第189集:Pod 与 Deployment

核心知识点讲解

1. Pod基础

基本概念

Pod是Kubernetes中最小的部署单元,它是一个或多个容器的集合,这些容器共享网络、存储和命名空间。Pod中的容器总是被调度到同一个节点上运行。

Pod的特点

  • 共享网络:Pod中的容器共享同一个网络命名空间,可以通过localhost通信
  • 共享存储:Pod中的容器可以共享卷
  • 生命周期短暂:Pod是临时的,会被创建、销毁和替换
  • 不可修改:Pod创建后,其规格不能被修改,只能通过替换来更新

Pod的创建

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
  - name: sidecar
    image: busybox:latest
    command: ["/bin/sh", "-c", "while true; do echo hello; sleep 10; done"]
# 创建Pod
kubectl apply -f pod.yaml

# 查看Pod
kubectl get pods

# 查看Pod详情
kubectl describe pod my-pod

# 删除Pod
kubectl delete pod my-pod

2. Pod配置详解

容器配置

  • image:容器镜像
  • command:覆盖容器的默认命令
  • args:传递给命令的参数
  • env:环境变量
  • ports:容器端口
  • resources:资源限制和请求
  • volumeMounts:挂载卷
  • livenessProbe:存活探针
  • readinessProbe:就绪探针
  • startupProbe:启动探针

示例配置

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: app
    image: my-app:latest
    ports:
    - containerPort: 8080
    env:
    - name: ENVIRONMENT
      value: production
    resources:
      limits:
        cpu: "1"
        memory: "512Mi"
      requests:
        cpu: "500m"
        memory: "256Mi"
    livenessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
    volumeMounts:
    - name: config-volume
      mountPath: /app/config
  volumes:
  - name: config-volume
    configMap:
      name: app-config

3. Deployment基础

基本概念

Deployment是Kubernetes中用于管理Pod副本的控制器,它提供了声明式的更新能力,确保指定数量的Pod副本正在运行,并支持滚动更新和回滚。

Deployment的特点

  • 声明式更新:通过修改Deployment的规格来更新应用
  • 滚动更新:逐步替换旧Pod,确保服务不中断
  • 回滚:支持回滚到之前的版本
  • 扩缩容:可以手动或自动调整Pod副本数量
  • 健康检查:确保只有健康的Pod被加入服务

Deployment的创建

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
# 创建Deployment
kubectl apply -f deployment.yaml

# 查看Deployment
kubectl get deployments

# 查看ReplicaSet
kubectl get replicasets

# 查看Pod
kubectl get pods

4. Deployment配置详解

基本配置

  • replicas:Pod副本数量
  • selector:选择器,用于匹配Pod
  • template:Pod模板
  • strategy:更新策略
  • minReadySeconds:最小就绪时间
  • revisionHistoryLimit:保留的历史版本数量

更新策略

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        ports:
        - containerPort: 80

5. 管理操作

扩缩容

# 手动扩缩容
kubectl scale deployment my-deployment --replicas=5

# 自动扩缩容(HPA)
kubectl autoscale deployment my-deployment --min=2 --max=10 --cpu-percent=80

# 查看HPA
kubectl get hpa

更新

# 通过编辑配置文件更新
kubectl edit deployment my-deployment

# 通过命令更新镜像
kubectl set image deployment my-deployment nginx=nginx:1.17.0

# 查看更新状态
kubectl rollout status deployment my-deployment

回滚

# 查看历史版本
kubectl rollout history deployment my-deployment

# 查看特定版本的详情
kubectl rollout history deployment my-deployment --revision=2

# 回滚到上一个版本
kubectl rollout undo deployment my-deployment

# 回滚到特定版本
kubectl rollout undo deployment my-deployment --to-revision=1

暂停和恢复

# 暂停更新
kubectl rollout pause deployment my-deployment

# 进行多次修改...

# 恢复更新
kubectl rollout resume deployment my-deployment

6. 健康检查

