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

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

先决条件

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

流程

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

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

    警告

    如果您更新 serviceAccountIssuer 字段,且已使用绑定令牌,则具有之前签发者值的所有绑定令牌都将无效。除非绑定令牌的拥有者明确支持签发者更改,否则该拥有者不会请求一个新的绑定令牌,直到 pod 重启为止。

    如果需要,您可以手动重启集群中的所有 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. 可选: 手动重启集群中的所有 pod,以便拥有者请求一个新的绑定令牌。

      1. 等待 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
      2. 手动重启集群中的所有 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:
        containers:
        - image: nginx
          name: nginx
          volumeMounts:
          - mountPath: /var/run/secrets/tokens
            name: vault-token
        serviceAccountName: build-robot 1
        volumes:
        - name: vault-token
          projected:
            sources:
            - serviceAccountToken:
                path: vault-token 2
                expirationSeconds: 7200 3
                audience: vault 4
      1
      对现有服务帐户的引用。
      2
      相对于文件挂载点的相对路径,用于将令牌放入。
      3
      (可选)设置服务帐户令牌的到期时间(以秒为单位)。默认为 3600 秒(1 小时),且必须至少为 600 秒(10 分钟)。如果令牌使用的时间超过这个值的 80%,或者超过 24 小时,则 kubelet 会开始尝试轮转令牌。
      4
      (可选)设置令牌的预期使用者。令牌的接收者应验证接收者身份是否与令牌的使用声明匹配,否则应拒绝令牌。使用者默认为 API 服务器的标识符。
    2. 创建 pod:

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

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

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

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