复制控制器

注意: A 部署方式 配置一个 复制集 现在是建议的设置复制的方法。

A 复制控制器 确保指定数量的Pod副本在任何一个上运行 时间。换句话说,复制控制器确保将一个Pod或同构Pod设置为 始终可用。

复制控制器如何工作

如果荚过多,复制控制器将终止额外的荚。如果太少, 复制控制器启动更多的Pod。与手动创建的广告连播不同的是, 如果复制控制器发生故障,被删除或终止,则会自动替换它们。 例如,在破坏性维护(例如内核升级)之后,将在节点上重新创建Pod。 因此,即使您的应用程序需要,也应使用复制控制器。 只有一个吊舱。 复制控制器与流程管理器相似, 但是复制控制器而不是监视单个节点上的单个进程,而是监视多个Pod。 跨多个节点。

在讨论中,复制控制器通常缩写为“ rc”,并且在 kubectl commands.

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

运行示例复制控制器

此示例复制控制器配置运行nginx Web服务器的三个副本。

apiVersion: v1
kind: 复制控制器
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

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

Kubectl apply -f //k8s.io/examples/controllers/replication.yaml

输出类似于以下内容:

replicationcontroller/nginx created

使用以下命令检查复制控制器的状态:

Kubectl describe replicationcontrollers/nginx

输出类似于以下内容:

Name:        nginx
Namespace:   default
Selector:    app=nginx
Labels:      app=nginx
Annotations:    <none>
Replicas:    3 current / 3 desired
Pods Status: 0 Running / 3 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:       app=nginx
  货柜:
   nginx:
    Image:              nginx
    Port:               80/TCP
    Environment:        <none>
    Mounts:             <none>
  卷数:              <none>
Events:
  FirstSeen       LastSeen     Count    From                        SubobjectPath    Type      Reason              Message
  ---------       --------     -----    ----                        -------------    ----      ------              -------
  20s             20s          1        {replication-controller }                    没有 rmal    SuccessfulCreate    Created pod: nginx-qrm3m
  20s             20s          1        {replication-controller }                    没有 rmal    SuccessfulCreate    Created pod: nginx-3ntk0
  20s             20s          1        {replication-controller }                    没有 rmal    SuccessfulCreate    Created pod: nginx-4ok8v

在这里,创建了三个吊舱,但尚未运行任何吊舱,这可能是因为正在拉映像。 稍后,相同的命令可能会显示:

豆荚 Status:    3 Running / 0 Waiting / 0 Succeeded / 0 Failed

要以机器可读的形式列出属于复制控制器的所有Pod,可以使用如下命令:

pods=$(Kubectl get pods --selector=app=nginx --output=jsonpath={.items..metadata.name})
echo $pods

输出类似于以下内容:

nginx-3ntk0 nginx-4ok8v nginx-qrm3m

在这里,选择器与复制控制器的选择器相同(见 Kubectl describe output), and in a different form in replication.yaml. The --output=jsonpath option 指定一个表达式,该表达式仅从返回列表中的每个pod中获取名称。

编写一个复制控制器规范

As with all other Kubernetes config, a 复制控制器 needs apiVersion, kind, and metadata fields. 复制控制器对象的名称必须是有效的 DNS子域名. 有关使用配置文件的一般信息,请参见 对象管理 .

复制控制器还需要一个 .spec 部分.

吊舱模板

The .spec.template is the only required field of the .spec.

The .spec.template is a 吊舱模板。它的架构与 , except it is nested and does not have an apiVersion 要么 kind.

除了Pod的必填字段外,复制控制器中的Pod模板还必须指定适当的 标签和适当的重启策略。对于标签,请确保不要与其他控制器重叠。看到 吊舱选择器.

只有一个 .spec.template.spec.restartPolicy equal to Always is allowed, which is the default if not specified.

对于本地容器重新启动,复制控制器s委托给节点上的代理, for example the Kubelet 或Docker。

复制控制器上的标签

The 复制控制器 can itself have labels (.metadata.labels)。 Typically, you would set these the same as the .spec.template.metadata.labels; if .metadata.labels is not specified then it defaults to .spec.template.metadata.labels. However, they are allowed to be different, and the .metadata.labels do not affect the behavior of the 复制控制器.

