ReplicationController.

笔记:一种部署这配置了A.复制品现在是设置复制的推荐方式。

一种ReplicationController.确保指定数量的POD副本在任何时间运行。换句话说,ReplicationController确保POD或同一组合的POD组始终上升和可用。

ReplicationController如何工作

如果POD有太多,ReplicationController终止了额外的吊舱。如果有太少,则ReplicationController启动更多POD。与手动创建的POD不同,如果失败,则会自动替换由ReplicationController维护的POD,或被终止。例如,在诸如内核升级之类的中断维护之后在节点上重新创建POD。因此,即使您的应用程序只需要单个POD,您应该使用ReplicationController。ReplicationController类似于进程主管,而不是监督单个节点上的单个进程,而不是在单个节点上监督多个节点的多个POD。

ReplicationController通常缩写为讨论中的“RC”,并作为kubectl命令中的快捷方式。

一个简单的情况是创建一个ReplicationController对象,可靠地无限期地运行一个POD的实例。一个更复杂的用例是运行多个复制服务的副本,例如Web服务器。

运行示例ReplicationController

此示例replicationController Config运行了nginx Web服务器的三个副本。

apiersionv1.种类ReplicationController.元数据名称nginx.规格复制品3.选择器应用程序nginx.模板元数据名称nginx.标签应用程序nginx.规格容器-名称nginx.图像nginx.港口-集装箱口80

通过下载示例文件,然后运行此命令运行示例作业:

kubectl应用-f https://k8s.io/examples/controllers/replication.yaml

输出类似于以下:

ReplicationController / nginx创建

使用此命令检查ReplicationController的状态:

kubectl描述了ReplicationController / nginx

输出类似于以下:

名称:nginx命名空间:默认选择器:app = nginx标签:app = nginx注释:<无>副本:3当前/ 3所需的Pods状态:0运行/ 3等待/ 0成功/ 0失败Pod模板:标签:app = nginx容器:nginx:图片:nginx端口:80 / tcp环境:装载:卷:事件:firstseen从subObjectPath类型的reseface消息---构--------------- ----- ---- -------------- ----------------------20S 20s 1 {Replication-Controller}正常的成功创建了POD:nginx-QRM3M 20s 20s 1 {Replication-Controller}正常成功创建的POD:nginx-3ntk0 20s 20s 1 {Replication-Controller}正常的AcceptCreate创建的Pod:nginx-4ok8v

在这里,创建了三个豆荚,但没有运行,可能是因为被拉了图像。稍后,同样的命令可能显示:

PODS状态:3.跑步 /0.等待 /0.成功/0.失败的

要列出属于计算机可读表单属于ReplicationController的所有POD,您可以使用这样的命令:

