常用工作负载控制器
1272字约4分钟
2024-09-29
工作负载控制器是什么
工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
常用工作负载控制器:
- Deployment : 无状态应用部署 
- StatefulSet : 有状态应用部署 
- DaemonSet : 确保所有Node运行同一个Pod 
- Job : 一次性任务 
- Cronjob : 定时任务 
控制器的作用:
- 管理Pod对象 
- 使用标签与Pod关联 
- 控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等。 

Deployment
Deployment:介绍
Deployment的功能:
- 管理Pod和ReplicaSet 
- 具有上线部署、副本设定、滚动升级、回滚等功能 
- 提供声明式更新,例如只更新一个新的Image 应用场景:网站、API、微服务 
Deployment:使用流程

Deployment:部署
第一步:部署镜像
kubectl apply -f xxx.yaml 
kubectl create deployment web --image=nginx:1.15vim web-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
  namespace: default
spec:
  replicas: 3 # Pod副本预期数量
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web # Pod副本的标签
    spec:
      containers:
      - name: web
        image: nginx:1.15发布并访问
kubectl apply -f web-deployment.yaml 
kubectl expose deployment web-deployment --port 80 --target-port=80 --type=NodePort
kubectl get svcDeployment:滚动升级
第二步:应用升级(更新镜像三种方式)
kubectl apply -f xxx.yaml 
kubectl set image deployment/web nginx=nginx:1.16 
kubectl edit deployment/webvim web-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
  namespace: default
spec:
  replicas: 3 # Pod副本预期数量
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web # Pod副本的标签
    spec:
      containers:
      - name: web
        image: nginx:1.17
        livenessProbe:
          httpGet:
            path: /index.html
            port: 80
        readinessProbe:
          httpGet:
            path: /index.html
            port: 80
          initialDelaySeconds: 10   #启动容器后多少秒开始检查
          periodSeconds: 10      #以后间隔多少秒检查一次
滚动升级:K8s对Pod升级的默认策略,通过使 用新版本Pod逐步更新旧版本Pod,实现零停机 发布,用户无感知。
滚动升级在K8s中的实现:
- 1个Deployment 
- 2个ReplicaSet 

- maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数 量比期望(replicas)Pod数量最大多出25% 
- maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时 最大25% Pod数量不可用,即确保75% Pod数量是可用状态。 

Deployment:水平扩缩容
第三步:水平扩缩容(启动多实例,提高并发)
- 修改yaml里replicas值,再apply 
- kubectl scale deployment web --replicas=10 
注:replicas参数控制Pod副本数量

Deployment:回滚
第四步:回滚(发布失败恢复正常版本)
kubectl rollout history deployment/web # 查看历史发布版本 
kubectl rollout undo deployment/web # 默认回滚上一个版本 
kubectl rollout undo deployment/web --to-revision=2 # 回滚历史指定版本注:回滚是重新部署某一次部署时的状态,即当时版本所有配置
kubectl set image deploy web-deployment web=nginx:1.19 --record  #升级
kubectl rollout undo deployment web-deployment --to-revision=7  #回滚到指定版本
kubectl get rs -o wide
kubectl describe rs web-deployment-5449cf89fDeployment:删除
最后,项目下线:
 kubectl delete deploy/web 
 kubectl delete svc/webDeployment:ReplicaSet
ReplicaSet控制器用途:
- Pod副本数量管理,不断对比当前Pod数量与期望Pod数量 
- Deployment每次发布都会创建一个RS作为记录,用于实现回滚 
kubectl get rs #查看RS记录 
kubectl rollout history deployment web #版本对应RS记录
kubectl describe rs |egrep -i "revision|image"  #查看版本对应的镜像
DaemonSet
DaemonSet功能:
- 在每一个Node上运行一个Pod 
- 新加入的Node也同样会自动运行一个Pod 
应用场景:网络插件(kube-proxy、calico)、其他Agent

示例:部署一个日志采集程序
vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet        
metadata:
  name: filebeat
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: filebeat
  template:
    metadata:
      labels:
        name: filebeat
    spec:
      tolerations:               
      - effect: NoSchedule        #配置污点容忍,确保分配到每个节点
        operator: Exists  #没有配置键值形式,节点上只要有NoSchedule策略,只要存在就容忍
      containers:
      - name: log
        image: elastic/filebeat:7.3.2验证查看
kubectl apply -f daemonset.yaml 
kubectl get daemonsets.apps -n kube-system  #查看使用daemonset控制器的pod
kubectl get daemonsets.apps calico-node -o yaml -n kube-system | grep tor 
kubectl get pod -n kube-system -o wide  #确保在每个节点都启动一个日志采集器podJob
Job分为普通任务(Job)和定时任务(CronJob)
- 一次性执行
应用场景:离线数据处理,视频解码等业务
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 # 重试次数查看
kubectl apply -f job.yaml 
kubectl get job
kubectl get pod    #complete状态,需要主动删除pod
kubectl logs pi-z7rrbCronJob
CronJob用于实现定时任务,像Linux的Crontab一样。
- 定时任务 应用场景:通知,备份
vim cronjob.yaml
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; echo Hello azhe
          restartPolicy: OnFailure   #如果执行上面的命令失败返回状态码非0会帮你重启容器查看
kubectl apply -f cronjob.yaml 
kubectl get job
kubectl get cronjob
kubectl logs hello-1613720220-ldb7z


