【问题标题】:kube-apiserver docker is restarting continuouslykube-apiserver docker 不断重启
【发布时间】:2021-01-02 17:30:06
【问题描述】:

对这篇冗长的帖子表示诚挚的歉意。

我有一个 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: 拨打 tcp 127.0.0.1:443:连接:连接被拒绝

注意: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 docker 容器:

I0907 10:35:08.970384 1 scheduler.go:572] 吊舱 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 server.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] 与传播策略 背景 I0907 10:44:01.937398 1 leaderelection.go:263] 失败 更新租约 kube-system/kube-controller-manager:未能 超过 tryAcquireOrRenew 上下文截止日期 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=10s: net/http:请求已取消(等待时超出 Client.Timeout 标头)I0907 10:44:01.937456 1 event.go:209] 事件(v1.ObjectReference{种类:“端点”,命名空间:“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 1 garbagecollector.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: 拨打 tcp 127.0.0.1:443:连接:连接被拒绝 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:连接:连接被拒绝

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

E0915 21:52:44.703587 1 反射器.go:126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1.Node: 获取https://127.0.0.1/api/v1/nodes?limit=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: dial tcp 127.0.0.1:443: connect: connection denied E0915 21:52:44.705471 1 个反射器.go:126] k8s.io/client-go/informers/factory.go:133: 无法列出 *v1.Service: 获取 https:--127.0.0.1/api/v1/services?limit=500&resourceVersion=0: 拨打 tcp 127.0.0.1:443:连接:连接被拒绝 E0915 21:52:44.706477 1 个反射器.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 个反射器.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 denied 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 个反射器.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: 拨打 tcp 127.0.0.1:443:连接:连接被拒绝 E0915 21:52:44.710744 1 个反射器.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 反射器.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: 拨打 tcp 127.0.0.1:443:连接:连接被拒绝 E0915 21:52:44.712903 1 个反射器.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:连接:连接被拒绝

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: private key does not match public key)

下面是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" 未找到

Sep 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: 获取 https:--127.0.0.1/apis/storage.k8s.io/v1beta1/csidrivers?limit=500&resourceVersion=0: 拨打 tcp 127.0.0.1:443: connect: 连接被拒绝

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: Get https://127.0.0.1/apis/node.k8s.io/v1beta1/runtimeclasses?limit=500&resourceVersion=0: dial tcp 127.0.0.1:443: connect: connection denied

这个集群(连同其他 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] 无法连接到对等 etcd-a: map[xxx.xx.xx.xxx:3996:true] W0916 14:41:40.351887 8221 peers.go:215] 来自对等互连的意外错误:无法连接到对等 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 的更新

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] 使用 TLS 策略连接到对等点“etcd-events-a”,servername="etcd-manager-server-etcd-events-a" W0916 14:42:45.297094 8316 peers.go:325] 无法 grpc-ping 发现对等方 xxx.xx.xx.xxx:3997: rpc 错误:代码 = 不可用 desc = 所有 SubConns 都处于 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 错误:代码 = 不可用 desc = 所有 SubConns 都处于 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

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

非常感谢。

【问题讨论】:

    标签: docker kubernetes x509certificate


    【解决方案1】:

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

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

    谢谢

    【讨论】:

      【解决方案2】:

      我认为这与 ETCD 有关。您可能已经更新了 Kubernetes 组件的证书,但您是否为 ETCD 做了同样的事情? 您的 API 服务器正在尝试连接到 ETCD 并提供:

      tls: private key does not match public key)
      

      由于您只有 1 个 etcd(假设主节点的数量),我会在尝试修复它之前对其进行备份。

      【讨论】:

      • 感谢@Zambozo 的回复。我检查了/etc/kubernetes/manifests/ etcd-events.manifestetcd-main.manifest 文件,但没有看到对证书的任何引用。我在哪里可以找到 ETCD 使用的证书?为了生成 kube-apiserver 证书,我使用了 /etc/kubernetes/pki/etcd-manager-events/etcd-clients-ca.crt 之后,我只收到了 tls: private key does not match public key 的消息,更早的时候我收到了 err (context deadline exceeded) 的过期证书。另外我如何备份ETCD?如果您需要更多日志,请告诉我。
      • ETCD 证书在 etcd-manager 挂载的卷中。要找到它们,您需要 ssh 进入主节点并在 /mnt 目录中搜索(sudo find /mnt/ -name server.*sudo find /mnt/ -name me.*)。你知道cert rotation 的 kops 专用指南的存在吗?
      • 感谢@Nepomucen 的回复。我可以确认我在您输入的两条路径上都找到了 ETCD 证书,并且它们已过期。可以按照此链接kops.sigs.k8s.io/advisories/etcd-manager-certificate-expiration 实施解决方法吗?解决此问题后,我将查看证书轮换。感谢您的帮助。
      • 我设法更新了 /mnt/*/server.* 和 /mnt/*/me.* 下的所有 ETCD 证书。如果无法与对等方连接,现在会出现不同的错误。我在上面的问题部分中包含了来自 etcd-manager-main 和 etcd-manager-events docker 容器的日志。请求进一步的指导,非常感谢您的帮助。谢谢。
      • @Nepomucen:升级 etcd-manager 到 kopeio/etcd-manager:3.0.20200531 解决了这个问题。谢谢。
      猜你喜欢
      • 2019-01-10
      • 2018-10-05
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 2021-02-17
      • 2019-05-08
      • 2018-10-25
      相关资源
      最近更新 更多