首页 > 解决方案 > kube-apiserver docker 不断重启

问题描述

对于这篇冗长的帖子,我们深表歉意。

我有一个 4 节点 Kubernetes 集群,有 1 个主节点和 3 个工作节点。我使用 kubeconfig 连接到 kubernetes 集群,因为昨天我无法使用 kubeconfig 连接。

kubectl get pods出现错误“与服务器 api.xxxxx.xxxxxxxx.com 的连接被拒绝 - 您是否指定了正确的主机或端口?”

在 kubeconfig 中服务器名称指定为https://api.xxxxx.xxxxxxxx.com

笔记:

请注意,由于 https 链接太多,我无法发布问题。所以我将 https:// 重命名为 https:-- 以避免后台分析部分的链接。

我尝试kubectl从主节点运行并收到类似错误与服务器 localhost:8080 的连接被拒绝 - 您是否指定了正确的主机或端口?

然后检查了kube-apiserver docker,它一直在退出/ Crashloopbackoff。

docker logs <container-id of kube-apiserver>显示以下错误

W0914 16:29:25.761524 1 clientconn.go:1251] grpc: addrConn.createTransport 无法连接到 {127.0.0.1:4001 0 }。错误:连接错误:desc =“传输:身份验证握手失败:x509:证书已过期或尚未生效”。重新连接... F0914 16:29:29.319785 1 storage_decorator.go:57] 无法创建存储后端:config (&{etcd3 /registry {[https://127.0.0.1:4001] /etc/kubernetes/pki/kube -apiserver/etcd-client.key /etc/kubernetes/pki/kube-apiserver/etcd-client.crt /etc/kubernetes/pki/kube-apiserver/etcd-ca.crt} false true 0xc000266d80 apiextensions.k8s.io/ v1beta1 5m0s 1m0s}),错误(超出上下文截止日期)

systemctl status kubelet--> 给出以下错误

9 月 14 日 16:40:49 ip-xxx-xxx-xx-xx kubelet[2411]: E0914 16:40:49.693576 2411 kubelet_node_status.go:385] 更新节点状态时出错,将重试:获取节点时出错“ip-xxx- xxx-xx-xx.xx-xxxxx-1.compute.internal”:获取 https://127.0.0.1/api/v1/nodes/ip-xxx-xxx-xx-xx.xx-xxxxx-1.compute。 internal?timeout=10s : dial tcp 127.0.0.1:443: connect: 连接被拒绝

注意:ip-xxx-xx-xx-xxx --> aws ec2 实例的内部 IP 地址。

背景分析:

看起来集群在 2020 年 9 月 7 日出现了一些问题,kube-controller 和 kube-scheduler docker 都退出并重新启动。我相信从那时起 kube-apiserver 没有运行或者因为 kube-apiserver,那些 docker 重新启动了。kube-apiserver 服务器证书于 2020 年 7 月到期,但通过 kubectl 的访问一直有效到 9 月 7 日。

下面是docker logs from the exited kube-scheduler码头集装箱:

I0907 10:35:08.970384 1 scheduler.go:572] pod default/k8version-1599474900-hrjcn 在节点 ip-xx-xx-xx-xx.xx-xxxxxx-x.compute.internal 上成功绑定,评估了 4 个节点,发现 3 个节点可行 I0907 10:40:09.286831 1 scheduler.go:572] pod default/k8version-1599475200-tshlx 在节点 ip-1x-xx-xx-xx.xx-xxxxxx-x.compute.internal 上绑定成功,评估了 4 个节点,发现 3 个节点可行 I0907 10:44:01.935373
1 leaderelection.go:263] 未能更新租约 kube-system/kube-scheduler: 未能尝试获取或更新上下文期限超过 E0907 10:44:01.935420 1 个服务器。 go:252] 失去主人失去租约

以下是退出的 kube-controller docker 容器中的 docker 日志:

