不使用gcloud工具将kubectl的本地实例连接到GKE集群?

时间:2018-01-23 05:08:06

标签: kubernetes kubectl google-kubernetes-engine

有没有人知道如何将kubectl的本地实例连接到Google Kubernetes Engine(GKE)群集,而不在本地使用gcloud工具?

例如:

如果您使用此命令使用gcloud工具:

gcloud container clusters get-credentials NAME [--zone=ZONE, -z ZONE] [GCLOUD_WIDE_FLAG …]

您会在~/.kube/config中找到这样的用户:

- name: gke_myproj_myzone
  user:
    auth-provider:
      config:
        access-token: TOKENSTRING
        cmd-args: config config-helper --format=json
        cmd-path: /google/google-cloud-sdk/bin/gcloud
        expiry: 2018-01-22 18:05:46
        expiry-key: '{.credential.token_expiry}'
        token-key: '{.credential.access_token}'
      name: gcp

正如您所看到的,gcloud工具提供的默认值需要glcoud工具作为 auth-provider 才能登录您的群集。

现在,我正在寻找的方法是将kubectl连接到未安装gcloud的计算机上的群集。

3 个答案:

答案 0 :(得分:4)

实现此目的的最简单方法是将~/.kube/config文件(从gcloud身份验证的实例)复制到本地实例(笔记本电脑)中的此目录$HOME/.kube

但首先,使用经过身份验证的实例,您必须通过运行以下命令为此document启用旧群集:

gcloud config set container/use_client_certificate True
export CLOUDSDK_CONTAINER_USE_CLIENT_CERTIFICATE=True

然后执行get-credentials命令,并复制该文件。

gcloud container clusters get-credentials NAME [--zone=ZONE, -z ZONE] [GCLOUD_WIDE_FLAG …]

请注意,您可能必须运行get-credentials命令,并在每次身份验证令牌(保存在配置文件中)到期时复制配置文件。

答案 1 :(得分:1)

因此,我已经创建了一个名为gke-kubeconfig的工具。我基本上对gcloud进行了反向工程,并做了同样的事情。它首先请求一个短期令牌,然后使用它来获取集群数据并创建kube配置。

您需要确保令牌在使用配置文件时不会过期,它当前会在1小时后过期,因此通常应该没有问题。

我还创建了mie00/gke-kubeconfig以便在我的CI管道中使用。

答案 2 :(得分:1)

您可以将kubectl与用户帐户或服务帐户一起使用。

用户帐户被设计为供人类使用,因此这些工具显然受到“限制”:如果您使用GKE群集,则假定用户已安装gcloud并使用该帐户登录。 / p>

您可以改而使用设计为软件使用的服务帐户。 Kubernetes具有专用的资源类型ServiceAccount(不要将其与GCP服务帐户混淆!)。额外的好处-这是一项k8s功能,因此它不取决于您使用的服务实现(GKE,AKS等)。

方法:

您只需要gcloud工具即可首次连接到群集。访问群集后,可以创建一个新的k8s ServiceAccount,并在kubectl配置文件中使用其令牌。

但是,必须以细粒度的方式使用assigned necessary roles(k8s RoleRoleBinding资源)服务帐户。

您的群集需要启用RBAC身份验证才能工作。

警告语:

服务帐户令牌不会过期,因此应格外小心,以免暴露或破坏令牌。旋转它们可能是一个好主意。

简单的示例:

这是完成上述操作的简化示例。它相当简单,因为它使用默认的名称空间,仅添加了几个角色,并且需要大量的手动操作,但是它可以帮助您开始自己的实现。

创建文件my-service-account.yaml

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: my-user-role
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-user-role-binding
subjects:
  - kind: ServiceAccount
    name: my-user
roleRef:
  kind: Role
  name: my-user-role
  apiGroup: rbac.authorization.k8s.io

并运行kubectl apply -f my-service-account.yaml来创建资源。

创建服务帐户后,您可以运行kubectl get secrets来查找持有用户令牌的机密(它的名称是从服务帐户名派生的),然后运行kubectl get secret <secret-name-here> -o yaml来获取机密数据,然后在输出的data.token字段中找到一个令牌。该令牌是base64编码的,因此您需要先对其进行解码,然后才能在kubectl配置文件中使用(为此,您可以在Linux中使用base64 -d)。最后,kubectl配置文件的相关部分可能如下所示:

apiVersion: v1
clusters:
  ...
contexts:
  ...
users:
- name: my-user
  user:
    token: <token-value-here>

现在,您可以将kubectl上下文切换到您为此用户创建的上下文,然后运行:

kubectl get pods

新创建的用户只能执行上述操作,而几乎不能执行其他任何操作,因为这是在关联角色中配置的。您可以在Kubernetes文档中找到有关RBAC和角色配置的更多信息:Using RBAC Authorization