通过token给TKE集群生成kubeconfig

2023-02-28 19:16:09 浏览数 (2)

tke集群默认会给每个子账号提供kubeconfig,子用户控制台就能获取到,为什么这里还要通过token生成tke的kubeconfig给子用户使用?

这是因为企业里面,很多人员没有腾讯云账号,只有运维有腾讯云账号,这样子用户获取不到kubeconfig,还有就是用户是合作公司,也没有腾讯云账号,但是又需要操作集群,这个时候需要给用户提供下kubeconfig才行。

当然运维也可以在腾讯云创建一个子账号,然后将这个子账号的kubeconfig给没有腾讯云账号的用户,但是所有人都用这一个kubeconfig,这个可能不是很好区分,并且会将uin这些信息泄漏出去,所以我们也可以通过集群的token来给不同用户生成kubeconfig,然后提供使用。

下面我们来说说如何获取集群的token,并通过token来给不同用户生成集群的kubeconfig。注意下面操作的前提是,你已经是tke集群的管理员了。

1. 如何获取token

这里获取集群的token,有2种方式,一种是云api获取,还有就是通过kubectl命令创建集群的token。

1.1 云api接口获取token

可以通过https://cloud.tencent.com/document/api/457/36703这个接口获取集群的token,response的password字段就是集群token,但是这个token的权限是admin,如果不需要那么大权限的token,就不能通过这个方式获取token,需要通过kubectl命令来生成token。

1.2 通过kubectl生成集群token

通过kubectl命令生成token的具体操作如下:

1.2.1 创建serviceAccount

代码语言:javascript复制
kubectl create sa tke-admin

1.2.2. 为serviceAccount绑定集群角色

我们新版的rbac权限控制有4个如下预设角色,既然我们的新的admin需要足够的权限,那就给他管理员权限。

  • 管理员(tke:admin):对所有命名空间下资源的读写权限,具备集群节点、存储卷、命名空间、配额的读写权限,可配置子账号的读写权限。
  • 运维人员(tke:ops):对所有命名空间下控制台可见资源的读写权限,具备集群节点、存储卷、命名空间、配额的读写权限。
  • 开发人员(tke:dev):对所有命名空间下控制台可见资源的读写权限。
  • 受限人员(tke:ro):对所有命名空间下控制台可见资源的只读权限。
代码语言:javascript复制
kubectl create clusterrolebinding tke-admin-binding --clusterrole=tke:admin --serviceaccount=default:tke-admin

1.2.3.获取serviceAccount对应的token

新的admin用户已经创建好了,下面我们来获取下这个账号的token用于jenkins里面认证

代码语言:javascript复制
[root@VM-0-13-centos ~]# kubectl get sa tke-admin -o=jsonpath='{.secrets[0].name}'
tke-admin-token-hwqw2
[root@VM-0-13-centos ~]# kubectl get secret tke-admin-token-hwqw2 -o=jsonpath='{.data.token}' | base64 -d    
eyJhbGciOiJSUzI1NiIsImtpZCI6ImphQ0RWTFBlNTJ0aXNDSUNkTUJzdHBlbTBLSFVGTmd0UF9JWGMwOFNqM2Mi

通过上命令获取sa的token,然后进行base64解密就是你可以使用的token了(注意防止token泄露,上面token已进行删减)。

注意:上面我们示例是创建admin权限的token,如果需要其他权限,只需要修改sa绑定的clusterrole即可,比如只读,--clusterrole=tke:ro,也绑定自定义权限的clusterrole。

2. 获取集群apiserver访问地址

这里集群的apiserver访问地址需要在控制台开启下内网或者公网访问,如果你是提供公网访问则开启外网访问,内网访问就开启内网内网,开启的访问方式支持ip和域名,如果是域名的话,需要自行配置dns解析才行。 tke集群的apiserver的访问端口默认是443,所以我的集群的apiserver访问地址就是https://172.16.4.9。

3. 获取集群CA证书

生成kubeconfig还需要获取下集群的ca证书,获取集群的ca证书有多种方式,一种是通过api接口,还有从控制台提供的kubeconfig获取,当然也可以登陆节点获取。

3.1 api接口获取ca证书

可以通过https://cloud.tencent.com/document/api/457/36703这个接口获取集群的ca证书,返回的CertificationAuthority字段就是集群的ca证书。

3.2 控制台kubeconfig获取

