簡體   English   中英

對使用 kubectl 部署的現有資源使用 Helm 3

[英]Use Helm 3 for existing resources deployed with kubectl

我們曾經使用普通的 kubectl 命令來部署 kube.netes 資源,用於服務、部署、configmap 等。 現在我們需要開始使用 Helm 3 並將其集成到我們的管道中,但是當我嘗試運行 helm upgrade 命令時,出現以下錯誤: Error: rendered manifests contain a resource that already exists. Unable to continue with install: existing resource conflict: namespace: default Error: rendered manifests contain a resource that already exists. Unable to continue with install: existing resource conflict: namespace: default

因此,這些資源從未使用 helm 創建,因為它通常是使用 kubcetl apply 命令創建的。

只需要知道如何在管道中使用 Helm 而無需重新創建 k8s 資源。 我發現讓它工作的唯一解決方法是刪除資源並使用 Helm 重新部署它們。

下面是我試過的命令: helm upgrade --atomic --debug --install --force test.

謝謝,阿里

看到 helm3 的這個特性采用正確的實例和管理標簽將資源發布

如果現有資源具有正確的 meta.helm.sh/release-name 和 meta.helm.sh/release-namespace 注釋,並且與 label 匹配,則在嘗試創建目標集群中已存在的資源時,Helm 將不再出錯選擇器 app.kube.netes.io/managed-by=Helm。 這有助於零停機時間遷移到 Helm 3 以管理現有部署,並允許 Helm “采用”它之前創建的現有資源。

為了允許 Helm 采用現有資源,請添加發布元數據和 managed-by label:

KIND=deployment
NAME=my-app-staging
RELEASE=staging
NAMESPACE=default
kubectl -n $NAMESPACE annotate $KIND $NAME meta.helm.sh/release-name=$RELEASE
kubectl -n $NAMESPACE annotate $KIND $NAME meta.helm.sh/release-namespace=$NAMESPACE
kubectl -n $NAMESPACE label $KIND $NAME app.kubernetes.io/managed-by=Helm

老實說,雖然 FL3SH 的答案正是您正在尋找的……最好的選擇是只刪除您的 k8s 資源。 有一些例外:

  1. 您的掌舵圖正在嘗試創建名稱空間(例如默認)
  2. 您的部署在任何時候都不能停機
  3. 您的 helm chart 具有持續的體積聲明

您可以添加所有 helm 標簽/注釋。 您可以使用helm template檢查所有 helm 標簽和花葯組件。 然后你可以使用kubectl labelkubectl annotate添加缺失的標簽/注釋。

我個人從未嘗試過,因為工作量太大,最后,如果它們由 deployment/statefulset 管理,則必須使用新標簽重新創建 pod。

暫無
暫無

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

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