第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-pod2. 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-config3. 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 pods4. 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: 805. 管理操作
扩缩容
# 手动扩缩容
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-deployment6. 健康检查
存活探针(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: 307. 最佳实践
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
- 可以快速回滚到蓝环境
课后练习
- 创建一个包含多个容器的Pod
- 为Pod配置健康检查
- 使用Deployment部署应用并设置3个副本
- 执行滚动更新,将应用版本从v1更新到v2
- 执行回滚操作,将应用回滚到v1版本
- 为Deployment配置自动扩缩容
- 实现一个包含Init容器的Deployment
- 设计一个蓝绿部署方案
总结
Pod和Deployment是Kubernetes中最核心的资源对象,它们构成了容器编排的基础。Pod作为最小的部署单元,提供了容器的运行环境;而Deployment则提供了声明式的方式来管理Pod的副本和更新。通过本集的学习,我们了解了Pod和Deployment的基本概念、配置方法、管理操作以及最佳实践。掌握这些技能对于使用Kubernetes进行容器编排至关重要,它们是构建可靠、可扩展的云原生应用的基础。在实际应用中,我们应该根据应用的特性和需求,合理配置Pod和Deployment,遵循最佳实践,确保应用的稳定性和可靠性。