控制器
一、前言
Pod 的分类:
自主式 Pod:Pod 退出后不会被创建
控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目,即使删除了副本,控制器也会恢复其数量。
控制器类型:
1、Replication Controller(RC)和ReplicaSet(RS)
2、Deployment
3、DaemonSet
4、StatefulSet
5、Job
6、CronJob
7、HPA全称Horizontal Pod Autoscaler
二、RS控制器
(1)、简介
ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,ReplicaSet 支持新的基于集合的选择器需求。
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
(2)、使用
1、创建一个ReplicaSet类型的控制器
[root@server2 control] cat rs.yaml
apiVersion: apps/v1
kind: ReplicaSet 类型:RS控制器
metadata:
name: replicaset-example 控制器的名字为replicaset-example
spec:
replicas: 6 副本数量为6
selector:
matchLabels:
app: nginx
template: 模板(创建的副本以此为模板)
metadata:
labels:
app: nginx 给副本打上nginx的标签
spec:
containers:
- name: nginx
image: myapp:v1
2、查看节点,并展示标签
[root@server2 control] kubectl get pod --show-labels
3、结果:出现6个副本,且标签都为nginx
4、查看rs副本的更多信息
[root@server2 control] kubectl describe rs
5、修改其中一个容器的标签,查看副本的数量变化
[root@server2 control] kubectl label pod replicaset-example-9llrx app=myapp --overwrite
pod/replicaset-example-9llrx labeled
[root@server2 control] kubectl get pod --show-labels
6、结果:新建了一个副本,原有的6个pod不变,说明副本的控制不受改变。
三、Deployment
(1)、简介
Deployment
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法
典型的应用场景:
用来创建Pod和ReplicaSet
滚动更新和回滚
扩容和缩容
暂停与恢复
(2)、使用
Deployment中可以实现ReplicaSet 的全部功能,所以一般是一起使用
1、建立一个deployment控制器
[root@server1 ~] cat deployment.yml
apiVersion: apps/v1
kind: Deployment 类型是Deployment
metadata:
name: nginx-deployment 控制器的名字是nginx-deployment
labels:
app: nginx 标签;nginx
spec: 指定内容如下
replicas: 3 副本数量为3
selector:
matchLabels: 匹配标签为nginx的容器
app: nginx
template: 新建模板如下:
metadata:
labels:
app: nginx 标签为nginx
spec:
containers:
- name: nginx 容器名字为nginx
image: nginx 使用镜像为nginx
//
2、查看副本的分配情况
[root@server1 ~] kubectl apply -f deployment.yml
deployment.apps/nginx-deployment created
[root@server1 ~] kubectl get pod -o wide
3、查看标签
[root@server1 ~] kubectl get pod --show-labels
4、访问测试
[root@server2 control]# curl 10.244.141.214
三、回滚测试
1、修改deployment.yml文件里面新建模板的镜像文件为myapp:v1。
2、应用,查看信息
可以直接应用,不用关闭之前的版本
[root@server2 control]# kubectl apply -f deployment.yml
[root@server2 statefulset]# kubectl get pod -o wide 图1、查看pod信息
[root@server2 statefulset]# curl 10.244.141.216 图1、进行访问
[root@server2 control]# kubectl get rs 图2、查看到目前的版本
图1、可以查看到目前myapp的版本
图2、查看到目前已经迭代过版,如果需要可以回滚为之前的版本
四、DaemonSet控制器
(1)、简介
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。一个典型用法是在每个节点上运行监控 DaemonSet,例如 zabbix agent等。保证每个节点做一次
编辑daemonset.yaml文件
(2)、使用
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
labels:
k8s-app: zabbix-agent
spec:
selector:
matchLabels:
name: zabbix-agent
template:
metadata:
labels:
name: zabbix-agent
spec:
containers:
- name: zabbix-agent
image: zabbix/zabbix-agent
五、StatefulSet控制器
StatefulSet 是用来管理有状态应用的工作负载 API 对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”。
主要用于长期的、持续的监测状态,需要唯一的网络标识符的集群。
六、Job控制器
执行批处理任务,仅执行一次任务,执行成功就结束。比如可以计算pi值。
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
拉起pod,查看状态
启动成功后,在日志中出现结果
七、CronJob控制器
Cron Job 创建基于时间调度的 Jobs。
一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job
$ vim cronjob-example.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-example
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from k8s cluster
restartPolicy: OnFailure
$ kubectlapply -f cronjob-example.yaml
$ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-example * * * * * False 0 38s 8m22s
$ kubectl get job -w
NAME COMPLETIONS DURATION AGE
cronjob-example-1581873180 1/1 1s 3m
cronjob-example-1581873240 1/1 1s 2m
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
cronjob-example-1581873240-r644w 0/1 Completed 0 2m51s
cronjob-example-1581873300-p89rc 0/1 Completed 0 111s
$ kubectl logs cronjob-example-1581873240-r644w
Sun Feb 16 17:14:06 UTC 2020
Hello from k8s cluster
$ kubectldelete cronjob cronjob-example
cronjob.batch"cronjob-example" deleted