1、K8s Pod 基本使用指南

一、Pod 基础概念

Pod 是 Kubernetes 中最小的调度单元,一个 Pod 包含一个或多个紧密关联的容器,这些容器共享网络命名空间、存储卷和进程空间。

  • 核心特性
    • 容器组:多个容器协同工作(如前端 + 后端)。
    • 共享资源:共享 IP、端口空间和存储卷。
    • 短暂性:Pod 可能因节点故障、扩缩容等原因被重新创建。
二、创建 Pod 的方式
1. 使用 kubectl run 命令(快速创建)

bash

# 创建一个运行 Nginx 的 Pod
kubectl run nginx-pod --image=nginx:latest --port=80

# 查看 Pod 状态
kubectl get pods

# 查看 Pod 详细信息
kubectl describe pod nginx-pod
2. 使用 YAML 配置文件(推荐生产环境)

yaml

apiVersion: v1           # API 版本
kind: Pod                # 资源类型为 Pod
metadata:
  name: nginx-pod        # Pod 名称
  namespace: default     # 命名空间(默认 default)
  labels:
    app: nginx           # 标签,用于筛选资源
spec:
  containers:
    - name: nginx        # 容器名称
      image: nginx:latest # 容器镜像
      ports:
        - containerPort: 80  # 容器暴露端口
      resources:
        requests:
          cpu: 100m        # 申请 100 毫核 CPU
          memory: 128Mi    # 申请 128MB 内存
        limits:
          cpu: 200m        # 限制 200 毫核 CPU
          memory: 256Mi    # 限制 256MB 内存
      volumeMounts:
        - name: data-volume  # 挂载卷名称
          mountPath: /usr/share/nginx/html  # 容器内挂载路径
  volumes:
    - name: data-volume     # 卷名称
      emptyDir: {}          # 临时空目录卷(数据随 Pod 销毁)

创建命令

bash

kubectl apply -f nginx-pod.yaml
三、Pod 核心配置字段解析
字段 说明
metadata.name Pod 的唯一名称,同一命名空间内不可重复。
spec.containers 容器列表,至少包含一个容器,定义镜像、资源限制、端口等。
spec.restartPolicy 重启策略,可选 Always(默认,失败时重启)、OnFailureNever
spec.volumes 存储卷定义,支持 emptyDirhostPathPVC 等多种类型。
spec.nodeSelector 节点选择器,指定 Pod 调度到包含特定标签的节点。
spec.tolerations 污点容忍,允许 Pod 调度到标记了污点的节点。
四、Pod 生命周期与状态
1. 生命周期阶段
  • Pending:Pod 已创建,但容器镜像未完全拉取或节点未调度。
  • Running:Pod 已绑定到节点,所有容器正在运行。
  • Succeeded:容器成功执行并退出(适用于批处理任务)。
  • Failed:容器执行失败(退出码非 0)。
  • Unknown:无法获取 Pod 状态(通常因节点通信问题)。
2. 查看状态命令

bash

# 查看所有 Pod 状态
kubectl get pods -o wide  # -o wide 显示节点信息

# 查看 Pod 详细事件(用于排查问题)
kubectl describe pod <pod-name>
五、Pod 健康检查(Probe)

K8s 支持两种探针确保容器健康:

1. 存活探针(Liveness Probe)
  • 作用:检测容器是否存活,失败时重启容器。
  • 示例配置:

    yaml

    livenessProbe:
      httpGet:
        path: /healthz       # 检查路径
        port: 80             # 端口
        scheme: HTTP         # 协议
      initialDelaySeconds: 10  # 启动后 10 秒开始检查
      periodSeconds: 5        # 每 5 秒检查一次
      failureThreshold: 3     # 连续 3 次失败则重启容器
    
2. 就绪探针(Readiness Probe)
  • 作用:检测容器是否准备好接收流量,失败时将 Pod 从服务端点移除。
  • 示例配置(TCP 检查):

    yaml

    readinessProbe:
      tcpSocket:
        port: 8080           # 检查 TCP 端口
      initialDelaySeconds: 5  # 启动后 5 秒开始检查
    
