跳转至

K8s Pod 与 Deployment

一句话概述:Pod 是 Kubernetes 最小的部署单元(一个或多个容器的组合),Deployment 管理 Pod 的副本数量和滚动更新,是 K8s 中最常用的工作负载资源。

核心知识点

概念白话解释
Pod豆荚 = 一个或多个容器打包在一起,共享网络和存储
Deployment部署 = 管理 Pod 副本的控制器(维持数量、滚动更新)
ReplicaSet副本集 = Deployment 自动创建的,负责维持指定数量的 Pod
Container容器 = Pod 中的一个 Docker 容器
Init Container初始化容器 = Pod 启动前先运行的容器(做准备工作)
Sidecar边车 = 和主容器一起运行的辅助容器
Label标签 = 键值对,用来标记和筛选资源
Selector选择器 = 根据标签筛选资源

安装配置

# 安装 kubectl(K8s 命令行工具)
# macOS
brew install kubectl

# Ubuntu
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/

# 本地学习用 minikube
brew install minikube  # macOS
minikube start  # 启动本地 K8s 集群

# 验证
kubectl version  # 查看版本
kubectl cluster-info  # 查看集群信息

基本使用

1. Pod

# pod.yaml — 最简单的 Pod
apiVersion: v1
kind: Pod  # 资源类型:Pod
metadata:
  name: my-pod  # Pod 名称
  labels:
    app: web  # 标签(用于选择器筛选)
spec:
  containers:
    - name: web  # 容器名
      image: nginx:latest  # 镜像
      ports:
        - containerPort: 80  # 容器端口
      resources:  # 资源限制
        requests:  # 最低保证
          cpu: "100m"  # 0.1 个 CPU
          memory: "128Mi"  # 128 MB 内存
        limits:  # 最大限制
          cpu: "500m"  # 0.5 个 CPU
          memory: "256Mi"  # 256 MB 内存
      livenessProbe:  # 存活探针(不响应就重启)
        httpGet:
          path: /  # 检查的 URL
          port: 80
        initialDelaySeconds: 10  # 启动后等10秒再检查
        periodSeconds: 5  # 每5秒检查一次
      readinessProbe:  # 就绪探针(不就绪就不接流量)
        httpGet:
          path: /
          port: 80
        initialDelaySeconds: 5
kubectl apply -f pod.yaml  # 创建 Pod
kubectl get pods  # 查看 Pod 列表
kubectl describe pod my-pod  # 查看 Pod 详情
kubectl logs my-pod  # 查看日志
kubectl exec -it my-pod -- bash  # 进入 Pod
kubectl delete pod my-pod  # 删除 Pod

2. Deployment

# deployment.yaml
apiVersion: apps/v1
kind: Deployment  # 资源类型:Deployment
metadata:
  name: web-deployment
  labels:
    app: web
spec:
  replicas: 3  # 运行3个 Pod 副本
  selector:
    matchLabels:
      app: web  # 管理带有 app=web 标签的 Pod
  strategy:
    type: RollingUpdate  # 滚动更新策略
    rollingUpdate:
      maxSurge: 1  # 更新时最多多出1个 Pod
      maxUnavailable: 0  # 更新时不允许有不可用的 Pod
  template:  # Pod 模板
    metadata:
      labels:
        app: web  # Pod 的标签(必须与 selector 匹配)
    spec:
      containers:
        - name: web
          image: myapp:v1.0  # 应用镜像
          ports:
            - containerPort: 8080
          env:  # 环境变量
            - name: DATABASE_URL
              value: "postgresql://db:5432/mydb"
          resources:
            requests:
              cpu: "200m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
kubectl apply -f deployment.yaml  # 创建/更新 Deployment
kubectl get deployments  # 查看 Deployment 列表
kubectl get pods -l app=web  # 查看这个 Deployment 管理的 Pod
kubectl rollout status deployment/web-deployment  # 查看部署状态

# 扩缩容
kubectl scale deployment web-deployment --replicas=5  # 扩到5个副本

# 更新镜像(触发滚动更新)
kubectl set image deployment/web-deployment web=myapp:v2.0  # 更新镜像版本

# 查看更新历史
kubectl rollout history deployment/web-deployment

# 回滚
kubectl rollout undo deployment/web-deployment  # 回滚到上一个版本
kubectl rollout undo deployment/web-deployment --to-revision=2  # 回滚到指定版本

3. 带 Init Container 的 Pod

apiVersion: v1
kind: Pod
metadata:
  name: analysis-pod
spec:
  initContainers:  # 初始化容器(按顺序执行,全部完成后才启动主容器)
    - name: download-data  # 下载数据
      image: busybox
      command: ['wget', '-O', '/data/reference.fa', 'https://example.com/ref.fa']
      volumeMounts:
        - name: data
          mountPath: /data

  containers:  # 主容器
    - name: analysis
      image: biocontainers/samtools:v1.19
      command: ['samtools', 'index', '/data/reference.fa']
      volumeMounts:
        - name: data
          mountPath: /data

  volumes:
    - name: data
      emptyDir: {}  # 临时卷,Pod 生命周期内存在

高级用法

1. 多容器 Pod(Sidecar 模式)

spec:
  containers:
    - name: app  # 主容器
      image: myapp:latest
      ports: [{containerPort: 8080}]

    - name: log-collector  # 边车:日志收集
      image: fluentd:latest
      volumeMounts:
        - name: logs
          mountPath: /var/log/app

  volumes:
    - name: logs
      emptyDir: {}

2. Pod 亲和性(调度控制)

spec:
  affinity:
    podAntiAffinity:  # Pod 反亲和:不要把同一应用的 Pod 放在同一个节点
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchLabels:
                app: web
            topologyKey: kubernetes.io/hostname

常见报错

报错信息原因解决方法
ImagePullBackOff拉取镜像失败检查镜像名、仓库权限
CrashLoopBackOff容器不断崩溃重启kubectl logs 查看日志
PendingPod 调度不上kubectl describe pod 看原因(资源不足?)
OOMKilled内存超限被杀增加 resources.limits.memory
CreateContainerConfigError配置错误检查 ConfigMap/Secret 引用

速查表

# === Pod 操作 ===
kubectl get pods                  # 列出 Pod
kubectl get pods -o wide          # 详细列出(含 IP、节点)
kubectl describe pod <name>       # 查看详情
kubectl logs <pod> [-c container] # 查看日志
kubectl exec -it <pod> -- bash    # 进入 Pod
kubectl delete pod <name>         # 删除 Pod
kubectl top pod                   # 查看资源使用

# === Deployment 操作 ===
kubectl get deployments           # 列出 Deployment
kubectl scale deploy <n> --replicas=5  # 扩缩容
kubectl set image deploy/<n> c=img:v2  # 更新镜像
kubectl rollout status deploy/<n>      # 查看部署状态
kubectl rollout history deploy/<n>     # 查看历史
kubectl rollout undo deploy/<n>        # 回滚

# === 常用参数 ===
-l app=web                        # 按标签筛选
-n namespace                      # 指定命名空间
-o yaml                           # 输出 YAML
-o json                           # 输出 JSON
--watch                           # 实时监听变化

参考:Kubernetes Pod 文档 | Deployment 文档 | 更新于 2026 年