前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过token给TKE集群生成kubeconfig

通过token给TKE集群生成kubeconfig

原创
作者头像
聂伟星
修改2023-02-28 19:16:09
1.2K0
修改2023-02-28 19:16:09
举报

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都可以直接访问到集群。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 如何获取token
    • 1.1 云api接口获取token
      • 1.2 通过kubectl生成集群token
        • 1.2.1 创建serviceAccount
        • 1.2.2. 为serviceAccount绑定集群角色
        • 1.2.3.获取serviceAccount对应的token
    • 2. 获取集群apiserver访问地址
    • 3. 获取集群CA证书
      • 3.1 api接口获取ca证书
        • 3.2 控制台kubeconfig获取
          • 3.3 集群node节点获取
          • 4. 生成kubeconfig
            • 4.1 设置集群参数
              • 4.2 设置客户端认证参数
                • 4.3 设置上下文参数
                  • 4.4 设置默认上下文
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档