在K8s-Pod文档中我们创建的Pod是非托管的Pod,因为Pod被设计为用后就弃的对象,如果Pod正常关闭,K8s会将该Pod清除,它没有自愈的能力。Pod控制器是用来保持Pod状态的一种对象资源,如下为Pod控制器的作用

Pod控制组成部分

更改标签选择器和Pod模板不会影响现有的Pod.更改标签选择器会使现有的Pod脱离控制,但不会影响现有Pod的运行,更改Pod模板也不会影响现有Pod的运行,只会影响由改控制器新生成的Pod.

作用:

1:确保Pod副本数保持一致

2:当节点故障时会在其他节点运行创建的Pod以替代旧的Pod

3:非常容器实现Pod的水平伸缩。

三: Pod控制器-ReplicationController

3.1 RC-组成部分

3.1.1 label selector

标签选择器,用于确定控制的Pod

3.1.2 replica count

副本个数,指定用行的Pod数量

3.1.3 pod template

Pod模板,用于创建新的Pod副本

3.2 RC-创建

我们可以通过yaml格式的文件进行RC的创建

如下一个rc yaml格式的文件

[root@k8s-master-node1 pod-controller]# cat kubia-rc.yaml

apiVersion: v1   # API的版本

kind: ReplicationController  # Pod控制器 RC

metadata:     # 元数据

name: kubia

spec:        # 规格说明

replicas: 3   # 副本个数

selector:    # 标签选择器

app: kubia

template:  # 标签的模板

metadata:

labels:

app: kubia  # Pod标签,这里要确保跟RC的标签选择器一致

spec:

containers:

- name: kubia

image: luksa/kubia

ports:

- containerPort: 8080

创建RC

[root@k8s-master-node1 pod-controller]# kubectl create -f kubia-rc.yaml

查看一下有没有生成Pod

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels -o wide

会生成指定的副本数3个Pod,也会贴上app=kubia的标签

查看我们已经创建的ReplicationController

[root@k8s-master-node1 pod-controller]# kubectl get replicationcontroller -o wide

Replicationcontroller的缩写时rc

[root@k8s-master-node1 pod-controller]# kubectl get rc -o wide

上面的三列分别时所需的Pod数量,实际的Pod数量,已经准备就绪的Pod数量

查看rc kubia的相信信息

[root@k8s-master-node1 pod-controller]# kubectl describe rc kubia

现在我们尝试删除一个Pod,看下发生了什么

# 查看当前Pod

[root@k8s-master-node1 pod-controller]# kubectl get po

NAME          READY   STATUS    RESTARTS   AGE

kubia-7x4dp   1/1     Running   0          32m

kubia-f4b5d   1/1     Running   0          28m

kubia-m7bv2   1/1     Running   0          32m

# 尝试删除一个Pod

[root@k8s-master-node1 pod-controller]# kubectl delete po kubia-7x4dp

# 查看目前Pod 可以看到如果我们手动删除一个Pod,RC会自动的根据Pod template创建出一个Pod

[root@k8s-master-node1 ~]# kubectl get po

NAME          READY   STATUS              RESTARTS   AGE

kubia-59r66   0/1     ContainerCreating   0          2s

kubia-7x4dp   1/1     Terminating         0          34m

kubia-f4b5d   1/1     Running             0          31m

kubia-m7bv2   1/1     Running             0          34m

# 我们使用标签选择器删除这三个Pod

[root@k8s-master-node1 pod-controller]# kubectl delete  po -l app=kubia

 

 

# 再次查看Pod情况

[root@k8s-master-node1 ~]# kubectl get po

NAME          READY   STATUS              RESTARTS   AGE

kubia-59r66   1/1     Terminating         0          3m26s

kubia-dpgp5   0/1     ContainerCreating   0          3s

kubia-f4b5d   1/1     Terminating         0          34m

kubia-jlw9l   0/1     ContainerCreating   0          3s

kubia-m7bv2   1/1     Terminating         0          38m

