k8s replicaset (k8s鍗曢泦缇ゆ灦鏋勫浘)

ReplicaSet & ReplicationController(上)

概述

  • ReplicationController是一种 K8s 资源,可确保其 pod 始终保持运行
  • 如果 pod 由于任何原因消失,例如节点从集群中消失或因为 pod 被从节点中逐出,它会 ReplicationController 注意到丢失的 pod 并创建一个替换 pod。
  • 通常 ReplicationController ,用于创建和管理 pod 的多个副本。

K8sReplicaSetReplicationController(上)

  • 使用复制控制器或副本集创建新的 pod 时,您的节点可能资源不足,在这种情况下,它会自动在另一个可用的集群节点上创建新的 pod

K8sReplicaSetReplicationController(上)

工作原理

ReplicationController 的工作是确保确切数量的 pod 始终与其标签选择器匹配。如果不是,则 ReplicationController 会采取适当的操作来协调实际数字与所需数字。

下面的流程图展示了 Replication Controller 的运行:

K8sReplicaSetReplicationController(上)

复制控制器有三个基本部分:

  • 标签选择器(label selector) ,它决定了 ReplicationController 范围内的 pod
  • 副本计数(replica count) ,指定应该运行的所需 pod 数量
  • pod模板(pod template) ,创建新的 pod 副本时使用

ReplicationController 的副本数、标签选择器,甚至 Pod 模板都可以随时修改, 但只有副本数的更改会影响现有的 Pod

创建

要获得复制控制器的种类和 apiVersion,我们将检查列表 api-resources

[root@controller ~]# kubectl api-resources | grep -iE 'KIND|replication'
NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
replicationcontrollers            rc                                          true         ReplicationController

因此,kind 值将是 ReplicationController,现在要获取此类 apiVersion,我们将使用 kubectl explain 命令:

[root@controller ~]# kubectl explain ReplicationController | head -n 2
KIND:     ReplicationController
VERSION:  v1

现在我们有了创建第一个复制控制器所需的数据 kind 和值。 apiVersion 与 pod 和其他 Kubernetes 资源类似,您可以通过将 JSON 或 YAML 描述符发布到 Kubernetes API 服务器来创建 ReplicationController。

[root@controller ~]# cat replication-controller.yml
apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp-rc
  labels:
    app: myapp
    type: dev
spec:
  replicas: 3
  selector:
    app: myapp
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: dev
    spec:
      containers:
      - name: nginx-container
        image: nginx

突出显示的部分是创建 Pod 的模板。

当您将文件发布到 API 服务器时,Kubernetes 会创建一个名为 的新 Replication-Controller myapp-rc ,它确保三个 pod 实例始终与标签选择器匹配 app=myapp 。当没有足够的 pod 时,将从提供的 pod 模板创建新的 pod。

K8sReplicaSetReplicationController(上)

提示:

定义 ReplicationController 时不要指定 pod 选择器。让 Kubernetes 从 pod 模板中提取它。这将使您的 YAML 更短更简单。要创建 ReplicationController,请使用 kubectl create 命令:

[root@controller ~]# kubectl create -f replication-controller.yml
replicationcontroller/myapp-rc created

验证 Replication Controller 的运行

因为标签不存在 pod app=myapp ,ReplicationController 应该从 pod 模板启动三个新的 pod。列出默认命名空间中的可用 pod:

[root@controller ~]# kubectl get pods
NAME                        READY   STATUS              RESTARTS   AGE
init-container-example-1    1/1     Running             0          112m
myapp-rc-b2jtr              0/1     ContainerCreating   0          5s
myapp-rc-c57qm              0/1     ContainerCreating   0          5s
myapp-rc-hmj9g              0/1     ContainerCreating   0          5s

正如预期的那样,ReplicationController 已经在默认命名空间中启动了 3 个 pod,以获取可用复制控制器的状态和列表:

[root@controller ~]# kubectl get rc
NAME       DESIRED   CURRENT   READY   AGE
myapp-rc   3         3         3       71s

这里' rc '是复制控制器的缩写。

为确保 RC 将创建新的 pod,我们将删除带有标签的现有 pod app=myapp

[root@controller ~]# kubectl delete pod myapp-rc-c57qm
pod "myapp-rc-c57qm" deleted

正如预期的那样,删除的 pod 将从可用 pod 列表中删除,并创建一个新的 pod:

