投射磁碟區
本文件說明 Kubernetes 中的投射磁碟區。建議您先熟悉磁碟區。
簡介
projected
磁碟區會將多個現有的磁碟區來源對應到同一個目錄中。
目前,可以投射下列類型的磁碟區來源
所有來源都必須與 Pod 位於相同的命名空間中。如需更多詳細資訊,請參閱all-in-one 磁碟區設計文件。
包含密鑰、downwardAPI 與 configMap 的範例組態
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox:1.28
command: ["sleep", "3600"]
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "cpu_limit"
resourceFieldRef:
containerName: container-test
resource: limits.cpu
- configMap:
name: myconfigmap
items:
- key: config
path: my-group/my-config
範例組態:具有非預設權限模式的密鑰集
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox:1.28
command: ["sleep", "3600"]
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- secret:
name: mysecret2
items:
- key: password
path: my-group/my-password
mode: 511
每個投射磁碟區來源都會在規格中的 sources
下列出。參數幾乎相同,但有兩個例外
- 對於密鑰,
secretName
欄位已變更為name
,以與 ConfigMap 命名一致。 defaultMode
只能在投射層級指定,而不能針對每個磁碟區來源指定。但是,如上所示,您可以明確設定每個個別投射的mode
。
serviceAccountToken 投射磁碟區
您可以將目前服務帳戶的權杖注入 Pod 中指定的路徑。例如
apiVersion: v1
kind: Pod
metadata:
name: sa-token-test
spec:
containers:
- name: container-test
image: busybox:1.28
command: ["sleep", "3600"]
volumeMounts:
- name: token-vol
mountPath: "/service-account"
readOnly: true
serviceAccountName: default
volumes:
- name: token-vol
projected:
sources:
- serviceAccountToken:
audience: api
expirationSeconds: 3600
path: token
範例 Pod 具有一個 projected volume,其中包含注入的服務帳戶權杖。此 Pod 中的容器可以使用該權杖來訪問 Kubernetes API 伺服器,並使用Pod 的 ServiceAccount身分進行身份驗證。audience
欄位包含權杖的預期受眾。權杖的接收者必須使用權杖受眾中指定的識別符來識別自己,否則應拒絕該權杖。此欄位為選填,預設值為 API 伺服器的識別符。
expirationSeconds
是服務帳戶權杖的預期有效期限。預設值為 1 小時,且必須至少為 10 分鐘(600 秒)。管理員也可以透過為 API 伺服器指定 --service-account-max-token-expiration
選項來限制其最大值。path
欄位指定 projected volume 掛載點的相對路徑。
注意
使用 projected volume 來源作為subPath
卷宗掛載的容器將不會接收這些卷宗來源的更新。clusterTrustBundle projected volume
Kubernetes v1.29 [alpha]
注意
若要在 Kubernetes 1.32 中使用此功能,您必須啟用對 ClusterTrustBundle 物件的支援,方法是使用ClusterTrustBundle
功能閘道 和 --runtime-config=certificates.k8s.io/v1alpha1/clustertrustbundles=true
kube-apiserver 標記,然後啟用 ClusterTrustBundleProjection
功能閘道。clusterTrustBundle
projected volume 來源會將一或多個 ClusterTrustBundle 物件的內容注入為容器檔案系統中自動更新的檔案。
ClusterTrustBundle 可以透過名稱或簽署者名稱來選取。
若要依名稱選取,請使用 name
欄位來指定單個 ClusterTrustBundle 物件。
若要依簽署者名稱選取,請使用 signerName
欄位(以及選用的 labelSelector
欄位)來指定一組使用給定簽署者名稱的 ClusterTrustBundle 物件。如果 labelSelector
不存在,則會選取該簽署者的所有 ClusterTrustBundle。
kubelet 會對選取的 ClusterTrustBundle 物件中的憑證進行去重複資料刪除、正規化 PEM 表示法(捨棄註解和標頭)、重新排序憑證,並將它們寫入由 path
命名的檔案中。隨著選取的 ClusterTrustBundle 集合或其內容變更,kubelet 會保持檔案為最新狀態。
預設情況下,如果找不到指定的 ClusterTrustBundle,或者 signerName
/ labelSelector
與任何 ClusterTrustBundle 都不符,kubelet 將阻止 Pod 啟動。如果您不希望這種行為,請將 optional
欄位設定為 true
,Pod 將在 path
啟動一個空檔案。
apiVersion: v1
kind: Pod
metadata:
name: sa-ctb-name-test
spec:
containers:
- name: container-test
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: token-vol
mountPath: "/root-certificates"
readOnly: true
serviceAccountName: default
volumes:
- name: token-vol
projected:
sources:
- clusterTrustBundle:
name: example
path: example-roots.pem
- clusterTrustBundle:
signerName: "example.com/mysigner"
labelSelector:
matchLabels:
version: live
path: mysigner-roots.pem
optional: true
SecurityContext 互動
在 projected service account volume 增強功能中,關於檔案權限處理的提案,引入了 projected 檔案具有正確的擁有者權限設定。
Linux
在 Linux Pod 中,若 projected volume 和 Pod SecurityContext
中設定了 RunAsUser
,則 projected 檔案會設定正確的擁有權,包括容器使用者擁有權。
當 Pod 中的所有容器在其 PodSecurityContext
或容器 SecurityContext
中設定了相同的 runAsUser
時,kubelet 會確保 serviceAccountToken
卷宗的內容由該使用者擁有,並且權杖檔案的權限模式設定為 0600
。
注意
在 Pod 建立後新增到 Pod 的臨時容器不會變更在 Pod 建立時設定的卷宗權限。
如果 Pod 的 serviceAccountToken
卷宗權限設定為 0600
,因為 Pod 中的所有其他容器都具有相同的 runAsUser
,則臨時容器必須使用相同的 runAsUser
才能讀取權杖。
Windows
在 Windows Pod 中,若 projected volume 和 Pod SecurityContext
中設定了 RunAsUsername
,則由於 Windows 管理使用者帳戶的方式,因此不會強制執行擁有權。Windows 在名為安全性帳戶管理器 (SAM) 的資料庫檔案中儲存和管理本機使用者和群組帳戶。每個容器都維護自己的 SAM 資料庫執行個體,主機在容器執行時無法查看該執行個體。Windows 容器旨在將作業系統的使用者模式部分與主機隔離執行,因此需要維護虛擬 SAM 資料庫。因此,在主機上執行的 kubelet 無法動態設定虛擬化容器帳戶的主機檔案擁有權。建議如果主機上的檔案要與容器共用,則應將它們放入 C:\
以外的獨立卷宗掛載中。
預設情況下,projected 檔案將具有以下擁有權,如下例 projected volume 檔案所示
PS C:\> Get-Acl C:\var\run\secrets\kubernetes.io\serviceaccount\..2021_08_31_22_22_18.318230061\ca.crt | Format-List
Path : Microsoft.PowerShell.Core\FileSystem::C:\var\run\secrets\kubernetes.io\serviceaccount\..2021_08_31_22_22_18.318230061\ca.crt
Owner : BUILTIN\Administrators
Group : NT AUTHORITY\SYSTEM
Access : NT AUTHORITY\SYSTEM Allow FullControl
BUILTIN\Administrators Allow FullControl
BUILTIN\Users Allow ReadAndExecute, Synchronize
Audit :
Sddl : O:BAG:SYD:AI(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;0x1200a9;;;BU)
這表示所有管理員使用者(如 ContainerAdministrator
)將具有讀取、寫入和執行權限,而非管理員使用者將具有讀取和執行權限。
注意
一般而言,不鼓勵授予容器對主機的存取權,因為這可能會為潛在的安全漏洞打開大門。
在 Windows Pod 的 SecurityContext
中建立具有 RunAsUser
的 Windows Pod 將導致 Pod 永遠停留在 ContainerCreating
狀態。因此,建議不要將僅限 Linux 的 RunAsUser
選項與 Windows Pod 一起使用。