欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kubernetes中Deployment的升級與回滾

 更新時間:2022年04月01日 11:07:01   作者:癡者工良  
這篇文章介紹了Kubernetes中Deployment的升級與回滾?,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

更新

打開 https://hub.docker.com/_/nginx 可以查詢 nginx 的鏡像版本,我們可以先選擇一個舊一點(diǎn)的版本。

首先,我們創(chuàng)建一個 Nginx 的 Deployment,副本數(shù)量為 3。

kubectl create deployment nginx --image=nginx:1.19.0 --replicas=3

首次部署的時候,跟之前的操作一致,不需要什么特殊的命令。

注: 我們也可以加上 --record 標(biāo)志將所執(zhí)行的命令寫入資源注解 kubernetes.io/change-cause 中。 這對于以后的檢查是有用的。例如,要查看針對每個 Deployment 修訂版本所執(zhí)行過的命令。

其實(shí)更新 pod 是非常簡單的,我們不需要控制每個 pod 的更新,也不需要擔(dān)心會不會對業(yè)務(wù)產(chǎn)生影響,k8s 會自動控制這些過程。

我們只需要觸發(fā)鏡像版本更新事件,k8s 會自動為我們更新 pod 的。

kubectl set image deployment.apps/nginx nginx=nginx:1.20.0

格式為:

kubectl set image deployment.apps/{deployment名稱} {鏡像名稱}:={鏡像名稱}:{版本}

我們可以查看 pod 的詳細(xì)信息:

kubectl describe pods

找到 Events 描述:

... ...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  66s   default-scheduler  Successfully assigned default/nginx-7b87485749-rlmcx to instance-2
  Normal  Pulled     66s   kubelet            Container image "nginx:1.20.0" already present on machine
  Normal  Created    66s   kubelet            Created container nginx
  Normal  Started    65s   kubelet            Started container nginx

為了記錄版本更新信息,我們需要在 kubectl create deployment、kubectl set image 命令后面加上 -- --record。

我們還可以通過 edit 方式更新 pod。

執(zhí)行:

kubectl edit deployment nginx

然后會彈出編輯 yaml 的界面,將 .spec.template.spec.containers[0].image 從 nginx:1.19.0 更改至 nginx:1.20.0,然后保存即可。

上線

僅當(dāng) Deployment Pod 模板(即 .spec.template)發(fā)生改變時,例如模板的標(biāo)簽或容器鏡像被更新, 才會觸發(fā) Deployment 上線。 其他更新(如對 Deployment 執(zhí)行擴(kuò)縮容的操作)不會觸發(fā)上線動作。Deployment 的上線動作可以為我們更新 pod 的版本。

它的上線跟我們所說的更新,有些區(qū)別。因?yàn)槲覀兯f的更新,版本是往后的,例如 1.19.0 -> 1.20.0 ,用新版本替換舊版本才叫更新。但是 Deployment 的上線,則是任意版本。它會根據(jù)我們設(shè)置的鏡像版本自動替換,可以用 1.19.0 替換 1.20.0。不過這里我們不需要糾結(jié)這些。

當(dāng)我們更新 pod 版本時,k8s 會自動負(fù)載均衡,而不是把所有 pod 刪除,再重新創(chuàng)建新版本 pod,它會以穩(wěn)健的方式逐漸替換 pod。

我們可以通過命令,查看 pod 的上線狀態(tài):

kubectl rollout status deployment nginx

輸出類似于:

Waiting for rollout to finish: 2 out of 3 new replicas have been updated...

或者

deployment "nginx-deployment" successfully rolled out

我們也可以通過獲取 deployment 信息時,查看已更新的 pod 數(shù)量:

kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           18m

UP-TO-DATE 字段可以看到成功更新的 pod 數(shù)量。

還可以查看 ReplicaSet 和 pod:

kubectl get replicaset
kubectl get pods

輸出類型于:

NAME               DESIRED   CURRENT   READY   AGE
nginx-7b87485749   0         0         0       20m
nginx-85b45874d9   3         3         3       21m
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b45874d9-nrbg8   1/1     Running   0          12m
nginx-85b45874d9-qc7f2   1/1     Running   0          12m
nginx-85b45874d9-t48vw   1/1     Running   0          12m

