Kubernetes连载 (1)Replication controller

什么是Replication controller?为什么我们需要Reoplication controller?

Replication controller是一个比pods更高级别的Kubernetes object。事实上,我们不会直接操作pods,而Replication controller会为我们进行pods的各种操作,让我们的生活更简单。Replication controller可以帮助我们维护pods的状态。
所以,第二我们可能想问pods的状态是什么意思?
举个例子,如果您想要运行一定数量的pods的实例,您会希望这些实例可以一直在Kubernetes集群中运行。 因此,我们需要在pods之上创建一个controller帮助我们实现这个意图,而这就是Replication controller的意义所在,即保证在Kubernetes 集群运行期间一直维持pods的实例的运行数量。pods的实例的运行数量便可以看作是Replication controller要维护pods的一个状态。

Replication controller要如何定义呢?

在Kubernetes中,要使用到Replication controller我们需要先为其创建一个定义文件。假设我们这个定义文件取名为nginx_rc.yml,内容如下:

apiVersion: v1
kind: ReplicationController
metadata:
        name: my-nginx-rc
spec:
        replicas: 10
        selector:
                app: nginx
        template:
                metadata:
                        name: my-nginx-pod
                        labels:
                              app: nginx
                spec:
                        containers:
                              - name: nginx
                                image: nginx

在这个文件里,您会需要提供Replication controller的api版本,而这个版本和Replication controller创建的pods的api版本会保持一致。而kind的话用来标明这是要部署一个Reoplication controller。在此之后我们需要提供一些metadata的相关细节。比如我们可以我们的Replication controller取名为my-nginx-rc。
接下来,我们需要提供这个RC(Replication controller)的specification。

replicas

它是您的集群在运行时需要维持的pod实例的数量,这里的10就代表我希望我的集群在运行的时候可以为我启动且维持10个实例。

selector

Selector 是变量,或者它是一个标签,我们可以用它来识别由这个复制控制器管理的 pod。 当您的 Kubernetes 集群中运行了大量由不同的Replication controller管理的 pods 时,您会发现该功能十分方便。所以selector是将 pod 链接到Replication controller的粘合剂。
现在我将我的选择器指定为 app : nginx 。 冒号后需要有一个空格。

template

这个template指的是pod template details,这里的detail指的就是一个pod的细节。在这里面你会发现又出现了一个name, 这个name指的是您的pod的名字。下面我们会用到labels。和selector相似,RC会使用这个标签来识别pod。
您可能发现了,template里也有个spec,但这个spec标识的是单个pod的参数,而非RC的。在spec的下面我们需要配置containers,即容器的参数,在这里你可以给container取一个名字(name),然后再标明这个容器的镜像名(image)。至此,我们就解析完了这个Reoplication controller的定义文件。

让我们看看这个定义文件会给我们带来什么惊喜

我用的是Ubuntu 20.04 LTS,Kubernetes 的版本信息如下:

Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", BuildDate:"2021-07-15T20:58:09Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}

上面是输出信息,请不要复制运行。
我假设您已经配置好了Kubernetes。
接下来使用下列命令

kubectl apply -f nginx_rc.yml

如果你看到下列输出信息,则说明Reoplication controller创建成功:

replicationcontroller/my-nginx-rc created

接下来我们再运行下列命令获取Reoplication controller列表:

kubectl get rc

您应该会看到下列信息:

NAME          DESIRED   CURRENT   READY   AGE
my-nginx-rc   10        10        10      60s

为了验证我们的这个RC是否创建了10个pods,我们执行下面这条命令:

kubectl get pods -l app=nginx

-l 是指label, 后面的即我们在定义文件所阐述的标签

如果您的集群运行正常,应该会看到下列信息:

AME                READY   STATUS    RESTARTS   AGE
my-nginx-rc-blfcn   1/1     Running   0          2m15s
my-nginx-rc-chx26   1/1     Running   0          2m15s
my-nginx-rc-fjd5v   1/1     Running   0          2m15s
my-nginx-rc-gpcvq   1/1     Running   0          2m15s
my-nginx-rc-ms7lc   1/1     Running   0          2m15s
my-nginx-rc-p7ng6   1/1     Running   0          2m15s
my-nginx-rc-p9png   1/1     Running   0          2m15s
my-nginx-rc-vk8xn   1/1     Running   0          2m15s
my-nginx-rc-wqf9v   1/1     Running   0          2m15s
my-nginx-rc-z7xc6   1/1     Running   0          2m15s

重头戏—Kubernetes的自我治愈特点

我们接下来模仿一个突发事项导致某个或多个pod突然离线的情况
使用下列命令删除pods

kubectl delete pods -l app=nginx

然后再查询pods的运行状况:

kubectl get pods -l app=nginx

输出情况应该和下图相差不大:

NAME                READY   STATUS              RESTARTS   AGE
my-nginx-rc-8lqfb   1/1     Running             0          22s
my-nginx-rc-fq8tv   0/1     ContainerCreating   0          22s
my-nginx-rc-h4jp2   1/1     Running             0          22s
my-nginx-rc-hclnp   1/1     Running             0          22s
my-nginx-rc-kjhtv   1/1     Running             0          22s
my-nginx-rc-mmdbl   0/1     ContainerCreating   0          22s
my-nginx-rc-rkcgl   0/1     ContainerCreating   0          22s
my-nginx-rc-s994x   1/1     Running             0          22s
my-nginx-rc-sssfb   0/1     ContainerCreating   0          22s
my-nginx-rc-xqqrl   0/1     ContainerCreating   0          22s

我们再查看下RC的状态:

kubectl get rc

输出信息应该是这样的:

NAME          DESIRED   CURRENT   READY   AGE
my-nginx-rc   10        10        10      81m

您会发现Reoplication controller又启动了10个pods,这就是Kubernetes的自我治愈特点。

因此,无论在RC下管理的 Pod 发生什么情况,RC都会总是确保您的 Kubernetes 一个集群中运行的replica的数量始终正确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值