Pod生命周期状态有四个:
查看Pod启动日志
kubectl logs Podname
POD 挂起状态通常会出现在应用重新部署,重启,或者scale up之后
POD挂起状态标识集群中没有工作节点有足够的资源能够满足运行该POD,kube-scheduler无法完成调度,只能一致等待,直到
集群中有节点能满足POD的资源要求
通常有如下原因
Limits:
cpu: 6
memory: 20Gi
Requests:
cpu: 6
memory: 20Gi
Volumes:
config-volume:
Type: ConfigMap(a volume populated by a ConfigMap)
Name: nginx-conf
Optionnal: false
Node-SelectorsL labelexxx=valuexxx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIngnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: failure-domain.beta.kubernetes.io/zone
operator: in
values:
- sha-az1
- sha-az2
这个错误是因为Kubernetes 无法拉取容器镜像所导致的。有四种常见原因
Pod not in ready state
这个状态表示POD里面的应用已经启动了,但是Readiness探针探测到POD还未就绪(前提是POD配置了Readiness 探针,否则只要程序运行着,POD就是Ready状态)。如果Readiness 探针失败,POD就不会被添加到Service中,也不会有访问流量被转发到该Pod。Pod的Readiness 探针失败通常是因为探针配置不正确或者应用错误导致,需要通过 kubectl describe pod podname 查看分析原因。
常见原因如下
readyniessProbe:
tcpSocket:
port: 8080
initialDelaySeconds:30
persiodSeconds:10
readinessProbe:
httpGet:
path:/healthz
port: liveness-port
failureThreshold:1
periodSeconds: 10
当工作节点的磁盘,内存资源使用率达到阈值时会出发POD驱逐
默认的驱逐阈值如下:
--eviction-hard default
imagefs.available<15%,memory.available<100Mi,nodefs.available<10%,nodefs.inodesFress<5%
一般常见的驱逐都是因为磁盘空间使用率太高,报错信息为Pod The node was low on resource: [DiskPressure]
此时需要检查主机上的磁盘空间使用率,清理不必要的文件或者扩容磁盘,有时可能因为某些Pod写了太大的日志或dump文件,导致单个Pod占用空间太大,而这个Pod被驱逐后,磁盘空间恢复正常,这种情况需要些日志、dump文件到外部挂载的磁盘(如nas等)
k8s集群中,每个工作节点上的kubelet会定时轮询Pod的状态并更新到apiserver。kubelet本身也会定时发送心跳信心给apiserver,如果apiserver没有收到kubelet的心跳信息超过一定阈值,该工作节点会变成NotReady,节点上的Pod会变成Unknown。如果节点转台在pod-eviction-timeout时间之内恢复正常,pod的状态也会恢复正常。如果节点状态无法再pod-eviction-timeout时间内恢复正常,控制器会在其他节点上拉起新的POD,旧的POD状态依旧是Unknown,等待节点恢复后,旧的POD会被删除。
工作节点NotReady的可能原因有:
nodePort是通过iptables规则对报文的源目的地址做如下转换
源IP:源Port | ||
---|---|---|
转换前 | 客户端IP:随机端口 | Node IP:node port |
转换后 | NodeIP :随机端口 | Pod IP:服务端口 |
Request 值是保证POD一定能分配到的资源,Pod实际使用资源可能比这个值小,Limit值是Pod 能够使用的资源上线(前提是工作节点未饱和)。Pod在调度时只看 request值,跟limits值无关,只要工作节点能满足CPU和Memory request值,Pod就可能部署到这些节点。初始配置 request 和limit可按照 1:1.5 配置,后续可根据监控信息调整
/var/lib/docker 目录告警阈值建议配置为 75%
单独挂载卷到 /var/lib/docker
1. 给节点打上NoExecute 污点,驱逐 Pod
2. 停止kubelet 服务, systemctl stop kubelet
3. 停止所有docker容器 docker stop $(docker ps -q)
4. 停止docker 服务 systemctl stop docker
5. 确认相关进程均已停止 ps -ef|grep docker
6. 重命名 docker 目录 cd /var/lib mv docker docker_bak ; mkdir docker
7. 挂载新卷到 /var/lib/docker目录,问价格式为xfs ,ftpye=1
8. 启动docker服务 systemctl start docker
9. 重新加载基础镜像 docker load -i /opt/k8s/node/inmage/pause.tar (视具体情况而定)
10.启动 kubelet 服务,systemctl start kubelet
11 删除工作节点上的污点标签
清理docker目录空间
Docker文件所在目录为/var/lib/docker 通常会被挂载为/var 分区或者直接被挂载到 根分区(/),不建议把Docker目录直接挂载到根分区。
Docker 所在的磁盘分区如果使用率太高会导致pod无法调度或者被驱逐,建议对docker所在磁盘分区设置监控并把阈值调整为70%
清理步骤:
主机oom容易导致docker 服务异常
java1.8_131以下版本无法感知容器内存,131-191 可以使用-XX:UnlockExperimentalVMOptions ,-XX:+UseCGroupMemoryLimitForHeap,191+可以使用-XX:+UserContainerSupport,-XX:MaxRAMPercent
POD 内存与JVM堆内存关系 ≈ 虚拟机与JVM 堆内存关系
net.ipv4.ip_forward=1
flannel 8472 UDP 不通
calico IP 协议不通
路由表未更新
iptables或者ipvs规则未更新