可以看到有兩個 ReplicaSet,nginx-7b87485749 已經(jīng)被全部更新到 nginx-85b45874d9 了,所以前者的數(shù)量為 0,我們也可以看到 pod 中,所有 pod 都是以 nginx-85b45874d9 作為前綴的。這幾個關(guān)鍵信息,我們可以截圖,后面再次對照。

如果我們的項(xiàng)目上線了,我們更新軟件版本,如果一次性更新所有容器或者 pod,那么我們的軟件會有一段時間處于不可用狀態(tài),直到所有 pod 都完成更新。Deployment 可確保在更新時僅關(guān)閉一定數(shù)量的 Pod,默認(rèn)情況下,它確保至少所需 Pods 75% 處于運(yùn)行狀態(tài),也就是說正在被更新的 pod 比例不超過 25%。當(dāng)然,只有兩三個 pod 的 Deployment 不會按照這個比例限定。

如果我們的 pod 數(shù)量足夠大,或者在更新 Deployment 時迅速輸出上線狀態(tài),可以看到新舊的 pod 數(shù)量加起來不一定就是 3 個,因?yàn)樗粫⑺览?Pods,直到有足夠的數(shù)量新的 Pods 已經(jīng)出現(xiàn)。 在足夠數(shù)量的舊 Pods 被殺死前并沒有創(chuàng)建新 Pods。它確保至少 2 個 Pod 可用,同時 最多總共 4 個 Pod 可用。

Deployment 確保僅所創(chuàng)建 Pod 數(shù)量只可能比期望 Pods 數(shù)高一點(diǎn)點(diǎn)。 默認(rèn)情況下,它可確保啟動的 Pod 個數(shù)比期望個數(shù)最多多出 25%(最大峰值 25%)所以在自動更新 Deployment 時,觀察到的 pod 可能為 4個。另外,在 Deployment 更新時,除了可以更改鏡像的版本,也可以更改 ReplicaSet 的數(shù)量。

執(zhí)行 kubectl describe deployment nginx 查看 Deployment 詳細(xì)信息,我們查看 Event 字段。

但是這些原理等知識我們都不需要記,也不需要深入,我們記得有這回事就行,有需要的時候也可以直接查看文檔的。

回滾

默認(rèn)情況下, Deployment 的上線記錄都會保留在系統(tǒng)中,以便可以隨時回滾。

我們查看 Deployment 的上線歷史記錄:

kubectl rollout history deployment nginx
REVISION  CHANGE-CAUSE
2         <none>
3         <none>

注:我們的版本不一定一樣,因?yàn)槲覟榱诉@這篇文章,進(jìn)行了一些測試,可能版本數(shù)量比你的多。

可以看到有 2,3 兩個版本,我們查看 版本3 的信息:

kubectl rollout history deployment nginx --revision=3
deployment.apps/nginx with revision #3
Pod Template:
  Labels:	app=nginx
	pod-template-hash=85b45874d9
  Containers:
   nginx:
    Image:	nginx:1.20.0
    Port:	<none>
    Host Port:	<none>
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>

目前介紹了幾個查看 Deployment 上線的歷史記錄,下面我真正來回滾 Deployment。

回滾是一個版本:

kubectl rollout undo deployment nginx

再執(zhí)行 kubectl rollout history deployment nginx 會看到不一樣的信息。

此時版本數(shù)量多了,我們還可以指定回滾到特點(diǎn)的版本。

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

這里提一下 --record,在前面,我們創(chuàng)建和更新 Deployment 時,都沒有使用到這個參數(shù)。我們可以試試這個參數(shù)的作用。

kubectl set image deployment.apps/nginx nginx=nginx:1.19.0
kubectl rollout history deployment nginx

輸出:

REVISION  CHANGE-CAUSE
5         <none>
6         kubectl set image deployment.apps/nginx nginx=nginx:1.19.0 --record=true

說明加上了 --record ,會把我們操作時的命令記錄下來。

但是我們這里目前來說,只有兩個記錄,我們明明提交了多次,但是這里查詢的只有兩條記錄,這時因?yàn)槲覀儾僮鞯臅r候,只用到了 1.19.0、1.20.0 兩個版本,所以也就只有這兩個版本的提交記錄。多用幾個版本,輸出結(jié)果:

