kubernetes集群一个master两个node证书过期解决

1.集群表现现象:

1.kubelet无法启动,并报如下错误:

[root@k8s01 ~]# journalctl -u kubelet.service  -f
-- Logs begin at Tue 2023-10-10 10:07:58 CST. --
Nov 10 15:30:31 k8s01 systemd[1]: Started kubelet: The Kubernetes Node Agent.
Nov 10 15:30:31 k8s01 kubelet[25591]: Flag --network-plugin has been deprecated, will be removed along with dockershim.
Nov 10 15:30:31 k8s01 kubelet[25591]: Flag --network-plugin has been deprecated, will be removed along with dockershim.
Nov 10 15:30:31 k8s01 kubelet[25591]: I1110 15:30:31.153621   25591 server.go:440] "Kubelet version" kubeletVersion="v1.21.2"
Nov 10 15:30:31 k8s01 kubelet[25591]: I1110 15:30:31.154104   25591 server.go:851] "Client rotation is on, will bootstrap in background"
Nov 10 15:30:31 k8s01 kubelet[25591]: E1110 15:30:31.157009   25591 bootstrap.go:265] part of the existing bootstrap client certificate in /etc/kubernetes/kubelet.conf is expired: 2024-10-08 06:25:08 +0000 UTC
Nov 10 15:30:31 k8s01 kubelet[25591]: E1110 15:30:31.157090   25591 server.go:292] "Failed to run kubelet" err="failed to run Kubelet: unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory"
Nov 10 15:30:31 k8s01 systemd[1]: kubelet.service: main process exited, code=exited, status=1/FAILURE
Nov 10 15:30:31 k8s01 systemd[1]: Unit kubelet.service entered failed state.
Nov 10 15:30:31 k8s01 systemd[1]: kubelet.service failed.
Nov 10 15:30:41 k8s01 systemd[1]: kubelet.service holdoff time over, scheduling restart.
Nov 10 15:30:41 k8s01 systemd[1]: Stopped kubelet: The Kubernetes Node Agent.
Nov 10 15:30:41 k8s01 systemd[1]: Started kubelet: The Kubernetes Node Agent.
Nov 10 15:30:41 k8s01 kubelet[25676]: Flag --network-plugin has been deprecated, will be removed along with dockershim.
Nov 10 15:30:41 k8s01 kubelet[25676]: Flag --network-plugin has been deprecated, will be removed along with dockershim.
Nov 10 15:30:41 k8s01 kubelet[25676]: I1110 15:30:41.404211   25676 server.go:440] "Kubelet version" kubeletVersion="v1.21.2"
Nov 10 15:30:41 k8s01 kubelet[25676]: I1110 15:30:41.404751   25676 server.go:851] "Client rotation is on, will bootstrap in background"
Nov 10 15:30:41 k8s01 kubelet[25676]: E1110 15:30:41.407590   25676 bootstrap.go:265] part of the existing bootstrap client certificate in /etc/kubernetes/kubelet.conf is expired: 2024-10-08 06:25:08 +0000 UTC
Nov 10 15:30:41 k8s01 kubelet[25676]: E1110 15:30:41.407670   25676 server.go:292] "Failed to run kubelet" err="failed to run Kubelet: unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory"
Nov 10 15:30:41 k8s01 systemd[1]: kubelet.service: main process exited, code=exited, status=1/FAILURE
Nov 10 15:30:41 k8s01 systemd[1]: Unit kubelet.service entered failed state.
Nov 10 15:30:41 k8s01 systemd[1]: kubelet.service failed.

【分析】:

  • failed to run Kubelet: unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory

在前边我们就可以看到这个报错,如果你对k8s的认证比较了解的话,就会知道bootstrap-kubelet.conf是k8s API的引导令牌(Bootstrap Tokens)认证相关的文件。该机制根据证书生成token,然后将信息写字这个文件里。

  • kubectl命令报错如下:
[root@k8s01 ~]# kubectl get nodes
Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2024-11-10T15:30:55+08:00 is after 2024-10-08T06:25:06Z

【分析】:

这里我们可以定位到证书问题,证书过期。

2.解决集群问题

  • 备份并重新生成证书
[root@k8s01 ~]# cd /etc/kubernetes/pki/
[root@k8s01 pki]# mkdir backup
[root@k8s01 pki]# mv  apiserver.crt apiserver-etcd-client.key apiserver-kubelet-client.crt front-proxy-ca.crt front-proxy-client.crt front-proxy-client.key front-proxy-ca.key apiserver-kubelet-client.key apiserver.key apiserver-etcd-client.crt backup
[root@k8s01 pki]# kubeadm init phase certs all
  • 备份并重新生成配置文件
