【发布时间】: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 20I0916 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 20W0916 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