×

您可以使用绑定服务帐户令牌,这提高了与云提供商身份访问管理 (IAM) 服务(例如 AWS IAM 或 Google Cloud Platform IAM 上的 OpenShift Container Platform)集成的能力。

关于绑定服务帐户令牌

可以使用绑定服务账户令牌来限制给定服务账户令牌的权限范围。这些令牌具有受众和时间限制。这有助于服务账户向 IAM 角色进行身份验证以及生成挂载到 Pod 的临时凭据。可以使用卷投影和 TokenRequest API 请求绑定服务账户令牌。

使用卷投影配置绑定服务账户令牌

可以使用卷投影配置 Pod 以请求绑定服务账户令牌。

先决条件
  • 您可以作为具有 `cluster-admin` 角色的用户访问集群。

  • 您已创建了一个服务账户。此过程假设服务账户名为 `build-robot`。

步骤
  1. 可选:设置服务账户颁发者。

    如果绑定令牌仅在集群内使用,则通常不需要此步骤。

    如果将服务账户颁发者更改为自定义颁发者,则在接下来的 24 小时内,仍信任之前的服务账户颁发者。

    您可以通过手动重新启动集群中的所有 Pod 或执行滚动节点重新启动来强制所有持有者请求新的绑定令牌。在执行任一操作之前,请等待 Kubernetes API 服务器 Pod 的新版本使用您的服务账户颁发者更改推出。

    1. 编辑 `cluster` `Authentication` 对象

      $ oc edit authentications cluster
    2. 将 `spec.serviceAccountIssuer` 字段设置为所需的 service account issuer 值

      spec:
        serviceAccountIssuer: https://test.default.svc (1)
      1 此值应为一个 URL,绑定令牌的接收者可以从中获取验证令牌签名的必需公钥。默认为 `https://kubernetes.default.svc`。
    3. 保存文件以应用更改。

    4. 等待 Kubernetes API 服务器 Pod 的新版本推出。所有节点更新到新版本可能需要几分钟时间。运行以下命令

      $ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\n"}{.message}{"\n"}'

      查看 Kubernetes API 服务器的 `NodeInstallerProgressing` 状态条件,以验证所有节点是否都处于最新版本。成功更新后,输出显示 `AllNodesAtLatestRevision`

      AllNodesAtLatestRevision
      3 nodes are at revision 12 (1)
      
      1 在此示例中,最新版本号为 `12`。

      如果输出显示类似于以下消息之一的消息,则更新仍在进行中。请等待几分钟,然后重试。

      • 3 个节点处于版本 11;0 个节点已达到新版本 12

      • 2 个节点处于版本 11;1 个节点处于版本 12

    5. 可选:通过执行滚动节点重新启动或手动重新启动集群中的所有 Pod 来强制持有者请求新的绑定令牌。

      • 执行滚动节点重新启动

        如果您在集群上运行自定义工作负载,则不建议执行滚动节点重新启动,因为它可能导致服务中断。请改为主动重新启动集群中的所有 Pod。

        顺序重启节点。等待节点完全可用后再重启下一个节点。有关如何优雅地清空、重启和再次将节点标记为可调度的说明,请参阅“优雅地重新启动节点”。

      • 手动重新启动集群中的所有 Pod

        请注意,运行此命令会导致服务中断,因为它会删除每个命名空间中的每个正在运行的 Pod。这些 Pod 在被删除后会自动重新启动。

        运行以下命令

        $ for I in $(oc get ns -o jsonpath='{range .items[*]} {.metadata.name}{"\n"} {end}'); \
              do oc delete pods --all -n $I; \
              sleep 1; \
              done
  2. 使用卷投影配置 Pod 以使用绑定服务账户令牌。

    1. 创建一个名为 `pod-projected-svc-token.yaml` 的文件,内容如下

      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx
      spec:
        securityContext:
          runAsNonRoot: true (1)
          seccompProfile:
            type: RuntimeDefault (2)
        containers:
        - image: nginx
          name: nginx
          volumeMounts:
          - mountPath: /var/run/secrets/tokens
            name: vault-token
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
        serviceAccountName: build-robot (3)
        volumes:
        - name: vault-token
          projected:
            sources:
            - serviceAccountToken:
                path: vault-token (4)
                expirationSeconds: 7200 (5)
                audience: vault (6)
      1 防止容器以 root 用户身份运行,以最大限度地降低安全风险。
      2 设置默认的 seccomp 配置文件,限制为必要的系统调用,以降低风险。
      3 对现有服务账户的引用。
      4 相对于挂载点,将令牌投影到的文件的路径。
      5 可选地设置服务账户令牌的过期时间(以秒为单位)。默认值为 3600 秒(1 小时),此值必须至少为 600 秒(10 分钟)。如果令牌的剩余时间小于其生命周期的 80%,或者令牌的年龄超过 24 小时,则 kubelet 会开始尝试轮换令牌。
      6 可选地设置令牌的目标受众。令牌的接收者应验证接收者身份是否与令牌的受众声明匹配,否则应拒绝令牌。受众默认为 API 服务器的标识符。

      为了防止意外失败,OpenShift Container Platform 将 `expirationSeconds` 值覆盖为从初始令牌生成起的一年,并使用 `--service-account-extend-token-expiration` 默认值为 `true`。您无法更改此设置。

    2. 创建 Pod

      $ oc create -f pod-projected-svc-token.yaml

      kubelet 代表 Pod 请求并存储令牌,在可配置的文件路径中使 Pod 可以访问令牌,并在令牌接近过期时刷新令牌。

  3. 使用绑定令牌的应用程序必须在令牌轮换时处理令牌的重新加载。

    如果令牌的剩余时间小于其生命周期的 80%,或者令牌的年龄超过 24 小时,则 kubelet 会轮换令牌。