[root@controller ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
init-container-example-1    1/1     Running   0          113m
myapp-rc-2tcgx              1/1     Running   0          15s
myapp-rc-b2jtr              1/1     Running   0          52s
myapp-rc-hmj9g              1/1     Running   0          52s

要检查 pod 的状态和运行相应 pod 的工作节点,您可以使用 -o wide with kubectl get pods 命令:

[root@controller ~]# kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP          NODE                   NOMINATED NODE   READINESS GATES
init-container-example-1    1/1     Running   0          122m    10.36.0.2   worker-1.example.com   <none>           <none>
myapp-rc-2tcgx              1/1     Running   0          9m58s   10.36.0.4   worker-1.example.com   <none>           <none>
myapp-rc-b2jtr              1/1     Running   0          10m     10.36.0.3   worker-1.example.com   <none>           <none>
myapp-rc-hmj9g              1/1     Running   0          10m     10.44.0.4   worker-2.example.com   <none>           <none>

ReplicationController 您可以使用以下命令查看有关您的其他信息 kubectl describe

[root@controller ~]# kubectl describe rc myapp-rc
Name:         myapp-rc
Namespace:    default
Selector:     app=myapp
Labels:       app=myapp
              type=dev
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=myapp
           type=dev
  Containers:
   nginx-container:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                    Message
  ----    ------            ----  ----                    -------
  Normal  SuccessfulCreate  91s   replication-controller  Created pod: myapp-rc-b2jtr
  Normal  SuccessfulCreate  91s   replication-controller  Created pod: myapp-rc-c57qm
  Normal  SuccessfulCreate  91s   replication-controller  Created pod: myapp-rc-hmj9g
  Normal  SuccessfulCreate  54s   replication-controller  Created pod: myapp-rc-2tcgx

底部的事件列表显示了 Replication-Controller 采取的操作——到目前为止它已经创建了四个 pod。

K8sReplicaSetReplicationController(上)

更改 pod 模板

ReplicationController 的 pod 模板可以随时修改。更改 pod 模板只会影响新创建的 pod,不会影响处于运行状态的现有 pod:

作为练习,我将通过编辑 pod 模板来更新 replicas 值,并将 的值更改 replicas 为 4 并保存模板。这将在您的默认文本编辑器中打开 ReplicationController 的 YAML 定义:

[root@controller ~]# kubectl edit rc myapp-rc
replicationcontroller/myapp-rc edited

我们现在将列出 Pod 并验证副本数,正如您现在看到的,我们有 4 个使用标签运行的 Pod myapp

[root@controller ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
init-container-example-1    1/1     Running   0          130m
myapp-rc-2tcgx              1/1     Running   0          17m
myapp-rc-b2jtr              1/1     Running   0          17m
myapp-rc-hmj9g              1/1     Running   0          17m
myapp-rc-ksx4f              1/1     Running   0          3m7s

您还可以检查复制控制器状态,该状态现在显示它允许 4 个副本:

[root@controller ~]# kubectl get rc
NAME       DESIRED   CURRENT   READY   AGE
myapp-rc   4         4         4       18m

K8sReplicaSetReplicationController(上)

水平扩展的 Pod

您已经了解了如何 ReplicationControllers 确保特定数量的 pod 实例始终在运行。因为更改所需的副本数量非常简单,这也意味着水平扩展 pod 是微不足道的。

假设您突然预计应用程序的负载会增加,因此您必须部署更多的 pod 直到负载减少,在这种情况下,您可以轻松地增加 pod 运行时的数量。

例如,在这里我将副本数量扩展到 6:

[root@controller ~]# kubectl scale rc myapp-rc --replicas=6
replicationcontroller/myapp-rc scaled

然后验证带有标签的 pod 列表 myapp ,因此又启动了两个 pod:

[root@controller ~]# kubectl get pods
NAME                        READY   STATUS              RESTARTS   AGE
init-container-example-1    1/1     Running             0          132m
myapp-rc-2tcgx              1/1     Running             0          19m
myapp-rc-b2jtr              1/1     Running             0          20m
myapp-rc-hmj9g              1/1     Running             0          20m
myapp-rc-ksx4f              1/1     Running             0          5m41s
myapp-rc-pvqk2              0/1     ContainerCreating   0          3s
myapp-rc-zp972              0/1     ContainerCreating   0          3s

同样,一旦负载减少,副本也可以缩小,这里我现在将副本的数量减少到 3。这个命令所做的就是修改 ReplicationController 定义的字段 spec.replicas ——就像你通过 . 更改它时一样 kubectl edit

[root@controller ~]# kubectl scale rc myapp-rc --replicas=3
replicationcontroller/myapp-rc scaled

在缩小副本后,您可以看到新创建的 Pod 现在正在终止:

[root@controller ~]# kubectl get pods
NAME                        READY   STATUS        RESTARTS   AGE
init-container-example-1    1/1     Running       0          134m
myapp-rc-2tcgx              1/1     Running       0          21m
myapp-rc-b2jtr              1/1     Running       0          21m
myapp-rc-hmj9g              1/1     Running       0          21m
myapp-rc-ksx4f              0/1     Terminating   0          7m13s
myapp-rc-pvqk2              0/1     Terminating   0          95s
myapp-rc-zp972              0/1     Terminating   0          95s

让王者们更上一层楼!

让王者们更上一层楼!

欢迎各位小伙伴关注、点赞、评论、转发,你的关注和转发是我最大的动力!