六、Pod 常用操作命令
操作 命令
查看 Pod 列表 kubectl get pods
查看 Pod 日志 kubectl logs <pod-name>
进入容器 shell kubectl exec -it <pod-name> -- /bin/bash
删除 Pod kubectl delete pod <pod-name>
查看 Pod 资源使用 kubectl top pod <pod-name>
端口转发(调试用) kubectl port-forward <pod-name> 本地端口:容器端口
七、Pod 调度策略
1. 节点选择器(NodeSelector)
  • 通过标签匹配指定节点:

    yaml

    spec:
      nodeSelector:
        disk-type: ssd  # 调度到具有 "disk-type=ssd" 标签的节点
    
2. 亲和性与反亲和性(Affinity / 反 Affinity)
  • 节点亲和性(Node Affinity):

    yaml

    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: environment
                    operator: In
                    values: ["production"]
    
  • Pod 亲和性(Pod Affinity):与其他 Pod 部署在同一节点。
  • Pod 反亲和性(Pod Anti-Affinity):与其他 Pod 部署在不同节点。
八、多容器 Pod(Sidecar 模式)

典型场景:主容器 + 日志收集器 / 监控代理。

yaml

spec:
  containers:
    - name: app-container    # 主应用容器
      image: my-app:latest
    - name: log-collector    # 日志收集 Sidecar
      image: log-collector:v1
      volumeMounts:
        - name: log-volume
          mountPath: /app-logs
  volumes:
    - name: log-volume
      hostPath:
        path: /var/log/app   # 挂载宿主机日志目录

九、最佳实践
  1. 避免直接创建 Pod:生产环境通过控制器(如 Deployment、StatefulSet)管理 Pod,实现自动扩缩容和故障恢复。
  2. 资源限制:为容器设置 requests 和 limits,避免资源竞争。
  3. 标签规范:使用 apptierenv 等标签分类管理 Pod。
  4. 存储卷持久化:对有状态应用使用 PersistentVolumeClaim 而非临时卷。
  5. 健康检查:始终配置 liveness 和 readiness 探针,保障服务可用性。
十、进阶扩展
  • Pod 安全策略(PodSecurityPolicy):限制 Pod 对宿主机资源的访问。
  • Pod 优先级(PriorityClass):定义 Pod 调度优先级,保障关键应用优先部署。
  • 污点(Taint)与容忍(Toleration):控制节点与 Pod 的绑定关系(如专用节点)。

通过以上内容,可全面掌握 K8s Pod 的基础使用。实际应用中,建议结合控制器(如 Deployment)管理 Pod,以实现更健壮的容器编排。

2、Kubernetes Pod 操作命令大全

在 Kubernetes 中,Pod 是最小的可部署计算单元。以下是常用的 Pod 操作命令集合,涵盖基础操作、状态查看、故障排查等场景。

一、基础操作命令
  1. 查看 Pod 列表

    bash

    kubectl get pods                 # 查看当前命名空间下所有Pod
    kubectl get pods -A              # 查看所有命名空间下的Pod
    kubectl get pods -n kube-system  # 查看特定命名空间下的Pod
    kubectl get pods -o wide         # 显示详细信息(包含IP、节点等)
    kubectl get pods -o yaml         # 输出YAML格式
    kubectl get pods -o json         # 输出JSON格式
    
  2. 创建 Pod

    bash

    kubectl apply -f pod.yaml        # 通过YAML文件创建
    kubectl run nginx --image=nginx  # 快速创建nginx Pod
    
  3. 删除 Pod

    bash

    kubectl delete pod my-pod        # 删除指定Pod
    kubectl delete pods --all        # 删除当前命名空间下所有Pod
    kubectl delete -f pod.yaml       # 删除YAML文件定义的Pod
    
  4. 强制删除 Pod

    bash

    kubectl delete pod my-pod --grace-period=0 --force
    