REVISION  CHANGE-CAUSE
7         kubectl set image deployment.apps/nginx nginx=nginx:1.19.0 --record=true
8         kubectl set image deployment.apps/nginx nginx=nginx:1.20.0 --record=true
9         kubectl set image deployment.apps/nginx nginx=nginx:latest --record=true

縮放 Deployment

直接設(shè)置

很簡單,使用 kubectl scale 命令直接設(shè)置:

kubectl scale deployment.v1.apps/nginx --replicas=10

修改 yaml 的方式也行,一是修改 yaml文件,使用 kubectl apply -f 的方式更新,或者使用 kube edit 的方式。

Pod 水平自動縮放

K8S有個 Pod 水平自動擴(kuò)縮(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自動擴(kuò)縮 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 數(shù)量。

除了 CPU 利用率,也可以基于其他應(yīng)程序提供的自定義度量指標(biāo) 來執(zhí)行自動擴(kuò)縮。 Pod 自動擴(kuò)縮不適用于無法擴(kuò)縮的對象,比如 DaemonSet。

參考資料:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/

命令:

kubectl autoscale deployment nginx --min=10 --max=15 --cpu-percent=80

表示目標(biāo) CPU 使用率為 80%(期望指標(biāo)),副本數(shù)量配置應(yīng)該為 10 到 15 之間,CPU 是動態(tài)縮放 pod 的指標(biāo),會根據(jù)具體的 CPU 使用率計(jì)算副本數(shù)量,其計(jì)算公式如下。

期望副本數(shù) = ceil[當(dāng)前副本數(shù) * (當(dāng)前指標(biāo) / 期望指標(biāo))]

算法細(xì)節(jié)請查看:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details

比例縮放

另外還有個比例縮放,允許 Deployment 支持同時運(yùn)行應(yīng)用程序的多個版本。

當(dāng)我們設(shè)置.spec.strategy.type==RollingUpdate時,采取 滾動更新的方式更新 Pods,就可以指定 maxUnavailable 和 maxSurge 來控制滾動更新 過程。這個我們之前提到過,就是 Deployment 默認(rèn)會保證一直有 75% 的 pod處于可用狀態(tài),在完成更新前可能有多個版本的 pod 共存。

這里不細(xì)說,請參考:https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/#max-unavailable

默認(rèn)的話,deployment 的 yaml 是這樣的:

  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

我們可以改成:

  strategy:
    rollingUpdate:
      maxSurge: 3
      maxUnavailable: 2
    type: RollingUpdate

注:執(zhí)行 kubectl edit deployment nginx 直接改。

我們可以觀察到這個過程:

root@instance-1:~# kubectl set image deployment nginx nginx=nginx:1.20.0
deployment.apps/nginx image updated
root@instance-1:~# kubectl get replicaset
NAME               DESIRED   CURRENT   READY   AGE
nginx-7b87485749   5         5         0       93m
nginx-85b45874d9   0         0         0       93m
nginx-bb957bbb5    8         8         8       35m

前面我們設(shè)置了最大存在兩個不可用 pod(maxUnavailable=2),所以一開始會更新兩個 pod,所以 nginx-bb957bbb5 8個處于可用狀態(tài)。而 maxSurge 表示允許超出的期望 pod 數(shù)量,所以nginx-7b87485749 的數(shù)量不是 2 個,而是 5個,因?yàn)樵试S超出 3 個。其實(shí)意思就是不需要等舊的 pod 刪除 一個,新的 pod 創(chuàng)建一個??梢远鄤?chuàng)建幾個 pod,再按照慢一些的速度刪除舊的 pod,最終完成版本更新。

最終:

NAME               DESIRED   CURRENT   READY   AGE
nginx-7b87485749   10        10        10      99m
nginx-85b45874d9   0         0         0       99m
nginx-bb957bbb5    0         0         0       41m

暫停 Deployment 上線

命令:

kubectl rollout pause deployment nginx

用途就是我們更新 Deployment 的 pod 版本時,可以暫停。

前面我們已經(jīng)設(shè)置了這個 maxSurge 和 maxUnavailable,可以讓 pod 的創(chuàng)建慢一些。

