本文共 2946 字,大约阅读时间需要 9 分钟。
Kubernetes 集群常见问题解析与解决方案
在使用 Kubernetes 集群的过程中,可能会遇到各种各样的技术问题。本文将对几个常见问题进行详细分析,并提供具体的解决方案。以下是各类问题的详细描述及解决方法。
1. Calico 节点启动失败
问题描述:
- 基础信息:Kubernetes v1.29.0,calico v3.27.0,CentOS 7.9,内核版本 6.6.8。
- 问题现象:calico-node 容器启动失败,Pod 状态显示为“Running”,但
READY
字段显示 0/1
,实际未运行。 - 错误日志:涉及
ipset
错误,提示“Kernel 和用户空间不兼容”,具体错误为“settype hash:ip,port 的修订版本 7 不支持用户空间”。
分析:
- 原因:calico 节点在进行数据平面 (
dataplane
) 同步时,ipset
包的用户空间与内核版本不兼容。默认情况下,Calico 会使用 ipset
库来处理网络IP设置,但如果内核版本较新,而用户空间的 ipset
库版本较旧,则会导致此错误。
解决方案:
- 降低系统内核版本:将内核版本替换为支持旧版的版本,例如将内核升级到 5.4.264。
- 升级 Calico 版本:根据文档建议,更新至支持内核新版本的 Calico 发布版本。
注意事项:
- 内核版本修改:需要正确遵循内核升级文档,避免引入新问题。
- Calico 版本更新:确保更新过程不影响正在运行的核心服务。
2. Calico APIserver 始终处于 Pending 状态
问题描述:
- 现象:calico-apiserver pod 状态始终为“Pending”,无法正常启动。
- 错误信息:类似错误提示“没有可用的节点”或“节点被污染”。
分析:
- 原因:无法将节点调度到任何可用的位置,这可能是因为节点被标记为“不可用”。
- 可能原因:
- 网络问题:网络配置错误导致节点无法连接到集群。
- 节点污染:之前存在多次尝试调度失败,导致节点被标记为“不可用”。
- 集群扩展问题:如果运行环境限制了节点的调度能力(例如网络有限制)。
解决方案:
检查节点状态:使用 kubectl describe pod calico-apiserver-<PodName>
查看 pod 的描述信息,确认是否存在节点不可用的问题。 清理节点污染:对于长时间处于“Pending”状态的 pod,手动删除 pod 资源,并确保节点未被污染。 检查网络连接:确认节点间的网络连接正常,特别是 kubelet 节点是否能互相通信。 重新启动集群:如果问题无法解决,尝试使用 kubeadm reset
命令重置集群,并重新加入节点。
3. Master 芯璧初始化失败
问题描述:
- 现象:集群初始化过程中主节点无法成功完成。
- 错误提示:需要指定容器运行类型,才能进行重置。
分析:
- 原因:在初始化过程中,容器设置不正确,导致重置失败。
- 可能导致的问题:
- kubeconfig 文件残留旧配置:重置时未清理 kubeconfig 文件,导致重新初始化时出现问题。
- kubelet 服务配置错误:kubelet 启动时占用了高端口,阻止了集群重置。
解决方案:
重置集群:使用 kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
命令,确保命令正确执行。 删除旧的 kubeconfig 文件:如果存在残留的 kubeconfig 文件,根据提示手动删除。 指定容器运行类型:确保在初始化时明确指定容器运行类型,避免重置时的错误提示。 重新初始化集群:按文档步骤重新初始化集群,并观察是否成功。
4. Worker 芯件无法加入集群
问题描述:
- 现象:边缘节点无法正常加入 Kubernetes 集群,多次重试失败。
- 错误提示:涉及到 CRI socket 访问权限问题。
分析:
- 原因:CRI socket 地址不匹配或权限不足,导致 Docker-in-Docker 操作失败。
- 可能导致的问题:
- CRI socket 地址配置错误:例如 socket 文件路径不正确。
- 权限问题:非 root 用户没有权限访问 CRI socket。
- 网络问题:CRI socket 连接被拒绝或网络延迟过高。
解决方案:
检查 CRI socket 配置:确保 /var/run/cri-dockerd.sock
文件存在并具有正确的权限。 身份验证权限:确认非 root 用户拥有访问 CRI socket 的权限,必要时增加相应的权限。 测试网络连接:使用 socat
或类似工具测试 CRI socket 是否可以连接。 重置集群并重新加入节点:如果问题无法解决,重新初始化集群,并遵循指导重新加入节点。
5. pod 无法拉取镜像
问题描述:
- 现象:部署服务时,pod 无法拉取所需镜像,导致启动失败。
- 错误日志:提示无法连接 Docker 镜像仓库,连接超时或镜像不存在。
分析:
- 可能原因:
- 镜像仓库地址错误:pod 配置中指定了错误的镜像仓库地址。
- 网络问题:镜像仓库与集群网络隔离,导致镜像拉取失败。
- 镜像版本问题:用户指定的镜像版本不存在或镜像被拉取限制。
解决方案:
检查镜像配置:确保镜像仓库地址正确,必要时提前下载镜像并托管在私有镜像仓库中。 测试网络连接:确认镜像仓库与集群网络间通信正常。 修复镜像拉取策略:根据镜像拉取策略(如 IfNotPresent
),确保镜像存在或能够被拉取。 处理 pod 池MANIFEST:检查 pod 的 YAML 配置文件,确保镜像引用正确。
6. pod 无法正常启动
问题描述:
- 现象:pod 启动失败,因 DNS 或资源不足导致。
- 错误提示:webhook 调用超时,无法完成服务注入或其他动作。
分析:
- 可能原因:
- DNS 配置问题:集群内部 DNS 配置错误,导致 pod 检索服务信息失败。
- 资源不足:节点资源(CPU、内存)不足以支持 pod 启动。
- 服务注入问题:-sidecar(injector) webhook 失败,导致 pod 启动延迟或失败。
解决方案:
排查 DNS 配置:检查命名空间的 DNS 配置,确保域名解析正确。 检查节点资源:使用 kubectl get node
查看节点资源使用情况,确保没有资源瓶颈。 处理 webhook超时问题:检查服务网格(如 istio)是否正常运行,确保 webhooks 能够及时响应。 关闭服务注入(sidecar):临时禁用服务网格注入,以排除其对 pod 启动的影响。 根据事件详情调整策略:根据 pod 的事件日志,进一步分析问题根源并采取相应措施。
总结
以上是 Kubernetes 集群中常见问题的分析及其解决方案。通过合理的故障排查步骤和系统性的解决方法,可以有效解决多种技术难题。建议在遇到问题时,先从简单的操作(如查看日志、检查网络配置)入手,再逐步深入到复杂的故障排查。如果问题依旧无法解决,建议参考官方文档或社区资源,找到更全面的解决方案。
转载地址:http://fqryk.baihongyu.com/