[root@k8s01 pki]# cd /etc/kubernetes/
[root@k8s01 kubernetes]# mkdir backup
[root@k8s01 kubernetes]# mv admin.conf controller-manager.conf kubelet.conf scheduler.conf  backup
[root@k8s01 kubernetes]# kubeadm  init phase kubeconfig all
  • 拷贝用户权限文件
[root@k8s01 kubernetes]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  • 查看证书
[root@k8s01 ~]# kubeadm  certs check-expiration
  • 启动kubelet
[root@k8s01 ~]# systemctl restart kubelet
[root@k8s01 ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Tue 2023-10-10 13:53:03 CST; 6s ago
     Docs: https://kubernetes.io/docs/
 Main PID: 5111 (kubelet)
    Tasks: 14
   Memory: 29.0M
   CGroup: /system.slice/kubelet.service
  • 处理工作节点证书
删除工作节点:
[root@k8s01 ~]# kubectl delete nodes k8s02
[root@k8s01 ~]# kubectl delete nodes k8s03
生成加入节点命令:
[root@k8s01 ~]# kubeadm token create --print-join-command
kubeadm join 172.11.0.74:6443 --token msbk7j.8ynbop6j6irn9qw7 --discovery-token-ca-cert-hash sha256:d5bd944fa55cd38f8a2515958e9523f85dbae93e3e91e7b50a15cc9b33d196f0
把工作节点重新加入节点:
[root@k8s02 ~]# kubeadm reset -f
[root@k8s02 ~]# kubeadm join 172.11.0.74:6443 --token msbk7j.8ynbop6j6irn9qw7 --discovery-token-ca-cert-hash sha256:d5bd944fa55cd38f8a2515958e9523f85dbae93e3e91e7b50a15cc9b33d196f0
[root@k8s03 ~]# kubeadm reset -f
[root@k8s03 ~]# kubeadm join 172.11.0.74:6443 --token msbk7j.8ynbop6j6irn9qw7 --discovery-token-ca-cert-hash sha256:d5bd944fa55cd38f8a2515958e9523f85dbae93e3e91e7b50a15cc9b33d196f0
<think> 我们正在构建一个基于Kubernetes的智慧医疗平台,架构包括: - LVS+Keepalived做负载均衡 - 应用服务部署在Kubernetes集群 - Redis集群模式在Kubernetes集群外部 - MySQL一主两从+MaxScale在集群外部 - MFS作为存储服务器 - Prometheus在集群内监控 - Elasticsearch在集群外部,Kibana+Filebeat在集群内进行日志采集 在项目搭建和后续维护中,Kubernetes集群可能会遇到各种棘手问题。以下列出至少10个案例,每个案例包含故障现象、排查思路和解决方法。这些问题应覆盖部署、网络、存储、服务发现、配置、资源管理、监控日志等方面。 ### 1. 节点NotReady **故障现象**:kubectl get nodes 显示部分节点状态为NotReady,导致Pod无法调度到这些节点上。 **排查思路**: - 检查节点上kubelet服务状态:`systemctl status kubelet` - 查看kubelet日志:`journalctl -u kubelet` - 检查网络插件(如Calico)是否正常运行 - 检查节点资源(CPU、内存、磁盘)是否不足 **解决方法**: - 重启kubelet:`systemctl restart kubelet` - 清理节点磁盘空间(如清理/var/lib/kubelet下的旧文件) - 重启网络插件 - 增加节点资源或迁移部分Pod ### 2. Pod无法访问外部MySQL服务 **故障现象**:应用Pod无法连接集群外部的MySQL服务(一主两从+MaxScale),但集群内部服务之间通信正常。 **排查思路**: - 在Pod内使用`telnet <mysql_host> <port>`测试连接 - 检查Kubernetes网络策略(NetworkPolicy)是否阻止了出口流量 - 检查外部MySQL的防火墙设置 - 检查CoreDNS是否能够解析MySQL的主机名 - 检查MaxScale的配置是否正确 **解决方法**: - 调整网络策略允许Pod访问外部MySQL的IP和端口 - 在外部MySQL服务器上开放防火墙端口 - 确保CoreDNS中配置了外部域名的正确解析(或者使用IP) - 验证MaxScale的读写分离配置 ### 3. Redis集群模式连接故障 **故障现象**:应用连接外部Redis集群时,间歇性出现连接失败或读写错误。 **排查思路**: - 检查应用配置的Redis集群节点地址是否正确 - 使用Redis客户端测试连接每个节点 - 检查Redis集群状态(使用`cluster nodes`命令) - 检查网络延迟和丢包(在Pod内ping Redis节点) - 查看Redis日志是否有异常 **解决方法**: - 确保应用使用Redis集群模式驱动,并正确配置所有节点 - 修复Redis集群中失败的主节点或从节点 - 优化网络(如调整路由,避免跨机房访问) - 增加Redis连接池大小和超时设置 ### 4. MFS存储挂载失败 **故障现象**:Pod挂载MFS存储卷失败,导致Pod启动异常。 **排查思路**: - 检查MFS存储服务器状态和网络连通性 - 检查PersistentVolume(PV)和PersistentVolumeClaim(PVC)的配置是否正确 - 查看kube-controller-manager日志,确认是否有挂载错误 - 检查StorageClass配置 - 在节点上手动挂载MFS共享目录测试 **解决方法**: - 修复MFS服务器问题(如重启服务) - 修正PV/PVC配置(如访问模式、容量等) - 更新StorageClass配置 - 确保节点上安装了MFS客户端 ### 5. Prometheus监控数据丢失 **故障现象**:Prometheus监控数据出现断点,部分指标丢失。 **排查思路**: - 检查Prometheus的存储卷是否满 - 查看Prometheus Pod日志,是否有频繁重启 - 检查Prometheus配置的抓取间隔(scrape_interval)和目标是否正常 - 检查资源限制(CPU、内存)是否导致OOMKill **解决方法**: - 清理Prometheus存储数据或扩展存储卷 - 调整Prometheus资源限制,增加内存 - 优化抓取配置,减少抓取目标或增加间隔 - 考虑使用远程存储(如Thanos) ### 6. Filebeat日志采集延迟 **故障现象**:Kibana中显示的日志延迟较大,日志产生后很久才能查询到。 **排查思路**: - 检查Filebeat Pod资源使用情况,是否资源不足 - 查看Filebeat日志,是否有大量错误 - 检查Elasticsearch集群状态(如索引是否健康,分片分配是否正常) - 检查网络带宽 **解决方法**: - 增加Filebeat的资源分配(CPU、内存) - 调整Filebeat的批量发送参数(如bulk_max_size,flush_interval) - 优化Elasticsearch索引(如增加分片,调整刷新间隔) - 扩容Elasticsearch集群 ### 7. Ingress控制器路由失败 **故障现象**:通过Ingress访问服务时返回404或502错误。 **排查思路**: - 检查Ingress资源定义是否正确(如host、path、backend service) - 检查后端Service是否存在且Endpoints正常 - 查看Ingress控制器日志 - 检查Ingress控制器配置(如是否启用了必要的注解) - 测试后端Pod是否健康(使用kubectl exec进入Pod测试服务) **解决方法**: - 修正Ingress配置(如修正路径匹配规则) - 确保Service的selector与Pod标签匹配 - 重启Ingress控制器Pod - 检查后端应用是否正常运行 ### 8. 资源不足导致Pod无法调度 **故障现象**:新Pod处于Pending状态,事件显示资源不足(Insufficient cpu/memory)。 **排查思路**: - 使用`kubectl describe pod <pod_name>`查看Pending原因 - 使用`kubectl top nodes`查看节点资源使用情况 - 检查是否有资源请求(requests)设置过高 - 检查节点是否有资源碎片 **解决方法**: - 增加集群节点 - 调整Pod的资源请求(requests)和限制(limits) - 使用HorizontalPodAutoscaler自动扩展 - 驱逐低优先级的Pod ### 9. CoreDNS解析异常 **故障现象**:集群内服务无法通过Service名称解析,或解析外部域名失败。 **排查思路**: - 在Pod内使用`nslookup`或`dig`测试Service名称解析 - 检查CoreDNS Pod是否正常运行 - 查看CoreDNS日志 - 检查CoreDNS配置(ConfigMap) - 检查节点上的resolv.conf配置 **解决方法**: - 重启CoreDNS Pod - 修复CoreDNS配置(如添加外部DNS服务器) - 确保kubelet的`--resolv-conf`参数正确配置 - 检查网络插件是否影响DNS流量 ### 10. 镜像拉取失败 **故障现象**:Pod状态为ImagePullBackOff,无法从镜像仓库拉取镜像。 **排查思路**: - 检查镜像名称和标签是否正确 - 检查镜像仓库的认证信息(Secret)是否存在且正确 - 在节点上手动使用docker pull测试 - 检查网络是否能够访问镜像仓库 - 检查镜像仓库的证书是否有效(如果是HTTPS) **解决方法**: - 修正镜像名称或标签 - 创建或更新镜像仓库的Secret - 配置节点访问镜像仓库的代理或网络 - 如果是私有仓库,确保所有节点都已登录 ### 11. 服务滚动更新导致流量中断 **故障现象**:在Deployment滚动更新期间,部分用户请求失败。 **排查思路**: - 检查Deployment的更新策略(maxSurge和maxUnavailable) - 查看Service的会话亲和性(sessionAffinity)配置 - 检查就绪探针(readinessProbe)配置是否合理 - 监控应用在启动时是否初始化时间过长 **解决方法**: - 调整更新策略,如增加maxSurge,减少maxUnavailable - 优化就绪探针(如增加初始延迟时间) - 确保新版本Pod完全启动后再停止旧Pod - 使用蓝绿发布或金丝雀发布策略 ### 12. HPA自动扩缩失效 **故障现象**:配置了HorizontalPodAutoscaler(HPA),但Pod数量未按负载自动调整。 **排查思路**: - 检查HPA资源的状态(`kubectl describe hpa`) - 查看Metrics Server是否正常运行(提供资源指标) - 检查HPA的指标阈值设置 - 检查目标Deployment的资源限制是否设置 **解决方法**: - 修复Metrics Server(如重启或重新部署) - 调整HPA的阈值(如降低CPU利用率目标) - 确保目标Deployment设置了资源限制(limits)和请求(requests) - 检查是否有其他因素限制Pod调度(如资源配额) 以上12个案例覆盖了Kubernetes集群的常见问题,可用于面试描述。在实际操作中,每个问题都需要根据具体环境深入分析。 §§相关问题§§ 1. 如何优化Kubernetes集群中的网络性能? 2. 在Kubernetes中如何实现高可用的有状态服务? 3. 如何设计一个容灾备份方案来保护Kubernetes集群中的数据? 4. 在混合云环境中如何管理多个Kubernetes集群? 5. 如何监控Kubernetes集群中的资源使用并预测扩容需求? </think> 以下是基于 Kubernetes 架构搭建智慧医疗平台过程中可能遇到的 10 个典型故障案例,涵盖故障现象、排查思路和解决方法: --- ### 1. **Ingress 控制器路由失效** **故障现象**:外部请求无法通过 LVS+Keepalived 访问 Kubernetes 服务,返回 503 错误。 **排查思路**: - 检查 Keepalived 日志 `/var/log/messages` 确认 VIP 漂移状态 - 使用 `ipvsadm -Ln` 验证 IPVS 规则是否生效 - 测试 Nginx Ingress Controller Pod 的 Endpoints 连通性 **解决方法**: ```bash # 重启 Keepalived 并强制刷新 IPVS 规则 systemctl restart keepalived ipvsadm --clear && ipvsadm --restore < /etc/keepalived/ipvs.rules ``` 根本原因:IPVS 规则未同步导致流量丢弃[^3][^4]。 --- ### 2. **Redis 集群连接超时** **故障现象**:应用 Pod 访问外部 Redis 集群频繁超时,日志报 `ERR Connection timed out`。 **排查思路**: - 使用 `redis-cli -c -h <node> cluster nodes` 检查集群状态 - 通过 `kubectl exec` 在 Pod 内执行 `telnet <redis_ip> 6379` 测试网络 - 检查 Redis 节点的 TCP 连接数 (`ss -s`) **解决方法**: 调整 Redis 内核参数并优化客户端配置: ```bash # Redis 节点优化 echo 'net.ipv4.tcp_keepalive_time = 600' >> /etc/sysctl.conf sysctl -p ``` 同时在 Kubernetes 侧配置连接池参数[^3]。 --- ### 3. **MFS 存储卷挂载失败** **故障现象**:Pod 启动时卡在 `ContainerCreating`,事件显示 `MountVolume.SetUp failed: mount failed: exit status 32`。 **排查思路**: - 在节点执行 `mount -t moosefs <mfs_master>:<path> /mnt/test` 手动验证挂载 - 检查 MFS Master 日志中的 chunk 服务器状态 - 查看 kubelet 日志 (`journalctl -u kubelet`) 的 FUSE 错误 **解决方法**: 修复 MFS 元数据并重建 PV: ```bash # 在 MFS Master 修复元数据 mfsmetarestore -a # 删除 Kubernetes 中异常的 PV/PVC kubectl delete pv <pv_name> --grace-period=0 --force ``` --- ### 4. **Prometheus 监控数据丢失** **故障现象**:Prometheus 显示 `scrape_error`,部分 Node Exporter 指标缺失。 **排查思路**: - 检查 Prometheus 目标页面 (`/targets`) 的状态码 - 验证 ServiceMonitor 的标签选择器是否匹配 -Node Exporter Pod 执行 `curl localhost:9100/metrics` **解决方法**: 更新 ServiceMonitor 配置并调整资源限制: ```yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor spec: endpoints: - interval: 30s # 增加采集间隔 port: web resources: limits: memory: 512Mi # 防止 OOM ``` --- ### 5. **MySQL 主从同步延迟** **故障现象**:MaxScale 读写分离异常,读请求被路由到主库。 **排查思路**: - 在 MaxScale 执行 `show servers` 查看副本状态 - 检查 MySQL 从库的 `Seconds_Behind_Master` - 分析慢查询日志 (`mysqldumpslow -s t`) **解决方法**: 在从库优化并行复制: ```sql STOP SLAVE; SET GLOBAL slave_parallel_workers = 8; START SLAVE; ``` 同时调整 MaxScale 的路由阈值[^3]。 --- ### 6. **Filebeat 日志阻塞** **故障现象**:Kibana 中日志延迟增长,Filebeat Pod 内存持续升高。 **排查思路**: - 检查 Filebeat 队列状态 (`filebeat test output`) - 验证 Elasticsearch 索引速率 (`GET _nodes/stats/ingest`) - 查看系统 IOwait (`iostat -x 1`) **解决方法**: 优化 Filebeat 管道配置: ```yaml output.elasticsearch: bulk_max_size: 200 # 降低批量大小 worker: 4 # 增加工作线程 queue: mem: events: 1024 # 限制内存队列 ``` --- ### 7. **节点资源争抢导致 Pod 驱逐** **故障现象**:应用 Pod 频繁被驱逐,事件显示 `Insufficient memory`。 **排查思路**: - 使用 `kubectl top nodes` 检查资源分配 - 分析调度器日志 (`kube-scheduler --v=4`) - 执行 `dmesg | grep -i 'oom'` 确认 OOM Kill **解决方法**: 配置合理的资源请求与限制: ```yaml resources: requests: memory: "256Mi" limits: memory: "1Gi" ``` 启用集群自动扩缩容 (Cluster Autoscaler)[^5]。 --- ### 8. **CoreDNS 解析超时** **故障现象**:Pod 内域名解析间歇性失败,报 `i/o timeout`。 **排查思路**: - 在 Pod 执行 `nslookup kubernetes.default` - 检查 CoreDNS 的 CPU 使用率 (`kubectl top pods -n kube-system`) - 验证节点 resolv.conf 配置 **解决方法**: 优化 CoreDNS 部署: ```yaml # 增加副本数和资源限制 kubectl scale -n kube-system deployment/coredns --replicas=5 kubectl set resources -n kube-system deployment/coredns --limits=memory=256Mi ``` --- ### 9. **跨命名空间服务访问拒绝** **故障现象**:前端 Pod 无法访问后端服务的 ClusterIP,返回 `Connection refused`。 **排查思路**: - 使用 `kubectl describe networkpolicy` 检查策略 - 通过 `calicoctl get wep` 验证 Calico 端点 - 执行 `iptables -t nat -L` 检查规则链 **解决方法**: 创建允许跨命名空间访问的 NetworkPolicy: ```yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: {} # 允许所有命名空间 ``` --- ### 10. **证书过期导致 API Server 不可用** **故障现象**:`kubectl` 命令报 `x509: certificate has expired or is not yet valid`。 **排查思路**: - 检查 `/etc/kubernetes/pki` 下证书有效期: ```bash openssl x509 -in apiserver.crt -noout -dates ``` - 查看 kubelet 日志 (`journalctl -u kubelet | grep -i cert`) **解决方法**: 续签证书并重启控制平面: ```bash kubeadm alpha certs renew all systemctl restart kubelet ``` --- ### 关键经验总结 1. **基础设施耦合性**:外部服务(如 MySQL/Redis)需通过 Endpoint 对象显式暴露给集群[^3] 2. **存储可靠性**:MFS 需定期检查 chunk 副本分布,避免存储单点故障 3. **监控全覆盖**:Prometheus 应监控集群外组件(如 MaxScale),通过 blackbox_exporter 实现 4. **灾备设计**:ETCD 数据每日备份到对象存储,MySQL 启用 GTID 同步[^5] > 注:以上案例均基于生产环境常见问题整理,实际解决方案需结合具体环境调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值