认识
一、认识
Kubernetes
中的 Deployment
是一种高层级的控制器,负责管理和维护应用的 Pod
和 ReplicaSet
。它为用户提供了声明式更新、版本回滚和副本管理等功能。它简化了应用的滚动更新、扩缩容、回滚等操作。通过 Deployment
,我们可以方便地部署和管理无状态应用,确保应用的多个副本持续运行并保持高可用性。
1.1 组件
Deployment
关键组件如下
-
Pod
: 应用的基本运行单元,由Deployment
创建和管理。 -
ReplicaSet
:Deployment
创建和控制的子资源,负责确保指定数量的Pod
一直处于运行状态。 -
Deployment
控制器: 监控用户定义的期望状态(通过Deployment
配置的spec
声明),并与实际状态对比。自动执行必要的操作来调整实际状态,使其符合期望。
1.2 功能
滚动更新:支持应用的滚动更新和回滚,使得应用更新时不会中断服务。
扩容缩容:可以轻松调整副本数量,以满足应用负载的需求。
自愈能力:若某个 Pod
出现问题,Deployment
控制器会自动创建新 Pod
以维持期望的状态。
按需回滚: 能够恢复到以前的版本,便于在更新失败时进行版本回滚。
1.3 工作
-
定义期望状态: 用户通过
YAML
或API
提交Deployment
配置,描述希望运行的Pod
副本数量、镜像版本、端口等。Deployment
控制器 会解析并保存这些声明。 -
创建
ReplicaSet
:Deployment
控制器会创建一个ReplicaSet
,根据配置管理Pod
的副本数量。如果Deployment
模板更新(如镜像版本改变),会创建一个新的ReplicaSet
,并启动滚动更新。 -
Pod
副本管理:ReplicaSet
负责具体的副本管理工作,确保指定数量的Pod
一直运行。如果某个Pod
因为故障被销毁,ReplicaSet
会自动创建新的Pod
来补充。 -
滚动更新: 当
Deployment
模板的配置发生变化时(如镜像版本升级),Deployment
会逐步将旧版本的Pod
替换为新版本。在更新过程中,Deployment
会维护一个期望的 最大不可用(maxUnavailable
) 和 最小可用(minAvailable
)Pod
数量,以确保服务的高可用性。 -
回滚机制: 如果滚动更新失败(如新版本出现问题),用户可以通过
Deployment
的回滚功能快速恢复到之前的版本。
1.4 StatefulSet Vs Deployment
Deployment
是无状态应用(Web 服务、批处理任务),Deployment
Pod
没有固定标识,随时可以删除、重建。没有持久存储,每次重建会清空数据。Pod
名称动态分配,每次重建可能会改变。容易快速增加或减少 Pod
数量。自动更新 Pod
,确保服务不中断。无法直接访问某个 Pod
,所有 Pod
共享一个服务入口, 通过标准 Service
对所有 Pod
实现负载均衡随机分配流量。
StatefulSet
是有状态应用(数据库、分布式系统),StatefulSet
每个 Pod
有固定的名称(如 myapp-0
, myapp-1
)。Pod
的重启或迁移不会改变其名称和身份。每个 Pod
都有一个与之绑定的持久存储卷(PersistentVolume
),即使 Pod
被删除或重建,其存储仍然保持不变。Pod
按顺序创建(0 -> 1 -> 2
)或删除(2 -> 1 -> 0
)。更新时也会按顺序进行,确保服务不中断。每个 Pod
都有一个固定的 DNS
名称(如 myapp-0.myservice.default.svc.cluster.local
)。
三、语法
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 指定副本数量
selector:
matchLabels:
app: nginx # 匹配 Pod 的标签
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest # 使用最新的 Nginx 镜像
ports:
- containerPort: 80 # 容器内监听的端口