執(zhí)行下面的命令可以快速卡住上線過程。

kubectl set image deployment nginx nginx=nginx:latest
kubectl rollout pause deployment nginx

之后,多次執(zhí)行 kubectl get replicaset ,會發(fā)現(xiàn)副本數(shù)量不會變化。

NAME               DESIRED   CURRENT   READY   AGE
nginx-7b87485749   8         8         8       109m
nginx-85b45874d9   0         0         0       109m
nginx-bb957bbb5    5         5         5       52m

如果我們再次執(zhí)行:

kubectl set image deployment nginx nginx=nginx:1.19.0

會發(fā)現(xiàn)雖然提示更新了,但是實(shí)際上沒有變化。在暫停中,執(zhí)行新的更新操作是無效的。

執(zhí)行 kubectl rollout history deployment nginx 也查不到我們提交的 1.19.0 的請求。

暫停的時候,我們可以更新一些限制的 CPU 和 資源:

kubectl set resources deployment nginx -c=nginx --limits=cpu=200m,memory=512Mi

恢復(fù) Deployment:

kubectl rollout resume deployment nginx

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • kubernetes實(shí)現(xiàn)分布式限流

    kubernetes實(shí)現(xiàn)分布式限流

    這篇文章介紹了kubernetes實(shí)現(xiàn)分布式限流的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Kubernetes kubectl中Pod創(chuàng)建流程源碼解析

    Kubernetes kubectl中Pod創(chuàng)建流程源碼解析

    這篇文章主要為大家介紹了Kubernetes kubectl中Pod創(chuàng)建流程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • K8S集群范圍使用imagePullSecret示例詳解

    K8S集群范圍使用imagePullSecret示例詳解

    在這篇文章中,我將向你展示如何在?Kubernetes?中使用?imagePullSecrets示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • kubectl中g(shù)et命令及使用示例總結(jié)

    kubectl中g(shù)et命令及使用示例總結(jié)

    這篇文章主要為大家介紹了kubectl中g(shù)et命令及使用示例的總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 了解Kubernetes中的Service和Endpoint

    了解Kubernetes中的Service和Endpoint

    這篇文章介紹了Kubernetes中的Service和Endpoint,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 部署k8s集群的超詳細(xì)實(shí)踐步驟

    部署k8s集群的超詳細(xì)實(shí)踐步驟

    k8s是一個可移植的、可擴(kuò)展的開源平臺,用于管理容器化的工作負(fù)載和服務(wù),可以促進(jìn)聲明式配置和自動化,下面這篇文章主要給大家介紹了關(guān)于部署k8s集群的實(shí)踐步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Kubernetes(K8S)容器集群管理環(huán)境完整部署詳細(xì)教程-上篇

    Kubernetes(K8S)容器集群管理環(huán)境完整部署詳細(xì)教程-上篇

    本系列文章主要介紹了Kubernetes(K8S)容器集群管理環(huán)境完整部署的詳細(xì)教程,分為上中下三篇文章,此為上篇,需要的朋友可以參考下
    2022-01-01
  • Kubernetes(K8S)容器集群管理環(huán)境完整部署詳細(xì)教程-下篇

    Kubernetes(K8S)容器集群管理環(huán)境完整部署詳細(xì)教程-下篇

    本系列文章主要介紹了Kubernetes(K8S)容器集群管理環(huán)境完整部署的詳細(xì)教程,分為上中下三篇文章,此為中篇,主要講解了K8S部署metrics-server插件,K8S部署集群dashboard插件,K8S部署集群coredns插件,K8S部署kube-state-metrics插件,K8S部署harbor私有倉庫
    2022-01-01
  • Kubernetes ApiServer三大server權(quán)限與數(shù)據(jù)存儲解析

    Kubernetes ApiServer三大server權(quán)限與數(shù)據(jù)存儲解析

    這篇文章主要為大家介紹了Kubernetes ApiServer三大server權(quán)限與數(shù)據(jù)存儲解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • CKAD認(rèn)證中部署k8s并配置Calico插件

    CKAD認(rèn)證中部署k8s并配置Calico插件

    這篇文章介紹了CKAD認(rèn)證中部署k8s并配置Calico插件的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03

最新評論