docker.mycompany.com),需要通过自定义域名拉取镜像。能力 | tcr-assistant | tcr-assistant-oidc |
凭证类型 | 静态长期凭证(用户名+密码) | 动态临时密钥,自动轮转 |
跨账号拉取 | 仅支持同账号 | 支持同账号和跨账号 |

编号 | 环节 | 关键动作 |
① | OIDC 身份注入 | pod-identity-webhook 将 B 账号 TKE 集群签发的 OIDC JWT 挂载到 Controller Pod,JWT 的 iss 指向 B 集群 |
② | 跨账号 CAM 授权 | Controller 携 B 集群的 JWT 跨账号调用 STS;STS 用登记在 A 账号的 B 集群 JWKS 验签,匹配 Role 信任策略中的 federated OIDC Provider(B),返回 A 账号 2h 临时凭证 |
③ | 换取 docker 密码 | Controller 用 A 账号临时凭证调用 A 账号 TCR 获取 docker 登录用户名/密码 |
④ | Secret 分发 | Controller 渲染 dockerconfigjson(同时包含公网、VPC、自定义域名),按 CR 规则分发到 B 账号集群目标 ns / SA |
⑤ | 跨 VPC 免密拉取 | 业务 Pod 通过 SA 的 imagePullSecrets 完成 docker pull,依赖 VPC 对等/云联网 + Private DNS 保障网络可达 |
角色 | 说明 | 示例 UIN |
A 账号 | TCR 实例所在账号(镜像提供方),负责创建 CAM OIDC 身份提供商、CAM 策略、CAM 角色。 | 100001113387 |
B 账号 | TKE 集群所在账号(镜像消费方),负责开启 OIDC、安装 tcr-assistant-oidc 插件。 | 100002223233 |



