CentOS环境下Kubernetes Pod管理指南
Pod是Kubernetes的核心调度单元,基础管理操作可通过kubectl命令完成:
kubectl get pods查看集群中所有Pod的名称、状态(Pending/Running/Succeeded/Failed)、重启次数及运行时间;添加-o wide可显示节点信息,-n <namespace>可指定命名空间。pod.yaml),包含容器镜像、端口、资源限制等字段,使用kubectl apply -f pod.yaml创建;也可使用kubectl run命令快速创建(如kubectl run nginx --image=nginx:latest --port=80)。kubectl delete pod <pod-name>删除指定Pod;若Pod由Deployment、StatefulSet等控制器管理,删除后会自动重建(需修改控制器配置彻底删除)。kubectl describe pod <pod-name>查看Pod的事件(如调度、拉取镜像)、容器状态(Waiting/Running/Terminated)及配置信息,是排查问题的关键命令。kubectl logs <pod-name>查看主容器日志;添加--previous可查看上一次运行日志,-f可实时跟踪日志输出。Pod的生命周期从创建到终止经历多个阶段,需关注关键状态及配置:
restartPolicy字段设置,可选Always(默认,容器终止后总是重启,适用于Deployment/StatefulSet)、OnFailure(容器退出码非0时重启,适用于Job)、Never(永不重启,适用于调试Pod)。探针是确保Pod健康运行的关键机制,Kubernetes提供三种探针:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30 # 容器启动后延迟30秒开始探测(避免过早杀死启动慢的应用)
periodSeconds: 10 # 每10秒探测一次
timeoutSeconds: 2 # 探测超时时间(超过则视为失败)
failureThreshold: 3 # 连续失败3次后重启容器
readinessProbe:
exec:
command: ["/bin/sh", "-c", "check_redis_ready.sh"]
initialDelaySeconds: 5
periodSeconds: 5
startupProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 0
periodSeconds: 5
failureThreshold: 30 # 30次探测(共150秒)后认为启动成功
配置黄金法则:存活探针间隔需大于应用最大恢复时间(避免频繁重启),就绪探针超时时间需小于服务最大容忍不可用时间(避免流量进入故障Pod)。合理的资源分配是Pod稳定运行的基础:
resources.requests(容器启动所需最小资源)和resources.limits(容器可使用最大资源),避免资源争抢或浪费;示例如下:resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
nodeName(强制指定节点)或nodeSelector(根据节点标签选择)定向调度;示例如下:nodeSelector:
disktype: ssd # 仅调度到标签为disktype=ssd的节点
affinity(亲和性,优先调度到满足条件的节点)和anti-affinity(反亲和性,避免调度到同一节点)优化资源分布;示例如下:affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: kubernetes.io/hostname # 避免同一应用的Pod调度到同一节点
tolerations(容忍度)让Pod调度到带有taints(污点)的节点(如专用节点);示例如下:tolerations:
- key: "dedicated"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.13.0/nvidia-device-plugin.yml),并在Pod中配置nvidia.com/gpu资源限制;示例如下:resources:
limits:
nvidia.com/gpu: 1 # 请求1个GPU
initContainers:
- name: wait-for-db
image: busybox
command: ['sh', '-c', 'until nslookup mysql; do echo waiting for mysql; sleep 2; done']
preStop钩子和terminationGracePeriodSeconds(优雅终止宽限期,默认30秒)确保Pod正常关闭;示例如下:terminationGracePeriodSeconds: 60 # 宽限期设置为60秒
lifecycle:
preStop:
exec:
command: ["sh", "-c", "nginx -s quit; while killall -0 nginx; do sleep 1; done"] # 优雅关闭Nginx
kubectl set image deployment/my-deployment my-container=nginx:1.21 # 更新镜像
若更新出现问题,可使用kubectl rollout undo deployment/my-deployment回滚到上一个版本。