目录
一、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。