翻譯自官方文檔
用戶使用 kubectl 或 REST 請求訪問 API、客戶端庫。人類用戶和service account 二者可以授權訪問 API。當請求到達API,它經過若干步驟。
傳輸安全
典型的 Kubernetes 集羣中,API Server 位於6443端口。API Server 出示證書。此證書通常是自簽名的,所以用戶機器上的$USER/.kube/config
通常包含API Server證書的根證書,在指定的時候用這個根證書來替代系統的默認根證書。這個證書通常在你創建集羣的時候自動寫入$USER/.kube/config
。如果集羣有多個用戶,那麼創建者需要將證書分享給他們。
認證
當TLS連接建立以後,HTTP請求進入認證步驟。如上圖中的第1步。集羣的創建腳本或集羣管理員配置API Server運行一個或多個認證模塊。這些模塊在這裏詳述。
認證步驟的輸入是整個HTTP請求,然而,通常只檢查頭部和/或客戶端證書。
認證模塊包括客戶端證書、密碼、明文Token、自助Token和JWT Token(service account使用)。
可以指定多個認證模塊,此時每一個模塊按順序嘗試認證,直到其中之一通過認證。
如果請求不能通過認證,它被HTTP狀態碼401拒絕。否則,用戶被認證爲一個指定的username
,用戶名可用於後續步驟中進行決策。有些認證者也提供用戶組認證。
儘管Kubernetes使用username
來進行訪問控制決策和將請求記錄進日誌,但它沒有用戶對象,也沒有在其對象存儲中存儲用戶名或其他有關用戶的信息。
授權
請求通過認證以後必須被授權。如上圖中的第2步。
請求必須包含請求者的用戶名,請求的動作和動作影響的對象。如果有已存在的策略聲明這個用戶有權完成請求的動作,請求就被授權了。
例如,如果Bob擁有以下策略,那麼他只能讀取projectCaribou
命名空間的pod信息:
{
"apiVersion": "abac.authorization.kubernetes.io/v1beta1",
"kind": "Policy",
"spec": {
"user": "bob",
"namespace": "projectCaribou",
"resource": "pods",
"readonly": true
}
}
如果Bob做了如下請求,這個請求時被授權允許的:
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"resourceAttributes": {
"namespace": "projectCaribou",
"verb": "get",
"group": "unicorn.example.org",
"resource": "pods"
}
}
}
如果Bob請求寫入該命名空間的對象,他的授權被拒絕。如果他請求讀取其他命名空間的資源也被拒絕。
Kubernetes要求使用REST屬性與現有的組織(根證書裏的O)或雲提供商訪問控制系統交互。使用REST格式很重要,因爲這些控制系統可能與Kubernetes API以外的其他API交互。
Kubernetes支持多種授權模塊如ABAC模式、RBAC模式和Webhook模式。管理員創建集羣的時候配置API Server採用的授權模塊。如果配置了多個,Kubernetes會檢查每一個,任何一個模塊授權了請求,請求就可以進行。如果所有模塊都拒絕了請求,納悶請求就被禁止了。(HTTP狀態碼403)
更多關於Kubernetes授權,詳見授權概述
准入控制
准入控制模塊是可以修改或者拒絕請求的軟件模塊。除了授權模塊可用的屬性,准入控制模塊可以訪問正在被創建或更新的對象。它們作用於正在創建,刪除,更新或連接(代理)的對象,但不讀取。
可以配置多個准入控制器,按序逐個調用。
如圖中第3步所示。
不同於認證和授權模塊,如果被任何一個准入控制模塊拒絕了,那麼請求就立即被拒絕。
除了拒絕對象外,准入控制器還可以爲字段設置複雜的默認值。
可用的准入控制模塊在這裏描述。
請求通過所有準入控制器後,將使用相應API對象的驗證例程對其進行驗證,然後寫入對象存儲(圖中第4步)。
API Server 的IP和端口
API Server 實際上可以服務於兩個端口:
- 本地端口:
- 用於測試和bootstrap,以及其他主節點的組件與API server 通信
- 非TLS
- 默認端口是8080,
--insecure-port
參數修改 - 默認IP是 localhost,
--insecure-bind-address
參數修改 - 請求繞過認證和授權模塊
- 請求被准入控制模塊處理
- 受需要訪問主機的保護
- 安全端口
- 儘可能使用
- 使用TLS。–tls-cert-file 參數和 --tls-private-key-file 參數設置證書
- 默認端口6443,–secure-port參數修改
- 默認IP是第一個非localhost的網卡的IP,–bind-address修改
- 請求被認證和授權模塊處理
- 請求被准入控制模塊處理
- 認證和授權模塊運行