kubia-m8n9p   0/1     ContainerCreating   0          3s

现在我们模拟一下节点故障

目前有两个Pod运行在worker 节点2上,现在我们将节点2down掉

# 我们看到节点2成为了NotReady状态

[root@k8s-master-node1 ~]# kubectl get nodes

NAME               STATUS     ROLES    AGE    VERSION

k8s-master-node1   Ready      master   2d     v1.13.1

k8s-worker-node1   Ready      <none>   2d     v1.13.1

k8s-worker-node2   NotReady   <none>   4h4m   v1.13.1

# 再查看Pod状态

[root@k8s-master-node1 pod-controller]# kubectl get pods

NAME          READY   STATUS    RESTARTS   AGE

kubia-dpgp5   1/1     Running   0          21m

kubia-jlw9l   0/1     Error     0          21m

kubia-m8n9p   0/1     Error     0          21m

# 等一会儿我们再次查看,K8s新创建了两个Pod,实现了自愈

[root@k8s-master-node1 pod-controller]# kubectl get po

NAME          READY   STATUS        RESTARTS   AGE

kubia-dl9zv   1/1     Running       0          5m47s

kubia-dpgp5   1/1     Running       0          29m

kubia-jlw9l   0/1     Terminating   0          29m

kubia-m8n9p   0/1     Terminating   0          29m

kubia-rjvnm   1/1     Running       0          5m47s

现在我们将节点2启动

发现Pod不会在发生改变,会把之前的Erro状态的Pod删除掉。

3.3 RC-作用域

RC 负责管理与标签选择器匹配的Pod,而不是绑定关系,两者没有互相依赖的关系,我们可以通过修改Pod的标签,从而脱离RC的管理,但该脱离Pod只是不受RC管理了,不会产生任何影响,所不同的是如果该Pod节点发生故障,Pod因为是非托管的Pod,该Pod会被删除而不会重建。

这里我们尝试修改其中一个Pod的标签

# 以下三个Pod有一个app=kubia的标签

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-dl9zv   1/1     Running   0          35m   app=kubia

kubia-dpgp5   1/1     Running   0          58m   app=kubia

kubia-rjvnm   1/1     Running   0          35m   app=kubia

# 现在我们修改其中一个Pod的标签

[root@k8s-master-node1 pod-controller]# kubectl label po kubia-dl9zv app=wangys --overwrite

# 现在看下Pod情况

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS              RESTARTS   AGE   LABELS

kubia-dl9zv   1/1     Running             0          35m   app=wangys

kubia-dpgp5   1/1     Running             0          59m   app=kubia

kubia-p5clz   0/1     ContainerCreating   0          3s    app=kubia

kubia-rjvnm   1/1     Running             0          35m   app=kubia

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-dl9zv   1/1     Running   0          35m   app=wangys

kubia-dpgp5   1/1     Running   0          59m   app=kubia

kubia-p5clz   1/1     Running   0          9s    app=kubia

kubia-rjvnm   1/1     Running   0          35m   app=kubia

说明:修改现有Pod的标签可以将该Pod移除RC的作用域,不受管理,但是该Pod正常运行不受影响,区别在于这个Pod节点故障就会被删除。

3.4 RC-Pod模板

对于Pod模板我们可能常常会更新,需要说明的是,如果Pod模板更新,并不会影响现有的Pod运行,影响的是新建的Pod,新建的Pod会根据这个Pod模板创建。

我们可以通过修改模板来验证我们的结论

# 现在三个Pod都有app=kubia的标签

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-dpgp5   1/1     Running   0          82m   app=kubia

kubia-p5clz   1/1     Running   0          23m   app=kubia

kubia-rjvnm   1/1     Running   0          59m   app=kubia

# 修改rc文件,新增rel:beta标签

[root@k8s-master-node1 pod-controller]# kubectl edit rc kubia

# 再次查看 原Pod标签没有修改

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-dpgp5   1/1     Running   0          86m   app=kubia

kubia-p5clz   1/1     Running   0          27m   app=kubia