吊舱选择器

The .spec.selector field is a 标签选择器。复制控制器 使用与选择器匹配的标签来管理所有广告连播。它不能区分 在它创建或删除的Pod与另一个人或进程创建的Pod之间,或 已删除。这样就可以替换复制控制器而不影响正在运行的Pod。

If specified, the .spec.template.metadata.labels must be equal to the .spec.selector, 要么 it will be rejected by the API. If .spec.selector is unspecified, it will be defaulted to .spec.template.metadata.labels.

同样,您通常不应该直接使用以下方式创建任何标签与该选择器匹配的容器: 另一个复制控制器或另一个控制器(例如Job)。如果这样做, 复制控制器认为它创建了其他Pod。 Kubernetes不会阻止你 from doing this.

如果最终确实有多个具有重叠选择器的控制器,则您 将必须自己管理删除操作(请参阅 下面)。

多个副本

You can specify how many pods should run concurrently by setting .spec.replicas to the number 您希望同时运行的Pod。任何时候运行的数字可能更高 或更低,例如副本是否刚刚增加或减少,或者吊舱是否优雅 关闭,然后尽早开始更换。

If you do not specify .spec.replicas, then it defaults to 1.

使用复制控制器s

删除复制控制器及其容器

要删除复制控制器及其所有容器,请使用 Kubectl delete。 Kubectl会将复制控制器缩放为零并等待 在删除复制控制器之前先删除每个Pod。如果这个kubectl 命令被中断,可以重新启动。

使用REST API或go客户端库时,您需要明确执行以下步骤(将副本扩展为 0,等待pod删除,然后删除复制控制器)。

仅删除一个复制控制器

您可以删除复制控制器而不影响其任何Pod。

Using Kubectl, specify the --cascade=false option to Kubectl delete.

使用REST API或go客户端库时,只需删除复制控制器对象。

删除原始文件后,您可以创建一个新的复制控制器来替换它。只要 as the old and new .spec.selector are the same, then the new one will adopt the old pods. 但是,它将不做任何努力来使现有吊舱与新的不同吊舱模板匹配。 要以受控方式将广告连播更新为新规范,请使用 滚动更新.

从复制控制器隔离Pod

可以通过更改标签来将Pod从复制控制器的目标集中删除。可以使用此技术从服务中删除Pod,以进行调试,数据恢复等。以这种方式删除的Pod将被自动替换(假定副本数也没有更改)。

常用用法

重新安排

如上所述,无论您要保持运行的Pod是1个,还是要保持1000个,复制控制器都将确保存在指定数量的Pod,即使在节点故障或Pod终止的情况下(例如,由于其他操作而导致的故障)控制代理)。

缩放比例

The 复制控制器 makes it easy to scale the number of replicas up 要么 down, either manually 要么 by an auto-scaling control agent, by simply updating the replicas field.

滚动更新

复制控制器旨在通过逐个替换pod来促进滚动更新服务。

如中所述 #1353,建议的方法是创建一个具有1个副本的新复制控制器,将新(+1)和旧(-1)控制器一个接一个地缩放,然后在达到0个副本后删除旧控制器。可以预期地更新吊舱集,而不管意外故障如何。

理想情况下,滚动更新控制器应考虑到应用程序的准备情况,并确保在任何给定时间有效生产足够数量的Pod。

这两个复制控制器将需要创建带有至少一个区分标签的容器,例如容器的主容器的图像标签,因为通常是图像更新会激发滚动更新。

多个发行曲目

除了在滚动更新进行过程中运行应用程序的多个版本外,通常还需要使用多个版本跟踪来长时间甚至连续运行多个版本。轨道将通过标签来区分。

For instance, a service might target all pods with tier in (frontend), environment in (prod). 没有 w say you have 10 replicated pods that make up this tier. But you want to be able to 'canary' a new version of this component. You could set up a 复制控制器 with replicas set to 9 for the bulk of the replicas, with labels tier=frontend, environment=prod, track=stable, and another 复制控制器 with replicas set to 1 for the canary, with labels tier=frontend, environment=prod, track=canary. 没有 w the service is covering both the canary and non-canary pods. But you can mess with the 复制控制器s separately to test things out, monitor the results, etc.