sts.cloud.tencent.com,单击确定。如下图所示:
service-account-issuer 和 service-account-jwks-uri 参数值不允许编辑,采用默认规则。pod-identity-webhook 组件已成功部署:
pod-identity-webhook 组件状态为"成功",即表示组件安装成功。pod-identity-webhook 的状态为 Running 即表示安装成功。
cls-xxxxxxxx)。service-account-issuer 值。sts.cloud.tencent.com。
qcs::tcr:::instance/tcr-5jm4cabc,仅需替换最后的 TCR 实例 ID 部分。{"version": "2.0","statement": [{"action": ["tcr:DescribeInstances"],"effect": "allow","resource": ["qcs::tcr:::instance/tcr-5jm4cabc"]},{"action": ["tcr:PullRepository","tcr:PushRepository","tcr:CreateRepository"],"effect": "allow","resource": ["qcs::tcr:::repository/tcr-5jm4cabc/production-backend/*"]}]}
tcr:DescribeInstances:login 时需要的权限。tcr:PullRepository:拉取镜像时需要的策略权限。tcr:PushRepository:按需授予,不影响镜像拉取。tcr:CreateRepository:按需授予,推送时如果 repo 不存在,则需要此权限。production-backend/* 表示仅控制命名空间粒度。oidc:aud 的 value 值需要和 CAM OIDC 提供商的客户端 ID value 值保持一致。oidc:aud 的 value 值标识为 $my_pod_audience,当 oidc:aud 的 value 值有多个时,任选其中之一即可。




docker.mycompany.com),需要额外配置 customDomains。echo -n '{"roleArn": "qcs::cam::uin/100000000000:roleName/your-role-name","registries": ["your-tcr-registry"]}' | base64
{"roleArn": "qcs::cam::uin/100001113387:roleName/tcr-assistant-odic-read-harbor","registries": ["your-tcr-registry"],"customDomains": ["docker.mycompany.com"],"tokenExpiration": 3600,"namespaces": "*","serviceAccounts": "*"}
resource "tencentcloud_kubernetes_addon" "tcr_assistant_oidc" {cluster_id = "cls-xxxxxxxx" # 替换为您的 TKE 集群 IDaddon_name = "tcr-assistant-oidc"raw_values = jsonencode({# CAM 角色 ARN(必填)# 格式: qcs::cam::uin/{UIN}:roleName/{ROLE_NAME}roleArn = "qcs::cam::uin/100000000000:roleName/your-role-name"# TCR 镜像仓库名称列表(必填)registries = ["your-tcr-registry"]# 目标 namespace("*" 表示所有,或 "ns1,ns2,ns3")namespaces = "*"# 目标 ServiceAccount("*" 表示所有,或 "sa1,sa2")serviceAccounts = "*"# 自定义域名(选填)customDomains = ["docker.mycompany.com"]})}
# 确认 Controller Pod 正常运行kubectl get pods -n tcr-assistant-system# 预期:Pod 为 Running 状态# 检查 CR 状态,确认已成功从 A 账号获取临时密钥kubectl get oips tcr-oidc-public -o yaml# 关注 status.credentialStatus 应为 Ready# 确认 imagePullSecret 已分发到目标命名空间kubectl get secret tcr.ips.tcr-oidc-public -n default \\-o jsonpath='{.data.\\.dockerconfigjson}' | base64 -d | jq '.auths | keys'
["your-tcr-registry.tencentcloudcr.com","docker.mycompany.com"]

qcs::cam::uin/222:roleName/a-policy-for-tcr # B 账号qcs::cam::uin/333:roleName/a-policy-for-tcr # C 账号
roleArn。docker.mycompany.com,B 账号需要通过该域名拉取 。在安装组件时,指定 customDomains=["docker.mycompany.com"]。安装后 B 账号集群即可通过自定义域名拉取 A 账号的镜像:kubectl run nginx --image=docker.mycompany.com/my-namespace/nginx:latest
helm install tcr-assistant-oidc ./tcr-assistant-oidc \\--namespace tcr-assistant-system --create-namespace \\--set roleArn="qcs::cam::uin/100000000000:roleName/your-role-name" \\--set "registries={your-tcr-registry}" \\--set namespaces="production,staging" \\--set serviceAccounts="default,app-sa"
# 检查 Pod 状态和镜像版本kubectl get pods -n tcr-assistant-system -o wide# 检查 CR 状态kubectl get oips tcr-oidc-public -o jsonpath='{.status.credentialStatus}'# 预期输出:Ready
kubectl get secret tcr.ips.tcr-oidc-public -n <pod-namespace>
kubectl get sa default -n <pod-namespace> -o jsonpath='{.imagePullSecrets}'
kubectl logs -n tcr-assistant-system deployment/tcr-assistant-oidc-controller
tokenExpiration 控制轮转间隔。如果设置过大(>5400),可能导致密钥过期。tokenExpiration 在 3600~5400 范围内。TKE_WEB_IDENTITY_TOKEN_FILE 等),说明 B 账号集群的 pod-identity-webhook 未正常工作。pod-identity-webhook Pod 正常运行。AssumeRoleWithWebIdentity 失败,说明 A 账号的角色载体配置或 B 账号的策略配置有误。resource 字段与 A 账号角色 ARN 完全一致。# 获取凭证SECRET_JSON=$(kubectl get secret tcr.ips.tcr-oidc-public -n default \\-o jsonpath='{.data.\\.dockerconfigjson}' | base64 -d)# 提取用户名和密码,your-tcr-registry.tencentcloudcr.com 要替换成实际的访问域名USERNAME=$(echo $SECRET_JSON | jq -r '.auths["your-tcr-registry.tencentcloudcr.com"].username')PASSWORD=$(echo $SECRET_JSON | jq -r '.auths["your-tcr-registry.tencentcloudcr.com"].password')# 手动登录 A 账号的 TCR 实例,your-tcr-registry.tencentcloudcr.com 要替换成实际的访问域名。注意访问的客户端机器需要能够正常访问TCR域名。docker login your-tcr-registry.tencentcloudcr.com --username "$USERNAME" --password "$PASSWORD"
文档反馈