kubectl 重启pod_kube-controller-manager反复重启解决

背景

某环境,kube-controller-manager反复重启,尝试重建kube-controller-manager的pod,但是过一会问题复现。
d8a0307d077ca6954c9675164704419a.png

如上图,kube-controller-manager反复重启了200多次了。

排查

1.通过kubectl logs -n kube-system kube-controller-manager-xxx查看kube-controller-manager日志,日志显示“failed to renew lease kube-system/kube-controller-manager: failed to tryAcquireOrRenew context deadline exceeded”

254c980184743890ee52713d2a417b06.png

2.参考一次kube-controller-manager的bug导致的线上无法调度处理过程,通过kubectl get --raw /api/v1/namespaces/kube-system/endpoints/kube-controller-manager | jq .|grep resource对比正常环境和此异常环境的resourceVersion,异常环境确实kube-controller-manager的endpoint,resourceVersion一直维持不变。

d55c6af6a892a06e8c3350af27b8f1b6.png
7694cc2bdabf561254d4c9339624ed9d.png

3.通过kubectl delete endpint -n kube-system kube-controller-manager,删除此endpoint, 发现kube-controller-manager启动成功,同时此endpoint的resourceVersion开始更新,初始以为问题解决,后发现kube-controller-manager反复重启问题依旧,日志报错仍和之前一样。

897c8e8c26c75676625e75b709093328.png

4.分析kube-controller-manager启动参数,leader-elect设置为true,此为高可用场景下多个kube-controller-manager实例竞争选举哪个实例为leader角色的开关,开启时kube-controller-manger实例启动时会连接kube-api竞争创建名为kube-controller-manager的endpoint,创建成功的kube-controller-manger实例为leader,其他实例为backup,同时leader实例需要定期更新此endpoint,维持leader地位。

841fa2ad662b245b3eaec009aaf06c54.png

5.分析kube-controller-manager日志,显示更新此endpoint超时,初始怀疑kube-api异常,检查kube-api日志未发现异常,同时kubectl操作流畅,通过curl调用kube-api 6443端口也正常响应,排除kube-api本身问题。

6.综上,排除kube-api问题后,怀疑kube-controller-manager实例连接kube-api的网络异常,检查/etc/kubernetes/controller-manager.conf发现,发现问题所在,环境配置了kube-controller-manager通过公网IP去连接kube-api,环境为公有云环境,有内外网IP,通过自动化部署工具创建集群时指定了公网IP,导致kube-controller-manager和kube-scheduler都是通过kube-api所在节点的公网IP去连接,导致连接不稳定。修改相关地址为内网IP后,问题未复现。

861dde6b3e0724c824c368f1d888cac4.png

总结

1.“failed to renew lease kube-system/kube-controller-manager: failed to tryAcquireOrRenew context deadline exceeded”问题,一般从kube-api和网络链接入手。

2.此环境为非高可用环境,修改leader-elect为false避免kube-controller-manager定期去连接kube-api更新endpoint,理论也可以避免renew超时退出问题。

3.如果特定场景,kube-controller等组件必须通过公网连接kube-api,如果有相关参数配置连接kube-api超时时间也是一种解决思路,笔者搜索kube-controller-manager启动参数,暂未发现与此有关参数,待代码确认是否写死了。

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `kubectl get pods -n kube-system` 指令会查询 `kube-system` 命名空间中的所有 Pod。这个命令的输出将会列出该命名空间中的每个 Pod 的名称、状态、重启次数和其他信息。如果您希望查看其他命名空间中的 Pod,可以将 `-n kube-system` 替换为目标命名空间的名称。 例如: ``` $ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-86c58d9df4-26tzj 1/1 Running 0 6d coredns-86c58d9df4-m8nh9 1/1 Running 0 6d etcd-minikube 1/1 Running 0 6d kube-apiserver-minikube 1/1 Running 0 6d kube-controller-manager-minikube 1/1 Running 0 6d kube-proxy-6xm7h 1/1 Running 0 6d kube-scheduler-minikube 1/1 Running 0 6d storage-provisioner 1/1 Running 0 6d ``` ### 回答2: kubectl get pods -n kube-system 是一个命令,用于在 Kubernetes 集群中获取 kube-system 命名空间中的所有 PodKubernetes 使用命名空间来对不同组件进行分类和组织,kube-system 命名空间是用于部署和管理 Kubernetes 系统组件的默认命名空间。 在运行该命令后,系统会返回 kube-system 命名空间中所有的 Pod 的详细信息,包括 Pod 的名称、运行状态、所属节点、IP 地址等。这些信息有助于管理员和开发人员检查和监控 Kubernetes 系统的运行状态。 通过使用 -n kube-system 参数,我们指定了要获取的 Pod 所在的命名空间。命名空间的概念使得在 Kubernetes 集群中可以同时运行多个不同的应用或系统组件,每个命名空间都是相互隔离的。 用这个命令可以查看 kube-system 命名空间中的 Pod,由于 kube-system 命名空间中部署了一些关键的系统组件,如 kube-proxy、coredns、metrics-server 等,检查它们的运行状态是非常重要的。如果发现其中某个 Pod 处于异常状态或者失败,可能会影响整个集群的正常运行。 总之,kubectl get pods -n kube-system 是一个方便的命令,用于查看 Kubernetes 系统组件的状态和运行情况,有助于管理员和开发人员监控集群的健康状态。 ### 回答3: `kubectl get pods -n kube-system` 是一个 Kubernetes 命令行工具(kubectl)的命令。这个命令的作用是获取命名空间为 kube-system 的所有 Pod(容器)。以下是对这个命令的解释和一些相关信息: `kubectl get pods` 是用于获取 Kubernetes 集群中的所有 Pod 的命令。通过使用 `-n` 标志,我们可以指定要获取的 Pod 所属的命名空间。在这里,我们使用 `kube-system` 作为命名空间。 命名空间是 Kubernetes 中一种用于隔离和组织资源的概念。命名空间可以帮助管理员对不同的组件和功能进行分类和管理。命名空间有默认的系统命名空间,如 `kube-system`,用于管理 Kubernetes 自身的组件和功能。这些组件包括 kube-proxy、kube-dns、kube-scheduler、kube-controller-manager 等。 `kubectl get pods -n kube-system` 命令将返回位于 `kube-system` 命名空间的所有 Pod 的列表。列表中将包含每个 Pod 的名称、状态、重启次数、运行时间等信息。这些信息可以帮助管理员监控和管理集群中的容器。 总之,`kubectl get pods -n kube-system` 是一个用于在 Kubernetes 集群中获取 `kube-system` 命名空间下所有 Pod 信息的命令。这个命令是管理 Kubernetes 集群的常用操作之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值