kubia-rjvnm   1/1     Running   0          63m   app=kubia

我们删除一个Pod试试,新Pod会根据修改后的模板创建

[root@k8s-master-node1 pod-controller]# kubectl delete po kubia-dpgp5

[root@k8s-master-node1 ~]# kubectl get po --show-labels

NAME          READY   STATUS        RESTARTS   AGE   LABELS

kubia-2r2qx   1/1     Running       0          15s   app=kubia,rel=beta

kubia-dpgp5   1/1     Terminating   0          88m   app=kubia

kubia-p5clz   1/1     Running       0          29m   app=kubia

kubia-rjvnm   1/1     Running       0          65m   app=kubia

[root@k8s-master-node1 ~]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-2r2qx   1/1     Running   0          38s   app=kubia,rel=beta

kubia-p5clz   1/1     Running   0          30m   app=kubia

kubia-rjvnm   1/1     Running   0          65m   app=kubia

3.5 RC-Pod水平伸缩

3.5.1  扩容

可以通过手动的方式

[root@k8s-master-node1 ~]# kubectl scale rc kubia --replicas=10

# 查看状态

[root@k8s-master-node1 pod-controller]# kubectl get po

NAME          READY   STATUS    RESTARTS   AGE

kubia-2r2qx   1/1     Running   0          8m30s

kubia-5c47l   1/1     Running   0          3m33s

kubia-bfksb   1/1     Running   0          3m33s

kubia-ctkcm   1/1     Running   0          3m33s

kubia-d6zh9   1/1     Running   0          3m33s

kubia-g7296   1/1     Running   0          3m33s

kubia-p5clz   1/1     Running   0          37m

kubia-rjvnm   1/1     Running   0          73m

kubia-rtg4q   1/1     Running   0          3m33s

kubia-s9n8k   1/1     Running   0          3m33s

 

通过编辑定义来扩容

[root@k8s-master-node1 pod-controller]# kubectl edit rc kubia

[root@k8s-master-node1 pod-controller]# kubectl get po

NAME          READY   STATUS    RESTARTS   AGE

kubia-2ctxt   1/1     Running   0          59s

kubia-2r2qx   1/1     Running   0          16m

kubia-5c47l   1/1     Running   0          11m

kubia-7hmm6   1/1     Running   0          59s

kubia-b5kxm   1/1     Running   0          59s

kubia-bfksb   1/1     Running   0          11m

kubia-ctkcm   1/1     Running   0          11m

kubia-d6zh9   1/1     Running   0          11m

kubia-g7296   1/1     Running   0          11m

kubia-jvmt6   1/1     Running   0          59s

kubia-k7kc4   1/1     Running   0          59s

kubia-krbj6   1/1     Running   0          59s

kubia-kw66f   1/1     Running   0          59s

kubia-mktbp   1/1     Running   0          59s

kubia-p5clz   1/1     Running   0          45m

kubia-rjvnm   1/1     Running   0          81m

kubia-rtg4q   1/1     Running   0          11m

kubia-s9n8k   1/1     Running   0          11m

kubia-w9jx6   1/1     Running   0          59s

kubia-zr5s6   1/1     Running   0          59s

3.5.2 缩容

命令行/编辑文件,这里演示命令行

[root@k8s-master-node1 pod-controller]# kubectl scale rc kubia --replicas=3

