云原生學習路線導航頁(持續更新中)
- kubernetes學習系列快捷鏈接
- Kubernetes架構原則和對象設計(一)
- Kubernetes架構原則和對象設計(二)
- Kubernetes架構原則和對象設計(三)
- Kubernetes控制平面組件:etcd(一)
- Kubernetes控制平面組件:etcd(二)
- Kubernetes控制平面組件:etcd常用配置參數
- Kubernetes控制平面組件:etcd高可用集群搭建
- Kubernetes控制平面組件:etcd高可用解決方案
- Kubernetes控制平面組件:Kubernetes如何使用etcd
- Kubernetes控制平面組件:API Server詳解(一)
- Kubernetes控制平面組件:APIServer 基于 X509 證書的認證機制
- Kubernetes控制平面組件:APIServer 基于 靜態Token 的認證機制
- Kubernetes控制平面組件:APIServer 基于 引導Token 的認證機制
- Kubernetes控制平面組件:APIServer 基于 ServiceAccount 的認證機制
- Kubernetes控制平面組件:APIServer 基于 OpenID 的認證機制詳解
- Kubernetes控制平面組件:APIServer 基于 Webhook Toeken令牌 的認證機制詳解
- Kubernetes控制平面組件:APIServer 基于匿名請求的認證機制詳解
- kubectl 和 kubeconfig 基本原理
- kubeadm 升級 k8s集群 1.17到1.20
- Kubernetes常見問題解答
- 查看云機器的一些常用配置
本文主要對kubernetes的控制面組件API Server 授權機制中的 Webhook 授權機制進行詳細介紹,涵蓋Webhook機制基礎概念、設計理念、實現原理、授權流程、參數配置等
- 希望大家多多 點贊 關注 評論 收藏,作者會更有動力編寫技術文章
1.基礎概念
1.1.Webhook 機制定義
- Webhook 是 Kubernetes 的擴展機制之一,允許將授權決策委托給外部 HTTP 服務。
- 當 API Server 收到資源操作請求時,會將請求轉發至預先配置的外部 Webhook 服務進行權限驗證,并根據其返回結果決定是否允許該操作。
1.2.核心設計理念
- 解耦性:將授權邏輯從 Kubernetes 核心組件中剝離,通過外部服務實現靈活的策略管理。
- 動態策略:無需重啟 API Server 即可動態更新授權規則,適應快速變化的業務需求。
- 多租戶支持:結合企業級身份認證系統(如 LDAP、OAuth)實現細粒度權限控制。
1.3.與 RBAC 的區別
- RBAC:基于角色和靜態策略,適用于固定權限模型。
- Webhook:支持動態、外部化策略,適用于復雜場景(如跨系統鑒權、自定義規則)。
1.4.Webhook認證 與 Webhook授權 異同辨析
- 相同點:
- 設計理念相同。認證/授權 均有Webhook的擴展機制,都是允許將當前請求發送到第三方服務進行認證/授權,apiserver 根據返回結果決定是否通過 認證/授權
- 使用方式類似。都是使用kubeconfig格式指定第三方服務的url、cert等信息,供apiserver與之交互使用
- 不同點:
- apiserver配置文件參數不同。在apiserver的參數中需要指定第三方服務的配置文件,認證參數:
--authentication-token-webhook-config-file
,授權參數:--authorization-webhook-config-file
- 調用時機不同。在API Server處理鏈路中,認證在前,授權在后。
- apiserver配置文件參數不同。在apiserver的參數中需要指定第三方服務的配置文件,認證參數:
1.5.API Server啟用webhook授權機制
--authorization-mode=Webhook
- 使用 Webhook 授權機制需顯式啟用 authorization.k8s.io/v1beta1 API 擴展組:
--runtime-config=authorization.k8s.io/v1beta1=true
。
2.實現原理
2.1 核心組件交互
- API Server:作為請求入口,負責接收客戶端請求,在合適時機將請求封裝為
SubjectAccessReview
結構轉發至 Webhook - Webhook 服務:webhook服務,接收apiserver的
SubjectAccessReview
對象,可以自行處理授權,也可以作為代理調用第三方授權服務,將返回結果封裝后將allowed
或denied
返回給apiserver。 - 第三方授權服務:獨立的第三方授權服務,一般為企業獨立的授權模塊,可以通過webhook代理插入apiserver。
如果 第三方授權服務 本身就可以處理
SubjectAccessReview
請求,那也可以省略中間的webhook代理服務
2.2 請求處理流程
- 請求接收:客戶端發起 API 請求(如
kubectl create
)。 - 認證與預檢:完成 TLS 握手和身份認證(如 ServiceAccount Token)。
- Webhook 匹配:根據資源配置(
rules
)判斷是否觸發 Webhook。 - 請求轉發:API Server 將請求封裝為
SubjectAccessReview
JSON 對象,通過 HTTPS 發送至 Webhook 代理服務。 - 策略決策:Webhook 解析請求屬性(用戶、資源、操作),執行自定義邏輯(如調用外部權限系統)。
- 響應處理:返回
allowed: true/false
,若拒絕需附帶原因(reason
)。
3.參數配置
可以直接看官方文檔:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/webhook/
3.1.配置文件格式
- Webhook 模式需要一個 HTTP 配置文件,通過 --authorization-webhook-config-file=SOME_FILENAME 的參數聲明。
- 配置文件的格式使用 kubeconfig。 在該文件中,“users” 代表著 API 服務器的 Webhook,而 “cluster” 代表著遠程服務。
- 使用 HTTPS 客戶端認證的配置例子:
# Kubernetes API 版本
apiVersion: v1
# API 對象種類
kind: Config
# clusters 代表遠程服務
clusters:- name: name-of-remote-authz-servicecluster:# 對遠程服務進行身份認證的 CAcertificate-authority: /path/to/ca.pem# 遠程服務的查詢 URL。必須使用 'https'。不可以包含參數。server: https://authz.example.com/authorize# users 代表 API 服務器的 webhook 配置
users:- name: name-of-api-serveruser:client-certificate: /path/to/cert.pem # 要使用的 webhook 插件的證書client-key: /path/to/key.pem # 與證書匹配的密鑰# kubeconfig 文件必須有 context。需要提供一個給 API 服務器。
current-context: webhook
contexts:
- context:cluster: name-of-remote-authz-serviceuser: name-of-api-servername: webhook
3.2.請求載荷
- 在做認證決策時,API 服務器會 POST 一個 JSON 序列化的
authorization.k8s.io/v1beta1
SubjectAccessReview
對象來描述這個動作。 - 這個對象包含了描述用戶請求的字段,同時也包含了需要被訪問資源或請求特征的具體信息。
// 請求SubjectAccessReview:資源類
{"apiVersion": "authorization.k8s.io/v1beta1","kind": "SubjectAccessReview","spec": {"resourceAttributes": {"namespace": "kittensandponies","verb": "get","group": "unicorn.example.org","resource": "pods"},"user": "jane","group": ["group1","group2"]}
}// 請求SubjectAccessReview:非資源類
{"apiVersion": "authorization.k8s.io/v1beta1","kind": "SubjectAccessReview","spec": {"nonResourceAttributes": {"path": "/debug","verb": "get"},"user": "jane","group": ["group1","group2"]}
}
3.3.請求響應
// 響應:通過授權
{"apiVersion": "authorization.k8s.io/v1beta1","kind": "SubjectAccessReview","status": {"allowed": true}
}// 響應:未通過授權,但未顯式拒絕,如果還有其他授權服務,會繼續調用
{"apiVersion": "authorization.k8s.io/v1beta1","kind": "SubjectAccessReview","status": {"allowed": false,"reason": "user does not have read access to the namespace"}
}// 響應:未通過授權,并且顯式拒絕,如果還有其他授權服務,不會再繼續調用
{"apiVersion": "authorization.k8s.io/v1beta1","kind": "SubjectAccessReview","status": {"allowed": false,"denied": true,"reason": "user does not have read access to the namespace"}
}
4.實操案例
- 可以參考 Kubernetes控制平面組件:APIServer 基于 Webhook Toeken令牌 的認證機制詳解 中的實操案例,認證和授權的webhook使用方式基本一致,僅僅是apiserver的配置文件參數不同而已