美文网首页
Pod控制器之Deployment

Pod控制器之Deployment

作者: 会倒立的香飘飘 | 来源:发表于2021-03-04 11:04 被阅读0次

    Pod控制器之Deployment

    简介:
    Deployment 是 Kubernetes v1.2 引入的新概念,引入的目的是为了更好的解决 Pod 的编排问题。为此,Deployment 在内部使用了 Replica Set 来实现目的,无论从 Deployment 的作用与目的、它的 YAML 定义,还是从它的具体命令操作来看,都可以把它看做 RC 的一次升级两者的相似度超过 90%。
    Deplyment 相对于 RC 的嘴个最大升级时可以随时知道当前 Pod “部署” 的进度。实际上由于一个 Pod 的创建、调度、绑定节点以及在目标 Node 上启动对应的容器这一完整过程需要一定的时间,所以期待系统启动 N 个 Pod 副本的目标状态,实际上是一个连续变化的 “部署过程” 导致的最终状态。

    Deployment 的典型使用场景有以下几个。
    创建一个 Deployment 对象来生成对应的 Replica Set 并完成 Pod 副本的创建过程。
    检查 Deployment 的状态来部署动作是否完成(Pod 副本的数量是否达到预期的值)。
    更新 Deployment 以创建新的 Pod(比如镜像升级)。
    如果当前 Deployment 不稳定,则回滚到一个早先的 Deployment 版本。
    暂停 Deployment 以便于下一次性修改多个 PotTemplateSpec 的配置项,之后再回复 Deployment,进行新的发布。
    扩展 Deployment 以应对高负载。
    查看 Deployment 的状态,以此作为发布是否完成的指标。
    清理不在需要的旧版本 ReplicaSets。
    Deployment 的定义与 Replica Set 的定义很类似,除了 API 声明与 Kind 类型等有所区别:

    ReplicaSet:
    
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: nginx-repset
    
    Deployment:
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    

    创建一个Deployment

    vim deploy-daem.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata: 
      name: deploy-myapp
      namespace: default
    spec:
      replicas:2
      selector:
        matchLabels:
          app: myapp
          release: cancay
      template:
        metadata:
          labels:
            app:myapp
            release: cancay
        spec:
          containers:
          - name: myapp
            image: ikubernetes/myapp:v1
            imagePullPolicy: IfNotPresent
            ports:
            - name: http
              containerPort: 80
    

    deploy实现更新应用时可以直接通过编辑配置文件来实现,直接修改配置文件中的replicas的数量然后使用apply创建,apply可以执行多次,create只能创建一次,apply可以把每一次的变化同步到etcd当中或者同步到apiserver当中,apiserver发现它与etcd中不同从而改变etcd从而实现他的期望状态

    image.png

    --record参数可以记录当前版本的Deployment都执行过哪些命令。
    使用patch命令打补定的方式扩容

    [root@k8s-master daem]# kubectl patch deployments.apps deploy-myapp -p '{"spec":{"replicas": 5}}'
    deployment.apps/deploy-myapp patched
    [root@k8s-master daem]# kubectl get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    deploy-myapp-74c58c54f5-4bh62   1/1     Running   0          5m55s
    deploy-myapp-74c58c54f5-dnsx5   1/1     Running   0          5m52s
    deploy-myapp-74c58c54f5-vn6b9   1/1     Running   0          7s
    deploy-myapp-74c58c54f5-wjpwn   1/1     Running   0          5m54s
    deploy-myapp-74c58c54f5-zfk74   1/1     Running   0          7s
    liveness-httpget                1/1     Running   3          2d5h
    poststart-pod                   1/1     Running   7          6h2m
    readiness-httpget-pods          1/1     Running   2          2d4h
    

    使用set image方式更新版本

    使用打补丁的方式修改更新策略
    [root@k8s-master daem]# kubectl patch deployments.apps deploy-myapp -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge": 1,"maxUnavailable":0}}}}'
    deployment.apps/deploy-myapp patched
    
    [root@k8s-master daem]# kubectl set image deploy deploy-myapp myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment deploy-myapp 
    deployment.apps/deploy-myapp image updated
    deployment.apps/deploy-myapp paused
    

    因为使用了pause参数暂停了更新只更新一个,会一直暂停下去,成为金丝雀发布,
    监控观察:


    image.png

    也可以通过kubectl rollout status deployment deploy-myapp监测


    image.png

    等确认好没有问题就继续更新,使用kubectl rollout resume 继续更新

    kubectl rollout resume deployment deploy-myapp
    
    image.png

    使用rollout undo版本回滚:

    undo默认是回滚到上一个版本 如果需要回滚到更早的版本可以使用--to-revision参数在指定回滚的版本号

    [root@k8s-master ~]# kubectl rollout undo deployment deploy-myapp --to-revision=1
    deployment.apps/deploy-myapp rolled back
    

    回滚到第一版
    查看rs已经回滚到第一版了


    image.png

    相关文章

      网友评论

          本文标题:Pod控制器之Deployment

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