簡體   English   中英

部分推出 Kubernetes Pod

[英]Partially Rollout Kubernetes Pods

我有 1 個節點和 3 個 pod。 我想在三個 pod 中的一個中推出新圖像,而其他 2 個 pod 保留舊圖像。 是否可以?

第二個問題。 我嘗試推出一個包含錯誤的新圖像,並且我已經定義了 maxUnavailable。 但是 kubernetes 仍然推出所有 pod。 我認為一旦 kubernetes 在第一個 pod 中發現錯誤,kubernetes 將停止推出整個 pod。 我們是否需要手動停止發布?

這是我的部署腳本。

# Service setup
apiVersion: v1
kind: Service
metadata:
  name: semantic-service
spec:
  ports:
    - port: 50049
  selector:
    app: semantic
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: semantic-service
spec:
  selector:
    matchLabels:
      app: semantic
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        app: semantic
    spec:
      containers:
      - name: semantic-service
        image: something/semantic-service:v2

正如@David Maze 在評論中所寫的那樣,您可以考慮使用canary ,它可以區分不同版本的部署或具有多個標簽的同一組件的配置,然后跟蹤這些標簽並指向不同的版本,有關Canary deployments更多信息可以在在這里找到。 實現目標的另一種方法是藍/綠部署,以防您想使用兩個盡可能相同的不同環境,並通過全面的方式在藍/綠環境和隨時回滾部署之間切換。

回答第二個問題取決於給定圖像包含的錯誤類型以及 Kubernetes 如何在 Pod 中識別此問題,如maxUnavailable: 1參數表示更新期間可能不可用的最大 Pod 數。 在集群部署控制器內的部署更新過程中,假設可用 Pod 的數量與rollingUpdate策略參數匹配,則創建一個新的 Pod,然后刪除舊的。

此外,Kubernetes 使用活性/就緒探針在部署更新期間檢查 Pod 是否准備好(活動),並使舊 Pod 保持運行狀態,直到probes在新副本上成功。 當部署嘗試跨集群 Pod 推出更新時,我建議檢查probes以識別 Pod 的狀態。

關於問題1:

我有 1 個節點和 3 個 pod。 我想在三個 pod 中的一個中推出新圖像,而其他 2 個 pod 保留舊圖像。 是否可以?

回答:
將您的策略​​中的maxSurge更改為0

replicas: 3
strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1 <------ From the 3 replicas - 1 can be unavailable
      maxSurge: 0       <------ You can't have more then the 3 replicas of pods at a time

關於問題2:

我嘗試推出一個包含錯誤的新圖像,並且我已經定義了 maxUnavailable。 但是 kubernetes 仍然推出所有 pod。 我認為一旦 kubernetes 在第一個 pod 中發現錯誤,kubernetes 將停止推出整個 pod。 我們是否需要手動停止發布?

A )為了讓 kubernetes 停止推出整個 pod - 使用minReadySeconds指定應將創建的 pod 視為ready (使用@Nick_Kh 建議的活性/就緒探針)。
如果其中一個探測在minReadySeconds間隔結束之前失敗,則所有推出將被阻止。

因此,結合maxSurge = 0以及minReadySecondsminReadySeconds / readiness 探針的設置,您可以實現所需的狀態: 3 個 pod:2 個帶有舊圖像,1 個 pod 帶有新圖像

B )在 A 的情況下 - 您不需要手動停止推出。

但如果你必須這樣做,你可以運行:

$ kubectl rollout pause deployment <name>

調試不起作用的 Pod 並采取相關操作。

如果您決定恢復推出,您可以運行:

$ kubectl rollout undo deployment <name> --to-revision=1

(查看修訂: $ kubectl rollout history deployment <name> )。

請注意,在pause發布后,您需要使用以下命令resume它:

$ kubectl rollout resume deployment <name>

即使您決定undo並返回到以前的修訂版。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM