K8S-[二]Deployment控制器
工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
常用工作负载控制器:
• Deployment : 无状态应用部署
• StatefulSet : 有状态应用部署
• DaemonSet : 确保所有Node运行同一个Pod
• Job : 一次性任务
• Cronjob : 定时任务
控制器的作用:
• 管理Pod对象
• 使用标签与Pod关联
• 控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等。
image.png
Deployment控制器
功能:
• 管理Pod和ReplicaSet(副本数量设定)
• 具有上线部署、副本设定、滚动升级、回滚等功能
• 提供声明式更新,例如只更新一个新的Image
应用场景:网站、API、微服务
image.png一. 部署
第一次写deploy的yaml可以用命令导出的方式获取模板,在进行删减。
kubectl create deployment web --image=nginx:1.15 -o yaml > deploy.yaml
最终版deployment的yaml:
deploy就是管理Pod的,所以关于对Pod管理的配置都可以放在这个配置文件,如资源配额(resource),污点容忍(tolrations),健康检查(linvenessProbe)等
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy #deployment控制器名,也是以后创建完Pod,pod名字的前缀
namespace: default
spec:
replicas: 2 #期望创建pod副本的数量
selector:
matchLabels:
app: nginx-pod #定义 pod 的标签,app=nginx-pod
template:
metadata:
labels:
app: nginx-pod #定义 pod 的标签,app=nginx-pod 要和selector的标签一致
spec:
#这块区域下是pod具体配置,可以配置调度策略等等。
containers:
- image: nginx:1.15
name: mynginx
resources: {}
部署:
kubectl apply -f deploy.yaml
查看:
image.png
暴露到外部访问:
kubectl expose deployment nginx-deploy --port=85 --target-port=80 --type=NodePort
[root@k8s-master pod_yml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-deploy NodePort 10.103.100.155 <none> 85:32149/TCP 6s
image.png
二.滚动升级
应用的升级其实就是换个镜像,更新镜像的三种方式
• kubectl apply -f xxx.yaml
• kubectl set image deployment/web nginx=nginx:1.16 (这个好处是这样回滚的时候可看到版本记录)
• kubectl edit deployment/web
滚动升级:K8s对Pod升级的默认策略,通过使用新版本Pod逐步更新旧版本Pod,实现零停机发布,用户无感知。
原理: 对Pod的升级,是先启动一个新的pod ,并启动。如果配了健康检查会在健康检查后完全没问题,出现running状态,才删掉一个旧pod。在启动一个新的,在删掉一个旧的。反复下去,这一切也都是deployment控制的。滚动升级在k8s中,也是由1个deployment 和 2个 replicaset 实现的。2个replicaset分别控制 增加新启动Pod副本数量;减少原pod的副本数量。 加一减一的原则。达到用户无感知。
image.png升级:将nginx 1.15 升级到1.18
集群内部访问一下service的集群IP,看下nginx此时版本是1.15
[root@k8s-node2 ~]# curl 10.104.95.173 -I
HTTP/1.1 200 OK
Server: nginx/1.15.12
编辑delpoy.yaml,修改镜像版本为1.18
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- image: nginx:1.18
name: mynginx
resources: {}
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 10 #启动容器后多少秒健康检查
periodSeconds: 10 #以后间隔多少秒检查一次
应用:
kubectl apply -f delpoy.yaml
查看过程:
图中可看到,k8s先启动了2个新pod, 在新pod成功运行后,再删除一个旧的。直到最后成功更新2个Pod。
image.png
[root@k8s-node2 ~]# curl 10.104.95.173 -I
HTTP/1.1 200 OK
Server: nginx/1.18.0
可设置滚动更新策略:
spec:
replicas: 3
revisionHistoryLimit: 10 # RS历史版本保存数量
selector:
matchLabels:
app: web
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
• maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数量比期望(replicas)Pod数量最大多出25%
• maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时最大25% Pod数量不可用,即确保75% Pod数量是可用状态。
回滚到上一版本:
kubectl rollout undo deployment nginx-deploy
三.水平扩容(启动多实例,提高并发)
deployment中replicas参数控制Pod副本数量
image.png
两种方式:
- 1.修改yaml文件中的replicas值,在进行apply
- 命令: kubectl scale deployment 控制器名 --replicas=期望pod副本数
扩容:现在我有两个Pod ,想扩容到5个。
kubectl scale deployment nginx-deploy --replicas=5
image.png
关于ReplicaSet
ReplicaSet控制器用途:
• Pod副本数量管理,不断对比当前Pod数量与期望Pod数量,一直循环这个过程。
• Deployment每次发布都会创建一个RS作为记录,用于实现回滚
所以刚才实现扩容都是ReplicaSet控制器做的。
可以查看ReplicaSet(RS)的信息
kubectl get rs #查看RS记录
kubectl describe rs nginx-deploy-6447c4cd45 #具体rs的信息记录
kubectl rollout history deployment nginx-deploy #版本对应RS记录
四. 下线
项目的下线很简单。删除对应的deploy控制器,svc 即可。
如果是用deploy创建的pod,那么直接删除Pod 是不起作用的,还会被拉起来,反复循环。这都是因为上面说的deployment控制器中的replicaset 一直在循环一个动作 : 对比当前pod数量是否和期望的一样,不一样就拉起。所以不能直接删除pod。
kubectl delete deploy nginx-deploy
kubectl delete svc nginx-deploy
定时任务CronJob
CronJob用于实现定时任务,像Linux的Crontab一样。
• 定时任务
应用场景:通知,备份
cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello-cron
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello word
restartPolicy: OnFailure
每过一分钟会启动这个pod,执行定义的命令
[root@k8s-master pod_yml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-cron-1623743640-v9kd2 0/1 Completed 0 2m32s
hello-cron-1623743700-qp4s8 0/1 Completed 0 92s
hello-cron-1623743760-wbv6k 0/1 Completed 0 32s
[root@k8s-master pod_yml]# kubectl logs hello-cron-1623743760-wbv6k
Tue Jun 15 07:56:18 UTC 2021
Hello word