第7章:深入理解常用控制器
-
controllers:在集群上管理和运行容器的对象。有时也称为工作负载(workload)
-
通过label-selector相关联,如下图所示。
-
Pod通过控制器实现应用的运维,如伸缩,滚动升级等
7.2 无状态应用部署控制器 Deployment
Deployment功能:
-
部署无状态应用(无状态应用简单来讲,就是Pod可以漂移任意节点,而不用考虑数据和IP变化)
-
管理Pod和ReplicaSet(副本数量管理控制器)
-
具有上线部署、副本设定、滚动升级、回滚等功能
-
提供声明式更新,例如只更新一个新的Image
应用场景:Web服务,微服务
下图是Deployment 标准YAML,通过标签与Pod关联。
使用YAML部署一个java应用:
# kubectl create deployment web --image=lizhenliang/java-demo -o yaml --dry-run > web-deploy.yaml
apiVersion: apps/v1 kind: Deployment metadata: labels: app: web name: web namespace: default spec: replicas: 3 # 设置3个副本 selector: matchLabels: app: web # deployment控制器关联pod的标签,与下面pod的标签名称相同,否则deployment控制器无法管理pod template: # pod模板 metadata: labels: app: web # pod的标签名称 spec: containers: - image: lizhenliang/java-demo name: java-demo
# kubectl apply -f web-deploy.yaml
将这个java应用暴露到集群外部访问:
# kubectl expose deployment/web --port=80 --target-port=8080 --name web --type=NodePort -o yaml --dry-run > web-expose.yaml
apiVersion: v1 kind: Service metadata: labels: app: web name: web namespace: default spec: ports: - port: 80 # 集群内容访问应用端口 protocol: TCP targetPort: 8080 # 容器镜像端口 nodePort: 30008 # 对外暴露的端口 selector: app: web # 该标签名称必须与deployment控制器中关联pod的标签名称相同,否则无法连暴露pod type: NodePort
# kubectl apply -f web-expose.yaml
查看资源:
# kubectl get deploy,pods,svc,ep -o wide -n default
浏览器输入:http://NodeIP:30008 即可访问到该应用。
1 升级项目,即更新最新镜像版本,这里换一个nginx镜像为例
kubectl set image deployment/web java-demo=tomcat --record
# 查看升级状态
# kubectl rollout status deployment/web
Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
deployment "web" successfully rolled out
2 如果该版本发布失败想回滚到上一个版本可以执行
# 回滚最新版本
kubectl rollout undo deployment/web
# 也可以回滚到指定发布记录
# 查看发布记录
kubectl rollout history deployment/web
# 回滚指定版本
kubectl rollout undo deployment/web --to-revision=1
kubectl rollout status deployment/web
3 扩容/缩容
# 将pod扩容到5个
kubectl scale deployment web --replicas=5
# --replicas 设置比现在值大就是扩容,反之就是缩容。
kubectl rollout status deployment/web
4 查看扩容后的状态
# kubectl get rs,deploy
NAME DESIRED CURRENT READY AGE
replicaset.apps/web-787b446885 0 0 0 22m
replicaset.apps/web-7c65cbbdfd 0 0 0 26m
replicaset.apps/web-844f79f54c 5 5 5 40m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/web 5/5 5 5 40m
kubectl set image 会触发滚动更新,即分批升级Pod。
滚动更新原理其实很简单,利用新旧两个replicaset,例如副本是3个,首先Scale Up增加新RS副本数量为1,准备就绪后,Scale Down减少旧RS副本数量为2,以此类推,逐渐替代,最终旧RS副本数量为0,新RS副本数量为3,完成本次更新。这个过程可通过 kubectl describe deployment web 看到。
7.3 守护进程控制器 DaemonSet
DaemonSet功能:
-
在每一个Node上运行一个Pod
-
新加入的Node也同样会自动运行一个Pod
应用场景:Agent,例如监控采集工具,日志采集工具
# cat daemonset-busybox.yamlapiVersion: apps/v1 kind: DaemonSet metadata: labels: app: busybox name: busybox namespace: default spec: selector: matchLabels: app: busybox template: metadata: labels: app: busybox spec: containers: - image: busybox name: busybox
7.4 批处理 Job & CronJob
Job:一次性执行
应用场景:离线数据处理,视频解码等业务
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 # 作业失败后会不再尝试创建新的Pod backoffLimit: 4 # .spec.backoffLimit字段限制重试次数。默认情况下,这个字段默认值是6。
上述示例中将π计算到2000个位置并将其打印出来。完成大约需要10秒。
查看任务:
# kubectl get job,pod -o wide
CronJob:定时任务,像Linux的Crontab一样。
应用场景:通知,备份
apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure # 作业失败并返回状态码非0时,尝试创建新的Pod运行任务
上述示例中将每分钟打印一次Hello。
查看任务:
# kubectl get cronjob,pod -o wide