.NET Core + Kubernetes:Deployment

在上篇文章 .NET Core + Kubernetes:Pod 中,主要介紹了 Pod 的相關(guān)內(nèi)容,
基于 Pod 為單位能更加合理進行容器編排,然而 Pod 只是個啟動了一個或一組容器的資源類型,在實際應(yīng)用中,我們也需要 Pod 能實現(xiàn)動態(tài)擴展與收縮、滾動更新等,但 Pod 本身是沒有辦法做到的,它需要依賴上層的一種控制來達到這樣的效果,這就涉及到 Kubernetes 中的控制器(Controller)模型知識,本文將注意介紹 Deployment 這個最基本的控制器對象。

我們繼續(xù)以 .NET Core + Kubernetes:快速體驗 文中配置為例,將以下配置保存為 k8sdemo-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8sdemo-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      name: k8sdemo
  template:
    metadata:
      labels:
        name: k8sdemo
    spec:
      containers:
      - name: k8sdemo
        image: beckjin/k8sdemo:1.0.0
        ports:
        - containerPort: 80
        imagePullPolicy: IfNotPresent

這個 Deployment 指定創(chuàng)建 2 個含 name=k8sdemo 標簽的 Pod,template 字段指定了 Pod 的模板。從表面上來看,Deployment 和 Pod 是直接關(guān)系,然而實際上在 Deployment 與 Pod 直接還有 ReplicaSet 一層。如下:

Deployment 實際上一個兩層控制器,Deployment 控制 ReplicaSet,ReplicaSet 控制 Pod。ReplicaSet 有版本區(qū)分,滾動更新的能力就是基于 ReplicaSet 的版本來實現(xiàn),下文會介紹。

通過以下命令創(chuàng)建 k8sdemo-deployment

kubectl apply -f k8sdemo-deployment.yaml

查看 k8sdemo-deployment 的狀態(tài)信息:

kubectl get deployments

輸出結(jié)果中含3個狀態(tài)字段,含義如下:

  • READY:當前處于 Running 狀態(tài)的 Pod 的個數(shù)/用戶期望的 Pod 個數(shù)(配置文件設(shè)置的 replicas);
  • UP-TO-DATE:當前處于最新版本的 Pod 個數(shù)(Pod 的 Spec 部分與 Deployment 里 Pod 模板里定義的完全一致),在滾動更新過程中會有不一致的階段;
  • AVAILABLE:當前可用的 Pod 個數(shù)。

查看 k8sdemo-deployment 所控制的 ReplicaSet 信息:

kubectl describe replicaset

如上圖,Deployment 創(chuàng)建后,Deployment 控制器就會立即創(chuàng)建一個 Pod 個數(shù)為 2 的 ReplicaSet,ReplicaSet 的名字是由 Deployment 名字 + 隨機字符串,Pod 的名字是由 ReplicaSet 名字 + 隨機字符串。

動態(tài)伸縮

要實現(xiàn) Pod 的伸縮只需要調(diào)整配置文件中的 replicas 字段,如擴展為 3 個,擴展完成后結(jié)果如下:

收縮則類似。

滾動更新

假設(shè)現(xiàn)在將鏡像 beckjin/k8sdemo:1.0.0 升級為 beckjin/k8sdemo:1.1.0,重新 apply 后并查看 Deployment 的 Events 信息,輸出內(nèi)容含 "滾動更新" 的整個流程。

kubectl describe deployment k8sdemo-deployment

Deployment 控制器根據(jù)修改后的 Pod 模板,創(chuàng)建新的 ReplicaSet(k8sdemo-deployment-68cb864ff6),Pod 數(shù)默認是 0,然后老的 ReplicaSet (k8sdemo-deployment-84d777fb7)Pod 數(shù)逐漸減少,新的 ReplicaSet 的 Pod 數(shù)逐漸增加,兩個過程交替進行,新的增加一個,老的減少一個,直到全部升級完成。

查看當前 ReplicaSet 的狀態(tài):

可以看出原來的 ReplicaSet 的 Pod 已經(jīng)縮減為 0 個,新的 ReplicaSet 的 Pod 擴展為 3 個,每次配置修改重新部署都可能創(chuàng)建一個新的 ReplicaSet,所以 Deployment、ReplicaSet 和 Pod 的關(guān)系圖可擴展如下:

回滾

通過上文的介紹,已經(jīng)了解應(yīng)用版本與 ReplicaSet 具有一一對應(yīng)關(guān)系,所以如果要回滾版本其實就是使原來的 ReplicaSet 重新擴展 Pod,當前的 ReplicaSet 收縮至 0 個 Pod。

通過 kubectl rollout history 命令查看每次 Deployment 變更對應(yīng)的版本。

kubectl rollout history deployment/k8sdemo-deployment

由于在創(chuàng)建 Deployment 沒有加 –record 參數(shù),所以 CHANGE-CAUSE 都是 none

現(xiàn)在如果需要回滾到版本 1,執(zhí)行以下命令:

kubectl rollout undo deployment/k8sdemo-deployment --to-revision=1

這時 Deployment 控制器還是按 "滾動更新" 的方式,完成對 k8sdemo-deployment 的回滾操作。

故障轉(zhuǎn)移

故障轉(zhuǎn)移主要是指當集群中某個節(jié)點掛了,Pod 會自動轉(zhuǎn)移到其他健康的節(jié)點上。當前的 Pod 分布情況如下:

可以看出 node1 上分配了 2 個 Pod,node2 分配了 1 個 Pod,接下來將 node1 強制關(guān)機,然后當 Kubernetes 檢測到 node1 不可用時,node1 上的 Pod 會變成 Terminating 狀態(tài),并在 node2 上新建,維持可用 Pod 總數(shù)不變。

當 node1 恢復(fù)后,Terminating 狀態(tài)的 Pod 會被自動刪除,不過已經(jīng)轉(zhuǎn)移到 node2 的 Pod 是不會被重新調(diào)度回 node1 的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容