网络知识 娱乐 如何用证书或者token访问TKE集群api接口

如何用证书或者token访问TKE集群api接口

使用k8s的过程中我们会经常访问集群的api接口,但是通常k8s的apiserver都是用https认证,当我们想直接访问api接口的时候都是需要进行认证的,这个在tke集群中同样也是如此,那么当我们需要在代码或者用curl请求去访问tke集群的api接口该怎么办呢?下面我们讲讲通过客户端证书或者集群token来访问tke集群的api接口。

1. 客户端证书访问tke集群api接口

既然我们想用客户端证书去访问api,那么证书该从哪里来呢?其实tke集群的kubeconfig都是通过证书进行认证的,每一个用户都有自己的kubeconfig,里面有客户端的证书用来和apiserver进行鉴权认证的,所以我们可以直接从kubeconfig中提取所需要的客户端证书。

进入到kubelet的kubeconfig目录下

cd /etc/kubernetes

依次执行以下命令,分别从 kubeconfig 文件中获取 cert、key 和 apiserver 信息

cat  ./kubelet-kubeconfig |grep client-certificate-data | awk -F ' ' '{print $2}' |base64 -d > client-cert.pem
cat  ./kubelet-kubeconfig |grep client-key-data | awk -F ' ' '{print $2}' |base64 -d > client-key.pem
APISERVER=`cat  ./kubelet-kubeconfig |grep server | awk -F ' ' '{print $2}'`

然后执行cur命令访问apiserver

curl --cert client-cert.pem --key client-key.pem -k $APISERVER/api/

获取集群中所有namespace

curl --cert client-cert.pem --key client-key.pem -k $APISERVER/api/v1/namespaces

这里就不一一举例,其他接口的访问,可以参考官方文档https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/ 。

执行curl命令访问的时候会出现下面报错

因为这里发起curl请求的是匿名用户,匿名用户一般在集群的权限是不够的,所以这里需要通过rbac给匿名用户绑定下clusterrole,这里我们给绑定下集群的管理员角色tke:admin,然后访问就没问题了

kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=tke:admin --user=system:anonymous

2. token访问集群api

大家都知道tke集群开启了rbac后,每个账号都是通过证书和apiserver进行认证,不再提供token,但是我们这里如果需要用到token还是可以获取的,具体获取方式参考文档https://cloud.tencent.com/developer/article/1762567 ,根据文档获取到集群token后,apiserver的地址可以根据上面APISERVER获取方式获取,token和apiserver地址都获取了,然后就可以访问api了。注意,为了避免token被泄露,下面token都是被修改的。

获取集群api接口

curl -k -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsIZXQubmFtZSI6InRrZS1hZG1pbi10b2tlbi1od3F3MiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ0a2UtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiMTJhYzU0Yi02N2I1LTQymYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDp0a2UtYWRtaW4ifQ.cVvAALd2ARAFwm5eMmrIxu2mbMB8fcvKiDlKO05-oYwBiKxagBJnZN2TQsANRkGzdMUp0IaZrZXpvvt4R48Fe5qxIzNkF7tvi0ZOQ4cY75jS7ZcpIVqRhUHGcRh8DOemWGa940UAF_k5CWX1Xf4y_odAEM-rW5IIsLesWXfdoBkf5PHfnD_XKGHBTZ0Io0OKC_cRNDQrxCYCRglcXNojCksHFec1bQVmUQpeVlkH8iAtvvpUHknM9W5KpwCeYmMgre0fVmy8v1wzLOSFrKWIBTJ_VZRoc7qMKFVRpszzoDtjfehLcJ-uualdCaXe0utsB2w9Sk15jnZtEyCb3qveZQ" https://cls-xxxxxx.ccs.tencent-cloud.com

获取集群的namespace

curl -k -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImphQ0RWTFBlNTJ0aXNDSUNkTUJzdHBlbTBLSFVGTmd0UF9JWGMwOFNqM2MifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhYNvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2Uiy9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InRrZS1hZG1pbi10b2tlbi1od3F3MiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ0a2UtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiMTJhYzU0Yi02N2I1LTQyNjktOTc3MC0xMGE5MTIzNDhhZmYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmY2mbMB8fcvKiDlKO05-oYwBiKxagBJnZN2TQsANRkGzdMUp0IaZrZXpvvt4R48Fe5qxIzNkF7tvi0ZOQ4cY75jS7ZcpIVqRhUHGcRh8DOemWGa940UAF_k5CWX1Xf4y_odAEM-rW5IIsLesWXfdoBkf5PHfnD_XKGHBTZ0Io0OKC_cRNDQrxCYCRglcXNojCksHFec1bQVmUQpeVlkH8iAtvvpUHknM9W5KpwCeYmMgre0fVmy8v1wzLOSFrKWIBTJ_VZRoc7qMKFVRpszzoDtjfehLcJ-uualdCaXe0utsB2w9Sk15jnZtEyCb3qveZQ" https://cls-xxxx.ccs.tencent-cloud.com//api/v1/namespaces

这里就不一一举例,其他接口的访问,可以参考官方文档https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/

这里我们也可以用postman去访问,填写token和apiserver的地址,然后发起请求即可。