什么是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的数量始终正确。