温馨提示×

centos k8s Pod如何管理

小樊
35
2025-11-01 21:37:06
栏目: 智能运维

CentOS环境下Kubernetes Pod管理指南

一、Pod基础管理操作

Pod是Kubernetes的核心调度单元,基础管理操作可通过kubectl命令完成:

  • 查看Pod状态:使用kubectl get pods查看集群中所有Pod的名称、状态(Pending/Running/Succeeded/Failed)、重启次数及运行时间;添加-o wide可显示节点信息,-n <namespace>可指定命名空间。
  • 创建Pod:通过YAML文件定义Pod配置(如pod.yaml),包含容器镜像、端口、资源限制等字段,使用kubectl apply -f pod.yaml创建;也可使用kubectl run命令快速创建(如kubectl run nginx --image=nginx:latest --port=80)。
  • 删除Pod:使用kubectl delete pod <pod-name>删除指定Pod;若Pod由Deployment、StatefulSet等控制器管理,删除后会自动重建(需修改控制器配置彻底删除)。
  • 查看Pod详情:使用kubectl describe pod <pod-name>查看Pod的事件(如调度、拉取镜像)、容器状态(Waiting/Running/Terminated)及配置信息,是排查问题的关键命令。
  • 查看Pod日志:使用kubectl logs <pod-name>查看主容器日志;添加--previous可查看上一次运行日志,-f可实时跟踪日志输出。

二、Pod生命周期管理

Pod的生命周期从创建到终止经历多个阶段,需关注关键状态及配置:

  • 生命周期阶段
    • Pending:Pod已创建但容器未启动,主要进行调度(等待节点资源)和镜像拉取;若资源不足或镜像过大,此阶段会持续较长时间。
    • ContainerCreating:容器正在创建(如挂载存储卷、分配网络IP),属于Pending到Running的过渡阶段。
    • Running:至少一个容器正在运行,此时会启动探针检测(存活、就绪、启动探针)。
    • Terminating:Pod被删除后进入此阶段,执行优雅终止流程(发送SIGTERM信号→执行PreStop钩子→等待terminationGracePeriodSeconds→发送SIGKILL强制终止)。
    • Succeeded/Failed:批处理任务(Job/CronJob)的Pod特有状态,分别表示任务成功完成或失败。
  • 重启策略:通过restartPolicy字段设置,可选Always(默认,容器终止后总是重启,适用于Deployment/StatefulSet)、OnFailure(容器退出码非0时重启,适用于Job)、Never(永不重启,适用于调试Pod)。

三、健康检查与探针配置

探针是确保Pod健康运行的关键机制,Kubernetes提供三种探针:

  • 存活探针(LivenessProbe):检测容器是否仍在运行,失败时重启容器(避免僵尸进程);配置示例如下:
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 30  # 容器启动后延迟30秒开始探测(避免过早杀死启动慢的应用)
      periodSeconds: 10        # 每10秒探测一次
      timeoutSeconds: 2        # 探测超时时间(超过则视为失败)
      failureThreshold: 3      # 连续失败3次后重启容器
    
  • 就绪探针(ReadinessProbe):检测容器是否准备好接受流量,失败时从Service的负载均衡池中移除(避免流量进入未就绪的Pod);配置示例如下:
    readinessProbe:
      exec:
        command: ["/bin/sh", "-c", "check_redis_ready.sh"]
      initialDelaySeconds: 5
      periodSeconds: 5
    
  • 启动探针(StartupProbe):检测容器是否正在启动(如慢启动应用),启动期间禁用存活和就绪探针;配置示例如下:
    startupProbe:
      httpGet:
        path: /healthz
        port: 80
      initialDelaySeconds: 0
      periodSeconds: 5
      failureThreshold: 30  # 30次探测(共150秒)后认为启动成功
    
    配置黄金法则:存活探针间隔需大于应用最大恢复时间(避免频繁重启),就绪探针超时时间需小于服务最大容忍不可用时间(避免流量进入故障Pod)。

四、资源分配与调度优化

合理的资源分配是Pod稳定运行的基础:

  • 资源请求与限制:在Pod或Deployment配置中设置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"
      
  • GPU调度:若需使用GPU资源,需安装NVIDIA设备插件(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
    

五、高级管理技巧

  • Init容器:在主容器启动前顺序执行的容器,用于完成准备工作(如等待依赖服务、下载配置文件);配置示例如下:
    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
    
  • 滚动更新与回滚:使用Deployment进行滚动更新(逐步替换旧Pod),示例如下:
    kubectl set image deployment/my-deployment my-container=nginx:1.21  # 更新镜像
    
    若更新出现问题,可使用kubectl rollout undo deployment/my-deployment回滚到上一个版本。

0