[英]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
以及minReadySeconds
和minReadySeconds
/ 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.