RC(Replication Controller)是早期Kubernetes版本提供的Pod,在现在版本中已经被建议使用Replica Set所代替(准确地说是使用Deployment配合ReplicaSet进行替代),这篇文章就二者的区别以使用方式进行介绍。
使用示例: RC
首先我们通过一个简单的示例来看一下RC的使用方式。YAML设定文件如下所示:
[root@host131 ReplicaSet]# cat busybox-rc.yaml
---
apiVersion: v1
kind: ReplicationController
metadata:
name: test-rc
spec:
replicas: 1
selector:
app: busybox-pod
template:
metadata:
name: busybox
labels:
app: busybox-pod
spec:
containers:
- name: busybox-host
image: busybox:latest
command: ["sleep"]
args: ["1000"]
...
[root@host131 ReplicaSet]#
RC生成和结果确认
[root@host131 ReplicaSet]# kubectl create -f busybox-rc.yaml
replicationcontroller/test-rc created
[root@host131 ReplicaSet]#
[root@host131 ReplicaSet]# kubectl get rc -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
test-rc 1 1 1 8s busybox-host busybox:latest app=busybox-pod
[root@host131 ReplicaSet]#
[root@host131 ReplicaSet]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-rc-t4t57 1/1 Running 0 15s 10.254.152.5 192.168.163.131 <none> <none>
[root@host131 ReplicaSet]# kubectl exec -it test-rc-t4t57 sh
/ # hostname
test-rc-t4t57
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 sleep 1000
11 root 0:00 sh
17 root 0:00 ps -ef
/ #
使用示例: RS
我们直接将上述RC的YAML文件进行修改来生成RS的YAML文件,来确认一下两者的区别,首先直接修改Kind
[root@host131 ReplicaSet]# kubectl create -f busybox-rs.yaml
error: unable to recognize "busybox-rs.yaml": no matches for kind "ReplicaSet" in version "v1"
[root@host131 ReplicaSet]#
RS在apps/v1,修改之后继续确认,spec规格中需要添加selector
[root@host131 ReplicaSet]# diff busybox-r*
2,3c2,3
< apiVersion: v1
< kind: ReplicationController
---
> apiVersion: apps/v1
> kind: ReplicaSet
[root@host131 ReplicaSet]# kubectl create -f busybox-rs.yaml
error: error validating "busybox-rs.yaml": error validating data: ValidationError(ReplicaSet.spec.selector): unknown field "app" in io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector; if you choose to ignore these errors, turn validation off with --validate=false
[root@host131 ReplicaSet]#
进行如下修改,添加matchLabels即可,这里将name也进行修改
[root@host131 ReplicaSet]# diff busybox-r*
2,3c2,3
< apiVersion: v1
< kind: ReplicationController
---
> apiVersion: apps/v1
> kind: ReplicaSet
5c5
< name: test-rc
---
> name: test-rs
9c9,10
< app: busybox-pod
---
> matchLabels:
> app: busybox-pod
[root@host131 ReplicaSet]#
YAML文件详细如下:
[root@host131 ReplicaSet]# cat busybox-rs.yaml
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: test-rs
spec:
replicas: 1
selector:
matchLabels:
app: busybox-pod
template:
metadata:
name: busybox
labels:
app: busybox-pod
spec:
containers:
- name: busybox-host
image: busybox:latest
command: ["sleep"]
args: ["1000"]
...
[root@host131 ReplicaSet]#
RS生成和结果确认
[root@host131 ReplicaSet]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
test-rs 1 1 1 7s busybox-host busybox:latest app=busybox-pod
[root@host131 ReplicaSet]#
[root@host131 ReplicaSet]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-rs-vfcdw 1/1 Running 0 15s 10.254.152.5 192.168.163.131 <none> <none>
[root@host131 ReplicaSet]#
[root@host131 ReplicaSet]# kubectl exec -it test-rs-vfcdw sh
/ # hostname
test-rs-vfcdw
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 sleep 1000
6 root 0:00 sh
12 root 0:00 ps -ef
/ #
总结
可以看到RC和RS的基本使用方式大体一致,只需要改一下Kind和selector即可,另外RS虽然可以创建并使用,但是在实际中更多情况则是直接使用Deployment。
参考内容
https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/
https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/