You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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. 确认并获取服务账户的有效令牌

你已经提到拿到了令牌,这里再给个标准的获取方式确保正确性:

  1. 找到SA对应的自动生成的Secret(GKE会为每个SA创建包含令牌的Secret,命名格式一般是{SA_NAME}-token-xxxx):
kubectl get secrets -n default | grep your-sa-name
  1. 提取并解码令牌:
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:

  1. 添加集群信息(包含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)
  1. 添加SA用户信息:
kubectl config set-credentials sa-your-sa-name --token=$(cat sa-token.txt)
  1. 创建并切换到上下文:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:19:43