14.2. 使用卷投射配置绑定服务帐户令牌
您可以使用卷投射,将 pod 配置为请求绑定的服务帐户令牌。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
您已创建了一个服务帐户。这里假定服务帐户命名为
build-robot
。
流程
可选:设置服务帐户签发者。
如果绑定令牌仅在集群中使用,则通常不需要这一步。
重要如果您将服务帐户签发者改为一个自定义的账户,则以前的服务帐户签发者仍可在下一个 24 小时内被信任。
您可以通过手动重启集群中的所有 pod 或执行滚动节点重启来强制所有拥有者请求新的绑定令牌。在执行任一操作前,等待 Kubernetes API 服务器 pod 的新修订版本来向您的服务帐户签发者更改。
编辑
cluster
Authentication
对象:$ oc edit authentications cluster
将
spec.serviceAccountIssuer
字段设置为所需的服务帐户签发者:spec: serviceAccountIssuer: https://test.default.svc 1
- 1
- 这个值应该是 URL,通过这个 URL,绑定令牌的接收方可以从中查找验证令牌签名所需的公钥。默认为
https://kubernetes.default.svc
。
- 保存文件以使改变生效。
等待 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
可选:强制拥有者通过执行滚动节点重启或重启集群中的所有 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
使用卷投影将 pod 配置为使用绑定服务帐户令牌。
创建名为
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
值,将其设置为从初始令牌生成开始后的一年。您无法更改此设置。创建 pod:
$ oc create -f pod-projected-svc-token.yaml
Kubelet 代表 pod 请求并存储令牌,使 pod 可以在一个可配置的文件路径中获得令牌,并在该令牌接近到期时刷新令牌。
使用绑定令牌的应用程序需要在令牌轮转时重新载入令牌。
如果令牌使用的时间超过这个值的 80%,或者超过 24 小时,则 kubelet 会轮转令牌。