前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TKE集群节点执行kubectl报错

TKE集群节点执行kubectl报错

原创
作者头像
聂伟星
修改2021-04-21 12:57:36
1.5K0
修改2021-04-21 12:57:36
举报
文章被收录于专栏:腾讯云容器运维

kubectl是一种访问k8s集群的命令行工具,其实就是通过kubecofng来和apiserver进行身份鉴权,然后调用apiserver的接口,获取对应的信息。tke集群默认每个节点会安装kubectl命令的,大家可以随便登录一个节点通过kubectl命令去访问集群,但是新建集群或者新加节点到集群的时候,会出现新节点隔一段后执行kubectl命令报错的问题,具体报错如下:

代码语言:javascript
复制
# kubectl get node
error: You must be logged in to the server (Unauthorized)
代码语言:javascript
复制
$ 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就过期了。

代码语言:javascript
复制
[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文件。

1. 控制台获取kubeconfig

登录腾讯云控制台,进入容器服务,点击到集群里面,在基本信息找到kubeconfig,点击下载或者复制文件

2. 获取集群的kubernetes service ip

tke集群的控制台,点击服务于路由,点击service,然后选择default命名空间,记录 kubernetes这个service的服务ip。

3. 登录节点替换kubeconfig

代码语言:javascript
复制
$ 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 控制台获取kubeconfig
  • 2. 获取集群的kubernetes service ip
  • 3. 登录节点替换kubeconfig
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档