<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      kubernetes之控制器(一)

      K8S核心組件之控制器

      1 Pod的分類

      自主式Pod:Pod退出后,此類型的Pod不會被創建
      控制器管理的Pod:在控制器的生命周期里,始終要維持Pod的副本數。

      2 什么是控制器?

      Pod控制是用于實現管理Pod的中間層,確保Pod資源符合預期的狀態;Pod的資源出現故障時,會嘗試進行重啟,當根據重啟策略無效時,則會根據Pod模板重新新建Pod資源。

      3 常見的控制器

      - ReplicationController:最早期的Pod控制器,即將被廢棄;
      - RelicaSet:副本集,負責管理一個應用(Pod)的多個副本;
      - Deployment:部署,它不直接管理Pod,而是借助ReplicaSet來管理Pod;是最常用的無狀態應用控制器;
      - DaemonSet:守護進程集,用于確保在每個節點僅運行某個應用的一個Pod副本;
      - StatefulSet:功能類似于Deployment,但StatefulSet專用于編排有狀態的應用;
      - Job:有終止期限的一次性作業式任務,而非一直處于運行狀態的服務進程;
      - CronJob:有終止期限的周期性作業式任務。

       3.1 RelicaSet

      3.1.1 RelicaSet概述

      ReplicaSet(簡稱RS)是Pod控制器類型的一種實現,用于確保由其管控的Pod對象副本數在任一時刻都能精確滿足期望的數量。ReplicaSet控制器資源啟動后會查找集群中匹配其標簽選擇的Pod資源對象,當前活動對象的數量與期望的數量不吻合時,多則刪除,少則通過Pod模板創建以補足。

      ReplicaSet的副本數量、標簽選擇器甚至是Pod模板都可以隨時按需進行修改,不過僅改動期望的副本數量會對現存的Pod副本產生直接影響。修改標簽選擇器可能會使得現有的Pod副本的標簽變得不在匹配,此時ReplicaSet控制器要做的不過是不再計入它們而已。另外,在創建完成后,RelicaSet也不會再關注Pod對象中點實際內容,因此Pod模板的改動也只會對后來新建的Pod副本產生影響。

      ReplicaSet能夠實現以下功能:

      - 確保Pod資源對象的數量精確反映期望值:ReplicaSet需要確保由其控制運行的Pod副本數量精確溫和配置中定義的期望值,否則就會自動補足所缺或終止所余。
      - 確保Pod健康運行:探測到由其管理的Pod對象因其所在的工作節點故障而不可用時,自動請求由調度器于其他工作節點創建缺失的Pod副本。
      - 彈性伸縮:業務規模因各種原因時長存在明顯波動,在波峰或波谷期間,可以通過ReplicaSet控制器動態調整相關Pod資源對象的數量。此外,在必要時還可以通過HPA(HroizontalPodAutoscaler)控制器實現Pod資源規模的自動伸縮。

      雖然ReplicaSet可以獨立使用,但一般還是建議DeployMent來自動管理ReplicaSet,這樣就無需擔心跟其他機制的不兼容問題(比如ReplicaSet不支持rolling-update但DeployMent支持)。

      定義要素:

      - 標簽選擇器
      - 期望的副本數
      - Pod模板

      ReplicaSet的更新機制:

      ? 刪除式更新:

      ? 1.單批次刪除所有Pod,一次完成所有更新;服務會中斷一段時間;

      ? 2.分批次刪除,待一批次就緒之后,才刪除下一批;滾動更新(灰度發布)

      ? set image:更新應用版本,但對于replicaset來說,僅能更新API server中的定義;

      部署類型:

      ? 藍綠部署:優點是便于回滾;缺點是因為新舊版本同時存在,比較占用資源。

      ? 滾動發布:優點是節省資源

      3.1.2 創建ReplicaSet

      **定義格式:**
      apiVersion: apps/v1
      kind: ReplicaSet
      metadata:
      name:
      namespace:
      spec:
      minReadySeconds <integer> # Pod就緒后多少秒內,Pod任一容器無crash方可視為“就緒”
      replicas <integer> # 期望的Pod副本數,默認為1
      selector: # 標簽選擇器,必須匹配template字段中Pod模板中的標簽;
      matchExpressions <[]Object> # 標簽選擇器表達式列表,多個列表項之間為“與”關系
      matchLabels <map[string]string> # map格式的標簽選擇器
      template: # Pod模板對象
      metadata: # Pod對象元數據
      labels: # 由模板創建出的Pod對象所擁有的標簽,必須要能夠匹配前面定義的標簽選擇器
      spec: # Pod規范,格式同自主式Pod
      范例1:
      #編輯資源清單
      [root@ubuntu-200 ~]# cat replicaset-demo.yaml
      apiVersion: apps/v1
      kind: ReplicaSet
      metadata:
      name: replicaset-demo
      spec:
      minReadySeconds: 3
      replicas: 3
      selector:
      matchLabels:
      app: demoapp
      release: stable
      version: v1.0
      template:
      metadata:
      labels:
      app: demoapp
      release: stable
      version: v1.0
      spec:
      containers:
      - name: demoapp
      image: ikubernetes/demoapp:v1.0
      ports:
      - name: http
      containerPort: 80
      
      #查看
      [root@ubuntu-200 ~]# kubectl get rs
      NAME DESIRED CURRENT READY AGE
      replicaset-demo 3 3 3 140m
      
      #詳細查看
      [root@ubuntu-200 ~]# kubectl describe replicasets replicaset-demo
      Name: replicaset-demo
      Namespace: default
      Selector: app=demoapp,release=stable,version=v1.0
      Labels: <none>
      Annotations: <none>
      Replicas: 3 current / 3 desired
      Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
      Pod Template:
      Labels: app=demoapp
      release=stable
      version=v1.0
      Containers:
      demoapp:
      Image: ikubernetes/demoapp:v1.0
      Port: 80/TCP
      Host Port: 0/TCP
      Environment: <none>
      Mounts: <none>
      Volumes: <none>
      Events: <none>
      [root@ubuntu-200 ~]# kubectl get replicaset -o wide
      NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
      replicaset-demo 3 3 3 3h3m demoapp ikubernetes/demoapp:v1.0 app=demoapp,release=stable,version=v1.0
      
      #replicaSet升級,使用kubectl set命令
      [root@ubuntu-200 ~]# kubectl set --help
      Configure application resources
      
      These commands help you make changes to existing application resources.
      
      Available Commands:
      env Update environment variables on a pod template
      image Update image of a pod template
      resources Update resource requests/limits on objects with pod templates
      selector Set the selector on a resource
      serviceaccount Update ServiceAccount of a resource
      subject Update User, Group or ServiceAccount in a
      RoleBinding/ClusterRoleBinding
      
      Usage:
      kubectl set SUBCOMMAND [options]
      
      Use "kubectl <command> --help" for more information about a given command.
      Use "kubectl options" for a list of global command-line options (applies to all
      commands).
      
      [root@ubuntu-200 ~]# kubectl set image --help
      Update existing container image(s) of resources.
      
      Possible resources include (case insensitive):
      
      pod (po), replicationcontroller (rc), deployment (deploy), daemonset (ds),
      replicaset (rs)
      
      Examples:
      # Set a deployment's nginx container image to 'nginx:1.9.1', and its busybox
      container image to 'busybox'.
      kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
      
      # Update all deployments' and rc's nginx container's image to 'nginx:1.9.1'
      kubectl set image deployments,rc nginx=nginx:1.9.1 --all
      
      # Update image of all containers of daemonset abc to 'nginx:1.9.1'
      kubectl set image daemonset abc *=nginx:1.9.1
      
      # Print result (in yaml format) of updating nginx container image from local
      file, without hitting the server
      kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml
      
      Options:
      --all=false: Select all resources, including uninitialized ones, in the
      namespace of the specified resource types
      --allow-missing-template-keys=true: If true, ignore any errors in
      templates when a field or map key is missing in the template. Only applies to
      golang and jsonpath output formats.
      --dry-run='none': Must be "none", "server", or "client". If client
      strategy, only print the object that would be sent, without sending it. If
      server strategy, submit server-side request without persisting the resource.
      --field-manager='kubectl-set': Name of the manager used to track field
      ownership.
      -f, --filename=[]: Filename, directory, or URL to files identifying the
      resource to get from a server.
      -k, --kustomize='': Process the kustomization directory. This flag can't be
      used together with -f or -R.
      --local=false: If true, set image will NOT contact api-server but run
      locally.
      -o, --output='': Output format. One of:
      json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file.
      --record=false: Record current kubectl command in the resource annotation.
      If set to false, do not record the command. If set to true, record the command.
      If not set, default to updating the existing annotation value only if one
      already exists.
      -R, --recursive=false: Process the directory used in -f, --filename
      recursively. Useful when you want to manage related manifests organized within
      the same directory.
      -l, --selector='': Selector (label query) to filter on, not including
      uninitialized ones, supports '=', '==', and '!='.(e.g. -l
      key1=value1,key2=value2)
      --template='': Template string or path to template file to use when
      -o=go-template, -o=go-template-file. The template format is golang templates
      [http://golang.org/pkg/text/template/#pkg-overview].
      
      Usage:
      kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1
      ... CONTAINER_NAME_N=CONTAINER_IMAGE_N [options]
      
      Use "kubectl options" for a list of global command-line options (applies to all
      commands).
      
      #修改鏡像版本
      [root@ubuntu-200 ~]# kubectl set image replicasets/replicaset-demo demoapp=ikubernetes/demoapp:v1.1
      replicaset.apps/replicaset-demo image updated
      
      #再次查看詳細信息,可看到鏡像版本已更新為1.1
      [root@ubuntu-200 ~]# kubectl get replicaset -o wide
      NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
      replicaset-demo 3 3 3 3h7m demoapp ikubernetes/demoapp:v1.1 app=demoapp,release=stable,version=v1.0
      
      #訪問測試
      [root@ubuntu-200 ~]# curl 10.244.1.98
      iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: replicaset-demo-4dgjd, ServerIP: 10.244.1.98!
      
      #replicaset默認不會自動更新,而是刪除更新,意思就是原有Pod已創建的情況下,需刪除原有的Pod后,才會發生更新,且使用新版本
      #刪除Pod
      [root@ubuntu-200 ~]# kubectl delete pods replicaset-demo-4dgjd
      pod "replicaset-demo-4dgjd" deleted
      #再次查看,原有pod已刪除,新建了一個Pod
      [root@ubuntu-200 ~]# kubectl get pods -l app=demoapp -o wide
      NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
      downwardapi-01 1/1 Running 0 9h 10.244.5.147 c8-48 <none> <none>
      replicaset-demo-8t7b5 1/1 Running 0 3h14m 10.244.2.109 ubuntu-210 <none> <none>
      replicaset-demo-9996s 1/1 Running 0 3h14m 10.244.5.151 c8-48 <none> <none>
      replicaset-demo-sx7ck 1/1 Running 0 88s 10.244.1.99 ubuntu-220 <none> <none>
      
      #對新建的Pod進行測試訪問,可以發現鏡像版本已更新為1.1
      [root@ubuntu-200 ~]# curl 10.244.1.99
      iKubernetes demoapp v1.1 !! ClientIP: 10.244.0.0, ServerName: replicaset-demo-sx7ck, ServerIP: 10.244.1.99!
      范例2:
      #創建一個Service,和之前的ReplicaSet關聯起來
      [root@ubuntu-200 ~]# cat service-for-replicaset.yaml
      apiVersion: v1
      kind: Service
      metadata:
      name: demoapp
      namespace: default
      spec:
      type: ClusterIP
      clusterIP: 10.97.26.1
      selector:
      app: demoapp #匹配的標簽要和replicaset中一致,但別加版本,以便新舊版本同時存在
      release: stable
      ports:
      - name: http
      port: 80
      protocol: TCP
      targetPort: 80
      #創建service
      [root@ubuntu-200 ~]# kubectl apply -f service-for-replicaset.yaml
      service/demoapp created
      #查看service是否已匹配到Pod
      [root@ubuntu-200 ~]# kubectl get svc
      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
      demoapp ClusterIP 10.97.26.1 <none> 80/TCP 9s
      kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d
      mysql-service NodePort 10.96.27.252 <none> 8080:30080/TCP 6d
      nginx-service NodePort 10.96.57.111 <none> 81:30016/TCP 3d23h
      [root@ubuntu-200 ~]# kubectl describe svc demoapp
      Name: demoapp
      Namespace: default
      Labels: <none>
      Annotations: <none>
      Selector: app=demoapp,release=stable
      Type: ClusterIP
      IP: 10.97.26.1
      Port: http 80/TCP
      TargetPort: 80/TCP
      Endpoints: 10.244.1.99:80,10.244.2.109:80,10.244.5.151:80 #可看到已匹配到Pod
      Session Affinity: None
      Events: <none>
      范例3: 藍綠部署
      #編寫Service的資源清單(變量版)
      [root@ubuntu-200 /data/replicaset]# cat service-blue-green.yaml
      apiVersion: v1
      kind: Service
      metadata:
      name: demoapp-svc
      namespace: default
      spec:
      type: ClusterIP
      selector:
      app: demoapp
      ctr: rs-${DEPLOY}
      version: ${VERSION}
      ports:
      - name: http
      port: 80
      protocol: TCP
      targetPort: 80
      
      #編寫ReplicaSet資源清單(變量版)
      [root@ubuntu-200 /data/replicaset]# cat replicaset-blue-green.yaml
      apiVersion: apps/v1
      kind: ReplicaSet
      name: rs-${DEPLOY}
      spec:
      minReadySeconds: 3
      replicas: 2
      selector:
      matchLabels:
      app: demoapp
      ctr: rs-${DEPLOY}
      version: ${VERSION}
      template:
      metadata:
      labels:
      app: demoapp
      ctr: rs-${DEPLOY}
      version: ${VERSION}
      spec:
      containers:
      - name: demoapp
      image: ikubernetes/demoapp:${VERSION}
      ports:
      - name: http
      containerPort: 80
      
      #利用envsubst進行變量替換
      [root@ubuntu-200 /data/replicaset]# DEPLOY=blue VERSION=v1.0 envsubst < replicaset-blue-green.yaml
      apiVersion: apps/v1
      kind: ReplicaSet
      name: rs-blue
      spec:
      minReadySeconds: 3
      replicas: 2
      selector:
      matchLabels:
      app: demoapp
      ctr: rs-blue
      version: v1.0
      template:
      metadata:
      labels:
      app: demoapp
      ctr: rs-blue
      version: v1.0
      spec:
      containers:
      - name: demoapp
      image: ikubernetes/demoapp:v1.0
      ports:
      - name: http
      containerPort: 80
      
      #變量替換后使用管道傳給kubectl命令創建ReplicaSet
      [root@ubuntu-200 ~]# DEPLOY=blue VERSION=v1.0 envsubst < /data/replicaset/service-blue-green.yaml | kubectl apply -f -
      
      #查看Pod
      [root@ubuntu-200 ~]# kubectl get pods
      NAME READY STATUS RESTARTS AGE
      rs-blue-wnlp4 1/1 Running 0 6m53s
      rs-blue-x5zzr 1/1 Running 0 6m53s
      
      #創建service
      [root@ubuntu-200 ~]# DEPLOY=blue VERSION=v1.0 envsubst < /data/replicaset/service-blue-green.yaml | kubectl apply -f -
      service/demoapp-svc configured
      #查看Service
      [root@ubuntu-200 ~]# kubectl get svc -o wide
      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
      demoapp-svc ClusterIP 10.109.211.52 <none> 80/TCP 22m app=demoapp,ctr=rs-green,version=v1.1
      
      #訪問測試
      [root@ubuntu-220 ~]# while true;do curl --connect-timeout 1 10.109.211.52;sleep .2;done
      iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: rs-blue-x5zzr, ServerIP: 10.244.2.113!
      iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.1, ServerName: rs-blue-wnlp4, ServerIP: 10.244.1.102!
      ...
      
      #更新版本
      [root@ubuntu-200 /data/replicaset]# DEPLOY=green VERSION=v1.1 envsubst < /data/replicaset/replicaset-blue-green.yaml | kubectl apply -f -
      [root@ubuntu-200 /data/replicaset]# kubectl get pods #可看到更新后的pod已運行起來
      NAME READY STATUS RESTARTS AGE
      rs-blue-5xvvj 1/1 Running 0 4h55m
      rs-blue-pfhl4 1/1 Running 0 4h55m
      rs-green-86l49 1/1 Running 0 6h53m
      rs-green-bbzt4 1/1 Running 0 4h55m
      #訪問測試
      [root@ubuntu-220 ~]# while true;do curl --connect-timeout 1 10.109.211.52;sleep .2;done
      iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: rs-blue-5xvvj, ServerIP: 10.244.3.8!
      iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: rs-blue-pfhl4, ServerIP: 10.244.3.15!
      ....
      
      #更新service
      [root@ubuntu-200 /data/replicaset]# DEPLOY=green VERSION=v1.1 envsubst < /data/replicaset/service-blue-green.yaml | kubectl apply -f -
      service/demoapp-svc configured
      
      #再次訪問測試,可以看到版本以更新
      [root@ubuntu-220 ~]# while true;do curl --connect-timeout 1 10.109.211.52;sleep .2;done
      iKubernetes demoapp v1.1 !! ClientIP: 10.244.1.0, ServerName: rs-green-86l49, ServerIP: 10.244.3.7!
      iKubernetes demoapp v1.1 !! ClientIP: 10.244.1.0, ServerName: rs-green-bbzt4, ServerIP: 10.244.3.21!
      
      #版本回滾,只需修改service即可實現
      [root@ubuntu-200 /data/replicaset]# DEPLOY=blue VERSION=v1.0 envsubst < /data/replicaset/service-blue-green.yaml | kubectl apply -f -
      service/demoapp-svc configured
      
      #測試訪問
      [root@ubuntu-220 ~]# while true;do curl --connect-timeout 1 10.109.211.52;sleep .2;done
      iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: rs-blue-5xvvj, ServerIP: 10.244.3.8!
      iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: rs-blue-pfhl4, ServerIP: 10.244.3.15!

      3.2 Deployment控制器

      Deployment(簡寫為deploy)時Kubernetes控制器的又一種實現,它構建與ReplicaSet控制器之上,可為Pod和ReplicaSet資源提供聲明式更新。相比較而言,Pod和ReplicaSet是較低級別的資源,它們很少被直接使用。

      Deployment控制器的主要職責同樣是為了保證Pod資源的健康運行,其大部分功能均可通過調用ReplicaSet控制器來實現,同時還增了新的特性。

      - 事件和狀態查看:必要時可以查看Deployment對象升級的詳細進度和狀態。
      - 回滾:升級操作完成后發現問題時,支持使用回滾機制將應用返回到前一個或由用戶指定點歷史記錄中的版本上。
      - 版本記錄:對Deployment對象的每一次操作都予以保存,以提供后續可能執行的回滾操作使用。
      - 暫停和啟動:對于每一次升級,都能夠隨時暫停和啟動。
      - 多種自動更新方案:一是Recreate,即重建更新機制,全面停止、刪除舊有的Pod后用新版本替代;另一個是RollingUpdate,即滾動升級機制,逐步替換舊有的Pod至新的版本。

      3.2.1 創建Deployment

      Deployment是標準的KubernetesAPI資源,它構建與ReplicaSet資源之上,于是其spec字段中嵌套使用的字段包含了ReplicaSet控制器支持的replicas、selector、template和minReadySeconds,它也正是利用這些信息完成了其二次資源ReplicaSet對象的創建。

      Deployment的配置規范:
      apiVersion: apps/v1 # API群組及版本
      kind: Deployment # 資源類型特有標識
      metadata:
      name <string> # 資源名稱,在作用域中要唯一
      namespace <string> # 名稱空間;Deployment隸屬名稱空間級別
      spec:
      minReadySeconds <integer> # Pod就緒后多少秒內任一容器無crash方可視為“就緒”
      replicas <integer> # 期望的Pod副本數,默認為1
      selector <object> # 標簽選擇器,必須匹配template字段中Pod模板中的標簽
      template <object> # Pod模板對象
      
      revisionHistoryLimit <integer> # 滾動更新歷史記錄數量,默認為10
      strategy <Object> # 滾動更新策略
      type <string> # 滾動更新類型,可用值有Recreate和RollingUpdate;
      rollingUpdate <Object> # 滾動更新參數,專用于RollingUpdate類型
      maxSurge <string> # 更新期間可比期望的Pod數量多出的數量或比例;
      maxUnavailable <string> # 更新期間可比期望的Pod數量缺少的數量或比例,10,
      progressDeadlineSeconds <integer> # 滾動更新故障超時時長,默認為600秒
      paused <boolean> # 是否暫停部署過程
      范例:
      #編寫資源清單文件
      [root@ubuntu-200 /data/deployment]# cat deployment-01.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: deployment-myapp
      spec:
      replicas: 3
      selector:
      matchLabels:
      app: myapp
      template:
      metadata:
      labels:
      app: myapp
      spec:
      containers:
      - name: myapp
      image: ikubernetes/myapp:v1
      ports:
      - containerPort: 80
      name: http
      #創建Deployment
      [root@ubuntu-200 /data/deployment]# kubectl apply -f deployment-01.yaml
      deployment.apps/deployment-myapp created
      
      #查看Deployment,UP-TO-DATE表示已經達到期望狀態的Pod副本數量
      [root@ubuntu-200 ~]# kubectl get deployments.apps
      NAME READY UP-TO-DATE AVAILABLE AGE
      deployment-myapp 3/3 3 3 10m
      
      #Deployment控制器會自動創建相關的ReplicaSet控制器資源,并以"[DEPLOYMENT-NAME]-[POD-TEMPLATE-HASH-VALUE]"格式為其命名,其中的hash值由Deployment控制器自動生成.
      [root@ubuntu-200 ~]# kubectl get replicasets.apps
      NAME DESIRED CURRENT READY AGE
      deployment-myapp-7ffb5fd5ff 3 3 3 17m
      
      #查看Deployment運行起來的Pod,Pod對象的名稱遵循ReplicaSet控制器的命名格式,它以ReplicaSet控制器的名稱為前綴,后跟5位隨機字符:
      [root@ubuntu-200 ~]# kubectl get pods
      NAME READY STATUS RESTARTS AGE
      deployment-myapp-7ffb5fd5ff-2wqwt 1/1 Running 0 10m
      deployment-myapp-7ffb5fd5ff-8g64d 1/1 Running 0 10m
      deployment-myapp-7ffb5fd5ff-tp7jv 1/1 Running 0 10m
      
      #查看Deployment的詳細信息
      [root@ubuntu-200 ~]# kubectl describe deployments.apps deployment-myapp
      Name: deployment-myapp
      Namespace: default
      CreationTimestamp: Tue, 15 Dec 2020 01:49:34 +0000
      Labels: <none>
      Annotations: deployment.kubernetes.io/revision: 1
      Selector: app=myapp
      Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
      StrategyType: RollingUpdate #更新策略
      MinReadySeconds: 0
      RollingUpdateStrategy: 25% max unavailable, 25% max surge
      Pod Template:
      Labels: app=myapp
      Containers:
      myapp:
      Image: ikubernetes/myapp:v1
      Port: 80/TCP
      Host Port: 0/TCP
      Environment: <none>
      Mounts: <none>
      Volumes: <none>
      Conditions:
      Type Status Reason
      ---- ------ ------
      Available True MinimumReplicasAvailable
      Progressing True NewReplicaSetAvailable
      OldReplicaSets: <none>
      NewReplicaSet: deployment-myapp-7ffb5fd5ff (3/3 replicas created)
      Events:
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal ScalingReplicaSet 23m deployment-controller Scaled up replica set deployment-myapp-7ffb5fd5ff to 3

       

      3.2.2 Deployment的更新策略

      Deployment控制器支持兩種更新策略:

      - 滾動更新(rolling update),默認更新策略:它在刪除一部分就版本Pod資源的同時,補充創建一部分新版本的Pod對象進行應用升級,其優勢是在升級期間,容器中應用提供的服務不會中斷,但要求應用程序能夠應對新舊版本同時工作的情形,例如新版本兼容同一個數據庫方案等。不過,更新操作期間,不同客戶端的得到的響應內容可能會來自不同版本的應用。
      - 重新創建(recreate):類似于ReplicaSet的第一站更新方式,即首先刪除現有的Pod對象,而后由控制器基于新模板創建出新版本資源對象。通常,只應該在應用新舊版本不兼容的情況下,才是會使用此更新策略。

      Deployment控制器的滾動更新操作并非在同一個ReplicaSet控制器對象下刪除并創建Pod資源,而是將它們分置于兩個不同的控制器之下:就控制器的pod對象數量不斷減少的同時,新控制器的Pod對象數量不斷增加,直到舊控制器不在擁有Pod對象,而新控制器的副本數量完全符合期望值為止。

      滾動更新時,應用升級期間還要確保可用的Pod對象數量不低于某閾值以確保可以持續處理客戶端的服務請求,變動的方式和Pod對象的數量范圍將通過spec.strategy.rollingUpdate.maxSurge和spec.strategy.rollingUpdate.maxUnavailable兩個屬性協同進行定義:

      - **maxSurge**:指定升級期間存在的總Pod對象數量最多可超出期望值的個數,其值可以是0或正整數,也可以是一個期望值的百分比;例如:如果期望值為3,當前的屬性值為1,則表示Pod對象的總數不能超過4個。
      - **maxUnavailable**:升級期間正常可用的Pod副本數(包括新舊版本)最低不能低于期望值的個數,其值可以是0或正整數,也可以是一個期望值的百分比;默認值為1,該值意味著如果期望值是3,則升級期間至少要有2個Pod對象處于正常提供服務的狀態。

      Deployment控制器也支持用戶保留其滾動更新歷史中的舊ReplicaSet對象版本,這賦予了控制器進行應用回滾的能力:用戶可按需回滾到指定的歷史版本。控制器可保存的歷史版本數量由“spec.revisionHistoryLimit”屬性進行定義。當然,也只有保存于revision歷史中的ReplicaSet版本可用于回滾,因此,用戶要習慣性地在更新操作時指定保留新舊版本。

      注意:為了保存版本升級的歷史,需要在創建Deployment對象時于命令中使用“--record”選項。

      更新策略的選擇:盡管滾動更新以節約資源著稱,但它也存在一些劣勢。直接改動現有環境,會使系統引入不確定性風險,而且升級過程中出現問題后,執行回滾操作也會較為緩慢。有鑒于此,金絲雀部署可能是較為理想的實現方式,當然,如果不考慮系統資源的可用性,那么藍綠部署也是不錯的選擇。

       3.2.3 升級Deployment

      由于是聲明式配置,因此對Deployment控制器資源的修改尤其適合使用apply和patch命令來進行;如果是修改容器鏡像,則“set image”命令更為易用。

      范例1:使用patch命令將minReadySeconds設置為5s
      注意:修改Deployment控制器的minReadySeconds、replicas和strategy等字段的值不會觸發Pod資源的更新操作,因為它們不屬于模板的內嵌字段,對現存的Pod對象不產生任何影響。
      #查看Deployment的詳細信息
      oot@ubuntu-200 ~]# kubectl describe deployments.apps deployment-myapp
      Name: deployment-myapp
      Namespace: default
      CreationTimestamp: Tue, 15 Dec 2020 01:49:34 +0000
      Labels: <none>
      Annotations: deployment.kubernetes.io/revision: 1
      Selector: app=myapp
      Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
      StrategyType: RollingUpdate #更新策略
      MinReadySeconds: 0 #未修改前的等待時間
      RollingUpdateStrategy: 25% max unavailable, 25% max surge
      Pod Template:
      Labels: app=myapp
      Containers:
      myapp:
      Image: ikubernetes/myapp:v1
      Port: 80/TCP
      Host Port: 0/TCP
      Environment: <none>
      Mounts: <none>
      Volumes: <none>
      Conditions:
      Type Status Reason
      ---- ------ ------
      Available True MinimumReplicasAvailable
      Progressing True NewReplicaSetAvailable
      OldReplicaSets: <none>
      NewReplicaSet: deployment-myapp-7ffb5fd5ff (3/3 replicas created)
      Events:
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal ScalingReplicaSet 23m deployment-controller Scaled up replica set deployment-myapp-7ffb5fd5ff to 3
      
      #使用patch命令進行修改
      [root@ubuntu-200 /data/deployment]# kubectl patch deployments.apps deployment-myapp -p '{"spec": {"minReadySeconds":5}}'
      deployment.apps/deployment-myapp patched
      
      #查看修改后的詳細信息
      [root@ubuntu-200 /data/deployment]# kubectl describe deployments.apps deployment-myapp
      Name: deployment-myapp
      Namespace: default
      CreationTimestamp: Tue, 15 Dec 2020 01:49:34 +0000
      Labels: <none>
      Annotations: deployment.kubernetes.io/revision: 1
      Selector: app=myapp
      Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
      StrategyType: RollingUpdate
      MinReadySeconds: 5 #可看到等待時間已修改
      RollingUpdateStrategy: 25% max unavailable, 25% max surge
      Pod Template:
      Labels: app=myapp
      Containers:
      myapp:
      Image: ikubernetes/myapp:v1
      Port: 80/TCP
      Host Port: 0/TCP
      Environment: <none>
      Mounts: <none>
      Volumes: <none>
      Conditions:
      Type Status Reason
      ---- ------ ------
      Available True MinimumReplicasAvailable
      Progressing True NewReplicaSetAvailable
      OldReplicaSets: <none>
      NewReplicaSet: deployment-myapp-7ffb5fd5ff (3/3 replicas created)
      Events: <none>
      范例2:使用set image修改鏡像版本
      #查看詳細信息中的鏡像版本
      [root@ubuntu-200 /data/deployment]# kubectl describe deployments.apps deployment-myapp
      Name: deployment-myapp
      Namespace: default
      CreationTimestamp: Tue, 15 Dec 2020 01:49:34 +0000
      Labels: <none>
      Annotations: deployment.kubernetes.io/revision: 1
      Selector: app=myapp
      Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
      StrategyType: RollingUpdate
      MinReadySeconds: 5
      RollingUpdateStrategy: 25% max unavailable, 25% max surge
      Pod Template:
      Labels: app=myapp
      Containers:
      myapp:
      Image: ikubernetes/myapp:v1 #可看到鏡像版本為v1
      Port: 80/TCP
      Host Port: 0/TCP
      Environment: <none>
      Mounts: <none>
      Volumes: <none>
      Conditions:
      Type Status Reason
      ---- ------ ------
      Available True MinimumReplicasAvailable
      Progressing True NewReplicaSetAvailable
      OldReplicaSets: <none>
      NewReplicaSet: deployment-myapp-7ffb5fd5ff (3/3 replicas created)
      Events: <none>
      
      #修改鏡像版本
      [root@ubuntu-200 /data/deployment]# kubectl set image deployment/deployment-myapp myapp=ikubernetes/myapp:v2
      deployment.apps/deployment-myapp image updated
      
      #查看更新過程
      [root@ubuntu-200 /data/deployment]# kubectl rollout status deployment deployment-myapp
      Waiting for deployment "deployment-myapp" rollout to finish: 2 out of 3 new replicas have been updated...
      Waiting for deployment "deployment-myapp" rollout to finish: 2 out of 3 new replicas have been updated...
      Waiting for deployment "deployment-myapp" rollout to finish: 2 out of 3 new replicas have been updated...
      Waiting for deployment "deployment-myapp" rollout to finish: 2 out of 3 new replicas have been updated...
      Waiting for deployment "deployment-myapp" rollout to finish: 1 old replicas are pending termination...
      Waiting for deployment "deployment-myapp" rollout to finish: 1 old replicas are pending termination...
      Waiting for deployment "deployment-myapp" rollout to finish: 1 old replicas are pending termination...
      deployment "deployment-myapp" successfully rolled out
      
      #查看ReplicaSet,可以看到已更新完成
      [root@ubuntu-200 /data/deployment]# kubectl get replicasets.apps -l app=myapp
      NAME DESIRED CURRENT READY AGE
      deployment-myapp-7ffb5fd5ff 0 0 0 78m
      deployment-myapp-d79f57d9d 3 3 3 2m25s
      
      #查看pod,可看到原有Pod已刪除,新的ReplicaSet已重新創建Pod
      [root@ubuntu-200 /data/deployment]# kubectl get pods -l app=myapp -o wide
      NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
      deployment-myapp-d79f57d9d-fs6n4 1/1 Running 0 7m11s 10.244.2.133 ubuntu-210 <none> <none>
      deployment-myapp-d79f57d9d-psv67 1/1 Running 0 6m43s 10.244.1.118 ubuntu-220 <none> <none>
      deployment-myapp-d79f57d9d-rz8xw 1/1 Running 0 6m14s 10.244.3.55 ubuntu-184 <none> <none>
      
      
      #測試訪問
      [root@ubuntu-200 /data/deployment]# curl 10.244.2.133
      Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
      
      #查看Deployment的詳細信息,可看到鏡像版本已更新,也能看到事件中Pod的新建與刪除
      [root@ubuntu-200 /data/deployment]# kubectl describe deployments.apps deployment-myapp
      Name: deployment-myapp
      Namespace: default
      CreationTimestamp: Tue, 15 Dec 2020 01:49:34 +0000
      Labels: <none>
      Annotations: deployment.kubernetes.io/revision: 2
      Selector: app=myapp
      Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
      StrategyType: RollingUpdate
      MinReadySeconds: 5
      RollingUpdateStrategy: 25% max unavailable, 25% max surge
      Pod Template:
      Labels: app=myapp
      Containers:
      myapp:
      Image: ikubernetes/myapp:v2 #鏡像版本
      Port: 80/TCP
      Host Port: 0/TCP
      Environment: <none>
      Mounts: <none>
      Volumes: <none>
      Conditions:
      Type Status Reason
      ---- ------ ------
      Available True MinimumReplicasAvailable
      Progressing True NewReplicaSetAvailable
      OldReplicaSets: <none>
      NewReplicaSet: deployment-myapp-d79f57d9d (3/3 replicas created)
      Events:
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set deployment-myapp-d79f57d9d to 1
      Normal ScalingReplicaSet 9m46s deployment-controller Scaled down replica set deployment-myapp-7ffb5fd5ff to 2
      Normal ScalingReplicaSet 9m46s deployment-controller Scaled up replica set deployment-myapp-d79f57d9d to 2
      Normal ScalingReplicaSet 9m17s deployment-controller Scaled down replica set deployment-myapp-7ffb5fd5ff to 1
      Normal ScalingReplicaSet 9m17s deployment-controller Scaled up replica set deployment-myapp-d79f57d9d to 3
      Normal ScalingReplicaSet 8m41s deployment-controller Scaled down replica set deployment-myapp-7ffb5fd5ff to 0

      3.2.4 回滾Deployment

      若因各種原因導致滾動更新無法正常進行,如鏡像文件獲取、“金絲雀”遇險等,則應該將應用回滾到之前的版本,或者回滾到奧由用戶指定的歷史記錄中的版本。

      相關命令:

      # 查看升級的歷史記錄
      # kubectl rollout history deployment/<deployment-name>
      
      #回滾到當前版本的上一個版本
      # kubectl rollout undo deployment/<deployment-name>
      
      #回滾到指定版本
      # kubectl rollout undo deployment/<deployment-name> --to-revision=版本號
      
      #停止更新(可用于金絲雀發布)
      # kubectl rollout pause deployment/<deployment-name>
      
      #繼續更新(可用于金絲雀發布)
      # kubectl rollout reuse deployment/<deployment-name>
      #查看升級的歷史記錄
      [root@ubuntu-200 /data/deployment]# kubectl rollout history deployment/deployment-myapp
      deployment.apps/deployment-myapp
      REVISION CHANGE-CAUSE
      1 <none>
      2 <none>
      
      #回滾到上一版本
      [root@ubuntu-200 /data/deployment]# kubectl rollout undo deployment deployment-myapp
      deployment.apps/deployment-myapp rolled back
      
      #可看到Pod回滾過程
      [root@ubuntu-200 /data/deployment]# kubectl get pods
      NAME READY STATUS RESTARTS AGE
      deployment-myapp-7ffb5fd5ff-4qszl 1/1 Running 0 21s
      deployment-myapp-7ffb5fd5ff-56fv4 1/1 Running 0 13s
      deployment-myapp-7ffb5fd5ff-vc8hs 0/1 ContainerCreating 0 2s
      deployment-myapp-d79f57d9d-psv67 0/1 Terminating 0 21m
      deployment-myapp-d79f57d9d-rz8xw 1/1 Running 0 21m
      replicaset-demo-v1.1-d8n24 1/1 Running 2 18h
      replicaset-demo-v1.1-h4fxg 1/1 Running 2 20h
      replicaset-demo-v1.1-xn5g4 1/1 Running 2 18h
      rs-blue-5xvvj 1/1 Running 2 18h
      rs-blue-pfhl4 1/1 Running 2 18h
      rs-green-86l49 1/1 Running 2 20h
      rs-green-bbzt4 1/1 Running 2 18h
      
      #查看ReplicaSet已回滾到上一個版本
      [root@ubuntu-200 /data/deployment]# kubectl get replicaset -l app=myapp
      NAME DESIRED CURRENT READY AGE
      deployment-myapp-7ffb5fd5ff 3 3 3 99m
      deployment-myapp-d79f57d9d 0 0 0 23m
      
      #訪問測試,可看到版本已回滾
      [root@ubuntu-200 /data/deployment]# kubectl get pods -l app=myapp -o wide
      NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
      deployment-myapp-7ffb5fd5ff-4qszl 1/1 Running 0 2m19s 10.244.2.134 ubuntu-210 <none> <none>
      deployment-myapp-7ffb5fd5ff-56fv4 1/1 Running 0 2m11s 10.244.1.119 ubuntu-220 <none> <none>
      deployment-myapp-7ffb5fd5ff-vc8hs 1/1 Running 0 2m 10.244.3.56 ubuntu-184 <none> <none>
      [root@ubuntu-200 /data/deployment]# curl 10.244.2.134
      Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
      
      #查看升級版本,由于默認為1版本,所以回滾后,1版本變為3版本
      [root@ubuntu-200 /data/deployment]# kubectl rollout history deployment deployment-myapp
      deployment.apps/deployment-myapp
      REVISION CHANGE-CAUSE
      2 <none>
      3 <none>
      
      #詳細信息中,事件已更新
      [root@ubuntu-200 /data/deployment]# kubectl describe deployments.apps deployment-myapp
      Name: deployment-myapp
      Namespace: default
      CreationTimestamp: Tue, 15 Dec 2020 01:49:34 +0000
      Labels: <none>
      Annotations: deployment.kubernetes.io/revision: 3
      Selector: app=myapp
      Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
      StrategyType: RollingUpdate
      MinReadySeconds: 5
      RollingUpdateStrategy: 25% max unavailable, 25% max surge
      Pod Template:
      Labels: app=myapp
      Containers:
      myapp:
      Image: ikubernetes/myapp:v1
      Port: 80/TCP
      Host Port: 0/TCP
      Environment: <none>
      Mounts: <none>
      Volumes: <none>
      Conditions:
      Type Status Reason
      ---- ------ ------
      Available True MinimumReplicasAvailable
      Progressing True NewReplicaSetAvailable
      OldReplicaSets: <none>
      NewReplicaSet: deployment-myapp-7ffb5fd5ff (3/3 replicas created)
      Events:
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal ScalingReplicaSet 26m deployment-controller Scaled up replica set deployment-myapp-d79f57d9d to 1
      Normal ScalingReplicaSet 26m deployment-controller Scaled down replica set deployment-myapp-7ffb5fd5ff to 2
      Normal ScalingReplicaSet 26m deployment-controller Scaled up replica set deployment-myapp-d79f57d9d to 2
      Normal ScalingReplicaSet 25m deployment-controller Scaled down replica set deployment-myapp-7ffb5fd5ff to 1
      Normal ScalingReplicaSet 25m deployment-controller Scaled up replica set deployment-myapp-d79f57d9d to 3
      Normal ScalingReplicaSet 24m deployment-controller Scaled down replica set deployment-myapp-7ffb5fd5ff to 0
      Normal ScalingReplicaSet 4m33s deployment-controller Scaled up replica set deployment-myapp-7ffb5fd5ff to 1
      Normal ScalingReplicaSet 4m25s deployment-controller Scaled down replica set deployment-myapp-d79f57d9d to 2
      Normal ScalingReplicaSet 4m25s deployment-controller Scaled up replica set deployment-myapp-7ffb5fd5ff to 2
      Normal ScalingReplicaSet 4m14s (x2 over 102m) deployment-controller Scaled up replica set deployment-myapp-7ffb5fd5ff to 3
      Normal ScalingReplicaSet 4m14s deployment-controller Scaled down replica set deployment-myapp-d79f57d9d to 1
      Normal ScalingReplicaSet 4m7s deployment-controller Scaled down replica set deployment-myapp-d79f57d9d to 0

      3.2.5 Deployment擴容和縮容

      擴容:增加期望副本的數量

      縮容:減少期望副本的數量

      相關命令:
      # kubectl scale deployment <deployment-name> --replicas 期望的副本數量(數字)
      例子:
      # kubectl scale deployment nginx-deployment --replicas 10
      
      #暫停更新
      # kubectl rollout pause deployment/<deployment-name>
      范例1:擴容
      #使用命令擴容
      [root@ubuntu-200 /data/deployment]# kubectl scale deployment --replicas=4 deployment-myapp
      deployment.apps/deployment-myapp scaled
      
      #查看pod
      [root@ubuntu-200 /data/deployment]# kubectl get pods -l app=myapp
      NAME READY STATUS RESTARTS AGE
      deployment-myapp-7ffb5fd5ff-4qszl 1/1 Running 0 9m24s
      deployment-myapp-7ffb5fd5ff-56fv4 1/1 Running 0 9m16s
      deployment-myapp-7ffb5fd5ff-pmcpn 1/1 Running 0 35s
      deployment-myapp-7ffb5fd5ff-vc8hs 1/1 Running 0 9m5s
      
      [root@ubuntu-200 /data/deployment]# kubectl get deployments.apps
      NAME READY UP-TO-DATE AVAILABLE AGE
      deployment-myapp 4/4 4 4 107m
      范例2:縮容
      [root@ubuntu-200 /data/deployment]# kubectl scale deployment deployment-myapp --replicas=3
      deployment.apps/deployment-myapp scaled
      
      [root@ubuntu-200 /data/deployment]# kubectl get pods -l app=myapp
      NAME READY STATUS RESTARTS AGE
      deployment-myapp-7ffb5fd5ff-4qszl 1/1 Running 0 13m
      deployment-myapp-7ffb5fd5ff-56fv4 1/1 Running 0 13m
      deployment-myapp-7ffb5fd5ff-vc8hs 1/1 Running 0 13m
      
      [root@ubuntu-200 /data/deployment]# kubectl get deployments.apps
      NAME READY UP-TO-DATE AVAILABLE AGE
      deployment-myapp 3/3 3 3 111m
      posted @ 2023-09-10 17:32  yt丶獨自  閱讀(71)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 美女无遮挡免费视频网站| 亚洲欧美一区二区三区图片| 亚洲自拍偷拍激情视频| 亚洲中文字幕日产无码成人片| 久久午夜夜伦鲁鲁片免费无码| 国产精品国语对白一区二区| 国产精品一区 在线播放| 国产人妻精品午夜福利免费| 色偷偷亚洲女人天堂观看| 国产初高中生在线视频| 免费十八禁一区二区三区| 在线无码免费看黄网站| 午夜精品久久久久久久爽| 国产亚洲精品久久久网站好莱| 在线观看中文字幕码国产| 国产成AV人片久青草影院| 亚洲成人四虎在线播放| 伊人春色激情综合激情网| 亚洲国产在一区二区三区| 荥阳市| 青青草成人免费自拍视频| 97一区二区国产好的精华液| 少妇愉情理伦片高潮日本| 国产午夜福利视频在线| 一区二区三区四区五区自拍 | 乳源| 国产高清在线精品一本大道| 久久夜夜免费视频| 亚洲精品国产字幕久久麻豆| 久久精品一区二区三区中文字幕| 亚洲禁精品一区二区三区| 国产jlzzjlzz视频免费看| 久久九九精品国产免费看小说| 久久涩综合一区二区三区| 亚洲中文字幕成人无码| 综合色综合色综合色综合| 久久99热只有频精品8| 免费吃奶摸下激烈视频| 精品久久人人妻人人做精品| 欧美老少配性行为| 亚洲国产成人va在线观看天堂|