Skip to content

Pod基础

概述

Pod是Kubernetes中最小的可部署单元,代表集群中运行的一个进程。一个Pod包含一个或多个容器,这些容器共享存储、网络和命名空间。

Pod核心概念

1. Pod生命周期

生命周期阶段

Pod的生命周期包括以下几个阶段:

  • Pending: Pod已被Kubernetes系统接受,但有一个或多个容器尚未创建
  • Running: Pod已绑定到节点,所有容器都已创建
  • Succeeded: Pod中的所有容器都已成功终止
  • Failed: Pod中至少有一个容器以失败状态终止
  • Unknown: 无法获取Pod状态

生命周期钩子

Pod提供了生命周期钩子,允许在容器生命周期的特定时间点执行操作:

yaml
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo 'Container started' > /var/log/startup.log"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo 'Container stopping' > /var/log/shutdown.log"]
  • postStart: 容器启动后立即执行
  • preStop: 容器终止前执行

终止过程

Pod的终止过程包括以下步骤:

  1. 发送终止信号(SIGTERM)给容器
  2. 等待优雅终止期(grace period)
  3. 如果容器在优雅终止期内未终止,发送SIGKILL信号
  4. 从API服务器中移除Pod

重启策略

Pod的重启策略决定了容器失败时的行为:

yaml
spec:
  restartPolicy: Always  # Always, OnFailure, Never
  • Always: 总是重启失败的容器(默认)
  • OnFailure: 只在容器以非零状态码退出时重启
  • Never: 从不重启容器

2. Pod与容器的关系

  • 一个Pod可以包含一个或多个容器
  • 容器共享Pod的网络命名空间
  • 容器可以通过localhost相互通信
  • 容器共享存储卷

3. Pod网络

  • 每个Pod获得唯一的IP地址
  • Pod内的容器共享网络命名空间
  • 容器间可以通过localhost通信
  • 外部访问需要通过Service

Pod配置详解

基本Pod配置

yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
    tier: frontend
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

多容器Pod配置

yaml
apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80
  - name: redis
    image: redis:6.2
    ports:
    - containerPort: 6379
  - name: sidecar
    image: busybox
    command: ['sh', '-c', 'while true; do echo "Sidecar running"; sleep 10; done']

Pod探针

1. 存活探针(Liveness Probe)

检查容器是否仍在运行。如果失败,kubelet会杀死容器并重启。

yaml
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 15
  periodSeconds: 20
  timeoutSeconds: 1
  successThreshold: 1
  failureThreshold: 3

2. 就绪探针(Readiness Probe)

检查容器是否已准备好接收流量。如果失败,Pod会从Service的端点列表中移除。

yaml
readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5

3. 启动探针(Startup Probe)

检查容器是否已成功启动。用于处理启动时间较长的应用。

yaml
startupProbe:
  httpGet:
    path: /health
    port: 8080
  failureThreshold: 30
  periodSeconds: 10

Pod资源管理

资源请求(Requests)

容器运行所需的最小资源量。

yaml
resources:
  requests:
    memory: "64Mi"
    cpu: "250m"

资源限制(Limits)

容器可以使用的最大资源量。

yaml
resources:
  limits:
    memory: "128Mi"
    cpu: "500m"

资源单位说明

  • CPU: 1个CPU核心 = 1000m(毫核)
  • 内存: 可以使用Ki、Mi、Gi等单位

Pod存储

临时存储(emptyDir)

yaml
volumes:
- name: cache-volume
  emptyDir: {}

主机路径存储(hostPath)

yaml
volumes:
- name: host-path-volume
  hostPath:
    path: /data
    type: Directory

配置存储(ConfigMap)

yaml
volumes:
- name: config-volume
  configMap:
    name: app-config

Pod安全

1. 安全上下文(Security Context)

容器级安全上下文

yaml
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    securityContext:
      runAsUser: 1000
      runAsGroup: 3000
      runAsNonRoot: true
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop:
        - ALL
        add:
        - NET_BIND_SERVICE
      seccompProfile:
        type: RuntimeDefault

Pod级安全上下文

yaml
spec:
  securityContext:
    fsGroup: 2000
    runAsNonRoot: true
  containers:
  - name: nginx
    image: nginx:1.21

2. Pod安全标准(Pod Security Standards)

特权(Privileged)

  • 无限制的权限
  • 允许所有特权操作
  • 仅用于特殊系统级应用

基线(Baseline)

  • 中等安全级别
  • 禁止已知的特权操作
  • 适合大多数应用

受限(Restricted)

  • 最高安全级别
  • 严格限制所有特权
  • 推荐用于生产环境

3. 网络安全

网络策略(NetworkPolicy)

yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-app-network-policy
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 80
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database
    ports:
    - protocol: TCP
      port: 3306

4. 镜像安全

镜像拉取策略

yaml
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    imagePullPolicy: Always  # Always, IfNotPresent, Never

镜像签名验证

yaml
spec:
  containers:
  - name: nginx
    image: nginx:1.21
  imagePullSecrets:
  - name: regcred

5. 敏感信息管理

使用Secret

yaml
spec:
  containers:
  - name: app
    image: myapp:latest
    env:
    - name: API_KEY
      valueFrom:
        secretKeyRef:
          name: app-secret
          key: api-key

使用环境变量加密

yaml
spec:
  containers:
  - name: app
    image: myapp:latest
    env:
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: password

6. 安全最佳实践

  1. 使用非root用户:始终以非root用户运行容器
  2. 限制权限:使用最小权限原则
  3. 只读文件系统:配置容器使用只读根文件系统
  4. 禁用特权:禁止特权容器和特权升级
  5. 网络隔离:使用网络策略限制Pod间通信
  6. 镜像安全:使用官方镜像,定期更新,扫描漏洞
  7. 敏感信息:使用Secret管理敏感信息
  8. 安全监控:监控异常行为和安全事件

Pod调度

节点选择器(nodeSelector)

yaml
spec:
  nodeSelector:
    disktype: ssd

节点亲和性(nodeAffinity)

yaml
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/os
            operator: In
            values:
            - linux

污点和容忍(Taints and Tolerations)

yaml
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"

Pod实践示例

示例1:Web应用Pod

yaml
apiVersion: v1
kind: Pod
metadata:
  name: web-app
  labels:
    app: web
    environment: production
spec:
  containers:
  - name: web
    image: nginx:1.21
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 30
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
    resources:
      requests:
        memory: "128Mi"
        cpu: "250m"
      limits:
        memory: "256Mi"
        cpu: "500m"

示例2:数据库Pod

yaml
apiVersion: v1
kind: Pod
metadata:
  name: database
  labels:
    app: database
    tier: backend
spec:
  containers:
  - name: mysql
    image: mysql:8.0
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "password123"
    ports:
    - containerPort: 3306
    volumeMounts:
    - name: mysql-data
      mountPath: /var/lib/mysql
  volumes:
  - name: mysql-data
    persistentVolumeClaim:
      claimName: mysql-pvc

Pod操作命令

创建Pod

bash
kubectl apply -f pod.yaml
kubectl create -f pod.yaml

查看Pod

bash
kubectl get pods
kubectl get pods -o wide
kubectl describe pod <pod-name>

进入Pod

bash
kubectl exec -it <pod-name> -- /bin/bash
kubectl exec <pod-name> -- ls /

查看日志

bash
kubectl logs <pod-name>
kubectl logs -f <pod-name>
kubectl logs <pod-name> -c <container-name>

删除Pod

bash
kubectl delete pod <pod-name>
kubectl delete -f pod.yaml

Pod故障排查

常见问题

1. Pod处于Pending状态

bash
# 查看Pod事件
kubectl describe pod <pod-name>

# 查看节点资源
kubectl describe node <node-name>

# 检查资源配额
kubectl get resourcequotas

2. Pod处于CrashLoopBackOff状态

bash
# 查看Pod日志
kubectl logs <pod-name>

# 查看容器退出码
kubectl describe pod <pod-name>

# 进入容器调试
kubectl exec -it <pod-name> -- /bin/sh

3. Pod无法访问网络

bash
# 检查网络插件
kubectl get pods -n kube-system

# 测试网络连通性
kubectl run test --image=busybox --rm -it -- ping <target-ip>

# 检查网络策略
kubectl get networkpolicy --all-namespaces

Pod最佳实践

1. 单容器Pod原则

  • 优先使用单容器Pod:每个Pod只运行一个主要容器
  • 合理使用多容器:只有当容器需要紧密耦合时才放在同一Pod
  • 常见多容器模式
    • 边车模式(Sidecar):日志收集、监控等
    • 初始化容器(Init Container):应用启动前的准备工作
    • 适配器模式(Adapter):数据格式转换

2. 资源管理

  • 设置资源请求和限制:根据应用实际需求配置
  • 合理分配资源:避免资源过度分配或不足
  • 使用资源配额:在命名空间级别限制资源使用
  • 监控资源使用:定期检查资源使用情况,调整配置

3. 健康检查

  • 配置多种探针
    • 存活探针(Liveness Probe):检测容器是否需要重启
    • 就绪探针(Readiness Probe):检测容器是否可以接收流量
    • 启动探针(Startup Probe):处理启动时间长的应用
  • 设置合理参数:根据应用特性调整检查间隔和超时时间
  • 避免误判:确保探针逻辑准确反映应用状态

4. 配置管理

  • 使用ConfigMap:管理应用配置,支持热更新
  • 使用Secret:安全管理敏感信息
  • 环境变量:传递配置参数
  • 卷挂载:挂载配置文件

5. 安全配置

  • 使用非root用户:以非特权用户运行容器
  • 限制权限:使用最小权限原则
  • 只读文件系统:配置容器使用只读根文件系统
  • 禁用特权:禁止特权容器和特权升级
  • 网络隔离:使用网络策略限制Pod间通信
  • 镜像安全:使用官方镜像,定期更新,扫描漏洞

6. 调度优化

  • 节点选择:使用nodeSelector和nodeAffinity选择合适的节点
  • 亲和性和反亲和性:控制Pod分布
  • 污点和容忍:实现节点隔离
  • Pod优先级:确保重要应用优先调度
  • 资源预留:为系统组件预留资源

7. 存储管理

  • 使用持久卷:对于需要持久化的数据
  • 选择合适的存储类:根据性能和可靠性需求
  • 临时存储:使用emptyDir存储临时数据
  • 主机路径:谨慎使用hostPath,避免节点依赖

8. 网络配置

  • 合理设置网络策略:限制Pod间通信
  • 使用Service:为Pod提供稳定的网络端点
  • Ingress:管理外部访问
  • DNS配置:确保Pod间可以通过服务名通信

9. 标签和注解

  • 使用有意义的标签:便于资源管理和查询
  • 标准化标签:使用推荐的标签规范
  • 注解:存储元数据和配置信息
  • 标签选择器:用于Service和Deployment的选择

10. 监控和日志

  • 配置日志收集:使用Sidecar容器或日志驱动
  • 暴露指标:实现应用指标的采集
  • 健康检查端点:提供应用健康状态
  • 事件监控:关注Pod相关事件

11. 故障排查

  • 日志分析:检查容器日志
  • 事件查看:分析Pod事件
  • 资源监控:检查资源使用情况
  • 网络诊断:测试网络连通性
  • 配置验证:检查Pod配置是否正确

总结

Pod是Kubernetes的核心概念,是集群中最小的可部署单元。通过本章的学习,您已经掌握了:

核心内容

  1. Pod生命周期管理

    • 生命周期阶段(Pending、Running、Succeeded、Failed、Unknown)
    • 生命周期钩子(postStart、preStop)
    • 终止过程和优雅终止
    • 重启策略(Always、OnFailure、Never)
  2. 安全配置

    • 安全上下文(容器级和Pod级)
    • Pod安全标准(Privileged、Baseline、Restricted)
    • 网络安全和网络策略
    • 镜像安全和敏感信息管理
    • 安全最佳实践
  3. 配置和管理

    • 基本Pod配置和多容器Pod
    • 资源管理(请求和限制)
    • 健康检查(存活、就绪、启动探针)
    • 存储管理(emptyDir、hostPath、ConfigMap)
    • 调度策略(节点选择器、亲和性、污点和容忍)
  4. 最佳实践

    • 单容器Pod原则和多容器模式
    • 资源管理和健康检查
    • 配置管理和安全配置
    • 调度优化和存储管理
    • 网络配置和标签管理
    • 监控日志和故障排查

理解Pod的工作原理和最佳实践,对于构建稳定、高效、安全的Kubernetes应用至关重要。Pod作为Kubernetes的基础单元,是所有其他资源(如Deployment、StatefulSet、Service等)的基础,掌握Pod的使用是Kubernetes学习的重要一步。

下一步学习