K8s-Pod控制器的更多相关文章

  1. k8s之pod控制器

    1.生产中,很少会跑一个自主式pod,一般由控制器去创建pod,其配置文件中内嵌了pod的创建方式. pod控制器:ReplicaSet.Deployment.DaemonSet.Job.Cronjo ...

  2. k8s之pod与Pod控制器

    k8s中最为重要的基础资源,pod,pod controller,service pod controller类型有多种需要向控制器赋值之后使用: kubectl命令使用 kubectk get no ...

  3. K8S Pod及其控制器

    Pod K8S里能够运行的最小逻辑单元,1个Pod可以运行多个容器 Pod 控制器 Pod控制器是Pod启动的一种模版,用来保证在K8S中启动的Pod始终按照人们的预期运行(副本数,生命周期.健康状态 ...

  4. k8s学习笔记之六:Pod控制器(kube-controller-manager)

    第一章.什么是kube-controller-manager? Controller Manager 由 kube-controller-manager 和 cloud-controller-mana ...

  5. k8s的Pod控制器

    pod的配置清单常见选项: apiVersion,kind,metadata,spec,status(只读) spec: containers: nodeSelector: nodeName: res ...

  6. Kubernetes学习之路(十二)之Pod控制器--ReplicaSet、Deployment

    一.Pod控制器及其功用 Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源. pod控制器 ...

  7. Kubernetes 学习8 Pod控制器

    一.回顾 1.Pod是标准的kubernetes资源,因此其遵循为其资源清单配置定义的基本格式,包含:apiVersion,kind,metadata,spec,status(只读) 2.spec的内 ...

  8. Kubernetes 学习6 Pod控制器应用进阶

    一.资源配置清单 1.自主式Pod资源 2.资源的清单格式,大多数清单格式都遵循如下条件: a.一级字段:apiVersion(group/version),kind,metadata(name,na ...

  9. 8and9 pod控制器

    Pod控制器: 自主定义的pod资源删除后不会被重启,被Pod控制器管理的pod资源被删除后会重启. pod控制器的种类: ReplicationController: (最早使用,现在已经被废弃,太 ...

  10. 五,pod控制器应用进阶

    目录 Pod 资源 标签 给资源打标签 标签选择器 Pod 生命周期 pod状态探测 livenessProbe 状态探测 livenessProbe exec 测试 livenessProbe ht ...

随机推荐

  1. 使用 JavaScript 将网站后台的数据变化实时更新到前端

    问:难道只能设置定时器每隔一秒通过 Ajax 向后台请求数据来实现吗? 答: 1. nodejs的 http://socket.io 支持上述 李宏训 所说的三种方式,另外还支持 Flash Sock ...

  2. P3168 [CQOI2015]任务查询系统

    题目地址:P3168 [CQOI2015]任务查询系统 主席树的模板题 更模板的在这儿:P3834 [模板]可持久化线段树 1(主席树) 形象的说,P3834是"单点修改,区间查询" ...

  3. 【C++】一篇文章,让你不再害怕指针

    在C++中,比较难以理解的就是指针,最常用的也是指针.这篇文章,结合我的所学,所看,来谈谈C++中的指针 指针是什么 指针是一个特殊的变量,指向内存中的一个地址.它具有四个要素: 指针类型:即指针本身 ...

  4. Python全栈(第一部分)day1

    计算机基础 cpu:相当于人的大脑,用于计算. 内存:储存数据,4G,8G,16G,32G,成本高,断电即消失. 硬盘:1T,固态硬盘,机械硬盘,储存数据,应该长久保持数据,重要文件,小电影等等. 操 ...

  5. QML 从入门到放弃

    发现了一个问题: QQuickView only supports loading of root objects that derive from QQuickItem. If your examp ...

  6. boost::tokenizer详解

    tokenizer 库提供预定义好的四个分词对象, 其中char_delimiters_separator已弃用. 其他如下: 1. char_separator char_separator有两个构 ...

  7. Centos6.8下卸载软件(以Mysql为例)

    1 删除Mysql yum remove  mysql mysql-server mysql-libs mysql-server; find / -name mysql 将找到的相关东西delete掉 ...

  8. Laravel 5.2--如何让表单提交错误,不清空?

    控制器 public function store(Request $request) { $validator = Validator::make($request->all(), [ 'Su ...

  9. java8 lambda方法引用

    注意引用方法的参数列表与返回值类型要与函数式接口中的抽象方法的参数列表与返回值类型保持一致 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实例方法名 pub ...

  10. appium常用方法

    1.输入中文 在capabilities中增加两项设置: capabilities.setCapability("unicodeKeyboard", "True" ...