I0907 10:40:19.703485 1garbagecollector.go:518] 使用传播策略背景删除对象 [v1/Pod,命名空间:默认,名称:k8version-1599474300-5r6ph,uid:67437201-f0f4-11ea-b612-0293e1aee720] :44:01.937398 1 leaderelection.go:263] 未能更新租约 kube-system/kube-controller-manager: 未能尝试获取或更新上下文期限超过 E0907 10:44:01.937506
1 leaderelection.go:306] 检索资源锁时出错 kube-system/kube-controller-manager: 获取 https:--127.0.0.1/api/v1/namespaces/kube-system/endpoints/kube-controller-manager?timeout= 10 秒:net/http:请求已取消(等待标头时超出 Client.Timeout)I0907 10:44:01.937456 1 event.go:209] Event(v1.ObjectReference{Kind:"Endpoints", Namespace:"kube-system",名称:“kube-controller-manager”,UID:“ba172d83-a302-11e9-b612-0293e1aee720”,APIVersion:“v1”,ResourceVersion:“85406287”,FieldPath:“”}):类型:“正常”原因: 'LeaderElection' ip-xxx-xx-xx-xxx_1dd3c03b-bd90-11e9-85c6-0293e1aee720 停止领先 F0907 10:44:01.937545 1 controllermanager.go:260] 领导选举丢失 I0907 10:44:01.949274
1 range_allocator.go:169] 关闭范围 CIDR 分配器 I0907 10:44:01.949285 1 replica_set.go:194] 关闭复制集控制器 I0907 10:44:01.949291 1 gc_controller.go:86] 关闭 GC 控制器 I0907 10:44 :01.949304 1 pvc_protection_controller.go:111] 关闭 PVC 保护控制器 I0907 10:44:01.949310 1 route_controller.go:125] 关闭路由控制器 I0907 10:44:01.949316 1 service_controller.go:197] 关闭服务控制器 I0907 10 :44:01.949327 1 deployment_controller.go:164] 关闭部署控制器 I0907 10:44:01.949435 1garbagecollector.go:148] 关闭垃圾收集器控制器 I0907 10:44:01.949443 1 resource_quota_controller.go:295] 关闭资源配额控制器

以下是自重启(9 月 7 日)以来 kube-controller 的 docker 日志:

E0915 21:51:36.028108 1 leaderelection.go:306] 检索资源锁 kube-system/kube-controller-manager 时出错:获取 https:--127.0.0.1/api/v1/namespaces/kube-system/endpoints/kube- controller-manager?timeout=10s: dial tcp 127.0.0.1:443: connect: connection denied E0915 21:51:40.133446 1 leaderelection.go:306] 检索资源锁时出错 kube-system/kube-controller-manager: 获取 https: --127.0.0.1/api/v1/namespaces/kube-system/endpoints/kube-controller-manager?timeout=10s: 拨打 tcp 127.0.0.1:443: connect: 连接被拒绝

以下是自重启(9 月 7 日)以来 kube-scheduler 的 docker 日志:

