使用服务帐户访问GKE中的Kubernetes API

时间:2018-04-09 11:06:17

标签: kubernetes google-kubernetes-engine

我在GKE中运行了我的Kubernetes集群我想在集群外运行一个应用程序并与Kubernetes API交谈。

使用从运行中检索到的密码:

gcloud container clusters get-credentials cluster-2 --log-http

我可以使用基本身份验证访问API。 但我想创建多个Kubernetes服务帐户并使用所需的授权对其进行配置并正确使用。

因此,我创建了服务帐户并使用以下方式获取了令牌:

kubectl create serviceaccount sauser1
kubectl get serviceaccounts sauser1 -o yaml
kubectl get secret sauser1-token-<random-string-as-retrieved-from-previous-command> -o yaml

如果我尝试使用Bearer身份验证使用获取的令牌访问Kubernetes API,那么我会收到401 HTTP错误。我认为可能必须为服务帐户设置一些权限,因此根据文档here,我在YAML文件下创建:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: pod-reader
subjects:
- kind: ServiceAccount
  name: sauser1
  namespace: default
roleRef:
  kind: ClusterRole
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

并尝试使用以下命令应用它:

kubectl apply -f default-sa-rolebinding.yaml

我收到以下错误:

clusterrolebinding "pod-reader" created
Error from server (Forbidden): error when creating "default-sa-rolebinding.yaml"
: clusterroles.rbac.authorization.k8s.io "pod-reader" is forbidden: attempt to g
rant extra privileges: [PolicyRule{Resources:["pods"], APIGroups:[""], Verbs:["g
et"]} PolicyRule{Resources:["pods"], APIGroups:[""], Verbs:["watch"]} PolicyRule
{Resources:["pods"], APIGroups:[""], Verbs:["list"]}] user=&{xyz@gmail.
com  [system:authenticated] map[authenticator:[GKE]]} ownerrules=[PolicyRule{Res
ources:["selfsubjectaccessreviews"], APIGroups:["authorization.k8s.io"], Verbs:[
"create"]} PolicyRule{NonResourceURLs:["/api" "/api/*" "/apis" "/apis/*" "/healt
hz" "/swagger-2.0.0.pb-v1" "/swagger.json" "/swaggerapi" "/swaggerapi/*" "/versi
on"], Verbs:["get"]}] ruleResolutionErrors=[]

我不知道如何从这里开始。我的方法是正确的还是我错过了什么?

UPDATE :根据@JanosLenart在评论中引用的帖子,修改了kubectl命令并且未观察到上述错误。但是访问API仍然会出现401错误。我正在使用的curl命令是:

curl -k -1 -H "Authorization: Bearer <token>" https://<ip-address>/api/v1/namespaces/default/pods -v

2 个答案:

答案 0 :(得分:4)

@Janos指出了潜在的问题,但我认为你还需要一个真正的Cloud IAM服务帐户,因为你说:

  

我想在群集[...]

之外运行一个应用程序

如果您从外部对GKE进行身份验证,我相信您只能使用Google IAM身份。 (我可能错了,如果是的话,请告诉我。)

在这种情况下,您需要做什么:

  1. 创建一个IAM服务帐户并下载它的json密钥文件。
  2. GOOGLE_APPLICATION_CREDENTIALS设置为该文件。
  3. 或者:

    • 在您的问题中使用RBAC授予IAM服务帐户电子邮件地址的权限

    • 使用IAM角色在GKE API上提供IAM服务帐户(例如Container Developer角色通常就足够了)

  4. 对集群使用kubectl命令(确保您预先拥有集群的IP / CA证书的.kube/config文件),并使用上面的环境变量,它应该可以正常工作

答案 1 :(得分:0)

YMMV

我设法在不使用实际Cloud IAM服务帐户的情况下使其正常工作

首先,我决定通过运行在GKE的k8s集群中使用外壳程序

kubectl run curl-random --image=radial/busyboxplus:curl -i --tty --rm

第二,我确保通过复制令牌然后运行来对令牌进行解码

pbpaste | base64 -D

第三,我为服务帐户而不是用户名创建了角色绑定。

kubectl create clusterrolebinding shaoserverless-cluster-admin-binding --clusterrole=cluster-admin --serviceaccount=default:shaoserverless

第三步特别棘手,但是我得到了启发,因为错误消息曾经是 Unknown user \"system:serviceaccount:default:shaoserverless\"",

最后,这样就可以了 curl -k -1 -H "Authorization: Bearer <token>" https://<ip-address>/api/v1/namespaces/default/pods -v