有没有人知道如何将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
的计算机上的群集。
答案 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 Role
和RoleBinding
资源)服务帐户。
您的群集需要启用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。