能力 | tcr-assistant | tcr-assistant-oidc |
凭证类型 | 静态长期凭证(用户名+密码) | 动态临时密钥,自动轮转 |
跨账号拉取 | 仅支持同账号 | 支持同账号和跨账号 |
安全性 | 长期密钥泄露风险 | 临时密钥定时轮转,自动失效 |
名称 | 类型 | 资源量 | Namespace |
tcr-assistant-system | Namespace | 1 | - |
tcr-assistant-oidc-manager-role | ClusterRole | 1 | - |
tcr-assistant-oidc-manager-rolebinding | ClusterRoleBinding | 1 | - |
tcr-assistant-oidc-leader-election-role | Role | 1 | tcr-assistant-system |
tcr-assistant-oidc-leader-election-rolebinding | RoleBinding | 1 | tcr-assistant-system |
tcr-assistant-oidc-controller-manager | ServiceAccount | 1 | tcr-assistant-system |
tcr-assistant-oidc-webhook-server-cert | Secret | 1 | tcr-assistant-system |
tcr-assistant-oidc-webhook-service | Service | 1 | tcr-assistant-system |
tcr-assistant-oidc-mutating-webhook-configuration | MutatingWebhookConfiguration | 1 | - |
oidcimagepullsecrets.tcr.tencentcloudcr.com | CustomResourceDefinition | 1 | - |
tcr-oidc-* | OIDCImagePullSecret CRD | (1-N) | tcr-assistant-system |
tcr.ips.* | Secret | (1-N)*{Namespace No.} | 目标 Namespace |
tcr-assistant-oidc-controller-manager | Deployment | 1 | tcr-assistant-system |
组件 | 资源用量 | 实例数量 |
tcr-assistant-oidc-controller-manager | CPU:600m memory:512Mi | 2(多副本高可用) |
imagePullSecrets 字段。在使用 YAML 创建或更新资源时,无需显式配置 ImagePullSecret,集群将会自动使用已下发的动态凭证拉取镜像。docker.mycompany.com),组件支持将自定义域名同步写入生成的 dockerconfigjson,工作负载可直接通过自定义域名拉取镜像。AssumeRoleWithWebIdentity 换取的临时密钥(有效期固定为 2 小时)访问 TCR,Controller 内部按 tokenExpiration 周期性触发凭证轮转,避免长期凭证泄露风险。ServiceAccountIssuerDiscovery 特性升级为正式可用)。pod-identity-webhook 组件安装成功。tcr:DescribeInstances、tcr:PullRepository 等),并授予对应角色。建议由具有 TCR 管理员及 CAM 管理员权限的用户完成组件初始化配置。namespaces 与 serviceAccounts 匹配规则不支持通配符表达式,需明确填写资源名称或使用 * 表示全部。tokenExpiration 建议在 3600~5400 秒 之间,避免临时密钥(有效期 7200 秒)过期后未及时轮转。功能 | 涉及对象 | 涉及操作权限 |
需要免密拉取镜像功能,即主动帮客户管理镜像凭证(secret)。 | Secret | watch、create、update、patch、delete |
通过创建、更新 ConfigMap/Lease 来进行主控制器选举,保证组件高可用。 | ConfigMap、Lease | get、list、watch、create、update、patch、delete |
监听命名空间的创建和更新,在需要时自动注入镜像凭证。 | Namespace | get、list、watch |
查询和更新服务账号。 | ServiceAccount | get、list、watch、patch、update |
管理自定义资源(CRD)实现凭证动态编排。 | OIDCImagePullSecret | get、list、watch、create、update、patch、delete |
Pod 创建时的准入兜底,检查并注入 ImagePullSecrets。 | Pod(准入) | MutatingWebhook 拦截 CREATE 事件 |
apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:name: tcr-assistant-oidc-leader-election-rolenamespace: tcr-assistant-systemrules:- apiGroups: [""]resources: ["configmaps"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]- apiGroups: ["coordination.k8s.io"]resources: ["leases"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]- apiGroups: [""]resources: ["events"]verbs: ["create", "patch"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: tcr-assistant-oidc-manager-rolerules:- apiGroups: [""]resources: ["secrets"]verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]- apiGroups: [""]resources: ["namespaces"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["serviceaccounts"]verbs: ["get", "list", "patch", "update", "watch"]- apiGroups: [""]resources: ["serviceaccounts/status"]verbs: ["get", "patch", "update"]- apiGroups: ["admissionregistration.k8s.io"]resources: ["mutatingwebhookconfigurations"]verbs: ["create", "get", "patch", "update"]- apiGroups: ["tcr.tencentcloudcr.com"]resources: ["oidcimagepullsecrets"]verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]- apiGroups: ["tcr.tencentcloudcr.com"]resources: ["oidcimagepullsecrets/status"]verbs: ["get", "patch", "update"]
imagePullSecret 到任意 Namespace,并关联到该空间下的 ServiceAccount。在用户创建的工作负载当中没有明确指定 imagePullSecret 和 serviceAccount 的情况下,Kubernetes 会尝试从当前命名空间下名为 default 的 ServiceAccount 资源中查找、匹配合适的 imagePullSecret。tokenExpiration 周期性轮转,避免了长期凭证泄露的风险。Name | 别名 | 描述 |
OIDCImagePullSecret | oips | tcr-assistant-oidc 定义的 CRD,声明凭证来源(roleArn / registries)与分发规则(namespaces / serviceAccounts / customDomains)。 |
OIDC Token | - | pod-identity-webhook 注入到 Controller Pod 中的 JWT,由 TKE 集群 API Server 签发,作为跨账号身份互信的凭据。 |
STS AssumeRoleWithWebIdentity | - | 腾讯云 STS 接口,凭 OIDC Token 换取指定角色的临时 SecretId / SecretKey / Token。 |
A 账号 / B 账号 | - | A 账号:TCR 实例所在账号(镜像提供方);B 账号:TKE 集群所在账号(镜像消费方)。同账号场景下 A = B。 |
oidcimagepullsecrets.tcr.tencentcloudcr.com。该 CRD 的 kind 为 OIDCImagePullSecret,版本是 tcr.tencentcloudcr.com/v1,缩写为 oips。Namespace 和 ServiceAccount 资源,并在这些资源发生变更的时候,检查资源变化是否匹配 OIDCImagePullSecret 中设定的规则来自动为用户部署拉取私有镜像仓库所需要的 Secret 资源。程序部署在 Kubernetes 集群内,使用 in cluster 模式访问 Kubernetes master API;同时依赖 TKE 官方 pod-identity-webhook 为 Controller Pod 注入 OIDC Token,通过腾讯云 STS 获取动态临时凭证。tcr:DescribeInstances、tcr:PullRepository 等最小权限。qcs::cam::uin/{UIN}:roleName/{ROLE_NAME},Controller 通过它调用 STS 获取临时凭证。{registry}.tencentcloudcr.com、{registry}-vpc.tencentcloudcr.com 以及用户配置的 customDomains。OIDCImagePullSecret 资源。也可通过 kubectl 或 Client Go 手工创建:# 新建 OIDCImagePullSecret 资源$ kubectl create -f oidcimagepullsecret-sample.yamloidcimagepullsecret.tcr.tencentcloudcr.com/tcr-oidc-sample created
OIDCImagePullSecret 资源示例文件:apiVersion: tcr.tencentcloudcr.com/v1kind: OIDCImagePullSecretmetadata:name: tcr-oidc-samplespec:namespaces: "*"serviceAccounts: "*"roleArn: "qcs::cam::uin/100001113387:roleName/tcr-cross-account-role"registries:- "your-tcr-registry"customDomains:- "docker.mycompany.com"tokenExpiration: 3600
OIDCImagePullSecret spec 字段解释如下表:字段 | 作用 | 注释 |
namespaces | Namespace 匹配规则 | * 或空字符串表示匹配任意;多个 Namespace 使用 , 分隔。注意:不支持任何表达式,需明确填写资源名称。 |
serviceAccounts | ServiceAccount 匹配规则 | * 或空字符串表示匹配任意;多个 ServiceAccount 使用 , 分隔。注意:不支持任何表达式,需明确填写资源名称。 |
roleArn | A 账号 CAM 角色 ARN | 用于 STS AssumeRoleWithWebIdentity,格式 qcs::cam::uin/{UIN}:roleName/{ROLE_NAME}。 |
registries | TCR 实例名称列表 | 仅填写实例名称,不含域名后缀,组件自动组合公网/VPC 域名。 |
customDomains | TCR 实例自定义域名列表 | 可选,用于自定义域名拉取场景,会额外写入 dockerconfigjson 的 auths 中。 |
tokenExpiration | Secret 轮转间隔(秒) | 建议 3600~5400,默认 3600;不可超过 STS 临时凭证有效期(7200s)。 |
# 列出 OIDCImagePullSecret 信息$ kubectl get oipsNAME NAMESPACES SERVICE-ACCOUNTS REGISTRIES CREDENTIAL-STATUStcr-oidc-sample * * [your-tcr-registry] Ready# 查看详细信息$ kubectl describe oips tcr-oidc-sampleName: tcr-oidc-sampleNamespace:API Version: tcr.tencentcloudcr.com/v1Kind: OIDCImagePullSecretSpec:Namespaces: *Service Accounts: *Role Arn: qcs::cam::uin/100001113387:roleName/tcr-cross-account-roleRegistries: [your-tcr-registry]Custom Domains: [docker.mycompany.com]Token Expiration: 3600Status:Credential Status: ReadyLast Refresh Time: 2026-08-05T10:00:00ZNext Refresh Time: 2026-08-05T11:00:00ZSecrets Desired: 10Secrets Success: 10Events: <none>
Secret 资源,无需删除重建 OIDCImagePullSecret 资源。修改 spec.roleArn、spec.registries、spec.customDomains 等字段后 Controller 会自动 reconcile,Secret 内容将在下一个轮转周期刷新。Namespace 资源创建后,会首先校验名称是否与 OIDCImagePullSecret 资源中的 namespaces 字段匹配。如果资源名称不匹配,跳过后续流程;若资源名称匹配,则会调用 STS 换取临时凭证、渲染 dockerconfigjson,调用 Kubernetes API 创建 Secret 资源,并添加 Secret 资源名称到该命名空间下 ServiceAccount 资源的 imagePullSecrets 字段中。示例如下:# 查看 newns 下自动部署的 Secret$ kubectl get secrets -n newnsNAME TYPE DATA AGEtcr.ips.tcr-oidc-sample kubernetes.io/dockerconfigjson 1 7m2s# 查看 dockerconfigjson 中包含的镜像仓库域名$ kubectl get secret tcr.ips.tcr-oidc-sample -n newns \\-o jsonpath='{.data.\\.dockerconfigjson}' | base64 -d | jq '.auths | keys'["your-tcr-registry.tencentcloudcr.com","your-tcr-registry-vpc.tencentcloudcr.com","docker.mycompany.com"]# 查看 newns 下自动关联到 ServiceAccount 资源 default 中的 Secret$ kubectl get serviceaccounts default -o yaml -n newnsapiVersion: v1imagePullSecrets:- name: tcr.ips.tcr-oidc-samplekind: ServiceAccountmetadata:name: defaultnamespace: newns
ServiceAccount 资源创建后,会首先校验名称是否与 OIDCImagePullSecret 资源中的 serviceAccounts 字段匹配。如果资源名称不匹配,跳过后续流程;若资源名称匹配,则会调用 Kubernetes API 创建或更新 Secret 资源,并添加 Secret 资源名称到 ServiceAccount 资源的 imagePullSecrets 字段当中。示例如下:# 在 newns 新建 ServiceAccount 资源$ kubectl create sa kung -n newnsserviceaccount/kung created# 查看 newns 下自动关联到新建 ServiceAccount 资源 kung 中的 Secret$ kubectl get serviceaccounts kung -o yaml -n newnsapiVersion: v1imagePullSecrets:- name: tcr.ips.tcr-oidc-samplekind: ServiceAccountmetadata:name: kungnamespace: newns
tokenExpiration 周期性触发。每次轮转会重新调用 STS AssumeRoleWithWebIdentity 获取新的临时凭证,并更新已分发的 Secret 内容。已运行的 Pod 无需重启,下一次镜像拉取即使用新凭证;升级 Controller 版本时,已生成的 Secret 不会中断,Controller 重启后自动恢复 reconcile。CheckIntervalMs 主动等待重试,避免 Pod 因时序问题拉取失败。使用场景 | 适用条件 | 操作文档 |
同账号免密拉取 | TKE 集群与 TCR 企业版实例属于同一个腾讯云账号 | |
跨账号免密拉取 | TKE 集群与 TCR 企业版实例分属不同的腾讯云账号 |
roleArn / registries / namespaces / serviceAccounts / customDomains / tokenExpiration)完全一致,差异仅在于 CAM 侧的 OIDC 身份提供商与角色信任策略的配置方。Apakah halaman ini membantu?
Anda juga dapat Menghubungi Penjualan atau Mengirimkan Tiket untuk meminta bantuan.
masukan