常用工作控制器

 一.工作控制器是什么

工作控制器(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
posted @ 2020-11-27 11:42  碎梦重拾  阅读(241)  评论(0编辑  收藏  举报