TkeAuthenticator 是一个 Kubernetes Authentication Webhook 和 Authorization Webhook 服务,为 TKE 集群提供基于腾讯云 CAM 的身份认证(CAM Identity Authentication)和访问控制能力。能力 | 说明 | 对应 Kubernetes 阶段 |
CAM 身份认证(CAM Identity Authentication) | 通过 CAM 身份验证用户,将 CAM 用户/角色映射为 Kubernetes RBAC 用户和用户组。配合 tke-cam-tool 使用,构建 CAM 身份到 Kubernetes RBAC 用户/组的桥梁。 | |
CAM 用户组鉴权(CAM User Group Authorization) | 基于 CAM 用户组进行 Kubernetes RBAC 鉴权,支持按用户组维度批量管理集群权限。CAM 用户组 是多个相同职能的用户(子账号)的集合,适用于为职能相同的子账号快速设置相同的 Kubernetes 对象访问权限。 |
UserGroupAccessControl(CAM 用户组鉴权)原为独立组件,现已合并至 TkeAuthenticator 统一部署。TkeAuthenticator 后,两个功能默认开启,无需额外配置,也可单独使用其中任一功能。TkeAuthenticator 组件版本 ≥ 1.0.0。
TKE_QCSRole 关联预设策略 QcloudAccessForTKERoleInGroupsForUser 的授权。如下图所示:

