k8s主要控制器简述(一)ReplicaSet与Deployment
目录
一、ReplicaSet
关键特性
示例
解释
支持的 Operator
二、Deployment
1. 声明式更新
示例
2. 滚动更新
示例
3. 回滚
示例
4. ReplicaSet 管理
示例
5. 自动恢复
示例
6. 扩展和缩容
示例
示例
一、ReplicaSet
ReplicaSet 是 Kubernetes 中的一个核心控制器,用于确保指定数量的 Pod 副本始终处于运行状态。它的主要职责是维护一组稳定的 Pod 副本,确保在任何时候都有指定数量的 Pod 在运行。ReplicaSet 是 Kubernetes 中实现 Pod 水平扩展的基础组件之一。
关键特性
-
副本管理:
-
ReplicaSet 的核心功能是确保指定数量的 Pod 副本始终在运行。你可以通过
replicas
字段指定期望的 Pod 副本数量。 -
如果实际运行的 Pod 数量少于预期,ReplicaSet 会自动创建新的 Pod。
-
如果实际运行的 Pod 数量多于预期,ReplicaSet 会自动删除多余的 Pod。
-
-
标签选择器(Label Selector):
-
ReplicaSet 使用标签选择器来识别它管理的 Pod。只有那些与选择器匹配的 Pod 才会被 ReplicaSet 管理。
-
标签选择器可以是简单的等值匹配(
matchLabels
),也可以是更复杂的集合匹配(matchExpressions
)。
-
-
Pod 模板:
-
ReplicaSet 使用 Pod 模板来创建新的 Pod。Pod 模板定义了 Pod 的规格,包括容器镜像、环境变量、卷等。
-
当 ReplicaSet 需要创建新的 Pod 时,它会根据 Pod 模板生成新的 Pod 实例。
-
-
自动恢复:
-
如果某个 Pod 意外终止(例如,节点故障或手动删除),ReplicaSet 会自动创建一个新的 Pod 来替换它,以确保 Pod 副本数量始终符合预期。
-
-
手动管理:
-
ReplicaSet 通常不直接由用户创建和管理,而是通过更高级的控制器(如 Deployment)来管理。用户通常只需要与 Deployment 交互,Deployment 会自动创建和管理 ReplicaSet。
-
示例
以下是一个简单的 ReplicaSet 定义示例:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
在这个示例中:
-
replicas: 3
表示期望有 3 个 Pod 副本在运行。 -
selector
指定了 ReplicaSet 管理的 Pod 的标签为app: my-app
。 -
template
定义了 Pod 的规格,包括容器镜像nginx
以下是一个使用几个匹配的ReplicaSet实例
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3
selector:
matchExpressions:
- key: app
operator: In
values:
- my-app
- my-backup-app
- key: environment
operator: NotIn
values:
- production
template:
metadata:
labels:
app: my-app
environment: staging
spec:
containers:
- name: my-container
image: nginx
解释
-
selector.matchExpressions
:
- 这是集合匹配的核心部分,允许你定义多个标签选择规则。
- 每个规则由
key
、operator
和values
组成。
- 规则 1:
app
标签:
key: app
:表示选择标签键为app
的 Pod。operator: In
:表示标签值必须在values
列表中。values: [my-app, my-backup-app]
:表示选择标签值为my-app
或my-backup-app
的 Pod。
-
规则 2:
environment
标签:
key: environment
:表示选择标签键为environment
的 Pod。operator: NotIn
:表示标签值不能出现在values
列表中。values: [production]
:表示排除标签值为production
的 Pod。
-
综合效果:
-
这个 ReplicaSet 会选择满足以下条件的 Pod:
-
标签
app
的值为my-app
或my-backup-app
。 -
标签
environment
的值不为production
。
-
-
-
Pod 模板:
-
在
template
部分,定义了新创建的 Pod 的标签为app: my-app
和environment: staging
。 -
这些标签满足 ReplicaSet 的选择条件,因此这些 Pod 会被 ReplicaSet 管理。
-
支持的 Operator
在 matchExpressions
中,operator
可以取以下值:
-
In
:标签值必须在values
列表中。 -
NotIn
:标签值不能在values
列表中。 -
Exists
:标签键必须存在(不需要指定values
)。 -
DoesNotExist
:标签键必须不存在(不需要指定values
)。
二、Deployment
Deployment 是 Kubernetes 中用于管理无状态应用的高级控制器。它基于 ReplicaSet 实现,提供了声明式更新、滚动更新和回滚等功能。Deployment 是 Kubernetes 中最常用的控制器之一,特别适用于需要频繁更新和扩展的应用场景。
1. 声明式更新
Deployment 允许你通过声明式的方式更新应用。你只需要修改 Deployment 的 YAML 文件(例如更新镜像版本),然后使用 kubectl apply
命令应用更改,Deployment 会自动处理更新过程。
示例
假设你有一个 Deployment,运行的是 nginx:1.18
镜像。现在你想将镜像更新为 nginx:1.19
。
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.18
更新步骤:
-
修改
deployment.yaml
文件,将image: nginx:1.18
改为image: nginx:1.19
。 -
使用
kubectl apply
应用更新:kubectl apply -f deployment.yaml
-
Deployment 会自动触发更新流程,逐步替换旧的 Pod 为新的 Pod。
2. 滚动更新
Deployment 默认支持滚动更新策略,逐步替换旧的 Pod 副本为新的 Pod 副本,确保应用在更新过程中不会中断。
示例
以下是一个配置了滚动更新策略的 Deployment:
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.19
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 更新过程中最多允许 1 个 Pod 不可用
maxSurge: 1 # 更新过程中最多允许超出预期副本数 1 个 Pod
更新过程:
-
Deployment 会先启动一个新的 Pod,然后终止一个旧的 Pod,逐步替换所有 Pod。
-
通过
maxUnavailable
和maxSurge
,你可以控制更新的速度和可用性。
3. 回滚
如果更新过程中出现问题,Deployment 允许你回滚到之前的版本。
示例
假设你更新了 Deployment,但新版本的应用有问题,需要回滚到上一个版本。
回滚步骤:
-
查看 Deployment 的更新历史:
kubectl rollout history deployment/my-deployment
输出示例:
REVISION CHANGE-CAUSE 1 <none> 2 Update image to nginx:1.19
-
回滚到上一个版本:
kubectl rollout undo deployment/my-deployment
-
回滚到指定版本(例如回滚到 Revision 1):
kubectl rollout undo deployment/my-deployment --to-revision=1
4. ReplicaSet 管理
Deployment 通过创建和管理 ReplicaSet 来实现 Pod 的副本管理。每次更新 Pod 模板时,Deployment 都会创建一个新的 ReplicaSet,并逐步将旧的 ReplicaSet 缩容。
示例
假设你有一个 Deployment,初始版本使用 nginx:1.18
镜像。
初始 Deployment:
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.18
更新 Deployment:
将镜像更新为 nginx:1.19
后,Deployment 会创建一个新的 ReplicaSet,并逐步将旧的 ReplicaSet 缩容。
查看 ReplicaSet:
kubectl get replicaset
输出示例:
NAME DESIRED CURRENT READY AGE
my-deployment-1234567890 3 3 3 5m # 新的 ReplicaSet
my-deployment-9876543210 0 0 0 10m # 旧的 ReplicaSet
5. 自动恢复
Deployment 会自动恢复意外终止的 Pod,以确保 Pod 副本数量始终符合预期。
示例
假设你有一个 Deployment,配置了 replicas: 3
。
手动删除一个 Pod:
kubectl delete pod <pod-name>
Deployment 的行为:
-
Deployment 会检测到 Pod 数量不足,并自动创建一个新的 Pod 来替换被删除的 Pod。
6. 扩展和缩容
Deployment 支持动态扩展和缩容。你可以通过修改 replicas
字段来调整 Pod 的副本数量。
示例
假设你有一个 Deployment,初始副本数为 3。
扩展副本数:
-
修改
deployment.yaml
文件,将replicas: 3
改为replicas: 5
。 -
应用更新:
kubectl apply -f deployment.yaml
-
Deployment 会自动创建 2 个新的 Pod。
缩容副本数:
-
修改
deployment.yaml
文件,将replicas: 5
改为replicas: 2
。 -
应用更新:
kubectl apply -f deployment.yaml
-
Deployment 会自动删除 3 个 Pod,只保留 2 个 Pod。
示例
以下是一个简单的 Deployment 定义示例:
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: my-container
image: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
在这个示例中:
-
replicas: 3
表示期望有 3 个 Pod 副本在运行。 -
selector
指定了 Deployment 管理的 Pod 的标签为app: my-app
。 -
template
定义了 Pod 的规格,包括容器镜像nginx
。 -
strategy
配置了滚动更新策略,maxUnavailable: 1
表示在更新过程中最多允许 1 个 Pod 不可用,maxSurge: 1
表示在更新过程中最多允许超出预期副本数 1 个 Pod。