$ oc edit authentications cluster
您可以使用绑定服务帐户令牌,这提高了与云提供商身份访问管理 (IAM) 服务(例如 AWS IAM 或 Google Cloud Platform IAM 上的 OpenShift Container Platform)集成的能力。
可以使用绑定服务账户令牌来限制给定服务账户令牌的权限范围。这些令牌具有受众和时间限制。这有助于服务账户向 IAM 角色进行身份验证以及生成挂载到 Pod 的临时凭据。可以使用卷投影和 TokenRequest API 请求绑定服务账户令牌。
可以使用卷投影配置 Pod 以请求绑定服务账户令牌。
您可以作为具有 `cluster-admin` 角色的用户访问集群。
您已创建了一个服务账户。此过程假设服务账户名为 `build-robot`。
可选:设置服务账户颁发者。
如果绑定令牌仅在集群内使用,则通常不需要此步骤。
如果将服务账户颁发者更改为自定义颁发者,则在接下来的 24 小时内,仍信任之前的服务账户颁发者。 您可以通过手动重新启动集群中的所有 Pod 或执行滚动节点重新启动来强制所有持有者请求新的绑定令牌。在执行任一操作之前,请等待 Kubernetes API 服务器 Pod 的新版本使用您的服务账户颁发者更改推出。 |
编辑 `cluster` `Authentication` 对象
$ oc edit authentications cluster
将 `spec.serviceAccountIssuer` 字段设置为所需的 service account issuer 值
spec:
serviceAccountIssuer: https://test.default.svc (1)
1 | 此值应为一个 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 个节点处于版本 11;0 个节点已达到新版本 12
2 个节点处于版本 11;1 个节点处于版本 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 将 `expirationSeconds` 值覆盖为从初始令牌生成起的一年,并使用 `--service-account-extend-token-expiration` 默认值为 `true`。您无法更改此设置。 |
创建 Pod
$ oc create -f pod-projected-svc-token.yaml
kubelet 代表 Pod 请求并存储令牌,在可配置的文件路径中使 Pod 可以访问令牌,并在令牌接近过期时刷新令牌。
使用绑定令牌的应用程序必须在令牌轮换时处理令牌的重新加载。
如果令牌的剩余时间小于其生命周期的 80%,或者令牌的年龄超过 24 小时,则 kubelet 会轮换令牌。
您已创建了一个服务账户。此过程假设服务账户名为 `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