Replication Controller
Replication Controller(RC)
是 Kubernetes
系统中核心概念之一, 当我们定义了一个 RC
并提交到 Kubernetes
集群中以后, Master
节点上的 Controller Manager
组件就得到通知,定期检查系统中存活的 Pod
,并确保目标 Pod
实例的数量刚好等于 RC 的预期值, 如果有过多或过少的 Pod
运行, 系统就会停掉或创建一些 Pod
.此外我们也可以通过修改 RC
的副本数量, 来实现 Pod
的动态缩放功能。
1、创建nginx的RC yaml文件
apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: reg.harbor.com/public/nginx:1.18.0 imagePullPolicy: IfNotPresent ports: - containerPort: 80
2、创建RC资源
[root@master1 rc]# ls nginx_rc.yaml [root@master1 rc]# kubectl create -f nginx_rc.yaml replicationcontroller/myweb created [root@master1 rc]# kubectl get rc myweb NAME DESIRED CURRENT READY AGE myweb 2 2 2 22s [root@master1 rc]# kubectl get pod NAME READY STATUS RESTARTS AGE myweb-flbpm 1/1 Running 0 40s myweb-td2ql 1/1 Running 0 40s [root@master1 rc]#
Pod和Controller的关系:
Pod是通过Controller实现应用的运维比如伸缩、滚动升级等等
Pod和Controller之间是通过label标签建立关系
由于Replication Controller
与 Kubernetes 代码中的模块 Replication Controller
同名,所以在 Kubernetes v1.2
时, 它就升级成了另外一个新的概念 Replica Sets
,官方解释为下一代的 RC
, 它与 RC
区别是:Replica Sets
支援基于集合的 Label selector
,而 RC
只支持基于等式的 Label Selector
。 我们很少单独使用 Replica Set
,它主要被 Deployment
这个更高层面的资源对象所使用, 从而形成一整套 Pod
创建、 删除、 更新的编排机制。 最好不要越过 RC
直接创建 Pod
, 因为 Replication Controller
会通过 RC
管理 Pod
副本, 实现自动创建、 补足、 替换、 删除 Pod
副本, 这样就能提高应用的容灾能力, 减少由于节点崩溃等意外状况造成的损失。 即使应用程序只有一个 Pod
副本, 也强烈建议使用 RC
来 定义 Pod
。
Replicat Set
ReplicaSet
跟 ReplicationController
没有本质的不同, 只是名字不一样, 并且ReplicaSet
支持集合式的 selector
(ReplicationController
仅支持等式) 。Kubernetes
官方强烈建议避免直接使用 ReplicaSet
, 而应该通过 Deployment
来创建 RS
和Pod
。 由于 ReplicaSet
是 ReplicationController
的代替物, 因此用法基本相同, 唯一的区别在于 ReplicaSet
支持集合式的 selector
。
Deployment
Deployment
是 Kubenetes v1.2
引入的新概念, 引入的目的是为了更好的解决 Pod
的编排问题, Deployment
内部使用了 Replica Set
来实现。 Deployment
的定义与 Replica Set
的定义很类似, 除了 API
声明与 Kind
类型有所区别:
使用如下命令导出deployment的yaml模板:
kubectl create deployment nginx-deploy --image=nginx --dry-run -o yaml > nginx_deploy.ymal
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deploy name: nginx-deploy spec: replicas: 1 selector: matchLabels: app: nginx-deploy template: metadata: labels: app: nginx-deploy spec: containers: - image: reg.harbor.com/public/nginx:1.18.0 name: nginx ports: - containerPort: 80