投射卷
本文档介绍 Kubernetes 中的投影卷。 建议您熟悉卷。
简介
projected
卷将多个现有的卷源映射到同一目录中。
目前,可以投影以下类型的卷源
所有源都必须与 Pod 处于同一命名空间中。有关更多详细信息,请参阅all-in-one 卷设计文档。
包含 secret、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
示例配置:设置了非默认权限模式的 secret
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
下列出。参数几乎相同,但有两个例外
- 对于 secret,
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 具有一个投影卷,其中包含注入的服务帐户令牌。此 Pod 中的容器可以使用该令牌访问 Kubernetes API 服务器,使用Pod 的服务帐户的身份进行身份验证。audience
字段包含令牌的预期受众。令牌的接收者必须使用令牌受众中指定的标识符来标识自己,否则应拒绝该令牌。此字段是可选的,默认值为 API 服务器的标识符。
expirationSeconds
是服务帐户令牌的预期有效持续时间。它默认为 1 小时,并且必须至少为 10 分钟(600 秒)。管理员还可以通过为 API 服务器指定 --service-account-max-token-expiration
选项来限制其最大值。path
字段指定投影卷挂载点的相对路径。
注意
使用投影卷源作为subPath
卷挂载的容器将不会收到这些卷源的更新。clusterTrustBundle 投影卷
Kubernetes v1.29 [alpha]
注意
要在 Kubernetes 1.32 中使用此功能,您必须使用ClusterTrustBundle
特性门控和 --runtime-config=certificates.k8s.io/v1alpha1/clustertrustbundles=true
kube-apiserver 标志启用对 ClusterTrustBundle 对象 的支持,然后启用 ClusterTrustBundleProjection
特性门控。clusterTrustBundle
投影卷源将一个或多个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 交互
在投影服务帐户卷增强功能中,用于文件权限处理的提案引入了设置了正确所有者权限的投影文件。
Linux
在 Linux Pod 中,如果投影卷且在 Pod SecurityContext
中设置了 RunAsUser
,则投影文件将具有正确的所属权设置,包括容器用户所有权。
当 Pod 中的所有容器在它们的 PodSecurityContext
或容器 SecurityContext
中都设置了相同的 runAsUser
时,kubelet 将确保 serviceAccountToken
卷的内容归该用户所有,并且令牌文件的权限模式设置为 0600
。
注意
在 Pod 创建后添加到 Pod 的临时容器不会更改 Pod 创建时设置的卷权限。
如果 Pod 的 serviceAccountToken
卷权限设置为 0600
,因为 Pod 中的所有其他容器都具有相同的 runAsUser
,则临时容器必须使用相同的 runAsUser
才能读取令牌。
Windows
在 Windows Pod 中,如果投影卷且在 Pod SecurityContext
中设置了 RunAsUsername
,则由于 Windows 中管理用户帐户的方式,因此不强制执行所属权。Windows 将本地用户和组帐户存储并在一个名为安全帐户管理器 (SAM) 的数据库文件中进行管理。每个容器都维护自己的 SAM 数据库实例,在容器运行时,主机无法访问该数据库。Windows 容器旨在将操作系统的用户模式部分与主机隔离运行,因此维护一个虚拟 SAM 数据库。因此,在主机上运行的 kubelet 无权动态配置虚拟化容器帐户的主机文件所有权。建议如果主机上的文件要与容器共享,则应将它们放置到 C:\
之外的单独卷挂载中。
默认情况下,投影文件将具有以下所有权,如下例所示,用于示例投影卷文件
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
的 Pod 将导致该 Pod 永远卡在 ContainerCreating
状态。因此,建议不要在 Windows Pod 中使用仅适用于 Linux 的 RunAsUser
选项。