【问题标题】:Accessing Kubernetes API in GKE using service accounts使用服务帐号访问 GKE 中的 Kubernetes API
【发布时间】:2018-04-09 11:06:16
【问题描述】:

我的 Kubernetes 集群在 GKE 中运行,我想在集群外运行应用程序并与 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=[]

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

更新:根据@JanosLenart在cmets中引用的帖子,修改了kubectl命令,没有观察到上述错误。但是访问 API,仍然给出 401 错误。我使用的 curl 命令是:

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

【问题讨论】:

  • GKE clusterrolebinding for cluster-admin fails with permission error 的可能重复项。否则你的方法是合理的!
  • @JanosLenart 另一个帖子,解决了我在创建集群角色时遇到的禁止错误。但是访问 API,仍然会出现 401 错误。我使用的 curl 命令是:curl -k -1 -H "Authorization: Bearer &lt;token&gt;" https://&lt;ip-address&gt;/api/v1/namespaces/default/pods -v

标签: kubernetes google-kubernetes-engine


【解决方案1】:

@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文件)和上面的环境变量,它应该可以工作。

【讨论】:

  • 我会试试这个。但是,Kubernetes 服务帐户方法是否应该在无需创建 Google IAM 服务帐户的情况下工作?我直接访问 Kubernetes API,而不是通过 GKE 列出的 API
  • 这是一个比其他 +1 更好的答案
【解决方案2】:

YMMV

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

首先,我决定通过运行在 GKE 的 k8s 集群中使用一个 shell

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多