k8s常用工作负载
工作负载控制器(Workload Controllers)时k8s的一个抽象的概念,用于更高级层次对象,部署和管理Pod,常用于工作负载控制器:
Deployment:无状态应用部署
StatefulSet:有状态应用部署
DaemonSet:确保所有node运行同一个pod
job:一次性任务
Cronjob:定时任务
控制器的作用:
管理pod对象
使用标签与pod关联
控制器实现了pod的运维,列如滚动更新、伸缩、副本管理、维护pod状态等。
Deployment的功能:
管理pod和ReplicaSet
具体由上线部署、副本设定、滚动升级、回滚等功能
提供声明时更新、列如只更新的一个新的lmage
流程:
应用程序—部署—升级—回滚—下线
Deployment部署
[root@master manifest]# cat test2.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: webnamespace: default
spec:replicas: 5selector:matchLabels: app: apachetemplate:metadata:labels: app: apachespec:containers:- image: sktystwd/apache:v0.1imagePullPolicy: IfNotPresentname: httpd[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-6bcd5cffd7-8jfjx 1/1 Running 0 6s
web-6bcd5cffd7-gmmqq 1/1 Running 0 6s
web-6bcd5cffd7-lnfl4 1/1 Running 0 6s
web-6bcd5cffd7-x67cb 1/1 Running 0 6s
web-6bcd5cffd7-zh869 1/1 Running 0 6s
Deployment滚动升级
[root@master manifest]# cat test2.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: webnamespace: default
spec:replicas: 5strategy:rollingUpdate:maxSurge: 30%maxUnavailable: 30%type: RollingUpdateselector:matchLabels: app: apachetemplate:metadata:labels: app: apachespec:containers:- image: sktystwd/apache:v0.2imagePullPolicy: IfNotPresentname: httpd
maxSurge:滚动更新过程中最大pod副本数,确保在更新时启动的pod数量比期望(replicas)pod数量最大多出25%
maxUnavailable:滚动更新过程中最大不可用pod副本,确保在更新时最大25%pod数量不可用,确保75%pod数量时可用状态。
查看
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5dc777c866-f8cfv 1/1 Running 0 17s
web-5dc777c866-gqp4j 1/1 Running 0 17s
web-5dc777c866-hvvwm 1/1 Running 0 18s
web-5dc777c866-nssgb 1/1 Running 0 18s
web-5dc777c866-vxrzz 1/1 Running 0 18s
web-6bcd5cffd7-8jfjx 1/1 Terminating 0 9m58s
web-6bcd5cffd7-gmmqq 1/1 Terminating 0 9m58s
web-6bcd5cffd7-lnfl4 1/1 Terminating 0 9m58s
web-6bcd5cffd7-x67cb 1/1 Terminating 0 9m58s
web-6bcd5cffd7-zh869 1/1 Terminating 0 9m58s[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5dc777c866-f8cfv 1/1 Running 0 78s
web-5dc777c866-gqp4j 1/1 Running 0 78s
web-5dc777c866-hvvwm 1/1 Running 0 79s
web-5dc777c866-nssgb 1/1 Running 0 79s
web-5dc777c866-vxrzz 1/1 Running 0 79s
水平扩容(启动多实列,提高并发)
修改yaml里replicas值,在apply
kubectl scale deployment web --replicas=10
[root@master manifest]# cat test2.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: webnamespace: default
spec:replicas: 10strategy:rollingUpdate:maxSurge: 60%maxUnavailable: 50%type: RollingUpdateselector:matchLabels: app: apachetemplate:metadata:labels: app: apachespec:containers:- image: sktystwd/apache:v0.1imagePullPolicy: IfNotPresentname: httpd[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5dc777c866-7cztl 0/1 Terminating 0 4s
web-5dc777c866-8zn7q 0/1 Terminating 0 4s
web-5dc777c866-fg49j 1/1 Running 0 2m48s
web-5dc777c866-k98nr 0/1 ContainerCreating 0 4s
web-5dc777c866-l5j72 1/1 Running 0 2m48s
web-5dc777c866-l6kcf 0/1 Terminating 0 4s
web-5dc777c866-qr9dl 0/1 ContainerCreating 0 4s
web-5dc777c866-x79lc 1/1 Running 0 2m47s
web-6bcd5cffd7-4cmpp 0/1 ContainerCreating 0 4s
web-6bcd5cffd7-697fx 0/1 Pending 0 4s
web-6bcd5cffd7-hc4h6 0/1 ContainerCreating 0 4s
web-6bcd5cffd7-hl7w7 0/1 Pending 0 4s
web-6bcd5cffd7-j8ks6 0/1 ContainerCreating 0 4s
web-6bcd5cffd7-msnq8 0/1 ContainerCreating 0 4s
web-6bcd5cffd7-v7k2t 0/1 ContainerCreating 0 4s
web-6bcd5cffd7-znvxs 0/1 Pending 0 4s
web-6bcd5cffd7-zvssw 0/1 ContainerCreating 0 4s
web-6bcd5cffd7-zwv86 0/1 Pending 0 4s[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-6bcd5cffd7-4cmpp 1/1 Running 0 53s
web-6bcd5cffd7-697fx 1/1 Running 0 53s
web-6bcd5cffd7-hc4h6 1/1 Running 0 53s
web-6bcd5cffd7-hl7w7 1/1 Running 0 53s
web-6bcd5cffd7-j8ks6 1/1 Running 0 53s
web-6bcd5cffd7-msnq8 1/1 Running 0 53s
web-6bcd5cffd7-v7k2t 1/1 Running 0 53s
web-6bcd5cffd7-znvxs 1/1 Running 0 53s
web-6bcd5cffd7-zvssw 1/1 Running 0 53s
web-6bcd5cffd7-zwv86 1/1 Running 0 53s
回滚(发布失败回复正常版本)
查看历史发布版本
[root@master ~]# kubectl rollout history deployment/web
deployment.apps/web
REVISION CHANGE-CAUSE
9 <none>
10 <none>
回滚到上一个版本(当前位置时12)
[root@master ~]# kubectl rollout undo deployment/web
deployment.apps/web rolled back[root@master ~]# kubectl rollout history deployment/web
deployment.apps/web
REVISION CHANGE-CAUSE
10 <none>
11 <none>
回滚到指定版本
[root@master ~]# kubectl rollout history deployment/web
deployment.apps/web
REVISION CHANGE-CAUSE
10 <none>
11 <none> (当前12)[root@master ~]# kubectl rollout undo deployment/web --to-revision=10
deployment.apps/web rolled back
[root@master ~]# kubectl rollout history deployment/web
deployment.apps/web
REVISION CHANGE-CAUSE
11 <none>
12 <none> (当前13)
revisionHistoryLimit RS历史版本保存数量
[root@master manifest]# cat test2.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: webnamespace: default
spec:replicas: 3revisionHistoryLimit: 10strategy:rollingUpdate:maxSurge: 51%maxUnavailable: 50%type: RollingUpdateselector:matchLabels: app: apachetemplate:metadata:labels: app: apachespec:containers:- image: sktystwd/apache:v0.2 #可以多换几个镜像imagePullPolicy: IfNotPresentname: httpd
只有使用2个以上的镜像才会显现出来
[root@master ~]# kubectl rollout history deployment/web
deployment.apps/web
REVISION CHANGE-CAUSE
11 <none>
12 <none>
13 <none>
14 <none>
ReplicaSet控制器用途
pod 副本数量管理,不断对比当前pod数量与期望pod数量
deployment每次发布都会创建一个RS作为记录,用于实现回滚
查看rs记录
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-5dc777c866 0 0 0 86m
web-5ff867458d 2 2 2 5m55s
web-6bcd5cffd7 0 0 0 96m
web-77588656d8 3 3 0 5m21s
DaemonSet功能:
在每一个node上运行一个pod
新加入的node也同样自动运行一个pod
[root@master manifest]# cat daemon.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: filebeat namespace: kube-system
spec:selector:matchLabels: name: filebeat template:metadata:labels: app: filebeatspec:containers:- image: elastic/filebeat:7.16.2imagePullPolicy: IfNotPresentname: log
job普通任务(job)和定时任务(CronJob)
job使用
[root@master ~]# kubectl explain job
....
[root@master manifest]# cat job.yaml
---
apiVersion: batch/v1
kind: Job
metadata:name: pi
spec:template:spec:containers:- name: piimage: perlcommand: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]restartPolicy: NeverbackoffLimit: 4 #(重试次数)
在容器里运行那条命令为一次性任务(job)做完结束。
定时任务(CronJob)像linux里的crontab一样
定时任务
应用场景:停止备份
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:name: test
spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:containers:- name: testimage: busyboxargs:- /bin/sh- "-c"- "date;echo hello tom"imagePullPolicy: IfNotPresentrestartPolicy: OnFailure[root@master manifest]# kubectl create -f cronjob.yaml
cronjob.batch/test created[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test-1640362140-x9hq7 0/1 Completed 0 20s
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test-1640362140-x9hq7 0/1 Completed 0 2m38s
test-1640362200-5v657 0/1 Completed 0 98s
test-1640362260-4rn5x 0/1 Completed 0 38s