一般控制台获取集群的kubeconfig,需要开启内网或者公网访问才会提供对应的kubeconfig,kubeconfig里面有ca证书可以直接从kubeconfig提取,certificate-authority-data字段就是集群的ca证书,这里将对应的值base64解密下即可,kubeconfig里是通过base64加密过的。

3.3 集群node节点获取

集群的每个节点都有集群的ca证书,对应文件是/etc/kubernetes/cluster-ca.crt,可以直接从这里获取。

4. 生成kubeconfig

上面我们获取了集群token,apiserver访问地址,还有集群的ca证书,接下来我们可以生成kubeconfig了。

4.1 设置集群参数

代码语言:javascript复制
kubectl config set-cluster ${CLUSTERID} --certificate-authority=./ca.crt --embed-certs=true --server=${APISRRVICE} --kubeconfig=xxx.kubeconfig

CLUSTERID是集群名称,--embed-certs=true表示将certificate-authority证书写入到生成的xxx.kubeconfig文件中,--certificate-authority指定集群的ca证书,--server指定集群的apiserver地址。

4.2 设置客户端认证参数

代码语言:javascript复制
kubectl config set-credentials test --token=${TOKEN} --kubeconfig=xxx.kubeconfig

test是客户端用户名,--token是指定集群token。

4.3 设置上下文参数

代码语言:javascript复制
kubectl config set-context ${CLUSTERID}-default --cluster=${CLUSTERID} --user=test --kubeconfig=xxx.kubeconfig

${CLUSTERID}-default上下文名称

4.4 设置默认上下文

代码语言:javascript复制
kubectl config use-context ${CLUSTERID}-default --kubeconfig=xxx.kubeconfig

执行完上面的步骤后,会在当前目录生成一个xxx.kubeconfig文件,后面就可以通过这个kubeconfig访问集群了。

如果需要批量生成kubeconfig,可以用下面脚本,先将上面1-3步骤获取的信息填写到脚本的变量里面。然后执行脚本,传入对应的客户端用户名参数,多个用户名空格隔开。

代码语言:javascript复制
#!/bin/bash

TOKEN="OIMxxxxxxxxxxxxxxxxP7Apq9fY"
APISRRVICE="https://172.16.4.9"
CLUSTERID="cls-xxxx"
CA_CERT="-----BEGIN CERTIFICATE-----
MIICyDCCAbCgAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
cm5ldGVzMB4XDTIyMDMxNTEwNDQxNVoXDTMyMDMxMjEwNDQxNVowFTETMBEGA1UE
AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALwh
/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAGFzhBWQX0GV75WJKL8PpJ4rpkS/
slgGHdsu6xJ859ZtNfcZrtguJbSb6 GZeqA9tFFNCZRs1ZSn78g 3ja4Whu1HoU9
KRZ7CsOutPacEkHaZP3k95Vdiym y4wJlFuu7GRmHY6FdOeYPafb5uXqhWv50 Iv
bYslSSzLcygYlYuRwKDqdb0cJBj06y4fZhhQACZ33Y0iTQAJ CpRnHnu2muqFjIG
YYyFWr8loHu8dT17alcvOVCIdfjXjeEzqpmTqOiIkuZY/zTz3KaXzilxYYU7FhFz
DebKmev/6E0kWj/yrL2knkP1INbtEgRKDUz055sUkMwMhN2gsJHUBq4zfuY=
-----END CERTIFICATE-----"

cat > ./ca.crt <<EOF
${CA_CERT}
EOF

for i in $@ ; do
    # 设置集群参数 --embed-certs为true时表示将certificate-authority证书写入到生成的xxxx.kubeconfig文件中
    kubectl config set-cluster ${CLUSTERID} --certificate-authority=./ca.crt --embed-certs=true --server=${APISRRVICE} --kubeconfig=${i}.kubeconfig

    # 设置客户端认证参数
    kubectl config set-credentials ${i} --token=${TOKEN} --kubeconfig=${i}.kubeconfig

    # 设置上下文参数
    kubectl config set-context ${CLUSTERID}-default --cluster=${CLUSTERID} --user=${i} --kubeconfig=${i}.kubeconfig

    # 设置默认上下文
    kubectl config use-context ${CLUSTERID}-default --kubeconfig=${i}.kubeconfig
done

rm -rf ./ca.crt

测试后,生成的每个kubeconfig都可以直接访问到集群。

0 人点赞