现象

线上大部分容器都莫名其妙的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并不熟悉,经过一顿查资料得知:

  1. 在证书过期node节点删除kubelet相关证书文件及配置文件,然后重启kubelete,这样node节点就会向apiserver发起一个csr申请
rm -f /etc/kubernetes/kubelet.kubeconfig
rm -f /etc/kubernetes/ssl/kubelet.*
  1. apiserver节点通过kubectl get csr可以查看到未授权的CSR请求。


我又激动的去执行kubectl get csr,竟然报错。wtf。报错如下:

x509: certificate signed by unknown authority

然后我发现,所有的kubectl命令都报这个错,想看看节点状态都看不了,又开始查资料,最后看到了这篇博文:https://blog.csdn.net/woay2008/article/details/93250137,我冥冥中感觉这就是我的救星了

  1. $HOME/.kube进行备份
  2. 删除$HOME/.kube
  3. 重启apiserver,正常启动
  4. 执行kubectl get csr正常,心里长舒一口气

接着上边处理证书过期的流程

  1. 执行kubectl get csr获取到的结果长这样,状态为Pending状态的表示未授权的
NAME                                                   AGE   REQUESTOR           CONDITION
node-csr-VhWYUFuT1kNq7W9mCGCGiP1jismOtnI7MCpKjK8lxus   13h   kubelet-bootstrap   Pending
  1. apiserver节点进行授权
kubectl certificate approve node-csr-VhWYUFuT1kNq7W9mCGCGiP1jismOtnI7MCpKjK8lxus
  1. 执行完成后会发现状态变为了Approved,Issued
  2. 通过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证书;也可以设置更长的有效期。

关于开启自动续期,网上有很多教程,这里就不再赘述了。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