kubectl是一种访问k8s集群的命令行工具,其实就是通过kubecofng来和apiserver进行身份鉴权,然后调用apiserver的接口,获取对应的信息。tke集群默认每个节点会安装kubectl命令的,大家可以随便登录一个节点通过kubectl命令去访问集群,但是新建集群或者新加节点到集群的时候,会出现新节点隔一段后执行kubectl命令报错的问题,具体报错如下:
# kubectl get node
error: You must be logged in to the server (Unauthorized)
$ kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?
为什么会出现这个错误呢,其实具体原因和解决方案可以参考文档https://cloud.tencent.com/document/product/457/48164 。这里我们只是详细说明下操作步骤。
执行kubectl命令报错的大致原因就是为了节点安全,节点不再发放admin用户永久的kubeconfig,而是将admin用户证书和私钥改成了12小时有效期,仅仅用来保证节点能成功加入到集群,所以这里报错就是因为节点的$HOME/.kube/config
这个文件里面用户的证书和私钥过期了,导致和apiserver鉴权失败了。
这里我们可以根据当前的kubecofig来查询下证书有效期时间是否是12小时,通过下面方式可以查看到kubecofig的客户端证书的有效期确实只有12小时,到2021年4.16号19:11:42就过期了。
[root@VM-8-8-centos .kube]# cd $HOME/.kube
[root@VM-8-8-centos .kube]# cat config |grep client-certificate-data | awk -F ' ' '{print $2}' |base64 -d > client-cert.pem
[root@VM-8-8-centos .kube]# openssl x509 -in client-cert.pem -noout -dates
notBefore=Apr 16 07:11:42 2021 GMT
notAfter=Apr 16 19:11:42 2021 GMT
既然知道原因了,那么解决方法自然就知道了,我们找一个证书和私钥不过期的kubeconfig就行,那么怎么获取呢?其实集群的基本信息里面有kubecofig,你可以看到你子账号UIN生成的一个kubeconfig,这个kubeconfig的秘钥是永久有效期的。
但是有一个另外的问题就是,你UIN账号对应的kubeconfig里面apiserver的地址是配置的域名,如果你没开启内网或者公网访问,那么就说明这个域名是无法解析到对应的clb上的,公网和内网访问其实就是用clb来负载均衡到后端的apiserver。
因为在节点上执行kubectl是在集群内访问apiserver,这里我们可以直接用apiserver对应的ClusterIP类型的service来访问到后端的apiserver,很多人都是托管集群,master组件都无法访问,那我怎么才能获取apiserver的service,其实tke这边已经在集群创建的时候就在defalut命名空间下创建了一个名称为kubernetes的service,这个service是可以直接访问到集群的apiserver的。意味着在集群内我们可以直接通过kubernetes这个service去访问apiserver。
既然域名解析不了,我们有只需要在集群内访问apiserver,这里直接将控制台的kubecofig文件clusters.cluster.server字段换成kubernetes这个service的ip和443端口就行,因为和apiserver通讯都是https,所以这里用443端口,下面我们具体说下怎么配置节点的kubecofng文件。
登录腾讯云控制台,进入容器服务,点击到集群里面,在基本信息找到kubeconfig,点击下载或者复制文件
tke集群的控制台,点击服务于路由,点击service,然后选择default命名空间,记录 kubernetes这个service的服务ip。
$ vi $HOME/.kube/config
这里登录cvm编辑下节点$HOME/.kube/config
文件,然后将控制台复制的kubecofig文件内容替换进去,并修改文件clusters.cluster.server
这个字段为kubernetes的service ip和443端口,https://服务ip:443,如上图所示。
修改完成后按ESC键然后:wq保存退出,然后再执行kubectl命令即可正常访问apiserver。
-
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。