14.2. 使用卷投射配置绑定服务帐户令牌
您可以使用卷投射,将 pod 配置为请求绑定的服务帐户令牌。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
您已创建了一个服务帐户。这里假定服务帐户命名为
build-robot
。
流程
另外,还可选择设置服务帐户问题的签发者。
如果绑定令牌仅在集群中使用,则通常不需要这一步。
警告如果您更新
serviceAccountIssuer
字段,且已使用绑定令牌,则具有之前签发者值的所有绑定令牌都将无效。除非绑定令牌的拥有者明确支持签发者更改,否则该拥有者不会请求一个新的绑定令牌,直到 pod 重启为止。如果需要,您可以手动重启集群中的所有 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
。
- 保存文件以使改变生效。
可选: 手动重启集群中的所有 pod,以便拥有者请求一个新的绑定令牌。
等待 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 会在删除后自动重启。
$ 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: 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
创建 pod:
$ oc create -f pod-projected-svc-token.yaml
Kubelet 代表 pod 请求并存储令牌,使 pod 可以在一个可配置的文件路径中获得令牌,并在该令牌接近到期时刷新令牌。
使用绑定令牌的应用程序需要在令牌轮转时重新载入令牌。
如果令牌使用的时间超过这个值的 80%,或者超过 24 小时,则 kubelet 会轮转令牌。