跳到主要内容

认识

2024年08月30日
柏拉文
越努力,越幸运

一、认识


Kubernetes 中的 Deployment 是一种高层级的控制器,负责管理和维护应用的 PodReplicaSet。它为用户提供了声明式更新、版本回滚和副本管理等功能。它简化了应用的滚动更新、扩缩容、回滚等操作。通过 Deployment,我们可以方便地部署和管理无状态应用,确保应用的多个副本持续运行并保持高可用性。

1.1 组件

Deployment 关键组件如下

  • Pod: 应用的基本运行单元,由 Deployment 创建和管理。

  • ReplicaSet: Deployment 创建和控制的子资源,负责确保指定数量的 Pod 一直处于运行状态。

  • Deployment 控制器: 监控用户定义的期望状态(通过 Deployment 配置的 spec 声明),并与实际状态对比。自动执行必要的操作来调整实际状态,使其符合期望。

1.2 功能

滚动更新:支持应用的滚动更新和回滚,使得应用更新时不会中断服务。

扩容缩容:可以轻松调整副本数量,以满足应用负载的需求。

自愈能力:若某个 Pod 出现问题,Deployment 控制器会自动创建新 Pod 以维持期望的状态。

按需回滚: 能够恢复到以前的版本,便于在更新失败时进行版本回滚。

1.3 工作

  1. 定义期望状态: 用户通过 YAMLAPI 提交 Deployment 配置,描述希望运行的 Pod 副本数量、镜像版本、端口等。Deployment 控制器 会解析并保存这些声明。

  2. 创建 ReplicaSet: Deployment 控制器会创建一个 ReplicaSet,根据配置管理 Pod 的副本数量。如果 Deployment 模板更新(如镜像版本改变),会创建一个新的 ReplicaSet,并启动滚动更新。

  3. Pod 副本管理: ReplicaSet 负责具体的副本管理工作,确保指定数量的 Pod 一直运行。如果某个 Pod 因为故障被销毁,ReplicaSet 会自动创建新的 Pod 来补充。

  4. 滚动更新: 当 Deployment 模板的配置发生变化时(如镜像版本升级),Deployment 会逐步将旧版本的 Pod 替换为新版本。在更新过程中,Deployment 会维护一个期望的 最大不可用(maxUnavailable最小可用(minAvailable Pod 数量,以确保服务的高可用性。

  5. 回滚机制: 如果滚动更新失败(如新版本出现问题),用户可以通过 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 # 容器内监听的端口