14.2. 使用卷投射配置绑定服务帐户令牌


您可以使用卷投射,将 pod 配置为请求绑定的服务帐户令牌。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 您已创建了一个服务帐户。这里假定服务帐户命名为 build-robot

流程

  1. 可选:设置服务帐户签发者。

    如果绑定令牌仅在集群中使用,则通常不需要这一步。

    重要

    如果您将服务帐户签发者改为一个自定义的账户,则以前的服务帐户签发者仍可在下一个 24 小时内被信任。

    您可以通过手动重启集群中的所有 pod 或执行滚动节点重启来强制所有拥有者请求新的绑定令牌。在执行任一操作前,等待 Kubernetes API 服务器 pod 的新修订版本来向您的服务帐户签发者更改。

    1. 编辑 cluster Authentication 对象:

      $ oc edit authentications cluster
    2. spec.serviceAccountIssuer 字段设置为所需的服务帐户签发者:

      spec:
        serviceAccountIssuer: https://test.default.svc 1
      1
      这个值应该是 URL,通过这个 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 nodes are at revision 11; 0 nodes have achieved new revision 12
      • 2 nodes are at revision 11; 1 nodes are at revision 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 会使用 --service-account-extend-token-expiration(默认为true)覆盖 expirationSeconds 值,将其设置为从初始令牌生成开始后的一年。您无法更改此设置。

    2. 创建 pod:

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

      Kubelet 代表 pod 请求并存储令牌,使 pod 可以在一个可配置的文件路径中获得令牌,并在该令牌接近到期时刷新令牌。

  3. 使用绑定令牌的应用程序需要在令牌轮转时重新载入令牌。

    如果令牌使用的时间超过这个值的 80%,或者超过 24 小时,则 kubelet 会轮转令牌。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.