TkeAuthenticator 的 CAM 身份认证功能通过 Authentication Webhook 实现,将腾讯云 CAM 身份映射为 Kubernetes RBAC 用户和用户组。配合 tke-cam-tool 一起使用,TkeAuthenticator 可构建 CAM 身份到 Kubernetes RBAC 用户/组的桥梁,从而避免在本地存储任何静态集群凭证(如 x509 客户端证书或静态令牌)。
TkeAuthenticator。TkeAuthenticator 将 token 中的请求发送至腾讯云安全令牌服务(Security Token Service,STS),调用 GetCallerIdentity 获取用户的 CAM 身份信息(ARN)。TkeAuthenticator 在所有 CAMIdentityMapping 中查找与该 ARN 匹配的映射规则,返回对应的 Kubernetes RBAC 用户名和用户组给 API Server。CAMIdentityMapping 中均未找到匹配,TkeAuthenticator 将返回 "Not Authenticated" 决策,用户会看到 "Unauthorized" 错误。TkeAuthenticator 发送至 STS 服务以获取用户的 CAM 身份。用于签名请求的腾讯云凭证(生成 Authorization header 中的签名)代表了用户希望被认证为的 CAM 身份。例如,使用某个子账号的 Secret ID 和 Secret Key 签名 token,则该 token 将被认证为该子账号。k8s-tke-v1. 加上 base64 编码的 JSON 组成:k8s-tke-v1.<base64 编码的 JSON>
{"clusterId": "cls-*****","header": {"Authorization": ["TC3-HMAC-SHA256 Credential=AKID*****/2024-09-03/sts/tc3_request, SignedHeaders=content-type;host;x-tc-action;x-tc-tke-clusterid, Signature=*****"],"Content-Type": ["application/json; charset=utf-8"],"Host": ["sts.internal.tencentcloudapi.com"],"X-TC-Action": ["GetCallerIdentity"],"X-TC-TKE-ClusterID": ["cls-*****"],"X-TC-Timestamp": ["1725332268"],"X-TC-Token": ["*****"],"X-TC-Version": ["2018-08-13"]}}
字段 | 说明 |
Authorization | |
Content-Type | 请求内容类型。 |
Host | STS 服务端点地址。 |
X-TC-Action | 固定为 GetCallerIdentity。 |
X-TC-TKE-ClusterID | token 可访问的集群 ID。 |
content-typehostx-tc-actionx-tc-tke-clusterid(确保 token 只能用于访问指定集群)tke-cam-tool 是一个 CLI 工具,帮助用户生成访问 Kubernetes API Server 所需的 kubeconfig 文件和 token。
tke-cam-tool 使用用户提供的腾讯云凭证生成 token:tke-cam-tool exec-cred token --cluster-id <CLUSTER_ID> [FLAGS...]
{"kind": "ExecCredential","apiVersion": "client.authentication.k8s.io/v1beta1","spec": { "interactive": false },"status": {"expirationTimestamp": "2024-10-12T09:18:05Z","token": "k8s-tke-v1.<base64 编码内容>"}}
expirationTimestamp 为 token 的过期时间,tke-cam-tool 会复用未过期的缓存 token。--no-cache 标志可禁用缓存,强制每次生成新 token。--role 扮演角色时,缓存的 token 必须使用相同的 role ARN、external ID 和 session name 才会被复用。tke-cam-tool exec-cred kubeconfig --cluster-id <CLUSTER_ID> --region <REGION> [FLAGS...]
k8s.io/client-go 的 ExecCredential 插件 能力,在每次 kubectl 请求时动态运行 tke-cam-tool exec-cred token 命令生成 token。示例:apiVersion: v1clusters:- cluster:certificate-authority-data: BASE64_PEM_ENCODED_CA_CERTIFICATEserver: API_SERVER_ADDRESSname: <CLUSTER_ID> # 自动生成,值为集群 IDcontexts:- context:cluster: <CLUSTER_ID>user: <CLUSTER_ID>-exec-cred-pluginname: <CLUSTER_ID>-exec-cred-plugin-context # 自动生成current-context: <CLUSTER_ID>-exec-cred-plugin-contextkind: Configpreferences: {}users:- name: <CLUSTER_ID>-exec-cred-plugin # 自动生成user:exec:apiVersion: client.authentication.k8s.io/v1beta1args:- exec-cred- token- --cluster-id- <CLUSTER_ID>- --profile- defaultcommand: tke-cam-toolenv: nullinteractiveMode: NeverprovideClusterInfo: false
TkeAuthenticator 需要通过映射规则将 CAM 身份转换为 Kubernetes 用户。该映射规则即 CAMIdentityMapping——一个 Kubernetes CRD(Custom Resource),用于定义从 CAM 身份的 ARN 到 Kubernetes RBAC 用户和用户组的映射关系。TkeAuthenticator 认证时,组件会从所有 CAMIdentityMapping 中查找与用户 ARN 匹配的规则,并返回对应的 Kubernetes 用户名和用户组给 API Server。apiVersion: authenticator.tke.cloud.tencent.com/v1kind: CAMIdentityMappingmetadata:name: <MAPPING_NAME> # 自定义资源名称,例如:my-sub-account-mappingspec:arn: <CAM_IDENTITY_ARN> # CAM 身份 ARN,例如:qcs::cam::uin/100000000001:uin/100000000002username: <K8S_USERNAME> # 自定义 Kubernetes 用户名,例如:my-usergroups: # 映射后的 Kubernetes 用户组(可选)- <GROUP_1> # 自定义用户组名称,例如:dev-team- <GROUP_2> # 自定义用户组名称,例如:read-only
字段 | 必填 | 说明 |
metadata.name | 是 | 资源名称,自定义即可,在集群内唯一。 |
spec.arn | 是 | CAM 身份的 ARN,用于匹配认证用户。支持精确匹配和通配符。 |
spec.username | 是 | 认证成功后返回给 API Server 的 Kubernetes 用户名。 |
spec.groups | 否 | 认证成功后返回给 API Server 的 Kubernetes 用户组列表。 |
apiVersion: authenticator.tke.cloud.tencent.com/v1kind: CAMIdentityMappingmetadata:name: <MAPPING_NAME> # 自定义资源名称,例如:my-sub-account-mappingspec:arn: qcs::cam::uin/<ROOT_ACCOUNT_ID>:uin/<SUB_ACCOUNT_ID>username: <K8S_USERNAME> # 自定义 Kubernetes 用户名,例如:my-usergroups:- read-group # 自定义用户组名称- write-group # 自定义用户组名称- {{CAMUserGroupIDs}}
qcs::SERVICE:(REGION:)ACCOUNT:RESOURCE。类型 | ARN 格式 | 示例 |
主账号 | qcs::cam::uin/<ROOT_ACCOUNT_ID>:root | qcs::cam::uin/100000000001:root |
子账号 | qcs::cam::uin/<ROOT_ACCOUNT_ID>:uin/<SUB_ACCOUNT_ID> | qcs::cam::uin/100000000001:uin/100000000002 |
CAM 角色 | qcs::cam::uin/<ROOT_ACCOUNT_ID>:role/<ROLE_ID> | qcs::cam::uin/100000000001:role/4611686018427000001 |
联合账号 | qcs::sts::uin/<ROOT_ACCOUNT_ID>:federated-user/<UIN> | qcs::sts::uin/100000000001:federated-user/100000000002 |
通配符 | qcs::cam::uin/<ROOT_ACCOUNT_ID>:uin/* | 匹配该主账号下所有子账号 |
username 和 groups 中使用占位符,它们会在认证成功后被自动替换为实际值。所有占位符都用双花括号 {{}} 包围。占位符 | 说明 |
{{AccountID}} | CAM 身份所属的主账号 ID |
{{SessionName}} | CAM 身份的会话名称(仅 CAM 角色有效) |
{{SecretID}} | Token 签名所使用的腾讯云 Secret ID |
{{AccountID}} 作为用户名:apiVersion: authenticator.tke.cloud.tencent.com/v1kind: CAMIdentityMappingmetadata:name: <MAPPING_NAME> # 自定义资源名称,例如:account-id-mappingspec:arn: qcs::cam::uin/<ROOT_ACCOUNT_ID>:uin/<SUB_ACCOUNT_ID>username: {{AccountID}}
占位符 | 说明 |
{{CAMUserGroupIDs}} | 子账号所属的所有 CAM 用户组 ID(仅子账号有效) |
{{CAMUserGroupIDs}} 会在认证时自动展开为该子账号所属的所有 CAM 用户组 ID。您可以在占位符前后添加自定义前缀/后缀来控制返回的用户组格式。{{CAMUserGroupIDs}} 关联用户组:apiVersion: authenticator.tke.cloud.tencent.com/v1kind: CAMIdentityMappingmetadata:name: <MAPPING_NAME> # 自定义资源名称,例如:cam-group-mappingspec:arn: qcs::cam::uin/<ROOT_ACCOUNT_ID>:uin/<SUB_ACCOUNT_ID>username: <K8S_USERNAME> # 自定义 Kubernetes 用户名,例如:my-usergroups:- cam-group-{{CAMUserGroupIDs}}
56789 和 67890,则认证后返回的用户组为:cam-group-56789cam-group-67890{{CAMUserGroupIDs}} 仅当 CAM 身份是子账号时有效。如果 CAM 身份是角色或联合账号,该占位符不会产生任何用户组。kubectl。方式 | 适用场景 | 凭证类型 |
已有子账号 Secret ID / Secret Key | 永久密钥 | |
通过企业 SSO 或腾讯云账号 OAuth 登录 | 临时密钥 |
export TENCENTCLOUD_SECRET_ID=<YOUR_SECRET_ID>export TENCENTCLOUD_SECRET_KEY=<YOUR_SECRET_KEY>
# 配置 SSO 登录地址# 替换 <YOUR_SSO_ID> 为企业 SSO 配置 ID(从企业 IdP 管理员处获取)tccli sso configure --url https://tencentcloudsso.com/<YOUR_SSO_ID>/login# 执行登录tccli sso login
tccli auth login
~/.tccli/default.credential。CAMIdentityMapping,将 CAM 身份映射到 Kubernetes 用户。根据步骤二选择的方式,arn 字段的填写方式不同:arn 填写子账号的 CAM 用户 ARN:apiVersion: authenticator.tke.cloud.tencent.com/v1kind: CAMIdentityMappingmetadata:name: <MAPPING_NAME> # 自定义资源名称,例如:my-cam-mappingspec:arn: qcs::cam::uin/<ROOT_ACCOUNT_ID>:uin/<SUB_ACCOUNT_ID>username: <K8S_USERNAME> # 自定义 Kubernetes 用户名,例如:my-user,后续 RBAC 绑定需与此一致
--role 扮演 CAM 角色,arn 填写该角色的 ARN:apiVersion: authenticator.tke.cloud.tencent.com/v1kind: CAMIdentityMappingmetadata:name: <MAPPING_NAME> # 自定义资源名称,例如:my-cam-mappingspec:arn: qcs::cam::uin/<ROOT_ACCOUNT_ID>:role/<ROLE_ID>username: <K8S_USERNAME> # 自定义 Kubernetes 用户名,例如:my-user,后续 RBAC 绑定需与此一致
<K8S_USERNAME> 需与上面 CAMIdentityMapping 中的 username 保持一致):apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: <CLUSTER_ROLE_NAME> # 自定义 ClusterRole 名称,例如:pod-readerrules:- apiGroups: [""]resources: ["pods"]verbs: ["get", "list"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: <BINDING_NAME> # 自定义 ClusterRoleBinding 名称,例如:my-bindingroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: <CLUSTER_ROLE_NAME> # 引用上面创建的 ClusterRole 名称subjects:- kind: UserapiGroup: rbac.authorization.k8s.ioname: <K8S_USERNAME> # 与 CAMIdentityMapping 中的 username 保持一致,例如:my-user
export CLUSTER_ID=<YOUR_CLUSTER_ID> # 例如:cls-xxxxxxxxexport REGION=<YOUR_REGION> # 例如:ap-guangzhou
tke-cam-tool exec-cred kubeconfig \\--cluster-id ${CLUSTER_ID} \\--region ${REGION} \\-o ${CLUSTER_ID}.kubeconfig
--role 扮演 CAM 角色:tke-cam-tool exec-cred kubeconfig \\--cluster-id ${CLUSTER_ID} \\--region ${REGION} \\--profile default \\--token-profile default \\--role qcs::cam::uin/<ROOT_ACCOUNT_ID>:roleName/<ROLE_NAME> \\ # 替换为实际的主账号 ID 和角色名称-o ${CLUSTER_ID}.kubeconfig
参数 | 说明 |
--profile default | 使用 SSO 登录写入的凭证调用 TKE 接口获取集群信息 |
--token-profile default | kubeconfig 中 kubectl 调用 tke-cam-tool 时使用的凭证 |
--role | 扮演 CAM 角色获取新的临时密钥,格式为 qcs::cam::uin/<ROOT_ACCOUNT_ID>:roleName/<ROLE_NAME>。替换 <ROOT_ACCOUNT_ID> 为主账号 ID(例如:100000000001),<ROLE_NAME> 为 CAM 角色名称(例如:TKE_QCSRole) |
# 可以读取 pods(已授权)kubectl --kubeconfig ${CLUSTER_ID}.kubeconfig get pod# 无法读取 deployments(未授权)kubectl --kubeconfig ${CLUSTER_ID}.kubeconfig get deployment# Error from server (Forbidden): deployments.apps is forbidden: User "<K8S_USERNAME>" cannot list resource "deployments" in API group "apps" in the namespace "default"
TkeAuthenticator 内置了基于 CAM 用户组的鉴权功能(即 Authorization Webhook),支持将 Kubernetes RBAC 权限管理机制对接腾讯云 CAM 用户组,便于对子账号进行细粒度的访问权限控制。安装组件后,该功能默认开启。SubjectAccessReview,转发至 TkeAuthenticator 的 /authorize 端点。NoOpinion,API Server 会继续使用其他 authorizer(如内置 RBAC)进行鉴权。方式 | 适用场景 |
通过可视化界面操作,适合不熟悉 YAML 的用户 | |
通过 YAML 文件创建,适合熟悉 Kubernetes 的用户 |

<CAM_USER_GROUP_ID>(例如 12345),创建以下 RBAC 规则,允许该用户组的成员读取所有 Pod:apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: <CLUSTER_ROLE_NAME> # 自定义 ClusterRole 名称,例如:pod-readerrules:- apiGroups: [""]resources: ["pods"]verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: <BINDING_NAME> # 自定义 ClusterRoleBinding 名称,例如:cam-group-bindingroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: <CLUSTER_ROLE_NAME> # 引用上面创建的 ClusterRole 名称subjects:- kind: GroupapiGroup: rbac.authorization.k8s.ioname: <CAM_USER_GROUP_ID> # 替换为 CAM 用户组 ID,例如:12345
# ${KUBECONFIG_PATH} 替换为实际的 kubeconfig 文件路径# 验证可以读取 pods(用户组已授权)kubectl --kubeconfig ${KUBECONFIG_PATH} get pods# 验证无法执行未授权操作kubectl --kubeconfig ${KUBECONFIG_PATH} delete pod some-pod# 预期:返回 Forbidden 错误
# 开发团队 - 可以读写 dev 命名空间apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:name: <BINDING_NAME> # 自定义 RoleBinding 名称,例如:dev-team-bindingnamespace: devroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: edit # Kubernetes 内置的 ClusterRolesubjects:- kind: GroupapiGroup: rbac.authorization.k8s.ioname: <DEV_GROUP_ID> # 替换为开发团队 CAM 用户组 ID,例如:56789---# 运维团队 - 集群管理员权限apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: <BINDING_NAME> # 自定义 ClusterRoleBinding 名称,例如:ops-team-adminroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin # Kubernetes 内置的 ClusterRolesubjects:- kind: GroupapiGroup: rbac.authorization.k8s.ioname: <OPS_GROUP_ID> # 替换为运维团队 CAM 用户组 ID,例如:67890
TkeAuthenticator 的鉴权模块内置了用户组缓存机制,以减少对 CAM API 的调用频率。UserGroupAccessControl 组件,请按以下步骤迁移:UserGroupAccessControl 组件。TkeAuthenticator 版本 >= 1.0.0。TkeAuthenticator 安装后,所有功能(认证 + 鉴权)默认开启,无需额外配置。NoOpinion(不做决定),此时 API Server 会继续使用其他 authorizer(如内置 RBAC)进行鉴权。TkeAuthenticator 提供,但它们是完全独立的两个功能模块,彼此之间没有功能依赖关系:/authenticate):负责 CAM 身份认证,验证用户的 CAM 身份并映射到 Kubernetes 用户/组。/authorize):负责鉴权,基于 CAM 用户组和 RBAC 规则判断用户是否有权执行某操作。TkeAuthenticator 组件内部,认证和鉴权是独立实现的,只是合并部署在同一个服务中。您可以单独使用其中任一功能,也可以同时使用两者。{{CAMUserGroupIDs}} 占位符对非子账号身份有效吗?{{CAMUserGroupIDs}} 仅当 CAM 身份是子账号时有效。如果 CAM 身份是角色或联合账号,该占位符不会产生任何用户组。文档反馈