投影卷

本文档描述了 Kubernetes 中的 *投影卷*。建议熟悉

介绍

projected 卷将多个现有卷源映射到同一个目录。

目前,可以投影以下类型的卷源

所有源都必须与 Pod 位于同一个命名空间。有关更多详细信息,请参阅 一体化卷 设计文档。

使用 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 的 ServiceAccount 的身份进行身份验证。audience 字段包含令牌的预期受众。令牌的接收者必须使用令牌的受众中指定的标识符标识自身,否则应拒绝该令牌。此字段是可选的,它默认为 API 服务器的标识符。

expirationSeconds 是服务帐户令牌的预期有效期。它默认为 1 小时,并且必须至少为 10 分钟(600 秒)。管理员还可以通过为 API 服务器指定 --service-account-max-token-expiration 选项来限制其最大值。path 字段指定投影卷的挂载点的相对路径。

clusterTrustBundle 投影卷

功能状态: Kubernetes v1.29 [alpha]

clusterTrustBundle 投影卷源将一个或多个 ClusterTrustBundle 对象的内容作为自动更新的文件注入容器文件系统中。

ClusterTrustBundles 可以通过 名称签名者名称 进行选择。

要按名称选择,请使用 name 字段来指定单个 ClusterTrustBundle 对象。

要按签名者名称选择,请使用 signerName 字段(以及可选的 labelSelector 字段)来指定使用给定签名者名称的一组 ClusterTrustBundle 对象。如果 labelSelector 不存在,则会选择该签名者的所有 ClusterTrustBundles。

kubelet 会对选定的 ClusterTrustBundle 对象中的证书进行重复数据删除,规范化 PEM 表示形式(丢弃注释和标题),重新排序证书,并将它们写入 path 指定的文件中。当选定的一组 ClusterTrustBundles 或其内容发生更改时,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 中,RunAsUser 设置在 Pod SecurityContext 中,投影文件具有正确的所有权设置,包括容器用户所有权。

当 pod 中的所有容器在其 PodSecurityContext 或容器 SecurityContext 中都设置了相同的 runAsUser 时,kubelet 会确保 serviceAccountToken 卷的内容归该用户所有,并且令牌文件的权限模式设置为 0600

Windows

在具有投影卷和在 Pod SecurityContext 中设置了 RunAsUsername 的 Windows pod 中,由于 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)都将具有读、写和执行访问权限,而非管理员用户将具有读和执行访问权限。

上次修改时间:2023 年 10 月 19 日太平洋标准时间下午 8:21:ClusterTrustBundles:记录投影卷 (6dd3091e55)