如何理解ReplicationController及其配置

63次阅读
没有评论

共计 2073 个字符,预计需要花费 6 分钟才能阅读完成。

如何理解 ReplicationController 及其配置,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

在介绍 ReplicationController 之前,我们先思考一下下图所示的场景,Kubernetes 集群包含 2 个 Node,每个 Node 上均运行一个同类型的 Pod 来做负载均衡,如果其中某个 Node 被管理员强制关机或者 Node 意外宕机时,会发生什么呢?

如何理解 ReplicationController 及其配置

由于 Pod 被调度到某个 Node 后就与 Node 绑定,当 Node 宕机后,Node 中的所有 Pod 也都停止运行。上图所示场景中,Node2 被关闭后,相应的 Pod- 2 也会停止,Pod- 2 并不会重新被调度到 Node1。

实际应用场景中,维持稳定的 Pod 副本数是非常必要的,因此 Kubernetes 引入了 ReplicationController。

工作机制

ReplicationController 用于定义指定 Pod 的副本数,与创建多个 Pod 相比,它可以保证 Pod 意外终止后,集群中仍会有指定个数的 Pod 副本在运行。运行于 kube-controller-manager 组件中的 ReplicationController 控制器(控制器和资源名相同)会监控集群中 Pod 的副本数:

如果 Pod 数量已经超出预期,那么 ReplicationController 将会删除部分 Pod,使 Pod 数量符合预期。

如果 Pod 数量低于预期,那么 ReplicationController 将会创建新的 Pod,使用 Pod 数量符合预期。

ReplicationController 控制器会时刻监控 Pod 的副本数量,一旦发现 Pod 数量不符合预期(Pod 数量过多或过少),均会通过增加或删除 Pod 的手段来让 Pod 维持在预期数量。

ReplicationController 控制器更像是一个 Pod 监管者,它监管的是整个集群范围的 Pod。在本节开头中所引用的场景中,如果使用 ReplicationController 创建两个 Pod 的副本,当其中一个 Pod 意外终止后,新的 Pod 会被创建出来,从而保证集群中仍有两个副本在运行,整体工作机制如下图所示:

如何理解 ReplicationController 及其配置

通过示意图可以看到,通过 ReplicationController 创建两个 Pod 情况下,当 Node2 被关闭后,运行于其上的 Pod 被重新调度到 Node1 中运行,集群中总的 Pod 数始终保持在 2 个。

ReplicationController 配置

一个简单的 ReplicationController 资源配置如下所示:

apiVersion: v1
kind: ReplicationController
metadata:
 name: replication-controller-runs-pod
spec:
 replicas: 3
 selector:
 app: nginx
 template:
 metadata:
 labels:
 app: nginx
 spec:
 containers:
 - name: nginx
 image: nginx:1.19.0

其中有三个关键的项:

spec.replicas 指定了期望的 Pod 副本数;

spec.selector 指定了 Selector,ReplicationController 正是通过该 Selector 来查找 Pod 对象;

spec.template 指定了 Pod 的模版,当 ReplicationController 发现 Pod 数量低于预期时将使用该模版创建新的 Pod。

Pod 模板

Pod 模版用于 Kubernetes 内部动态地创建 Pod,它广泛应用于各种控制器中,包括本节中介绍的 ReplicationController,以及后续将要介绍的 Deployments、Jobs 和 DaemonSets 等等。

从数据结构上看,Pod 模版(PodTemplateSpec)可以理解为简化版的 Pod,它只保留了 Pod 的 Metadata 和 Spec,如下所示:

type PodTemplateSpec struct {
 // Metadata of the pods created from this template.
 // +optional
 metav1.ObjectMeta
 // Spec defines the behavior of a pod.
 // +optional
 Spec PodSpec
}

ReplicationController 设计初衷是维持集群中指定类型 Pod 的副本数,但它只支持等值 Selector,不支持基于集合的 Selector。为了不违背 API 兼容性原则,Kubernetes 不得已提供了另一种制器 ReplicaSet 来替换它。

所以,实际场景中几乎不会用到 ReplicationController,虽然它是一个稳定的 API。

看完上述内容,你们掌握如何理解 ReplicationController 及其配置的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2073字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)