线上k8s集群节点授权过期问题处理
现象线上大部分容器都莫名其妙的crash了,当时匆忙忘了截图,通过命令kubectl get nodes查看节点状态发现80%的node节点状态都为NotReady状态。问题处理过程kube-apiserver启动错误问题最开始先是公司另一位同事处理的,不知道操作了什么导致apiserver起不来了,查看报错日志如下:Unable to create storage backend:config
现象
线上大部分容器都莫名其妙的crash了,当时匆忙忘了截图,通过命令kubectl get nodes
查看节点状态发现80%的node节点状态都为NotReady
状态。
问题处理过程
kube-apiserver启动错误问题
最开始先是公司另一位同事处理的,不知道操作了什么导致apiserver
起不来了,查看报错日志如下:
Unable to create storage backend:
config (&{ /registry [https://xx.xx.xx.1:2379 https://xx.xx.xx.2:2379] /etc/kubernetes/ssl/kubernetes-key.pem /etc/kubernetes/ssl/kubernetes.pem /etc/kubernetes/ssl/ca.pem true 0xc0000e1b00 <nil> 5m0s 1m0s}),
err (dial tcp xx.xx.xx.48:2379: connect: connection refused)
etcd问题
发现是由于etcd节点拒绝连接导致的,因此我就去尝试启动etcd节点,发现etcd报错,主要报错信息如下
member c2c5804bd87e2884 has already been bootstrapped
查看资料说是:其中一个成员是通过discovery service引导的。必须删除以前的数据目录来清理成员信息。否则成员将忽略新配置,使用旧配置。这就是为什么你看到了不匹配,启动失败的原因在于data-dir (/var/lib/etcd/default.etcd)中记录的信息与 etcd启动的选项所标识的信息不太匹配造成的。(这里是看的这篇博文:https://www.cnblogs.com/kaye/p/10600597.html)
最终通过在启动项中参数--initial-cluster-state=new
修改为--initial-cluster-state=existing
再重启就可以了,表示不再初始化集群状态(个人猜测)。
再次尝试启动,启动成功了,因此使用同样的方式将其他etcd节点启动。
证书过期授权问题
前边已经把etcd节点都启动好了,我就自信满满的去启动kube-apiserver
了,结果当然是不成功,又报错:
Sep 22 16:56:13 web-2.novalocal kube-apiserver[10945]: E0922 16:56:13.099304 10945 authentication.go:65] Unable to authenticate the request due to an error: [x509: certificate has expired or is not yet valid, x509: certificate has expired or is not yet valid]
这一看就是认证过期了呀,由于对k8s并不熟悉,经过一顿查资料得知:
- 在证书过期node节点删除kubelet相关证书文件及配置文件,然后重启kubelete,这样node节点就会向apiserver发起一个csr申请
rm -f /etc/kubernetes/kubelet.kubeconfig
rm -f /etc/kubernetes/ssl/kubelet.*
- 在
apiserver
节点通过kubectl get csr
可以查看到未授权的CSR请求。
我又激动的去执行kubectl get csr
,竟然报错。wtf。报错如下:
x509: certificate signed by unknown authority
然后我发现,所有的kubectl
命令都报这个错,想看看节点状态都看不了,又开始查资料,最后看到了这篇博文:https://blog.csdn.net/woay2008/article/details/93250137,我冥冥中感觉这就是我的救星了
- 对
$HOME/.kube
进行备份 - 删除
$HOME/.kube
- 重启
apiserver
,正常启动 - 执行
kubectl get csr
正常,心里长舒一口气
接着上边处理证书过期的流程
- 执行
kubectl get csr
获取到的结果长这样,状态为Pending
状态的表示未授权的
NAME AGE REQUESTOR CONDITION
node-csr-VhWYUFuT1kNq7W9mCGCGiP1jismOtnI7MCpKjK8lxus 13h kubelet-bootstrap Pending
- 在
apiserver
节点进行授权
kubectl certificate approve node-csr-VhWYUFuT1kNq7W9mCGCGiP1jismOtnI7MCpKjK8lxus
- 执行完成后会发现状态变为了
Approved,Issued
- 通过
kubectl get nodes
查看节点状态,刚刚授权的节点状态已经变为Ready
欣喜若狂,到这里主要问题就已经解决了,剩下的问题就是对剩下的Not Ready
状态的节点执行同样的操作了,通过ansible
节点批量分发命令即可:
最后在apiserver
节点批量授权即可,批量授权命令如下:
kubectl get csr | grep Pending | awk '{print $1}' | xargs kubectl certificate approve
执行完成后,再去查看节点,再去查看节点状态,发现大部分节点状态都已经是Ready
状态,容器也都启动起来了,这里需要注意的是,有的节点状态同步可能会有一定延迟,需要等待一会儿。
开启kubelet证书自动续期
在kubernetes1.7之后,可以采用集群自动签发证书方案,但仍然需要手动重启kubelet, 在1.8之后,就可以自动签发,自动renew证书;也可以设置更长的有效期。
关于开启自动续期,网上有很多教程,这里就不再赘述了。
更多推荐
所有评论(0)