E0915 21:52:44.703587 1 reflector.go:126] k8s.io/client-go/informers/factory.go:133:无法列出 *v1.Node:获取https://127.0.0.1/api/v1/节点?限制=500&resourceVersion=0:拨号 tcp 127.0.0.1:443:连接:连接被拒绝 E0915 21:52:44.704504
1 reflector.go:126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1.ReplicationController: 获取 https:--127.0.0.1/api/v1/replicationcontrollers?limit=500&resourceVersion= 0: 拨打 tcp 127.0.0.1:443: 连接: 连接被拒绝 E0915 21:52:44.705471 1 reflector.go:126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1.Service : 获取 https:--127.0.0.1/api/v1/services?limit=500&resourceVersion=0: dial tcp 127.0.0.1:443: connect: connection denied E0915 21:52:44.706477 1 reflector.go:126] k8s.io /client-go/informers/factory.go:133: 无法列出 *v1.ReplicaSet: 获取 https:--127.0.0.1/apis/apps/v1/replicasets?limit=500&resourceVersion=0: 拨打 tcp 127.0.0.1: 443:连接:连接被拒绝 E0915 21:52:44.707581 1 reflector.go:126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1。StorageClass: Get https:--127.0.0.1/apis/storage.k8s.io/v1/storageclasses?limit=500&resourceVersion=0: dial tcp 127.0.0.1:443: connect: connection refused E0915 21:52:44.708599 1 个反射器。 go:126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1.PersistentVolume: 获取 https:--127.0.0.1/api/v1/persistentvolumes?limit=500&resourceVersion=0: 拨号tcp 127.0.0.1:443: 连接: 连接被拒绝 E0915 21:52:44.709687 1 reflector.go:126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1.StatefulSet: 获取 https :--127.0.0.1/apis/apps/v1/statefulsets?limit=500&resourceVersion=0: dial tcp 127.0.0.1:443: connect: connection denied E0915 21:52:44.710744 1 reflector.go:126] k8s.io/ client-go/informers/factory.go:133: 无法列出 *v1.PersistentVolumeClaim: 获取 https:--127.0.0。1/api/v1/persistentvolumeclaims?limit=500&resourceVersion=0:拨号 tcp 127.0.0.1:443:连接:连接被拒绝 E0915 21:52:44.711879 1 reflector.go:126] k8s.io/kubernetes/cmd/kube-scheduler /app/server.go:223: 无法列出 *v1.Pod: 获取 https:--127.0.0.1/api/v1/pods?fieldSelector=status.phase%21%3DFailed%2Cstatus.phase%21%3DSucceeded&limit= 500&resourceVersion=0: dial tcp 127.0.0.1:443: connect: connection denied E0915 21:52:44.712903 1 reflector.go:126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1beta1 .PodDisruptionBudget: 获取 https:--127.0.0.1/apis/policy/v1beta1/poddisruptionbudgets?limit=500&resourceVersion=0: 拨打 tcp 127.0.0.1:443: connect: 连接被拒绝io/kubernetes/cmd/kube-scheduler/app/server.go:223: 无法列出 *v1.Pod: 获取 https:--127.0.0.1/api/v1/pods?fieldSelector=status.phase%21%3DFailed %2Cstatus.phase%21%3DSucceeded&limit=500&resourceVersion=0:拨号 tcp 127.0.0.1:443:连接:连接被拒绝 E0915 21:52:44.712903 1 reflector.go:126] k8s.io/client-go/informers/factory。 go:133: 无法列出 *v1beta1.PodDisruptionBudget: 获取 https:--127.0.0.1/apis/policy/v1beta1/poddisruptionbudgets?limit=500&resourceVersion=0: 拨打 tcp 127.0.0.1:443: connect: 连接被拒绝io/kubernetes/cmd/kube-scheduler/app/server.go:223: 无法列出 *v1.Pod: 获取 https:--127.0.0.1/api/v1/pods?fieldSelector=status.phase%21%3DFailed %2Cstatus.phase%21%3DSucceeded&limit=500&resourceVersion=0:拨号 tcp 127.0.0.1:443:连接:连接被拒绝 E0915 21:52:44.712903 1 reflector.go:126] k8s.io/client-go/informers/factory。 go:133: 无法列出 *v1beta1.PodDisruptionBudget: 获取 https:--127.0.0.1/apis/policy/v1beta1/poddisruptionbudgets?limit=500&resourceVersion=0: 拨打 tcp 127.0.0.1:443: connect: 连接被拒绝126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1beta1.PodDisruptionBudget: 获取 https:--127.0.0.1/apis/policy/v1beta1/poddisruptionbudgets?limit=500&resourceVersion=0: 拨号tcp 127.0.0.1:443:连接:连接被拒绝126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1beta1.PodDisruptionBudget: 获取 https:--127.0.0.1/apis/policy/v1beta1/poddisruptionbudgets?limit=500&resourceVersion=0: 拨号tcp 127.0.0.1:443:连接:连接被拒绝

kube-apiserver 证书更新:

我发现这个 kube-apiserver 证书/etc/kubernetes/pki/kube-apiserver/etcd-client.crt已于 2020 年 7 月过期。与 etcd-manager-main 和事件相关的其他过期证书很少(它与两个地方的证书副本相同)但我没有看到这在清单文件中引用。

我搜索并找到了更新证书的步骤,但其中大多数都使用“kubeadm init phase”命令,但我在主服务器上找不到 kubeadm,证书名称和路径与我的设置不同。因此,我使用 openssl 为 kube-apiserver 使用现有的 ca 证书生成了一个新证书,并使用 openssl.cnf 文件包含了具有内部和外部 IP 地址(ec2 实例)和环回 IP 地址的 DNS 名称。我用相同的名称替换了新证书/etc/kubernetes/pki/kube-apiserver/etcd-client.crt

之后我重新启动了 kube-apiserver docker(它一直在退出)并重新启动 kubelet。现在证书过期消息没有出现,但 kube-apiserver 不断重新启动,我认为这是 kube-controller 和 kube-scheduler docker 容器出现错误的原因。

笔记:

更换证书后,我还没有重新启动主服务器上的 docker。

注意:我们所有的生产 POD 都在工作节点上运行,因此它们不受影响,但我无法管理它们,因为我无法使用 kubectl 连接。

现在,我不确定是什么问题以及为什么 kube-apiserver 不断重启。

更新原始问题:

Kubernetes 版本:v1.14.1 Docker 版本:18.6.3

以下是最新的docker logs from kube-apiserver container(仍在崩溃)

F0916 08:09:56.753538 1 storage_decorator.go:57] 无法创建存储后端:config (&{etcd3 /registry {[https:--127.0.0.1:4001] /etc/kubernetes/pki/kube-apiserver/etcd -client.key /etc/kubernetes/pki/kube-apiserver/etcd-client.crt /etc/kubernetes/pki/kube-apiserver/etcd-ca.crt} false true 0xc00095f050 apiextensions.k8s.io/v1beta1 5m0s 1m0s} ), err (tls: 私钥与公钥不匹配)

