一.工作控制器是什么
工作控制器(Workload Controller)是k8s的一个抽象概念,用于更高层次对象,部署和管理pod
常用工作负载控制器:
- Deployment:无状态应用部署
- StatefulSet:有状态应用部署
- DaemonSet:确保所有Node运行同一个pod
- Job:一次性任务
- Cronjob:定时任务
控制器的作用:
- 管理pod对象
- 使用标签与pod关联
- 控制器实现了pod的运维:例如滚动更新、伸缩、副本管理、维护pod状态
二、Deployment
功能:
管理pod和ReplicaSet
具有线上部署、副本设定、滚动升级、回滚等功能
提供声明式更新,例如更新一个新的image
应用场景:
网站 api 微服务
PS:
Deployment并不直接操纵Pod,而是操纵Replicaset对象
ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。
kubectl get rs -o yaml 可以看到对应的replicaset对象的yaml
1.部署(根据事先定义好的yaml)
apiVersion: apps/v1 kind: Deployment # 控制器类型 metadata: name: web namespace: default spec: replicas: 3 selector: matchLabels: app: nginx # 与pod的标签一一致 template: metadata: labels: app: nginx spec: containers: - name: web image: nginx:1.15 #####此处可以定义各种调度策略#############
通过expose暴露出去,让外部访问
kubectl expose deployment web --port=8080 --target-port=80 --type=NodePort
2.滚动升级
• kubectl apply -f xxx.yaml # 修改yaml文件里的镜像版本 • kubectl set image deployment/web nginx=nginx:1.16 --record # set image 指定对应镜像的版本 container_name=镜像版本 deployment/deployment-name • kubectl edit deployment/web #通过edit命令进行修改image版本
滚动更新策略: spec: replicas: 3 revisionHistoryLimit: 10 # RS历史版本保存数量 selector: matchLabels: app: nginx strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate
########
maxSurge:滚动更新过程中最大的pod副本数,确保在更新时启动的pod数量比期望(replicas)pod数量最大多出25%
maxUnavailable:滚动更新过程中最大的不可用pod副本数。确保在更新时最大25%pod数量不可用,即75的pod数量是可用状态
3.水平扩缩容
水平扩缩容(启动多实例,提高并发) • 修改yaml里replicas值,再apply • kubectl scale deployment web --replicas=10
###replicas控制副本数量,总共副本数量,不是在当前基础上+或者-
4.回滚
回滚(发布失败恢复正常版本) kubectl rollout history deployment/web # 查看历史发布版本 kubectl rollout undo deployment/web # 回滚上一个版本 kubectl rollout undo deployment/web --to-revision=2 # 回滚历史指定版本 注:回滚是重新部署某一次部署时的状态,即当时版本所有配置
###实际生产中,原生的回滚功能用的不多,回滚的版本一般都是研发来定的
4.下线
kubectl delete svc web # 删除
kubectl delete -f nginx-deployment.yaml #删除控制器下线
##### replicaSet
三.DaemonSet
DaemoSet的功能:
- 在没一个node上运行一个pod
- 新加入的node也同样自动运行一个pod
应用场景: 网络插件(kube-proxy、calico)、其他agent(监控、日志采集等)
支持滚动升级
[root@k8s-master yaml]# kubectl get daemonset -n kube-system filebeat -o yaml |grep Roll
type: RollingUpdate
示例:在mater上及每个节点上部署一个日志采集程序
apiVersion: apps/v1 kind: DaemonSet metadata: name: filebeat namespace: kube-system spec: selector: matchLabels: name: filebeat template: metadata: labels: name: filebeat spec: tolerations: # 配置master污点容忍 - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: log image: elastic/filebeat:7.3.2
四.Job
Job的功能:
一次性执行
应用场景:
离线数据处理 视频解码任务
示例:perl打印圆周率
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 # 重试次数
[root@k8s-master yaml]# kubectl get pod NAME READY STATUS RESTARTS AGE pi-dkm26 0/1 Completed 0 25m
# 执行完后正常退出,status是Completed
五.CronJob
CronJob用于实现定时任务,和Linux的crontab一样
应用场景:一些定时操作(备份、通知等)
示例:
apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" # 和Linux的crontab格式一样 jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date restartPolicy: OnFailure