美文网首页K8s微服务
K8S-[二]Deployment控制器

K8S-[二]Deployment控制器

作者: 阿当运维 | 来源:发表于2021-06-15 15:58 被阅读0次

    工作负载控制器(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
    

    输入http://NodeIP:32149访问

    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
      1. 命令: 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
    

    相关文章

      网友评论

        本文标题:K8S-[二]Deployment控制器

        本文链接:https://www.haomeiwen.com/subject/ywdveltx.html