目录
一、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: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: 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: 3selector:matchExpressions:- key: appoperator: Invalues:- my-app- my-backup-app- key: environmentoperator: NotInvalues:- productiontemplate:metadata:labels:app: my-appenvironment: stagingspec:containers:- name: my-containerimage: 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: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: nginximage: 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: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: nginximage: nginx:1.19strategy:type: RollingUpdaterollingUpdate: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: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: nginximage: 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  # 旧的 ReplicaSet5. 自动恢复
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: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginxstrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1maxSurge: 1在这个示例中:
-  replicas: 3表示期望有 3 个 Pod 副本在运行。
-  selector指定了 Deployment 管理的 Pod 的标签为app: my-app。
-  template定义了 Pod 的规格,包括容器镜像nginx。
-  strategy配置了滚动更新策略,maxUnavailable: 1表示在更新过程中最多允许 1 个 Pod 不可用,maxSurge: 1表示在更新过程中最多允许超出预期副本数 1 个 Pod。