Terraform用集群输出配置Kubernetes provider时报client用户无权限错误
问题根因说明
Kubernetes 使用 x509 客户端证书进行身份认证时,默认会将证书的 Common Name (CN) 字段值作为请求用户名,你看到的client用户就是你传入的cluster_client_certificate证书的CN字段值,并非Kubernetes Provider主动引入的命名用户。你使用kubectl --as client可复现错误的现象也完全匹配该认证逻辑。
排查步骤
- 先确认当前使用的客户端证书的CN字段值,执行以下命令解析证书内容:
openssl x509 -in <你的客户端证书本地存储路径> -noout -subject
返回结果中CN=后面的内容就是认证时使用的用户名,正常情况下你会看到CN=client的输出,和报错信息完全一致。 - 对比你本地
~/.kube/config中配置的客户端证书,执行同样的openssl命令解析,确认其CN字段和你已经配置过RBAC权限的用户名一致。
解决方案
方案1:补充client用户的RBAC权限绑定
如果确认当前使用的客户端证书CN确实为client,直接给该用户绑定对应权限即可,示例ClusterRoleBinding配置如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: client-cluster-permission subjects: - kind: User name: client apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-admin # 可按需替换为权限范围更小的ClusterRole/角色 apiGroup: rbac.authorization.k8s.io
将上述配置应用到集群后即可恢复正常。
方案2:替换为有权限的客户端证书
从集群创建模块的输出中,找到对应集群管理员身份的客户端证书、密钥参数,替换当前传入Kubernetes Provider的cluster_client_certificate、cluster_client_key配置即可。
方案3:修改证书生成逻辑
如果是集群创建模块自定义生成的客户端证书,修改证书生成规则,将CN字段改为你已经配置过RBAC权限的用户名(和本地kubeconfig使用的证书CN保持一致即可),重新生成证书后再传入Provider。
内容的提问来源于stack exchange,提问作者Cameron Hudson
相关产品推荐
相关产品推荐

