1、控制器简介
2、 Replicaset控制器
[root@server2 ~]# vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 3 运行了三个副本
selector: 表示选者器,控制器和pod之间的联系是啥,因为不同的pod有不同的控制器
matchLabels:
app: nginx 如果pod上有app:nginx标签,此pod就属于此控制器
template: 模板
metadata:
labels:
app: nginx 表示模板下面创建的pod都会有app: nginx 标签
spec:
containers:
- name: nginx
image: nginx
[root@server2 ~]# kubectl apply -f rs.yaml 运行
replicaset.apps/replicaset-example created
[root@server2 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
replicaset-example 3 3 3 40s
[root@server2 ~]# kubectl get pod 运行了三个副本
NAME READY STATUS RESTARTS AGE
replicaset-example-9qr92 1/1 Running 0 2m13s
replicaset-example-c7zpv 1/1 Running 0 2m13s
replicaset-example-hdrqc 1/1 Running 0 2m13s
[root@server2 ~]# kubectl get pod --show-labels 查看pod的标签 ,3个副本都有 app=myapp 标签
NAME READY STATUS RESTARTS AGE LABELS
replicaset-example-9qr92 1/1 Running 0 3m22s app=myapp
replicaset-example-c7zpv 1/1 Running 0 3m22s app=myapp
replicaset-example-hdrqc 1/1 Running 0 3m22s app=myapp
标签对控制器的影响
[root@server2 ~]# kubectl label pods replicaset-example-9qr92 app=nginx --overwrite 将原有的标签覆盖换成app=nginx,overwrite 表示覆盖
pod/replicaset-example-9qr92 labeled
[root@server2 ~]# kubectl get pod --show-labels 查看标签
NAME READY STATUS RESTARTS AGE LABELS
replicaset-example-9qr92 1/1 Running 0 13m app=nginx 其中这个不匹配,控制器会维护副本数,会重新拉伸一个出来
replicaset-example-c7zpv 1/1 Running 0 13m app=myapp
replicaset-example-hdrqc 1/1 Running 0 13m app=myapp
replicaset-example-sjxss 1/1 Running 0 2m46s app=myapp
[root@server2 ~]# kubectl delete -f rs.yaml 删除
replicaset.apps "replicaset-example" deleted
3、deployment 控制器
deployment 和 Replicaset 书写一样
[root@server2 ~]# vim rs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yaml
deployment.apps/deployment created
[root@server2 ~]# kubectl get all
deployment控制器可以进行版本更新,版本退回,rs是做不到的,rs只控制副本数,如下实验:
[root@server2 ~]# vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@server2 ~]# vim rs.yaml
[root@server2 ~]# kubectl apply -f rs.yaml 运行
[root@server2 ~]# vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2 版本变成v2
[root@server2 ~]# kubectl apply -f rs.yaml
[root@server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployment-895ql 1/1 Running 0 2m28s 10.244.2.17 server4 <none> <none>
deployment-bsgpw 1/1 Running 0 2m28s 10.244.1.24 server3 <none> <none>
deployment-wmw2x 1/1 Running 0 2m28s 10.244.1.25 server3 <none> <none>
replicaset-example-9qr92 1/1 Running 0 77m 10.244.2.15 server4 <none>
[root@server2 ~]# curl 10.244.2.17 版本并没有更改。rs是做不到版本更新的
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# kubectl delete pod --all 删除所有副本,重新拉起三个副本
pod "deployment-895ql" deleted
pod "deployment-bsgpw" deleted
pod "deployment-wmw2x" deleted
pod "replicaset-example-9qr92" deleted
[root@server2 ~]# kubectl get pod -o wide 查看ip
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployment-7dvsd 1/1 Running 0 57s 10.244.2.20 server4 <none> <none>
deployment-prlpx 1/1 Running 0 56s 10.244.1.29 server3 <none> <none>
deployment-wtvkx 1/1 Running 0 56s 10.244.1.28 server3 <none> <none>
[root@server2 ~]# curl 10.244.1.28 访问,可以看出新拉起来的,版本就更新成了v2
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# kubectl delete -f rs.yaml 删除
replicaset.apps "deployment" deleted
deployment 控制器
[root@server2 ~]# vim rs.yaml 变回deployment控制器
apiVersion: apps/v1
kind: Deployment 变回deployment控制器
metadata:
name: deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yaml 运行
deployment.apps/deployment created
[root@server2 ~]# kubectl get pod 查看pod节点,总共3个副本
NAME READY STATUS RESTARTS AGE
deployment-678fcbc488-8nhmf 1/1 Running 0 38s
deployment-678fcbc488-9brd7 1/1 Running 0 38s
deployment-678fcbc488-xkr8x 1/1 Running 0 38s
[root@server2 ~]# vim rs.yaml 拉伸为6个副本
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 6 拉伸为6个副本
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yaml 运行
deployment.apps/deployment configured
[root@server2 ~]# kubectl get pod 可以发现生成了6个副本,deployment控制器里面也有rs控制器,所以可以拉伸
NAME READY STATUS RESTARTS AGE
deployment-678fcbc488-57q4x 1/1 Running 0 75s
deployment-678fcbc488-6l24d 1/1 Running 0 75s
deployment-678fcbc488-8nhmf 1/1 Running 0 3m35s
deployment-678fcbc488-9brd7 1/1 Running 0 3m35s
deployment-678fcbc488-cmggh 1/1 Running 0 75s
deployment-678fcbc488-xkr8x 1/1 Running 0 3m35s
[root@server2 ~]# vim rs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 3 下降为3个副本
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yaml 运行
[root@server2 ~]# kubectl get pod 3个副本
NAME READY STATUS RESTARTS AGE
deployment-678fcbc488-57q4x 1/1 Running 0 6m50s
deployment-678fcbc488-9brd7 1/1 Running 0 9m10s
deployment-678fcbc488-cmggh 1/1 Running 0 6m50s
[root@server2 ~]# vim rs.yaml 版本更新
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2 将版本更新为v2
[root@server2 ~]# kubectl apply -f rs.yaml
deployment.apps/deployment configured
[root@server2 ~]# kubectl get pod -o wide 查看ip
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployment-57c78c68df-d5bbz 1/1 Running 0 70s 10.244.1.33 server3 <none> <none>
deployment-57c78c68df-v69cg 1/1 Running 0 66s 10.244.2.24 server4 <none> <none>
deployment-57c78c68df-xq7wp 1/1 Running 0 61s 10.244.1.34 server3 <none> <none>
[root@server2 ~]# curl 10.244.1.34 访问,可以发现版本变成v2 deployment控制器负责版本切换
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
deployment控制器版本更新回退原理
[root@server2 ~]# kubectl get all
如果更新了镜像,deployment控制器新建一个rs,原来的rs不动保留,之前rs控制的pod会被回收,新的rs应用新的副本 如果退回原来的版本v1,v2上的rs直接切换到以前保留的版本v1,不用新建,v2上rs控制的pod会被回收
上述操作也可用命令操作
3、DaemonSet控制器(针对所有节点都要部署一个pod)
[root@server2 ~]# kubectl delete -f rs.yaml
deployment.apps "deployment" deleted
[root@server2 ~]# cp rs.yaml ds.yaml
[root@server2 ~]# vim ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2
[root@server2 ~]# kubectl apply -f ds.yaml 运行
daemonset.apps/daemonset created
[root@server2 ~]# kubectl get ds 部署了两个节点,其中master节点不部署
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset 2 2 2 2 2 <none> 39s
[root@server2 ~]# kubectl get node daemonset控制器是根据集群节点数来部署的,每个节点部署一个pod
NAME STATUS ROLES AGE VERSION
server2 Ready control-plane,master 5d7h v1.23.4
server3 Ready <none> 4d22h v1.23.4
server4 Ready <none> 4d22h v1.23.4
[root@server2 ~]# vim ds.yaml 如果变更镜像版本
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1 版本变成v1
[root@server2 ~]# kubectl apply -f ds.yaml 运行
[root@server2 ~]# kubectl get pod -o wide 查看ip
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-2df5d 1/1 Running 0 68s 10.244.2.26 server4 <none> <none>
daemonset-ksv2h 1/1 Running 0 72s 10.244.1.36 server3 <none> <none>
[root@server2 ~]# curl 10.244.1.36 访问,可以发现版本变成v1,所以daemonset控制器也只成版本更新
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# kubectl delete -f ds.yaml 删除
daemonset.apps "daemonset" deleted
4、job控制器(仅执行一次任务)
[root@server1 harbor]# docker pull perl 网上拉取perl镜像
[root@server1 harbor]# docker tag perl:latest reg.westos.org/library/perl:latest 改标签
[root@server1 harbor]# docker push reg.westos.org/library/perl:latest 上传到私有仓库
[root@server2 ~]# vim job.yaml
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 出错次数最大上限为4次
[root@server2 ~]# kubectl apply -f job.yaml 创建
job.batch/pi created
[root@server2 ~]# kubectl get pod 可以发现运行完一次之后直接退出
NAME READY STATUS RESTARTS AGE
pi-v27nx 0/1 Completed 0 2m10s
[root@server2 ~]# kubectl logs pi-v27nx 输出的信息在日志里保存
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096
[root@server2 ~]# kubectl delete -f job.yaml 删除
job.batch "pi" deleted
5、cronjob 控制器
Cron Job 创建基于时间调度的 Jobs。 一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。
Cron 时间表语法
# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6) (周日到周一;在某些系统上,7 也是星期日)
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
[root@server2 ~]# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *" 表示每分钟
jobTemplate: job模板
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster 在shell里面执行date命令
restartPolicy: OnFailure 表示只要出错,就重启
[root@server2 ~]# kubectl apply -f cronjob.yaml 运行
Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJob 版本 太低
[root@server2 ~]# kubectl api-versions 查看版本
[root@server2 ~]# kubectl get pod 每分钟运行
NAME READY STATUS RESTARTS AGE
hello-27465276-mtdsr 0/1 Completed 0 2m5s
hello-27465277-9pnb9 0/1 Completed 0 65s
hello-27465278-5qbsj 0/1 Completed 0 5s
[root@server2 ~]# kubectl logs hello-27465278-5qbsj 查看日志里的输出
Tue Mar 22 02:38:01 UTC 2022
Hello from the Kubernetes cluster
[root@server2 ~]# kubectl delete -f cronjob.yaml 删除
|