序言
要从容地着手去做一件事,但一旦开始,就要坚持到底
Kubernetes (k8s) 是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下k8s ReplicaSet。
文章标记颜色说明:
- 黄色:重要标题
- 红色:用来标记结论
- 绿色:用来标记一级论点
- 蓝色:用来标记二级论点
1 基础介绍
Kubernetes ReplicaSet 是 Kubernetes 中的一个重要组件,它用于确保指定数量的 Pod 副本正在运行。
在本节中,我们将深入探讨 Kubernetes ReplicaSet 的一些关键特性和使用方法。
1.1 重要特性
下面是一些 ReplicaSet 的重要特性:
- Pod 副本数的控制:通过 ReplicaSet,用户可以指定想要的 Pod 副本数目,ReplicaSet 会自动创建或删除 Pod 副本来达到该数量。
- 根据标签选择器筛选 Pod:ReplicaSet 会基于一组标签选择器来选择匹配的 Pod,以便创建或删除相应的 Pod 副本。标签选择器可以指定某个应用的所有 Pod,也可以根据不同的部署环境来选择特定的 Pod。
- 确保 Pod 的健康状态:ReplicaSet 会监控所有的 Pod 副本的运行状态,并确保在有 Pod 发生故障时进行恢复。如果某个 Pod 副本意外退出,ReplicaSet 会自动创建一个新的 Pod 副本来代替它,以维持指定的副本数。
- 滚动更新和回滚:ReplicaSet 还支持滚动更新和回滚操作,用户可以通过指定更新的策略和版本号,对应用程序进行更新和回滚操作。
- 与其他控制器的协作:ReplicaSet 可以与其他 Kubernetes 控制器对象(如 Deployment)协同工作,来完成应用程序的部署和管理任务。
1.2 控制器
在 Kubernetes 中,ReplicaSet 是一种控制器(Controller),它实现了 Kubernetes API 对象的控制循环(Control Loop)。
控制循环是 Kubernetes 中所有控制器的核心概念,它负责将系统状态调整为所需状态。
ReplicaSet 控制器的控制循环过程如下:
- ReplicaSet 控制器监视 Pod 的状态,确保其与当前 ReplicaSet 配置文件中定义的副本数一致。
- 数量小于情况:如果当前 Pod 的数量小于 ReplicaSet 配置文件中定义的数量,则 ReplicaSet 控制器会启动新的 Pod 副本来替换当前缺少的 Pod。
- 数量大于情况:如果当前 Pod 的数量大于 ReplicaSet 配置文件中定义的数量,则 ReplicaSet 控制器会停止一些 Pod 副本,以保持与定义的数量一致。
1.3 标签选择器
ReplicaSet 控制器使用标签选择器(Label Selector)来选择要控制的 Pod。所以,在 ReplicaSet 配置文件中,可以使用标签选择器指定要控制的 Pod 的标签。
ReplicaSet 控制器将根据标签选择器选择符合条件的 Pod,确保其数量与 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: my-image
ports:
- containerPort: 80
在上面的示例中,ReplicaSet 控制器将根据
matchLabels: app: my-app
标签选择器选择符合条件的 Pod,确保其数量与
replicas: 3
中定义的副本数一致。
Pod 模板定义了要控制的 Pod 的规格、容器镜像、环境变量、挂载卷等信息。
1.4 自动伸缩
ReplicaSet 控制器还可以结合 HorizontalPodAutoscaler(HPA)组件实现自动伸缩功能。HPA 可以根据 Pod 的 CPU 使用率等指标来自动调整 ReplicaSet 中的 Pod 副本数,以满足应用程序的需求。
当应用程序的负载增加时,HPA 可以自动增加 Pod 副本数,从而提高应用程序的吞吐量;
当负载下降时,HPA 可以自动减少 Pod 副本数,从而节省资源。
示例配置文件:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler #资源类型
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: ReplicaSet
name: my-replicaset
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
在上面的示例中,HPA 将根据
targetCPUUtilizationPercentage: 50
指定的 CPU 使用率来自动调整
my-replicaset
ReplicaSet 中的 Pod 副本数,确保其数在
1
到
10
之间。
2 拓展
2.1 Deployment 水平扩展
Deployment 看似简单,但实际上,它实现了 Kubernetes 项目中一个非常重要的功能:Pod 的“水平扩展 / 收缩”(horizontal scaling out/in)。这个功能,是从 PaaS 时代开始,一个平台级项目就必须具备的编排能力。
举个例子,如果你更新了 Deployment 的 Pod 模板(比如,修改了容器的镜像),那么 Deployment 就需要遵循一种叫作“滚动更新”(rolling update)的方式,来升级现有的容器。
而这个能力的实现,依赖的是 Kubernetes 项目中的一个非常重要的概念(API 对象):ReplicaSet。
ReplicaSet 的结构非常简单,可以通过这个 YAML 文件查看一下:
apiVersion: apps/v1
kind: ReplicaSet #资源类型
metadata:
name: nginx-set
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
思考问题:
对于一个 Deployment 所管理的 Pod,它的 ownerReference 是谁?
答案是:ReplicaSet。
可以看到,这就是一个常用的 nginx-deployment,它定义的 Pod 副本个数是 3(spec.replicas=3)。
在具体的实现上,这个 Deployment,与 ReplicaSet,以及 Pod 的关系是怎样的呢?
可以用一张图把它描述出来:
通过这张图,可以清楚的看到,一个定义了 replicas=3 的 Deployment,与它的ReplicaSet,以及 Pod 的关系,实际上是一种“层层控制”的关系。
其中,ReplicaSet 负责通过“控制器模式”,保证系统中 Pod 的个数永远等于指定的个数(比如,3 个)。
这也正是 Deployment 只允许容器的 restartPolicy=Always 的主要原因:只有在容器能保证自己始终是 Running 状态的前提下,ReplicaSet 调整 Pod 的个数才有意义。
而在此基础上,Deployment 同样通过“控制器模式”,来操作 ReplicaSet 的个数和属性,进而实现“水平扩展 / 收缩”和“滚动更新”这两个编排动作。
其中,“水平扩展 / 收缩”非常容易实现,Deployment Controller 只需要修改它所控制的 ReplicaSet 的 Pod 副本个数就可以了。
$ kubectl scale deployment nginx-deployment --replicas=4 deployment.apps/nginx-deployment scaled
比如,把这个值从 3 改成 4,那么 Deployment 所对应的 ReplicaSet,就会根据修改后的值自动创建一个新的 Pod。
这就是“水平扩展”了;“水平收缩”则反之。
3 投票
版权归原作者 颜淡慕潇 所有, 如有侵权,请联系我们删除。