在GKE中使用Kubernetes服务账户访问Kubernetes API的方法问询
在GKE集群外使用服务账户访问Kubernetes API的配置指南
嘿,你已经走完了创建服务账户(SA)的第一步,接下来只需要完成权限绑定、访问配置这几步,就能实现按需用不同权限的SA访问K8s API了,咱们一步步来:
1. 给服务账户绑定RBAC权限
服务账户默认没有任何操作权限,必须给它分配对应的RBAC规则才能生效,这里分两种常见场景:
场景1:集群级权限(比如全集群读取Pod)
先创建一个ClusterRole定义权限范围:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: pod-reader-cluster rules: - apiGroups: [""] # 核心API组 resources: ["pods", "pods/log"] verbs: ["get", "list", "watch"] # 允许执行的操作
执行命令创建:
kubectl apply -f clusterrole-pod-reader.yaml
再把这个ClusterRole绑定到你的服务账户:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: bind-pod-reader-to-sa subjects: - kind: ServiceAccount name: your-sa-name # 替换成你创建的SA名称 namespace: default # 替换成SA所在的命名空间 roleRef: kind: ClusterRole name: pod-reader-cluster apiGroup: rbac.authorization.k8s.io
执行绑定:
kubectl apply -f clusterrolebinding.yaml
场景2:命名空间级权限(比如仅操作default命名空间的Deployment)
如果只需要SA在某个命名空间内有操作权限,就用Role和RoleBinding:
# role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: deployment-manager rules: - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "list", "update", "patch"]
# rolebinding.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: bind-deployment-manager-to-sa namespace: default subjects: - kind: ServiceAccount name: your-sa-name namespace: default roleRef: kind: Role name: deployment-manager apiGroup: rbac.authorization.k8s.io
同样用kubectl apply命令创建这两个资源即可。
2. 确认并获取服务账户的有效令牌
你已经提到拿到了令牌,这里再给个标准的获取方式确保正确性:
- 找到SA对应的自动生成的Secret(GKE会为每个SA创建包含令牌的Secret,命名格式一般是
{SA_NAME}-token-xxxx):
kubectl get secrets -n default | grep your-sa-name
- 提取并解码令牌:
kubectl get secret <secret-name-from-above> -n default -o jsonpath='{.data.token}' | base64 --decode > sa-token.txt
把这个令牌妥善保存,后续访问API会用到。
3. 获取GKE集群的API访问端点
要在集群外访问API,得先拿到集群的API服务器地址:
用kubectl命令(本地已有集群凭证时):
kubectl cluster-info | grep "Kubernetes control plane" | awk '{print $NF}'
或者用gcloud命令更直接:
gcloud container clusters describe cluster-2 --zone <your-cluster-zone> --format="value(endpoint)"
得到的地址类似https://34.xx.xx.xx。
4. 测试集群外的API访问
用curl测试是否能正常访问,带上令牌:
curl -H "Authorization: Bearer $(cat sa-token.txt)" https://<api-endpoint>/api/v1/pods
如果返回集群内的Pod列表,说明权限和访问都配置成功了!
5. (可选)配置kubeconfig方便用kubectl操作
如果想在集群外直接用kubectl通过这个SA操作集群,可以创建一个专属的kubeconfig:
- 添加集群信息(包含CA证书,避免不安全的HTTP访问):
kubectl config set-cluster gke-cluster-2 --server=https://<api-endpoint> --certificate-authority=<(gcloud container clusters describe cluster-2 --zone <your-cluster-zone> --format="value(masterAuth.clusterCaCertificate)" | base64 --decode)
- 添加SA用户信息:
kubectl config set-credentials sa-your-sa-name --token=$(cat sa-token.txt)
- 创建并切换到上下文:
kubectl config set-context sa-context --cluster=gke-cluster-2 --user=sa-your-sa-name kubectl config use-context sa-context
之后执行kubectl get pods就是用这个SA的权限来操作集群了。
关键注意点
- 权限隔离:不同业务场景可以创建不同的SA,绑定不同的RBAC规则,遵循最小权限原则,避免过度授权。
- 令牌安全:令牌相当于SA的“密码”,一旦泄露要立刻删除对应的Secret,GKE会自动为SA生成新的令牌:
kubectl delete secret <secret-name>。 - 网络访问:如果你的GKE集群是VPC私有集群,集群外访问需要通过Cloud NAT、VPN或者Cloud Interconnect打通网络,确保API端点能被访问到。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