在服务中使用复制控制器s

多个复制控制器可以位于单个服务之后,例如,一些流量 转到旧版本,有些转到新版本。

复制控制器永远不会自行终止,但是不会像服务一样长寿。服务可能由多个复制控制器控制的容器组成,并且期望在服务的整个生命周期内可以创建和销毁许多复制控制器(例如,执行运行该服务的容器的更新)。服务本身及其客户端都应忽略维护服务容器的复制控制器。

编写用于复制的程序

尽管随着时间的流逝它们的配置可能变得异构,但是由复制控制器创建的Pod旨在具有可互换性和语义上相同。这显然适合于复制的无状态服务器,但是复制控制器s也可以用于维护主选,分片和工作池应用程序的可用性。此类应用程序应使用动态工作分配机制,例如 RabbitMQ工作队列,而不是每个Pod的配置的静态/一次性自定义,这被认为是反模式。所执行的任何pod自定义(例如资源(例如,cpu或内存)的垂直自动调整大小)都应由另一个联机控制器进程执行,这与复制控制器本身不同。

复制控制器的职责

复制控制器只是简单地确保所需的Pod数量与其标签选择器匹配并且可以操作。当前,仅终止的Pod被排除在计数之外。在将来, 准备就绪 并考虑到系统中可用的其他信息,我们可能会增加对替换策略的控制,并且我们计划发出事件,外部客户可以使用这些事件来实施任意复杂的替换和/或缩减策略。

复制控制器永远受限于这种狭responsibility的职责。它本身不会执行准备状态或活动性探测。与其执行自动缩放,不如通过外部自动缩放器进行控制(如 #492), which would change its replicas field. We will not add scheduling policies (for example, 传播)复制到复制控制器。也不应验证所控制的吊舱是否与当前指定的模板匹配,否则会妨碍自动调整大小和其他自动化过程。同样,完成期限,排序依存关系,配置扩展和其他功能也位于其他位置。我们甚至计划考虑创建批量Pod的机制(#170)。

复制控制器旨在成为可组合的构建基元。我们希望将来可以在其上以及其他互补原语的基础上构建更高级别的API和/或工具。 Kubectl当前支持的“宏”操作(运行,缩放)是此概念验证的示例。例如,我们可以想象 阿斯加德 管理复制控制器,自动缩放器,服务,调度策略,canary等。

API对象

复制控制器是Kubernetes REST API中的顶级资源。有关的更多详细信息 API对象可以在以下位置找到: 复制控制器 API对象.

复制控制器的替代品

复制集

复制集 是支持新版本的下一代复制控制器 基于集合的标签选择器. It's mainly used by 部署方式 作为协调窗格创建,删除和更新的一种机制。 请注意,除非您需要自定义更新编排或完全不需要更新,否则我们建议使用部署而不是直接使用副本集。

部署方式 是更高级别的API对象,用于更新其基础副本集及其Pod。如果您想要此滚动更新功能,则建议部署,因为它们是声明性的,在服务器端且具有其他功能。

裸荚

与用户直接创建Pod的情况不同,复制控制器替换由于任何原因(例如,节点故障或破坏性节点维护,例如内核升级)而删除或终止的Pod。因此,即使您的应用程序只需要一个Pod,我们也建议您使用复制控制器。与流程主管类似,只将其监管多个节点上的多个Pod,而不是单个节点上的单个流程。 复制控制器将本地容器委托重新启动到节点上的某个代理(例如,Kubelet或Docker)。

工作

用一个 工作 而不是预期将自行终止的Pod的复制控制器 (即批处理作业)。

守护程序集

用一个 守护程序集 而不是提供以下内容的Pod的复制控制器: 机器级别的功能,例如机器监视或机器记录。这些豆荚的寿命是紧密联系在一起的 延长机器寿命:在其他Pod启动之前,pod必须在机器上运行,并且 当机器准备重新启动/关闭时,可以安全终止。

欲获得更多信息

运行无状态应用程序部署.

上次修改时间:太平洋标准时间2020年12月29日上午9:34: 在Replicationcontroller.md(abb825dd1)中添加内容