下面是输出systemctl status kubelet

9 月 16 日 08:10:16 ip-xxx-xx-xx-xx kubelet[388]: E0916 08:10:16.095615 388 kubelet.go:2244] 节点“ip-xxx-xx-xx-xx.xx-xxxxx- x.compute.internal" 未找到

9 月 16 日 08:10:16 ip-xxx-xx-xx-xx kubelet[388]: E0916 08:10:16.130377 388 kubelet.go:2170] 容器运行时网络未准备好:NetworkReady=false 原因:NetworkPluginNotReady 消息:docker:网络插件未准备好:Kubenet 没有 netConfig。这很可能是由于缺少 PodCIDR

9 月 16 日 08:10:16 ip-xxx-xx-xx-xx kubelet[388]: E0916 08:10:16.147390 388 reflector.go:126] k8s.io/client-go/informers/factory.go:133:无法列出 *v1beta1.CSIDriver: Get https:--127.0.0.1/apis/storage.k8s.io/v1beta1/csidrivers?limit=500&resourceVersion=0: dial tcp 127.0.0.1:443: connect: connection denied

9 月 16 日 08:10:16 ip-xxx-xx-xx-xx kubelet[388]: E0916 08:10:16.195768 388 kubelet.go:2244] 节点“ip-xxx-xx-xx-xx.xx-xxxxx- x..compute.internal" 未找到

9 月 16 日 08:10:16 ip-xxx-xx-xx-xx kubelet[388]: E0916 08:10:16.295890 388 kubelet.go:2244] 节点“ip-xxx-xx-xx-xx.xx-xxxxx- x..compute.internal" 未找到

9 月 16 日 08:10:16 ip-xxx-xx-xx-xx kubelet[388]: E0916 08:10:16.347431 388 reflector.go:126] k8s.io/client-go/informers/factory.go:133:无法列出 *v1beta1.RuntimeClass:获取https://127.0.0.1/apis/node.k8s.io/v1beta1/runtimeclasses?limit=500&resourceVersion=0:拨打 tcp 127.0.0.1:443:连接:连接被拒绝

这个集群(连同其他 3 个)是使用 kops 设置的。其他集群运行正常,看起来它们也有一些过期的证书。设置集群的人无法发表评论,我对 Kubernetes 的经验有限。因此需要大师的帮助。

很感谢任何形式的帮助。

非常感谢。

Zambozo 和 Nepomucen 回复后更新:

感谢你们两位的回复。基于此,我发现 /mnt 挂载点上有过期的 etcd 证书。

我遵循了https://kops.sigs.k8s.io/advisories/etcd-manager-certificate-expiration/的解决方法

并重新创建了 etcd 证书和密钥。我已经使用旧证书的副本(来自我的备份文件夹)验证了每个证书,并且一切都匹配,并且新证书的到期日期设置为 2021 年 9 月。

现在我在 etcd docker 上遇到了不同的错误(etcd-manager-events 和 etcd-manager-main)

注意:xxx-xx-xx-xxx是主服务器的IP地址