在 Pod 外创建绑定服务账户令牌

先决条件
  • 您已创建了一个服务账户。此过程假设服务账户名为 `build-robot`。

步骤
  • 通过运行以下命令在 Pod 外创建绑定服务账户令牌

    $ oc create token build-robot
    示例输出
    eyJhbGciOiJSUzI1NiIsImtpZCI6IkY2M1N4MHRvc2xFNnFSQlA4eG9GYzVPdnN3NkhIV0tRWmFrUDRNcWx4S0kifQ.eyJhdWQiOlsiaHR0cHM6Ly9pc3N1ZXIyLnRlc3QuY29tIiwiaHR0cHM6Ly9pc3N1ZXIxLnRlc3QuY29tIiwiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjIl0sImV4cCI6MTY3OTU0MzgzMCwiaWF0IjoxNjc5NTQwMjMwLCJpc3MiOiJodHRwczovL2lzc3VlcjIudGVzdC5jb20iLCJrdWJlcm5ldGVzLmlvIjp7Im5hbWVzcGFjZSI6ImRlZmF1bHQiLCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoidGVzdC1zYSIsInVpZCI6ImM3ZjA4MjkwLWIzOTUtNGM4NC04NjI4LTMzMTM1NTVhNWY1OSJ9fSwibmJmIjoxNjc5NTQwMjMwLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDp0ZXN0LXNhIn0.WyAOPvh1BFMUl3LNhBCrQeaB5wSynbnCfojWuNNPSilT4YvFnKibxwREwmzHpV4LO1xOFZHSi6bXBOmG_o-m0XNDYL3FrGHd65mymiFyluztxa2lgHVxjw5reIV5ZLgNSol3Y8bJqQqmNg3rtQQWRML2kpJBXdDHNww0E5XOypmffYkfkadli8lN5QQD-MhsCbiAF8waCYs8bj6V6Y7uUKTcxee8sCjiRMVtXKjQtooERKm-CH_p57wxCljIBeM89VdaR51NJGued4hVV5lxvVrYZFu89lBEAq4oyQN_d6N1vBWGXQMyoihnt_fQjn-NfnlJWk-3NSZDIluDJAv7e-MTEk3geDrHVQKNEzDei2-Un64hSzb-n1g1M0Vn0885wQBQAePC9UlZm8YZlMNk1tq6wIUKQTMv3HPfi5HtBRqVc2eVs0EfMX4-x-PHhPCasJ6qLJWyj6DvyQ08dP4DW_TWZVGvKlmId0hzwpg59TTcLR0iCklSEJgAVEEd13Aa_M0-faD11L3MhUGxw0qxgOsPczdXUsolSISbefs7OKymzFSIkTAn9sDQ8PHMOsuyxsK8vzfrR-E0z7MAeguZ2kaIY7cZqbN6WFy0caWgx46hrKem9vCKALefElRYbCg3hcBmowBcRTOqaFHLNnHghhU1LaRpoFzH7OUarqX9SGQ