一、集群部署时节点无法加入的典型症状
当你兴冲冲执行完kubeadm init,却发现worker节点死活join不进去时,先别急着砸键盘。最常见的报错是:"kubelet isn't running or healthy"。这时候建议分三步走:
- 检查防火墙:
# CentOS示例(技术栈:Linux + kubeadm)
sudo systemctl stop firewalld # 临时关闭防火墙
sudo systemctl disable firewalld # 永久禁用
注意:生产环境建议配置精确放行规则而非直接关闭
- 验证容器运行时:
sudo systemctl status docker # 假设使用Docker作为运行时
journalctl -xeu docker.service # 查看详细日志
- 排查证书问题:
openssl x509 -noout -text -in /etc/kubernetes/pki/ca.crt # 检查CA证书有效期
date # 对比系统时间是否偏差过大
二、Pod卡在Pending状态的深度排查
那些赖在Pending状态不走的Pod,十有八九是资源分配的问题。来个真实案例:
# 示例:资源超限的Deployment(技术栈:Kubernetes YAML)
apiVersion: apps/v1
kind: Deployment
metadata:
name: memory-hog
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
memory: "16Gi" # 请求16G内存
limits:
memory: "32Gi" # 限制32G
关键命令:
kubectl describe node | grep -A 10 Allocatable查看节点实际可用资源
进阶排查技巧:
kubectl get events --sort-by='.lastTimestamp' # 按时间排序查看事件
kubectl describe pod <pod-name> | grep -i warning # 过滤警告信息
三、Service网络不通的经典场景
明明Pod跑得好好的,Service却访问不了?先试试这个诊断流程:
- 基础连通性测试:
kubectl run test-$RANDOM --image=busybox --rm -it -- sh # 临时容器
wget -O- <service-ip>:<port> # 从集群内部测试
- Endpoint验证:
# 典型错误示例:标签不匹配导致Endpoint为空
apiVersion: v1
kind: Service
metadata:
name: buggy-service
spec:
selector:
app: not-exist-label # 这里写错了标签
ports:
- protocol: TCP
port: 80
补救命令:
kubectl get endpoints <service-name>看是否有对应IP
- 网络插件诊断:
# Calico网络排查示例
calicoctl get workloadendpoints # 查看网络端点
iptables -t nat -L -n -v # 检查iptables规则
四、存储卷挂载失败的救火指南
PVC一直处于Pending状态?可能是这些原因:
- StorageClass配置问题:
kubectl get storageclass # 查看默认存储类
kubectl describe pvc <pvc-name> # 查看具体错误
- 动态供应器日志:
# NFS Provisioner示例(技术栈:Kubernetes + NFS)
kubectl logs -n kube-system deploy/nfs-provisioner | grep -i error
- 权限配置示例:
# 正确的SecurityContext配置
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
fsGroup: 2000
volumes:
- name: sec-ctx-vol
persistentVolumeClaim:
claimName: test-pvc
五、集群升级中的那些坑
从1.18升级到1.20?小心这些雷区:
- API版本废弃检查:
kubectl api-resources | grep deprecated # 查找废弃API
kubectl convert -f old-deployment.yaml --output-version apps/v1 # 版本转换
- 关键组件版本兼容性:
# 查看当前组件版本
kubectl version --short
kubeadm version
kubectl get daemonset -n kube-system kube-proxy -o yaml | grep image:
- 回滚方案:
# 快速回滚kubelet示例
sudo yum install -y kubelet-1.18.20-0 # 指定旧版本
sudo systemctl restart kubelet
应用场景与技术选型
这套排查方法特别适合:
- 刚接触Kubernetes的运维团队
- 需要快速定位生产问题的场景
- 混合云环境下的集群管理
技术优缺点:
- 优点:覆盖了90%的常见问题,步骤可复制性强
- 缺点:需要基础Linux知识,部分命令需要根据实际环境调整
注意事项:
- 生产环境慎用
--force类强制命令 - 所有诊断操作应该先在测试环境验证
- 重要操作前务必做快照备份
总结
就像修车要先听发动机声音一样,处理Kubernetes问题也要学会"听"集群的状态。记住这个诊断黄金法则:先看Events,再查Describe,最后分析Logs。保持耐心,你终将成为集群故障的"老中医"。
评论