root@ip-xxx-xx-xx-xxx:~#docker logs <etcd-manager-main container> --tail 20 I0916 14:41:40.349570 8221 peers.go:281] 使用 TLS 策略连接到对等点“etcd-a”,servername="etcd-manager-server-etcd-a" W0916 14:41:40.351857 8221 peers.go:325 ] 无法 grpc-ping 发现对等方 xxx.xx.xx.xxx:3996: rpc 错误:代码 = 不可用 desc = 所有 SubConns 都在 TransientFailure I0916 14:41:40.351878 8221 peers.go:347] 无法连接到peer etcd-a: map[xxx.xx.xx.xxx:3996:true] W0916 14:41:40.351887 8221 peers.go:215] peer intercommunications 出现意外错误:无法连接到 peer etcd-a I0916 14:41 :41.205763 8221 controller.go:173] 开始控制器迭代 W0916 14:41:41.205801 8221 controller.go:149] 运行 etcd 集群协调循环时出现意外错误:在对等点列表中找不到自我“etcd-a”[] I0916 14: 41:45.352008 8221 peers.go:281] 使用 TLS 策略连接到对等“etcd-a”,servername="etcd-manager-server-etcd-a" I0916 14:41:46.678314 8221 volumes.go:85] AWS API 请求:ec2/DescribeVolumes I0916 14: 41:46.739272 8221 volumes.go:85] AWS API 请求:ec2/DescribeInstances I0916 14:41:46.786653 8221 hosts.go:84] 主机更新:primary=map[],fallbacks=map[etcd-a.internal.xxxxx .xxxxxxx.com:[xxx.xx.xx.xxx xxx.xx.xx.xxx]], final=map[xxx.xx.xx.xxx:[etcd-a.internal.xxxxx.xxxxxxx.com etcd-a .internal.xxxxx.xxxxxxx.com]] I0916 14:41:46.786724 8221 hosts.go:181] 跳过未更改 /etc/hosts 的更新ec2/DescribeInstances I0916 14:41:46.786653 8221 hosts.go:84] 主机更新:primary=map[],fallbacks=map[etcd-a.internal.xxxxx.xxxxxxx.com:[xxx.xx.xx.xxx xxx .xx.xx.xxx]],final=map[xxx.xx.xx.xxx:[etcd-a.internal.xxxxx.xxxxxxx.com etcd-a.internal.xxxxx.xxxxxxx.com]] I0916 14:41 :46.786724 8221 hosts.go:181] 跳过未更改 /etc/hosts 的更新ec2/DescribeInstances I0916 14:41:46.786653 8221 hosts.go:84] 主机更新:primary=map[],fallbacks=map[etcd-a.internal.xxxxx.xxxxxxx.com:[xxx.xx.xx.xxx xxx .xx.xx.xxx]],final=map[xxx.xx.xx.xxx:[etcd-a.internal.xxxxx.xxxxxxx.com etcd-a.internal.xxxxx.xxxxxxx.com]] I0916 14:41 :46.786724 8221 hosts.go:181] 跳过未更改 /etc/hosts 的更新

root@ip-xxx-xx-xx-xxx:~#docker logs <etcd-manager-events container> --tail 20 W0916 14:42:40.294576 8316 peers.go:215] 来自对等互连的意外错误:无法连接到对等 etcd-events-a I0916 14:42:41.106654 8316 controller.go:173] 开始控制器迭代 W0916 14:42: 41.106692 8316 controller.go:149] 运行 etcd 集群协调循环的意外错误:在对等点列表中找不到自我“etcd-events-a”[] I0916 14:42:45.294682 8316 peers.go:281] 连接到对等点“etcd -events-a" 使用 TLS 策略,servername="etcd-manager-server-etcd-events-a" W0916 14:42:45.297094 8316 peers.go:325] 无法 grpc-ping 发现的对等 xxx.xx.xx。 xxx:3997: rpc 错误: code = Unavailable desc = all SubConns are in TransientFailure I0916 14:42:45.297117 8316 peers.go:347] 无法连接到对等 etcd-events-a: map[xxx.xx.xx .xxx:3997:true] I0916 14:42:46。791923 8316 volumes.go:85] AWS API 请求:ec2/DescribeVolumes I0916 14:42:46.856548 8316 volumes.go:85] AWS API 请求:ec2/DescribeInstances I0916 14:42:46.945119 8316 hosts.go:84] 主机更新:primary=map[],fallbacks=map[etcd-events-a.internal.xxxxx.xxxxxxx.com:[xxx.xx.xx.xxx xxx.xx.xx.xxx]],final=map[xxx.xx .xx.xxx:[etcd-events-a.internal.xxxxx.xxxxxxx.com etcd-events-a.internal.xxxxx.xxxxxxx.com]] I0916 14:42:50.297264 8316 peers.go:281] 连接到对等带有 TLS 策略的“etcd-events-a”,servername="etcd-manager-server-etcd-events-a" W0916 14:42:50.300328 8316 peers.go:325] 无法 grpc-ping 发现的对等 xxx.xx。 xx.xxx:3997: rpc 错误: code = Unavailable desc = all SubConns are in TransientFailure I0916 14:42:50.300348 8316 peers.go:347] 无法连接到对等 etcd-events-a: map[xxx.xx .xx.xxx:3997:true] W0916 14:42:50.300360 8316 peers.go:215] 来自对等互连的意外错误:无法连接到对等 etcd-events-a

您能否建议如何从这里开始?

非常感谢。

标签: dockerkubernetesx509certificate

解决方案


使用 openssl 为 kube-apiserver 生成新证书并替换证书和密钥使 kube-apiserver docker 进入稳定状态并通过 kubectl 提供访问权限。

要解决 etcd-manager 证书问题,请将 etcd-manager 升级到kopeio/etcd-manager:3.0.20200531etcd-manager-main 和 etcd-manager-events,如https://github.com/kubernetes/kops/issues/8959#issuecomment-673515269所述

谢谢


推荐阅读