二、Pod 状态与详情
  1. 查看 Pod 详细信息

    bash

    kubectl describe pod my-pod      # 查看Pod详细描述
    
  2. 查看 Pod 日志

    bash

    kubectl logs my-pod              # 查看Pod当前日志
    kubectl logs -f my-pod           # 实时流式查看日志(类似tail -f)
    kubectl logs my-pod -c container-name  # 查看多容器Pod中特定容器的日志
    kubectl logs my-pod --previous   # 查看前一个容器实例的日志(容器重启后)
    
  3. 查看 Pod 事件

    bash

    kubectl get events --field-selector involvedObject.name=my-pod
    
三、Pod 内部操作
  1. 进入 Pod 容器

    bash

    kubectl exec -it my-pod -- bash  # 进入Pod的默认容器
    kubectl exec -it my-pod -c container-name -- sh  # 进入多容器Pod的特定容器
    
  2. 在 Pod 内执行命令

    bash

    kubectl exec my-pod -- ls /      # 执行ls命令
    kubectl exec my-pod -- cat /etc/hosts  # 查看hosts文件
    
四、Pod 故障排查
  1. 检查 Pod 健康状态

    bash

    kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,RESTARTS:.status.containerStatuses[0].restartCount
    
  2. 检查 Pod 调度失败原因

    bash

    kubectl describe pod my-pod | grep -A 10 "FailedScheduling"
    
  3. 检查容器崩溃循环

    bash

    kubectl get pods my-pod -o jsonpath='{.status.containerStatuses[0].state.waiting.message}'
    
五、Pod 资源与标签
  1. 查看 Pod 资源使用情况

    bash

    kubectl top pods                 # 查看CPU和内存使用情况
    kubectl top pods --containers    # 按容器显示资源使用
    
  2. 添加 / 修改 Pod 标签

    bash

    kubectl label pods my-pod app=frontend       # 添加标签
    kubectl label pods my-pod env=prod --overwrite  # 修改已有标签
    
  3. 基于标签筛选 Pod

    bash

    kubectl get pods -l app=nginx                # 筛选特定标签的Pod
    kubectl get pods -l 'app in (nginx,mysql)'  # 多值筛选
    
六、Pod YAML 操作
  1. 生成 Pod YAML 模板

    bash

    kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml
    
  2. 查看运行中 Pod 的 YAML 定义

    bash

    kubectl get pod my-pod -o yaml
    
  3. 修补(Patch)Pod 配置

    bash

    kubectl patch pod my-pod -p '{"spec":{"containers":[{"name":"nginx","image":"nginx:1.21"}]}}'
    
七、高级操作
  1. 端口转发

    bash

    kubectl port-forward my-pod 8080:80  # 将Pod的80端口映射到本地8080端口
    
  2. 复制文件到 / 从 Pod

    bash

    kubectl cp my-pod:/tmp/file.txt ./local-file.txt  # 从Pod复制文件
    kubectl cp ./local-file.txt my-pod:/tmp/          # 复制文件到Pod
    
  3. 强制驱逐不可用节点上的 Pod

    bash

    kubectl drain node-name --ignore-daemonsets --force
    
  4. 滚动重启 Pod

    bash

    kubectl rollout restart deployment my-deployment  # 重启Deployment下属的所有Pod
    
八、常用参数速查表
参数 作用
-n NAMESPACE 指定命名空间
-o FORMAT 指定输出格式(yaml/json/wide)
--all-namespaces 跨所有命名空间操作
--watch 实时监控资源变化
--dry-run=client 模拟执行,不实际创建资源
--grace-period=0 立即删除,跳过优雅终止
九、实践建议
  1. 使用别名简化命令

    bash

    alias k=kubectl
    complete -F __start_kubectl k  # 启用命令补全
    

  2. 使用 Krew 插件扩展功能

    bash

    kubectl krew install tree      # 树形查看资源关系
    kubectl krew install neat      # 美化YAML输出
    

  3. 使用自定义输出模板

    bash

    kubectl get pods -o custom-columns='NAME:.metadata.name,NODE:.spec.nodeName,IP:.status.podIP'
    

  4. 结合watch实时监控

    bash

    watch -n 1 kubectl get pods    # 每秒刷新一次Pod状态
    

通过这些命令,你可以全面管理 Kubernetes 中的 Pod 资源。建议结合kubectl explain命令查看资源字段详情,或使用kubectl docs访问官方文档。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