Skip to content

Kubernetes Pod

Pod 是 Kubernetes 的最小调度单位。一个 Pod 中的容器共享网络命名空间和卷,并被放到同一节点。Pod 不是虚拟机,也不是稳定服务地址;控制器会在故障或发布时创建新的 Pod,新 Pod 通常拥有新的 UID 和 IP。

什么时候直接创建 Pod

生产应用通常由 Deployment、StatefulSet、DaemonSet 或 Job 管理,不直接创建裸 Pod。裸 Pod 适合临时调试和最小实验,但节点故障后不会由工作负载控制器补建。

多容器 Pod 只适合生命周期、网络和资源边界紧密耦合的进程,例如应用与必须同地运行的代理。可以独立扩缩、发布或故障隔离的服务应拆成不同 Pod。

一个生产基线

yaml
apiVersion: v1
kind: Pod
metadata:
  name: order-api
  labels:
    app: order-api
spec:
  serviceAccountName: order-api
  terminationGracePeriodSeconds: 30
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  containers:
    - name: api
      image: registry.example.com/order-api@sha256:replace-with-digest
      ports:
        - name: http
          containerPort: 8080
      resources:
        requests:
          cpu: 250m
          memory: 256Mi
        limits:
          memory: 512Mi
      startupProbe:
        httpGet: { path: /health/startup, port: http }
        failureThreshold: 30
        periodSeconds: 5
      readinessProbe:
        httpGet: { path: /health/readiness, port: http }
        periodSeconds: 5
      livenessProbe:
        httpGet: { path: /health/liveness, port: http }
        periodSeconds: 10
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities:
          drop: ["ALL"]

CPU limit 是否设置取决于延迟目标和节流风险;内存 limit 超出时可能导致 OOMKill。requests 应来自测量,因为 scheduler、HPA 和容量规划都会使用它。

生命周期和 Conditions

status.phase 只有 Pending、Running、Succeeded、Failed、Unknown 等粗粒度状态。定位问题应继续看容器状态和 Conditions:

Condition含义
PodScheduled是否已经绑定节点
Initializedinit containers 是否完成
ContainersReady所有业务容器是否 Ready
ReadyPod 是否可作为 Service 后端

Running 不等于 Ready;进程已经启动但就绪探针失败时,Pod 仍不应接收流量。

容器状态中的 waiting.reasonterminated.reason、退出码和 restartCount 比 phase 更能解释 ImagePullBackOffCrashLoopBackOff、OOMKilled 和探针失败。

init container、卷和配置

init container 按顺序运行并全部成功后,业务容器才启动。它适合生成配置、等待必要条件或设置文件权限,但不应无限等待外部服务;超时和失败要能从日志与 Events 看见。

ConfigMap/Secret 环境变量只在容器创建时读取。卷投影可能更新文件,但应用是否重载由应用决定。持久数据应使用 PVC,不写进容器可写层。

排障顺序

bash
kubectl get pod order-api -o wide
kubectl describe pod order-api
kubectl get pod order-api -o jsonpath='{range .status.conditions[*]}{.type}{"="}{.status}{" "}{.reason}{"\n"}{end}'
kubectl logs order-api -c api
kubectl logs order-api -c api --previous
kubectl get events --field-selector involvedObject.name=order-api --sort-by=.metadata.creationTimestamp
现象优先检查
PendingPodScheduled、资源请求、污点/容忍、拓扑、PVC
ImagePullBackOff镜像名、Registry 凭据、节点网络、限流
CrashLoopBackOff当前与 previous 日志、退出码、启动参数、探针
Running 但不接流量Ready Condition、readinessProbe、EndpointSlice
OOMKilledlimit、工作集、堆外内存、并发和内存泄漏
Terminating 很久preStop、宽限期、卷卸载、节点状态和 finalizer

需要进入容器时优先使用 kubectl exec;镜像缺少工具时使用 ephemeral container 调试,避免为了排障永久扩大生产镜像。

别急,先让缓存热一下。