设置CLOUDSDK_CONFIG时无法使用Go客户端访问Kubernetes集群

时间:2018-10-08 14:02:46

标签: kubernetes kubernetes-go-client

我在GKE上有一个kubernetes集群。即使正确设置了KUBECONFIG =“ / tmp / kubeconfigxvz”,当我执行kubectl get pods时,命令也会失败,并显示以下错误

bash-4.3# kubectl get pods
Unable to connect to the server: error executing access token command 
"/google-cloud-sdk/bin/gcloud config config-helper --format=json": err=exit 
status 1 output= stderr=ERROR: (gcloud.config.config-helper) You do not 
currently have an active account selected.
Please run:

  $ gcloud auth login

to obtain new credentials, or if you have already logged in with a
different account:

  $ gcloud config set account ACCOUNT

to select an already authenticated account to use.

当我设置CLOUDSDK_CONFIG=/tmp/customdir时,命令开始工作。

如何通过go客户端实现相同的目标?

===更新===

创建go客户端时,我将正确的文件指针传递给此函数 clientcmd.BuildConfigFromFlags("", *tmpKubeConfigFile),其中tmpKubeConfigFile指向/tmp/kubeconfigxvz。 但是我认为这还不够,go客户端还需要CLOUDSDK_CONFIG目录中的更多信息,我认为它需要会话信息或凭据或其他东西。

创建go-client时是否也可以传递此CLOUDSDK_CONFIG?

BuildConfigFromFlags,它输入指向kubeconfig文件的指针并返回一个config对象,该对象可以传递给创建客户端的kubernetes.NewForConfig(config)。是否有可能或者是否存在类似的功能来传递CLOUDSDK_CONFIG并返回go-client或创建配置?

1 个答案:

答案 0 :(得分:2)

基本上,您需要创建一个~/.kube/config文件才能直接访问GKE集群。

您可以看到in this go client example正在从~/.kube/config那里获取配置

GKE配置看起来像这样:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: [REDACTED]
    server: https://x.x.x.x
  name: gke_project_us-central1-a_your-first-cluster-1
contexts:
- context:
    cluster: gke_project_us-central1-a_your-first-cluster-1
    user: gke_project_us-central1-a_your-first-cluster-1
  name: gke_project_us-central1-a_your-first-cluster-1
current-context: gke_project_us-central1-a_your-first-cluster-1
kind: Config
preferences: {}
users:
- name: gke_project_us-central1-a_your-first-cluster-1
  user:
    auth-provider:
      config:
        cmd-args: config config-helper --format=json
        cmd-path: /google/google-cloud-sdk/bin/gcloud
        expiry-key: '{.credential.token_expiry}'
        token-key: '{.credential.access_token}'
      name: gcp

您必须使用类似以下内容来更改用户部分:

- name: myuser
  user:
     token: [REDACTED]

该用户是带有令牌的服务帐户,如果您想添加此用户来管理集群中的所有内容,则可以将其ClusterRoleBind扮演admin角色。

有关RBACServiceAccountsRolesClusterRolesUsers的更多信息,请参见here

不幸的是,不幸的是,GKE不允许您访问主节点,因此您无法创建证书身份验证,因为您无权访问CA.key文件。