91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kubernetes中怎么利用Deloyment實現滾動更新

發布時間:2021-06-21 18:15:41 來源:億速云 閱讀:318 作者:Leah 欄目:大數據

本篇文章為大家展示了Kubernetes中怎么利用Deloyment實現滾動更新,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

滾動更新簡介

當kubernetes集群中的某個服務需要升級時,傳統的做法是,先將要更新的服務下線,業務停止后再更新版本和配置,然后重新啟動并提供服務。如果業務集群規模較大時,這個工作就變成了一個挑戰,而且先全部了停止,再逐步升級的方式會導致服務較長時間不可用。kubernetes提供了滾動更新(rolling-update)的方式來解決上述問題。

簡單來說,滾動更新就是針對多實例服務的一種不中斷服務的更新升級方式。一般情況下,對于多實例服務,滾動更新采用對各個實例逐個進行單獨更新而非同一時刻對所有實例進行全部更新的方式。

對于k8s集群來說,rolling update就是指一次僅更新一個或者一組pod,而不是在同一時刻將一個Deployment管理的所有pod shutdown,避免業務中斷。

新版本的Kubernetes推薦用Deployment替代ReplicationController,在Deployment這個概念下在保持Pod副本數上實際發揮作用的是隱藏在背后的Replica Set。

使用kubectl rolling-update更新RC

使用kubectl rolling-update命令的方式,主要是針對使用RC創建的pods。
先來看下面一個示例,創建一個包含4個nginx副本的RC nginx-demo-v1-rc.yml:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-demo-v1
spec:
  replicas: 4
  selector:
    app: nginx-demo
    ver: v1
  template:
    metadata:
      labels:
        app: nginx-demo
        ver: v1
    spec:
      containers:
        - name: nginx-demo
          image: nginx:1.14
          ports:
            - containerPort: 80
              protocol: TCP
          env:
            - name: NGX_DEMO_VER
              value: v1

創建一個service,nginx-demo-svc.yml內容如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx-demo-svc
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: nginx-demo

創建rc和service:

kubectl create -f nginx-demo-v1-rc.yml
kubectl create -f nginx-demo-svc.yml

創建完成以后,可以通過訪問任一Pod的環境變量查看NGX_DEMO_VER的值,為v1

現在我們創建一個nginx-demo-v2-rc.yml的文件,來升級現有的pod:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-demo-v2
spec:
  replicas: 4
  selector:
    app: nginx-demo
    ver: v2
  template:
    metadata:
      labels:
        app: nginx-demo
        ver: v2
    spec:
      containers:
        - name: nginx-demo
          image: nginx:1.15
          ports:
            - containerPort: 80
              protocol: TCP
          env:
            - name: NGX_DEMO_VER
              value: v2

執行更新操作:

kubectl rolling-update nginx-demo-svc -f nginx-demo-v2-rc.yml

需要注意的是,在執行滾動升級時,兩個版本的yml文件區別:

  • RC的名字不能與舊的RC名字相同

  • 在selector中應至少有一個label與舊的RC的label不同,以標識其為新的RC。

我們可以通過如下操作來查看更新的完整過程:

kubectl rolling-update nginx-demo-v1 --udpate-period=10s -f nginx-demo-v2-rc.yml

當所有舊的pod被新的Pod替換完成以后,更新完成。

使用kubectl rolling-update實現滾動更新的不足:

  • rolling-update的邏輯是由kubectl發出N條命令到APIServer完成的,很可能因為網絡原因導致update中斷

  • 需要創建一個新的rc,名字與要更新的rc不能一樣

  • 回滾還需要執行rolling-update,只是用老的版本替換新的版本

  • service執行的rolling-update在集群中沒有記錄,后續無法跟蹤rolling-update歷史

現如今,RC的方式已經被Deployment替代。

Deployment的rolling-update

kubernetes的Deployment是一個更高級別的抽象。Deployment會創建一個Replica Set,用來保證Deployment中的Pod的副本數。要rolling-update deployment中的Pod,只需要修改Deployment自己的yml文件并應用即可。這個修改會創建一個新的Replica Set,在增加這個新RS的pod數的同時,減少舊RS的pod,直至完全升級。而這一切都發生在Server端,并不需要kubectl參與。

創建一個Deployment yml文件nginx-demo-dm.yml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx-demo
  minReadySeconds: 10
  template:
    metadata:
      labels:
        app: nginx-demo
        version: v1
    spec:
      containers:
        - name: deployment-demo
          image: nginx:1.14
          ports:
            - containerPort: 80
              protocol: TCP

創建該deployment:

kubect create -f nginx-demo-dm.yml --record

然后我們可以直接修改該deployment文件,如下 :

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx-demo
  minReadySeconds: 10
  template:
    metadata:
      labels:
        app: nginx-demo
        version: v2
    spec:
      containers:
        - name: deployment-demo
          image: nginx:1.15
          ports:
            - containerPort: 80
              protocol: TCP

一共就改了兩個地方,將version改為了v2,將nginx鏡像從1.14改到了1.15,執行如下操作應用更改:

kubectl apply -f nginx-demo-dm.yml --record

這個時候,我們可以通過執行kubectl get rs來查看到rs的變化,以確認是否在執行升級。也可以通過kubectl describe deployment nginx-demo來查看詳細的rolling-update的過程。還可以通過kubectl rollout status deployment/nginx-demo來查看更新狀態。

除了使用apply方式來應用更改以外,還有另外一種方式可以直接升級。就是通過kubectl edit nginx-demo-dm.yml來編輯deployment文件,保存以后,不需要執行apply,就會自動完成升級。

我們可以注意到,在執行deployment的操作時,使用了一個--record參數,這個參數是用來告訴apiserver記錄update的歷史。可以通過如下命令來查看update歷史:

kubectl rollout history deployment nginx-demo

查看指定revision的詳細信息:

kubectl rollout history deployment hello-deployment --revision=2

需要說明的是,在升級完成以后,舊的RS也不會被刪除,這些信息都會存儲到server端,以方便回滾。
deployment下的pod的回滾操作相當簡單,直接執行rollout undo即可將deployment回滾到record中記錄的上一個revision:

kubectl rollout undo deployment nginx-demo

執行如下操作,回滾到指定版本:

kubectl rollout undo deployment hello-deployment --to-revision=2

上述內容就是Kubernetes中怎么利用Deloyment實現滾動更新,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

托克逊县| 汉中市| 广西| 乌拉特前旗| 怀集县| 东兰县| 五河县| 新绛县| 安宁市| 黎城县| 仙桃市| 莱芜市| 同仁县| 霍林郭勒市| 离岛区| 湘潭市| 唐河县| 遵化市| 临澧县| 中宁县| 嵊州市| 闵行区| 望奎县| 乌鲁木齐县| 公安县| 长治市| 囊谦县| 砚山县| 资兴市| 扎鲁特旗| 迁西县| 商洛市| 西乡县| 原阳县| 南平市| 昌黎县| 三门峡市| 嘉荫县| 平塘县| 兰溪市| 沈丘县|