豆荚=$(kubectl获取pods  - 选择=应用程序=nginx  - 小费=jsonpath.= {.Items..MELADATA.NAME.NAME.}回声$豆荚

输出类似于以下:

nginx-3ntk0 nginx-4ok8v nginx-qrm3m

这里,选择器与ReplicationController的选择器相同(在kubectl描述输出),并以不同的形式Replication.yaml.。这--output = jsonpath.选项指定返回列表中每个POD中名称的表达式。

编写ReplicationController规范

与所有其他Kubernetes配置一样,ReplicationController需要apiersion种类, 和元数据字段。ReplicationController对象的名称必须是有效的DNS子域名。有关使用配置文件的一般信息,请参阅对象管理

ReplicationController也需要一个.spec.部分

豆荚模板

.spec.template.是唯一必填字段.spec.

.spec.template.是A.豆荚模板。它与一个完全相同的架构,除了它嵌套而且没有apiersion或者种类

除了用于POD的必填字段之外,ReplicationController中的POD模板必须指定适当的标签和适当的重启策略。对于标签,请确保不要与其他控制器重叠。看POD选择器

只有A..spec.template.spec.restartpolicy.等于总是允许,如果未指定,则是默认值。

对于本地容器重新启动,ReplicationControllers委派给节点上的代理,例如kubelet.或码头。

ReplicationController上的标签

ReplicationController本身可以具有标签(.metadata.Labels.)。通常,您会将这些与之设置为.spec.template.Metadata.Labels.;如果.metadata.Labels.未指定,然后它默认为.spec.template.Metadata.Labels.。但是,它们被允许与众不同,而且.metadata.Labels.不要影响ReplicationController的行为。

POD选择器

.spec.Selector.领域是A.标签选择器。ReplicationController管理与选择器匹配的标签的所有窗格。它不区分它创建或删除的POD,并介绍了创建或删除的另一个人或进程。这允许替换ReplicationController而不影响运行POD。

如果指定,则.spec.template.Metadata.Labels.必须等于.spec.Selector.,或者它将被API拒绝。如果.spec.Selector.未指定,它将默认为.spec.template.Metadata.Labels.

此外,您不应创建标签与此选择器的标签与另一个ReplicationController或其他控制器等其他控制器相匹配的任何POD。如果您这样做,则ReplicationController认为它创建了其他豆荚。Kubernetes不会阻止你这样做。

如果您最终完成了具有重叠选择器的多个控制器,则必须自己管理删除(请参阅以下)。

多重副本

您可以通过设置指定应同时运行多少个POD.spec.replicas.对于您希望同时运行的豆荚数。在任何时间运行的数字可能更高或更低,例如如果副本刚增加或减少,或者如果优雅地关闭POD,并且更替换早期开始。

如果您未指定.spec.replicas.,然后它默认为1。

使用ReplicationControllers.

删除ReplicationController及其吊舱

删除ReplicationController及其所有POD,使用kubectl删除。kubectl会将ReplicationController扩展到零并等待它删除每个POD,然后删除ReplicationController本身。如果此kubectl命令被中断,则可以重新启动它。

使用REST API或Go Client库时,需要显式执行步骤(缩小副本到0,等待POD删除,然后删除ReplicationController)。

仅删除ReplicationController

您可以删除ReplicationController,而不会影响其任何POD。

使用kubectl,指定--cascade = false.选择kubectl删除

使用REST API或Go客户端库时,可以删除ReplicationController对象。

删除原始原件后,您可以创建一个新的ReplicationController来替换它。只要旧和新的.spec.Selector.是一样的,那么新的一个将采用旧豆荚。但是,它不会努力使现有的PODS匹配新的不同的POD模板。以受控方式将POD更新为新规格,使用a滚动更新

从ReplicationController隔离POD

可以通过更改其标签从ReplicationController的目标中删除POD。该技术可用于从用于调试和数据恢复的服务中删除POD。以这种方式删除的POD将被自动更换(假设副本的数量也不改变)。

常见的使用模式

重新安排

如上所述,无论您有1个要继续运行的POD,还是1000,即使在节点故障或POD终止的情况下,也会确保存在指定数量的POD(例如,由于另一个操作控制剂)。

缩放

ReplicationController通过更新,可以通过更新,手动或由自动缩放控制代理向上或向下缩放副本数量复制品场地。

滚动更新

ReplicationController旨在通过单个逐个替换POD来促进对服务的更新。

如上所述#1353,推荐的方法是创建一个具有1个副本的新ReplicationController,一个逐个缩放新(+1)和旧(-1)控制器,然后在达到0副本后删除旧控制器。无论意外故障如何,这可以预测地更新一组豆荚。

理想情况下,滚动更新控制器将考虑应用程序准备,并确保足够数量的豆荚在任何给定时间都有高效地服务。

两个ReplicationControllers需要创建具有至少一个差分标签的POD,例如POD的主容器的图像标签,因为它通常是激励滚动更新的图像更新。

多个释放轨道

除了在进行滚动更新时运行多个应用程序的版本外,使用多个释放轨道,延长时间段或甚至连续地运行多个释放。曲目将由标签差异化。

例如,服务可能针对所有窗口(前端),环境中的(刺)。现在说你有10个复制的豆荚,可以弥补这个层。但是你希望能够'金丝雀'这个组件的新版本。您可以使用ReplicationController设置复制品设置为9的批量复制品,带标签Tier = Frontend,Environment = Prod,Track =稳定,以及另一个ReplicationController复制品设置为1金丝雀,带标签Tier = Frontend,环境= Prod,Track =金丝雀。现在,服务覆盖金丝雀和非金丝雀豆荚。但是,您可以将ReplicationController分开弄乱,以测试事项,监控结果等。

使用具有服务的ReplicationControllers

多个ReplicationControllers可以坐在单个服务后面,以便例如,某些流量进入​​旧版本,有些则进入新版本。

ReplicationController永远不会自行终止,但预计它并未像服务一样长期存在。服务可以由由多个ReplicationController控制的POD组成,并且预期可以在服务的生命周期内创建和销毁许多ReplicationControllers(例如,执行运行该服务的POD的更新)。这两位服务本身和客户都应对维护服务豆荚的ReplicationControllers保持遗憾。

编写复制程序

由ReplicationController创建的PODS旨在是可替代和语义相同的,但它们的配置可能会随着时间的推移变得异构。This is an obvious fit for replicated stateless servers, but ReplicationControllers can also be used to maintain availability of master-elected, sharded, and worker-pool applications.此类应用程序应使用动态工作分配机制,例如rabbitmq工作队列(而不是静态/一次性定制每个POD的配置,这被认为是一种防模式。执行的任何POD自定义,例如资源的垂直自动调整(例如,CPU或内存),应由另一个在线控制器进程执行,而不是与ReplicationController本身不同。

ReplicationController的职责

ReplicationController可确保所需数量的POD与其标签选择器匹配并进行操作。目前,只有终止的POD被排除在其数量之外。将来,准备可以考虑从系统中提供的其他信息,我们可以通过替换策略添加更多控件,我们计划在外部客户端可以使用的事件来实现任意复杂的替代和/或缩减策略。

ReplicationController永远限制了这种狭窄的责任。它本身不会表现准备或活跃的探针。它旨在由外部自动缩放器控制(如讨论)而不是执行自动缩放#492),这将改变它复制品场地。我们不会添加计划策略(例如,传播)到ReplicationController。也不应该验证PODS控制是否与当前指定的模板相匹配,因为这将阻碍自动调整和其他自动化进程。同样,完成截止日期,排序依赖关系,配置扩展和其他功能属于其他位置。我们甚至计划要考虑散装豆荚创作的机制(#170)。

ReplicationController旨在成为可协调构建块原语。我们预计未来用户便利的高级API和/或工具将在其顶部和其他互补的原语构建。Kubectl(Run,Scale)支持的“宏”操作是概念验证示例。例如,我们可以想象出类似的东西亚梁管理ReplicationControllers,自动缩放器,服务,安排策略,金丝雀等

API对象

Replication Controller是Kubernetes REST API中的顶级资源。有关API对象的更多详细信息,请访问:ReplicationController API对象

ReplicationController的替代方案

复制品

复制品是支持新的下一代ReplicationController基于SET的标签选择器。它主要用于部署作为协调POD创建,删除和更新的机制。请注意,我们建议使用部署而不是直接使用副本集,除非您需要自定义更新编排或根本不需要更新。

部署是一个更高级别的API对象,可更新其底层副本集及其窗格。如果您想要此滚动更新功能,建议使用部署,因为,它们是声明性,服务器端以及具有其他功能。

裸露的豆荚

与用户直接创建吊舱的情况不同,ReplicationController替换因任何原因被删除或终止的POD,例如在节点故障或中断节点维护(例如内核升级)的情况下。因此,我们建议您使用ReplicationController即使您的应用程序只需要单个POD。与流程监督者类似地认为它,只有它在多个节点上监督多个POD,而不是单个节点上的单个进程。ReplicationController委托本地容器重新启动到节点上的某个代理(例如,kubelet或docker)。

工作

用一个工作而不是预期终止自己的豆荚的ReplicationController(即批处理作业)。

守护者

用一个守护者而不是提供提供机器级功能的POD的ReplicationController,例如机器监控或机器日志记录。这些豆荚具有与机器寿命相关联的寿命:POD需要在其他POD启动之前在机器上运行,并且在机器准备重新启动/关闭时,可以安全地终止。

想要查询更多的信息

运行无状态应用程序部署

上次修改3月30日,2021年9月30日PM PST:FIXUP RC TEXT(FE2F1E2DA)