存活探针(Liveness Probe)

存活探针用于检测容器是否正在运行,如果探测失败,kubelet会重启容器。

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
  timeoutSeconds: 5
  failureThreshold: 3
  successThreshold: 1

就绪探针(Readiness Probe)

就绪探针用于检测容器是否准备好接收流量,如果探测失败,Pod会从Service的端点中移除。

readinessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 10

启动探针(Startup Probe)

启动探针用于检测容器是否已经启动完成,适用于启动较慢的应用。

startupProbe:
  exec:
    command:
    - cat
    - /app/ready
  initialDelaySeconds: 10
  periodSeconds: 5
  failureThreshold: 30

7. 最佳实践

Pod设计

  • 单一职责:每个Pod应该只包含一个主要容器和必要的辅助容器
  • 使用标签:为Pod添加有意义的标签,便于管理和服务发现
  • 配置健康检查:为所有容器配置适当的健康检查
  • 设置资源限制:为容器设置资源请求和限制
  • 使用Init容器:用于初始化操作

Deployment管理

  • 使用Deployment:优先使用Deployment而不是直接创建Pod
  • 合理设置更新策略:根据应用特性选择合适的更新策略
  • 保留历史版本:设置适当的revisionHistoryLimit
  • 使用命名空间:将不同环境的Deployment部署到不同的命名空间
  • 监控Deployment:监控Deployment的状态和性能

实用案例分析

案例1:部署多容器应用

场景描述:部署一个包含主应用和日志收集器的多容器应用。

解决方案

# app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-with-logger
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: main-app
        image: my-app:latest
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: log-volume
          mountPath: /app/logs
      - name: logger
        image: fluentd:latest
        volumeMounts:
        - name: log-volume
          mountPath: /app/logs
      volumes:
      - name: log-volume
        emptyDir: {}

实施效果

  • 主应用和日志收集器在同一个Pod中运行
  • 它们共享日志卷,logger可以实时收集main-app的日志
  • Deployment确保应用有2个副本运行

案例2:蓝绿部署

场景描述:使用Deployment实现蓝绿部署,确保零 downtime 升级。

解决方案

# 部署蓝环境
kubectl apply -f blue-deployment.yaml

# 创建服务指向蓝环境
kubectl apply -f service.yaml

# 部署绿环境
kubectl apply -f green-deployment.yaml

# 验证绿环境正常运行
# ...

# 更新服务指向绿环境
kubectl patch service my-service -p '{"spec":{"selector":{"app":"my-app","version":"green"}}}'

# 验证服务正常
# ...

# 删除蓝环境(可选)
kubectl delete deployment blue-deployment

实施效果

  • 蓝绿两个环境并行运行
  • 通过更新服务的选择器实现流量切换
  • 切换过程零 downtime
  • 可以快速回滚到蓝环境

课后练习

  1. 创建一个包含多个容器的Pod
  2. 为Pod配置健康检查
  3. 使用Deployment部署应用并设置3个副本
  4. 执行滚动更新,将应用版本从v1更新到v2
  5. 执行回滚操作,将应用回滚到v1版本
  6. 为Deployment配置自动扩缩容
  7. 实现一个包含Init容器的Deployment
  8. 设计一个蓝绿部署方案

总结

Pod和Deployment是Kubernetes中最核心的资源对象,它们构成了容器编排的基础。Pod作为最小的部署单元,提供了容器的运行环境;而Deployment则提供了声明式的方式来管理Pod的副本和更新。通过本集的学习,我们了解了Pod和Deployment的基本概念、配置方法、管理操作以及最佳实践。掌握这些技能对于使用Kubernetes进行容器编排至关重要,它们是构建可靠、可扩展的云原生应用的基础。在实际应用中,我们应该根据应用的特性和需求,合理配置Pod和Deployment,遵循最佳实践,确保应用的稳定性和可靠性。

« 上一篇 Kubernetes 基础 下一篇 » Pod 与 Deployment