<p>ヘルムのアップグレヌドがspec.clusterIPで倱敗する無効な倀 ""フィヌルドは䞍倉です</p>

䜜成日 2020幎04月20日  Â·  64コメント  Â·  ゜ヌス: helm/helm

ヘルムアップグレヌドを発行するず、次のような゚ラヌが衚瀺されたす「my-service」が「clusterIPNone」から「typeLoadBalancer」にフィヌルドclusterIPなしで倉曎されたす

Error: UPGRADE FAILED: Service "my-service" is invalid: spec.clusterIP: Invalid value: "": field is immutable 

ただし、「my-service」タむプが新しいタむプ「LoadBalancer」に倉曎されないこずを陀いお、新しいバヌゞョンの他のすべおのポッドは匕き続き再起動されたす。

ヘルムが特定のフィヌルドでの倉曎をサポヌトしおいないためにアップグレヌドが倱敗した理由を理解しおいたす。 しかし、なぜヘルムはそれを再起動するこずによっお他のサヌビス/ポッドをアップグレヌドしたす。 アップグレヌド䞭に゚ラヌが発生した堎合、helmは䜕もしたせんか 私は、サヌビスのセット党䜓をパッケヌゞずしお扱い、すべおをアップグレヌドするか、たったくアップグレヌドしないかのいずれかを行うためにhelmを陀倖したしたが、私の期埅は間違っおいるようです。

そしお、もし私たちがそのような状況に陥った堎合、私たちはその状況から抜け出すために䜕をすべきでしょうか 「my-service」を新しいタむプにアップグレヌドする方法のように

たた、-dry-runオプションを䜿甚するず、helmに゚ラヌが衚瀺されたせん。

これはバグず芋なされたすか、それずも予想されたすか。぀たり、アップグレヌドによっお゚ラヌがスロヌされたすが、䞀郚のサヌビスはアップグレヌドされたす。

helm version出力

Client: &version.Version{SemVer:"v2.12.3", GitCommit:"eecf22f77df5f65c823aacd2dbd30ae6c65f186e", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}

kubectl version出力

Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:36:53Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.27", GitCommit:"145f9e21a4515947d6fb10819e5a336aff1b6959", GitTreeState:"clean", BuildDate:"2020-02-21T18:01:40Z", GoVersion:"go1.12.12b4", Compiler:"gc", Platform:"linux/amd64"}

クラりドプロバむダヌ/プラットフォヌムAKS、GKE、Minikubeなど
GKEずミンクベ

最も参考になるコメント

参考たでに、OPによっお提起された問題ず、ここで提起された--forceに関するコメントは、個別の個別の問題です。 ここでOPの問題に焊点を圓おおみたしょう。

明確にするために、OPが説明しおいる問題は、 https //github.com/helm/helm/issues/7956#issuecomment-620749552で特定された朜圚的なリグレッション@ n1kooです。 それは正圓なバグのようです。

圌らのために働いおいる--forceの削陀に蚀及しおいる他のコメントは、Kubernetesの芳点から意図的で予想される動䜜です。 --forceを䜿甚するず、HelmにKubernetesに察しおPUTリク゚ストを行うように芁求したす。 事実䞊、Kubernetesにタヌゲットマニフェストチャヌトでhelm upgradeからレンダリングされたテンプレヌトを真理の゜ヌスずしお取埗し、クラスタヌ内のリ゜ヌスをレンダリングされたマニフェストで䞊曞きするように芁求しおいたす。 これはkubectl apply --overwriteず同じです。

ほずんどの堎合、テンプレヌトはクラスタヌIPを指定しおいたせん。぀たり、 helm upgrade --forceはサヌビスのクラスタヌIPを削陀たたは倉曎するように芁求しおいたす。 これは、Kubernetesの芳点からは違法な操䜜です。

これは7082にも蚘茉されおいたす。

これが--force削陀が機胜する理由でもありたす。HelmはPATCH操䜜を行い、ラむブ状態ずは異なり、クラスタヌIPをパッチ適甚されたマニフェストにマヌゞし、アップグレヌド埌もクラスタヌIPを保持したす。

Helm 2で行われたように、オブゞェクトを匷制的に削陀しお再䜜成する堎合は、7431を参照しおください。

これが物事を明らかにするこずを願っおいたす。

今埌は、ここでOPの問題に焊点を圓おおみたしょう。

党おのコメント64件

再珟するのに十分な情報が提䟛されおいたせん。 再珟可胜なチャヌトの䜜成方法ず、䜿甚したHelmコマンドを教えおください。

こんにちは、ここに再珟手順がありたす
以䞋のように2぀のサヌビスyamlファむルがありたす。

nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

prometheus.yaml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: prometheus
spec:
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - image: prom/prometheus
        name: prometheus
        ports:
        - containerPort: 9090
        imagePullPolicy: Always
      hostname: prometheus
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
spec:
  selector:
    app: prometheus
  clusterIP: None
  ports:
  - name: headless
    port: 9090
    targetPort: 0

次に、helm1 / templates /に2぀のファむルを配眮しおむンストヌルしたす。 これは、prometheusサヌビスがclusterIPを䜿甚し、nginxバヌゞョンが1.14.2であるこずを瀺しおいたす

# helm upgrade --install test helm1
Release "test" does not exist. Installing it now.
NAME: test
LAST DEPLOYED: Tue Apr 21 20:42:55 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP    35d
prometheus   ClusterIP   None         <none>        9090/TCP   7s

# kubectl describe deployment nginx |grep Image
    Image:        nginx:1.14.2

次に、nginx.yamlのセクションを新しいバヌゞョン1.16に曎新したす

        image: nginx:1.16

そしおprometheus.yamlをLoadBalancerに倉曎したす。

spec:
  selector:
    app: prometheus
  ports:
  - name: "9090"
    port: 9090
    protocol: TCP
    targetPort: 9090
  type: LoadBalancer

次に、それらをhelm2ずしお配眮し、アップグレヌドを実行したす。 次に、アップグレヌドでいく぀かの゚ラヌがスロヌされるこずがわかりたすが、nginxサヌビスは新しいバヌゞョンにアップグレヌドするこずで通過したすが、プロメテりスはただクラスタヌIPを䜿甚しおいるため、アップグレヌドされたせん。

# helm upgrade --install test helm2
Error: UPGRADE FAILED: cannot patch "prometheus" with kind Service: Service "prometheus" is invalid: spec.clusterIP: Invalid value: "": field is immutable

# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP    35d
prometheus   ClusterIP   None         <none>        9090/TCP   5m34s

# kubectl describe deployment nginx |grep Image
    Image:        nginx:1.16

ヘルムリストは

# helm list
NAME    NAMESPACE   REVISION    UPDATED                                 STATUS  CHART                                       APP VERSION
test    default     2           2020-04-21 20:48:20.133644429 -0700 PDT failed  

ヘルムの歎史

# helm history test
REVISION    UPDATED                     STATUS      CHART       APP VERSION DESCRIPTION                                                                                                                                               
1           Tue Apr 21 20:42:55 2020    deployed    helm-helm   1.0.0.6     Install complete                                                                                                                                          
2           Tue Apr 21 20:48:20 2020    failed      helm-helm   1.0.0.6     Upgrade "test" failed: cannot patch "prometheus" with kind Service: Service "prometheus" is invalid: spec.clusterIP: Invalid value: "": field is immutable

v3.2.0でも同じ動䜜があり、v3.1.3ぞのダりングレヌドは䞀時的な修正です

Helm 2-> 3の移行で、これがたくさんありたす。 倉換されたリリヌスを初めおアップグレヌドしようずするず、これがたくさん発生したす。 これは、これたでのNginx Ingress、Prometheus Operator、Graylog、およびJaegerチャヌト甚です。 それらのほずんどは、サヌビスを削陀しおHelmに再䜜成させるだけで満足しおいたすが、NginxIngressの堎合これはオプションではありたせん...

私の堎合の問題を説明しおいるこのhttps://github.com/helm/helm/issues/6378#issuecomment-557746499を芋぀けたした。

6378の耇補ずしお締めくくりたす。 @cablespaghettiは、この動䜜のより深い説明を芋぀けたした。これは非垞に詳现に説明されおいたす。

それがうたくいかない堎合はお知らせください。

@GaramNickなぜダりングレヌドでこれが修正されるのですか ダりングレヌドによっお修正された「䜕」に぀いお詳しく説明しおいただけたすか

@bacongobblerあなたがここにいる間。 リリヌスを削陀しお再デプロむせずにこの状況を修正する方法はありたすか ヘルム2たたは3でそれを行う方法はないようです。既存のリリヌスデヌタをハックしたいので、ヘルムはclusterIPが垞に省略されおいるず考え、パッチは必芁ありたせん。

kubectl editを詊したしたか

同じ問題があり、 3.1.3ダりングレヌドするず、問題が修正されたした。 私の掚枬では、これはCreateであり、曎新ではなく、空に蚭定しようずしおいるこずを考慮しお、 https//github.com/helm/helm/pull/7649/commits/d829343c1514db17bee7a90624d06cdfbffde963の新しいロゞックに関係しおいるず思いたす。 IPず入力されたものを再利甚しない

興味深い発芋。 調査しおいただきありがずうございたす。

@jlegroneこれを調べる時間があるかもしれたせんか

@bacongobbler CI / CDパむプラむンは、Helmを䜿甚しお、ClusterIPタむプのサヌビスを含むアプリケヌションを曎新したす。 コマンド

helm upgrade --install --force \
        --wait \
        --set image.repository="$CI_REGISTRY_IMAGE" \
        --set image.tag="$CI_COMMIT_REF_NAME-$CI_COMMIT_SHA" \
        --set image.pullPolicy=IfNotPresent \
        --namespace="$KUBE_NAMESPACE" \
        "$APP_NAME" \
        ./path/to/charts/

v3.2.0では、このコマンドはService "service-name" is invalid: spec.clusterIP: Invalid value: "": field is immutable倱敗したす

v3.1.3では、これは正垞に機胜したす。

さらに詳しい情報が必芁な堎合はお知らせください。

こっちも䞀緒。 次のservice.yamlがhelm2で䜕ヶ月も正垞に動䜜しおいたした。
移行埌、helm 3.2 helm upgradeコマンドが䞊蚘の保存゚ラヌで倱敗したした。 3.1.3にダりングレヌドするず解決したした。

apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.global.name }}
  namespace: {{ index .Values.global.namespace .Values.global.env }}
  labels:
     microservice: {{ .Values.global.name }}
spec:
   type: ClusterIP
   ports:
   - port: 8080
   selector:
      microservice: {{ .Values.global.name }}

同じ問題があり、3.1.3にダりングレヌドするず修正されたした。 私の掚枬では、これは曎新ではなく䜜成であり、空のIPを蚭定しようずし、入力されたIPを再利甚しないこずを考慮しお、d829343の新しいロゞックに関係しおいるず思いたす。

@ n1kooこれが問題の原因であるず思う理由を説明できたすか これはむンストヌルコヌドであり、アップグレヌドコヌドではないため、3.1のcreateあり、機胜したす。

@adamreeseで問題を確認しおいたすが、 @ n1kooが特定したパッチであるず_ 。 Createメ゜ッドは、サヌビスの通垞の3方向差分をバむパスしたす。これにより、サヌビスのclusterIPがKubernetesによっお入力された倀ではなく「」に蚭定されたす。 その結果、APIサヌバヌに送信されたマニフェストはクラスタヌIPをリセットしおいるように芋えたすが、これはサヌビスでは違法ですナヌザヌが意図したものではありたせん。

これに぀いおはただ調査䞭です。詳现がわかり次第、曎新したす。

したがっお、 https //github.com/helm/helm/issues/6378#issuecomment-557746499は正しいです。 この問題を続行する前に、それをお読みください。 clusterIP: ""が蚭定されおいる堎合、KubernetesはIPを割り圓おたす。 次のHelmアップグレヌドで、 clusterIP:""再床実行するず、IPをリセットしようずしおいるように芋えるため、䞊蚘の゚ラヌが発生したす。 はい、Kubernetesはサヌビスのspec:セクションを倉曎したす

Createメ゜ッドが3方向の差分をバむパスする堎合、Kubernetesによっお割り圓おられたIPアドレスに蚭定する代わりに、 clusterIP: ""を蚭定したす。

再珟するには

$ helm create issue7956
$ # edit issue7956/templates/service.yaml and add `clusterIP: ""` under `spec:`
$ helm upgrade --install issue7956 issue7956
...
$ helm upgrade issue7956 issue7956
Error: UPGRADE FAILED: cannot patch "issue-issue7956" with kind Service: Service "issue-issue7956" is invalid: spec.clusterIP: Invalid value: "": field is immutable

2回目にアップグレヌドを実行するず、倱敗したす。

@IdanAdarのケヌスをmaster再珟できたせん。

@GaramNickは、゚ラヌを再珟するために䜿甚しおいるサヌビスに関する十分な情報がありたせん。

私の状況
version.BuildInfo{Version:"v3.2.0", GitCommit:"e11b7ce3b12db2941e90399e874513fbd24bcb71", GitTreeState:"clean", GoVersion:"go1.13.10"}
たた、w /でテスト枈み
version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}

次のサヌビステンプレヌトが䞎えられたす。

apiVersion: v1
kind: Service
metadata:
  name: {{ include "app.fullname" . }}
  labels:
    {{- include "app.labels" . | nindent 4 }}
  annotations:
    getambassador.io/config: |
      ---
      apiVersion: ambassador/v1
      kind: Mapping
      name: {{ include "app.fullname" . }}_mapping
      prefix: /{{ include "app.fullname" . }}
      host: "^{{ include "app.fullname" . }}.*"
      host_regex: true
      service: {{ include "app.fullname" . }}.{{ .Release.Namespace }}
      rewrite: ""
      timeout_ms: 60000
      bypass_auth: true
      cors:
        origins: "*"
        methods: POST, GET, OPTIONS
        headers:
        - Content-Type
        - Authorization
        - x-client-id
        - x-client-secret
        - x-client-trace-id
        - x-flow-proto
      ---
      apiVersion: ambassador/v1
      kind: Mapping
      name: {{ include "app.fullname" . }}_swagger_mapping
      ambassador_id: corp
      prefix: /swagger
      host: "^{{ include "app.fullname" . }}.corp.*"
      host_regex: true
      service: {{ include "app.fullname" . }}.{{ .Release.Namespace }}
      rewrite: ""
      bypass_auth: true
      cors:
        origins: "*"
        methods: POST, GET, OPTIONS
        headers:
        - Content-Type
        - x-client-id
        - x-client-secret
        - Authorization
        - x-flow-proto
  namespace: {{ .Release.Namespace }}
spec:
  type: {{ .Values.service.type }}
  selector:
    {{- include "app.selectorLabels" . | nindent 4 }}
  ports:
  - port: {{ .Values.service.port }}
    name: http-rest-hub
    targetPort: http-rest
  - port: {{ .Values.service.healthPort }}
    name: http-health
    targetPort : http-health

これにより、 upgrade --install埌に次のようになりたす。

apiVersion: v1
kind: Service
metadata:
  annotations:
    getambassador.io/config: |
      ---
      apiVersion: ambassador/v1
      kind: Mapping
      name: hub-alt-bor_mapping
      prefix: /hub-alt-bor
      host: "^hub-alt-bor.*"
      host_regex: true
      service: hub-alt-bor.brett
      rewrite: ""
      timeout_ms: 60000
      bypass_auth: true
      cors:
        origins: "*"
        methods: POST, GET, OPTIONS
        headers:
        - Content-Type
        - Authorization
        - x-client-id
        - x-client-secret
        - x-client-trace-id
        - x-flow-proto
      ---
      apiVersion: ambassador/v1
      kind: Mapping
      name: hub-alt-bor_swagger_mapping
      ambassador_id: corp
      prefix: /swagger
      host: "^hub-alt-bor.corp.*"
      host_regex: true
      service: hub-alt-bor.brett
      rewrite: ""
      bypass_auth: true
      cors:
        origins: "*"
        methods: POST, GET, OPTIONS
        headers:
        - Content-Type
        - x-client-id
        - x-client-secret
        - Authorization
        - x-flow-proto
    meta.helm.sh/release-name: alt-bor
    meta.helm.sh/release-namespace: brett
  creationTimestamp: ...
  labels:
    app: hub
    app.kubernetes.io/instance: alt-bor
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: hub
    app.kubernetes.io/version: v1.6.0-rc.26
    deploy.xevo.com/stackname: bor-v0.1-test
    helm.sh/chart: hub-0.0.4
    owner: gateway
    ownerSlack: TODOunknown
  name: hub-alt-bor
  namespace: brett
  resourceVersion: ...
  selfLink: ...
  uid: ...
spec:
  clusterIP: 172.20.147.13
  ports:
  - name: http-rest-hub
    port: 80
    protocol: TCP
    targetPort: http-rest
  - name: http-health
    port: 90
    protocol: TCP
    targetPort: http-health
  selector:
    app.kubernetes.io/instance: alt-bor
    app.kubernetes.io/name: hub
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

次に、バヌゞョン0.0.5およびupgrade --installずたったく同じチャヌトを再床アップロヌドするず、次のようになりたす。
Error: UPGRADE FAILED: failed to replace object: Service "hub-alt-bor" is invalid: spec.clusterIP: Invalid value: "": field is immutable

唯䞀の違いは、 helm.sh/chartラベルの倀であり、珟圚はhub-0.0.5倀になっおいたす。

これは巚倧なブロッカヌです。

@GaramNickは、゚ラヌを再珟するために䜿甚しおいるサヌビスに関する十分な情報がありたせん。

@technosophos䜕が必芁ですか 詳现をお知らせしたす。

曎新 helm upgrade --install w / --forceを䜿甚しおいる堎合にのみ、曎新は倱敗したす。 ブロッカヌが枛りたした。

ああ それは面癜いね。 これにより、゚ラヌの远跡が容易になりたす。

こんにちは@ technosophos @ bacongobbler同じ2぀の問題がありたす

version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}

  1. 問題
    clusterIPないServiceテンプレヌトがありたすが、kubernetesはclusterIP自動的に割り圓おたす。
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
  labels:
    app: {{ .Values.image.name }}
    release: {{ .Release.Name }}
spec:
  type: ClusterIP
  ports:
    - port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.port }}
      protocol: TCP
      name: http
  selector:
    app: {{ .Values.image.name }}
    release: {{ .Release.Name }}

helm 2to3 convertを䜿甚しおhelm 3に移行した埌、同じリリヌスhelm3 upgrade --install --forceアップグレヌドしおみおください。

failed to replace object: Service "dummy-stage" is invalid: spec.clusterIP: Invalid value: "": field is immutable

--forceなしで同じこずをする堎合-> helm3 upgrade --install゚ラヌなしで正垞に動䜜したす。

  1. 問題
    --forceない䞍倉フィヌルドであるDeploymentのspec.selector.matchLabelsを倉曎したい堎合、゚ラヌが発生したす。
cannot patch "dummy-stage" with kind Deployment: Deployment.apps "dummy-stage" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/name":"web-nerf-dummy-app"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

--force同じこずをするず、゚ラヌが発生したす。

failed to replace object: Deployment.apps "dummy-stage" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/name":"web-nerf-dummy-app"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

--forceに察しおhelm 2ず同じ動䜜を実装するこずは可胜ですか゚ラヌなしで䞍倉のファむルをアップグレヌドできるからですか

apiVersion: v1
kind: Service
metadata:
  name: zipkin-proxy
  namespace: monitoring
spec:
  ports:
  - port: 9411
    targetPort: 9411
  selector:
    app: zipkin-proxy
  type: ClusterIP

---

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: zipkin-proxy
  namespace: monitoring
spec:
  replicas: {{ .Values.zipkinProxy.replicaCount }}
  template:
    metadata:
      labels:
        app: zipkin-proxy
      annotations:
        prometheus.io/scrape: 'true'
    spec:
      containers:
      - image: {{ .Values.image.repository }}/zipkin-proxy
        name: zipkin-proxy
        env:
        - name: STORAGE_TYPE
          value: stackdriver

helm upgrade -i --debug --force --namespace monitoring zipkin-proxy --values ./values.yaml.tmp .

forceオプションを削陀しおみたした。 v3.1.3、v3.2.0、v3.2.1でも同じ問題を詊したした。

スタックトレヌス

history.go:52: [debug] getting history for release zipkin-proxy
upgrade.go:84: [debug] preparing upgrade for zipkin-proxy
upgrade.go:92: [debug] performing update for zipkin-proxy
upgrade.go:234: [debug] creating upgraded release for zipkin-proxy
client.go:163: [debug] checking 2 resources for changes
client.go:195: [debug] error updating the resource "zipkin-proxy":
         cannot patch "zipkin-proxy" with kind Service: Service "zipkin-proxy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
client.go:403: [debug] Looks like there are no changes for Deployment "zipkin-proxy"
upgrade.go:293: [debug] warning: Upgrade "zipkin-proxy" failed: cannot patch "zipkin-proxy" with kind Service: Service "zipkin-proxy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Error: UPGRADE FAILED: cannot patch "zipkin-proxy" with kind Service: Service "zipkin-proxy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm.go:75: [debug] cannot patch "zipkin-proxy" with kind Service: Service "zipkin-proxy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm.sh/helm/v3/pkg/kube.(*Client).Update
        /home/circleci/helm.sh/helm/pkg/kube/client.go:208
helm.sh/helm/v3/pkg/action.(*Upgrade).performUpgrade
        /home/circleci/helm.sh/helm/pkg/action/upgrade.go:248
helm.sh/helm/v3/pkg/action.(*Upgrade).Run
        /home/circleci/helm.sh/helm/pkg/action/upgrade.go:93
main.newUpgradeCmd.func1
        /home/circleci/helm.sh/helm/cmd/helm/upgrade.go:137
github.com/spf13/cobra.(*Command).execute
        /go/pkg/mod/github.com/spf13/[email protected]/command.go:826
github.com/spf13/cobra.(*Command).ExecuteC
        /go/pkg/mod/github.com/spf13/[email protected]/command.go:914
github.com/spf13/cobra.(*Command).Execute
        /go/pkg/mod/github.com/spf13/[email protected]/command.go:864
main.main
        /home/circleci/helm.sh/helm/cmd/helm/helm.go:74
runtime.main
        /usr/local/go/src/runtime/proc.go:203
runtime.goexit
        /usr/local/go/src/runtime/asm_amd64.s:1357
UPGRADE FAILED
main.newUpgradeCmd.func1
        /home/circleci/helm.sh/helm/cmd/helm/upgrade.go:139
github.com/spf13/cobra.(*Command).execute
        /go/pkg/mod/github.com/spf13/[email protected]/command.go:826
github.com/spf13/cobra.(*Command).ExecuteC
        /go/pkg/mod/github.com/spf13/[email protected]/command.go:914
github.com/spf13/cobra.(*Command).Execute
        /go/pkg/mod/github.com/spf13/[email protected]/command.go:864
main.main
        /home/circleci/helm.sh/helm/cmd/helm/helm.go:74
runtime.main
        /usr/local/go/src/runtime/proc.go:203
runtime.goexit
        /usr/local/go/src/runtime/asm_amd64.s:1357

Helm Chartのバヌゞョンが倉曎され、既存の展開がある堎合、この問題が発生したす。

HelmV3.2.0の䜿甚

3.1.2ぞのダりングレヌドが機胜するこずを確認できたす。

@ gor181どうすればそれを再珟できたすか 3.2で壊れたが、3.1で動䜜したものは䜕ですか チャヌトたたは少なくずもsvcテンプレヌトずコマンドは、䜕が倉曎されたかを把握できるようにするために必芁なものです。

@azarudeena @ alexandrsemak-䞡方にずっお、 --forceフラグがこれを匕き起こしおいる原因です。 --forceを削陀した堎合、アップグレヌドは機胜したすか

@technosophosは力なしで詊したしたが機胜したせんでした。 3.1.2で詊すこずを蚈画しおいる

@azarudeena問題を再珟するための䞀連の手順を提䟛しおいただけたすか サヌビスずデプロむメントテンプレヌトの出力をいく぀か瀺したしたが、出力がわからないvalues.yaml.tmpもChart.yamlも参照したした。

問題を再珟するために䜿甚できるサンプルチャヌトを提䟛しおいただけたすか

@bacongobbler構造を共有しおいたす。

Chart.yaml

apiVersion: v1
description: Deploys Stackdriver Trace Zipkin Proxy
name: zipkin-proxy
version: 1.0.0

テンプレヌトyamlを䞊に配眮したした。

私の倀yaml.tmpは以䞋の通りです

zipkinProxy:
  replicaCount: 1

image:
  repository: openzipkin/zipkin

ヘルムパッケヌゞずしおパッケヌゞ化したす--versionアップグレヌドで同じものを䜿甚したす。 これが機胜するかどうか教えおください。 3.1.2で詊しおみたら、ここで曎新したす

線集

3.1.2および3.1.1にダりングレヌドしおみたした。 ただこれにパッチを圓おるこずはできたせん。

私は同じ問題に盎面したしたが、テラフォヌムヘルムプロバむダヌを介しおヘルムチャヌトをアップグレヌドしたした。
force_update = trueをforce_update = false埌、゚ラヌはなくなりたした。

Helm Chartのバヌゞョンが倉曎され、既存の展開がある堎合、この問題が発生したす。

HelmV3.2.0の䜿甚

--forceフラグを無効にするず機胜したす。

@technosophos --force 、helm3に移行するずきにClusterIPの問題を解決したす。helm2はhelm3がアップグレヌドするずきにClusterIPをアップグレヌドしようずしないためです。
Helm 3は、 matchLabelsずしお提出された䞍倉の問題を解決できたせん

Kubernetesはサヌビスのspec:セクションを倉曎したす

これは、根本的なKubernetesの蚭蚈䞊の欠陥ず芋なす必芁がありたすか https://kubernetes.io/docs/concepts/services-networking/service/#choosing -your-own-ip-addressは、この動䜜に぀いお蚀及しおいたせん。 割り圓おられた倀がstatusセクションに配眮されるこずを期埅しおいたした。

 Podの.spec.nodeNameにも同様の動䜜がありたすが、Helmナヌザヌに圱響を䞎える可胜性はほずんどありたせん。

v3.2.3-forceで倱敗し、-forceなしで枡されたす。 チャヌトテンプレヌトにClusterIP:がありたせん。 https://github.com/helm/helm/pull/8000/filesで修正されるはずだったず思い

upgrade.go:121: [debug] preparing upgrade for eos-eve-srv-d1
upgrade.go:129: [debug] performing update for eos-eve-srv-d1
upgrade.go:308: [debug] creating upgraded release for eos-eve-srv-d1
client.go:173: [debug] checking 6 resources for changes
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode" with kind ServiceAccount for kind ServiceAccount
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode-imagepullsecret" with kind Secret for kind Secret
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode-config" with kind ConfigMap for kind ConfigMap
client.go:205: [debug] error updating the resource "eos-eve-srv-d1-fsnode":
         failed to replace object: Service "eos-eve-srv-d1-fsnode" is invalid: spec.clusterIP: Invalid value: "": field is immutable
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode" with kind Deployment for kind Deployment
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode" with kind Ingress for kind Ingress
upgrade.go:367: [debug] warning: Upgrade "eos-eve-srv-d1" failed: failed to replace object: Service "eos-eve-srv-d1-fsnode" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Error: UPGRADE FAILED: failed to replace object: Service "eos-eve-srv-d1-fsnode" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm.go:84: [debug] failed to replace object: Service "eos-eve-srv-d1-fsnode" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm.sh/helm/v3/pkg/kube.(*Client).Update
        /private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/pkg/kube/client.go:218
helm.sh/helm/v3/pkg/action.(*Upgrade).performUpgrade
        /private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/pkg/action/upgrade.go:322
helm.sh/helm/v3/pkg/action.(*Upgrade).Run
        /private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/pkg/action/upgrade.go:130
main.newUpgradeCmd.func1
        /private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/cmd/helm/upgrade.go:144
github.com/spf13/cobra.(*Command).execute
        /private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:842
github.com/spf13/cobra.(*Command).ExecuteC
        /private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:950
github.com/spf13/cobra.(*Command).Execute
        /private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:887
main.main
        /private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/cmd/helm/helm.go:83
runtime.main
        /usr/local/Cellar/[email protected]/1.13.12/libexec/src/runtime/proc.go:203
runtime.goexit
        /usr/local/Cellar/[email protected]/1.13.12/libexec/src/runtime/asm_amd64.s:1357
UPGRADE FAILED
main.newUpgradeCmd.func1
        /private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/cmd/helm/upgrade.go:146
github.com/spf13/cobra.(*Command).execute
        /private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:842
github.com/spf13/cobra.(*Command).ExecuteC
        /private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:950
github.com/spf13/cobra.(*Command).Execute
        /private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:887
main.main
        /private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/cmd/helm/helm.go:83
runtime.main
        /usr/local/Cellar/[email protected]/1.13.12/libexec/src/runtime/proc.go:203
runtime.goexit
        /usr/local/Cellar/[email protected]/1.13.12/libexec/src/runtime/asm_amd64.s:1357

私はこの問題を3.2.3芳察しおいたすが、 3.2.0芳察しおいたせん。 力を無効にするこずも、䜿甚可胜な回避策でした。

参考たでに、OPによっお提起された問題ず、ここで提起された--forceに関するコメントは、個別の個別の問題です。 ここでOPの問題に焊点を圓おおみたしょう。

明確にするために、OPが説明しおいる問題は、 https //github.com/helm/helm/issues/7956#issuecomment-620749552で特定された朜圚的なリグレッション@ n1kooです。 それは正圓なバグのようです。

圌らのために働いおいる--forceの削陀に蚀及しおいる他のコメントは、Kubernetesの芳点から意図的で予想される動䜜です。 --forceを䜿甚するず、HelmにKubernetesに察しおPUTリク゚ストを行うように芁求したす。 事実䞊、Kubernetesにタヌゲットマニフェストチャヌトでhelm upgradeからレンダリングされたテンプレヌトを真理の゜ヌスずしお取埗し、クラスタヌ内のリ゜ヌスをレンダリングされたマニフェストで䞊曞きするように芁求しおいたす。 これはkubectl apply --overwriteず同じです。

ほずんどの堎合、テンプレヌトはクラスタヌIPを指定しおいたせん。぀たり、 helm upgrade --forceはサヌビスのクラスタヌIPを削陀たたは倉曎するように芁求しおいたす。 これは、Kubernetesの芳点からは違法な操䜜です。

これは7082にも蚘茉されおいたす。

これが--force削陀が機胜する理由でもありたす。HelmはPATCH操䜜を行い、ラむブ状態ずは異なり、クラスタヌIPをパッチ適甚されたマニフェストにマヌゞし、アップグレヌド埌もクラスタヌIPを保持したす。

Helm 2で行われたように、オブゞェクトを匷制的に削陀しお再䜜成する堎合は、7431を参照しおください。

これが物事を明らかにするこずを願っおいたす。

今埌は、ここでOPの問題に焊点を圓おおみたしょう。

既知の回避策はありたすか https://github.com/helm/charts/tree/master/stable/rabbitmq-haを1.34.1から1.46.4にアップグレヌドしようずしたずきに、同じ問題に盎面したした。 明らかに、 --forceたたはヘルムの3.1.3ぞのダりングレヌドは圹に立ちたせんでした。問題のサヌビスを削陀するず、 helm upgradeが圹に立ちたした。

@EvgeniGordeevこれは、わずかなダりンタむムでうたくいった

これもnginxincのむングレスチャヌトでヒットしたした。 通垞は--forceを䜿甚したす。

この問題はただ開いおいるので、これに察凊するための䜕らかの修正の蚈画はありたすか、それずもこれは蚭蚈どおりに機胜しおいるず芋なされたすかこれず同じ動䜜で開かれた他の問題ず区別するのは難しいです これはチャヌト自䜓の問題であり、 clusterIP: ""は䜿甚せず、代わりに倀を完党に省略する必芁があるずいう説明を1぀読みたした。

これは、チャヌト開発者ず䞀緒に远いかけるべきものですか

@ cdunford-提案されたhttps://github.com/helm/helm/issues/7956#issuecomment-643432099のように、 --force䜿甚を停止するように修正するこずを提案したした。

このPRは、この問題にも察凊できたす7431そのコメントでも提案されおいたす...

この問題はN回発生し、パむプラむンでも--forceフラグを䜿甚しおいたす。

元の問題はhelm2に付随しおいたので、helm2でも修正されたすか @bacongobbler

@bacongobbler 「力」を提䟛するこずは、それを取り陀くかダりングレヌドするこずが圹立぀堎合、なぜ問題ずは異なるず蚀うのですか

぀たり、Helm 3.3.4、 https//artifacthub.io/packages/helm/bitnami/nginxチャヌトで問題が発生したばかりで、倀は倉曎されおいたせん。 GCP / GKE、Azure / AKS、AWS / EKSの3぀の異なるクラりドでテストされたしたが、3぀すべおで倱敗したした。

Helmを3.1.3にダりングレヌドした盎埌に動䜜し、「-force」フラグなしで3.3.4にも動䜜したした。

以前のコメントで、ナヌザヌにこの゚ラヌが衚瀺される可胜性のある2぀の別個の固有のケヌスがあるこずをかなり明確にしたず思いたした。 1぀はOPの堎合です。 もう1぀は、-forceの䜿甚によるものです。 ここではOPの問題に焊点を圓おおいたす。

OPず同じ問題が発生しおいる人々を尊重するため、このスレッドのハむゞャックをやめお--forceに぀いお話しおください。 OPの問題を解決する方法に぀いお話し合っおいたす。 OPが説明した問題ずは関係のないトピックに぀いお話したい堎合は、新しいチケットを開くか、以前に行った提案を確認しおください。

ヘルム2のこれを修正するこずに関しお@tibetsam いいえ。 Helm 2のバグ修正は提䟛されなくなりたした。詳现に぀いおは、 https//helm.sh/blog/helm-v2-deprecation-timeline/を参照しおください。

ゞュピサヌハブヘルムチャヌトでOPの問題を再珟できたず思いたす。
うたくいけば、以䞋の手順で、問題を再珟するこずができたす。


重芁
Jupyterhubヘルムチャヌトのサヌビス仕様にはspec.clusterIPフィヌルドが含たれおいたせん。これは、たずえば、 https  たす。 /jupyterhub/templates/hub/service.yaml#L17 -L29


私は問題を再珟するために舵ず皮類を䜿甚しおいたす

➜ helm version
version.BuildInfo{Version:"v3.4.0", GitCommit:"7090a89efc8a18f3d8178bf47d2462450349a004", GitTreeState:"clean", GoVersion:"go1.14.10"}

➜ kind version
kind v0.9.0 go1.15.2 linux/amd64

➜ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:56:40Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.1", GitCommit:"206bcadf021e76c27513500ca24182692aabd17e", GitTreeState:"clean", BuildDate:"2020-09-14T07:30:52Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}

再珟する方法

  1. 新しい皮類のクラスタヌを䜜成する
kind create cluster
  1. 次のコンテンツランダムに生成された16進数を含むconfig.yamlずいうファむルを䜜成したす。
proxy:
  secretToken: "3a4bbf7405dfe1096ea2eb9736c0df299299f94651fe0605cfb1c6c5700a6786"

参考たでに、ヘルムファむルのむンストヌル手順に埓っおいたすリンク

  1. ヘルムリポゞトリを远加する
helm repo add jupyterhub https://jupyterhub.github.io/helm-chart/
helm repo update
  1. チャヌトをむンストヌルしたす --forceオプション付き
RELEASE=jhub
NAMESPACE=jhub

helm upgrade --cleanup-on-fail --force \
  --install $RELEASE jupyterhub/jupyterhub \
  --namespace $NAMESPACE \
  --create-namespace \
  --version=0.9.0 \
  --values config.yaml
  1. 手順5を繰り返したす

゚ラヌ

Error: UPGRADE FAILED: failed to replace object: PersistentVolumeClaim "hub-db-dir" is invalid: spec: Forbidden: spec is immutable after creation except resources.requests for bound claims
  core.PersistentVolumeClaimSpec{
        AccessModes:      []core.PersistentVolumeAccessMode{"ReadWriteOnce"},
        Selector:         nil,
        Resources:        core.ResourceRequirements{Requests: core.ResourceList{s"storage": {i: resource.int64Amount{value: 1073741824}, s: "1Gi", Format: "BinarySI"}}},
-       VolumeName:       "",
+       VolumeName:       "pvc-c614de5c-4749-4755-bd3a-6e603605c44e",
-       StorageClassName: nil,
+       StorageClassName: &"standard",
        VolumeMode:       &"Filesystem",
        DataSource:       nil,
  }
 && failed to replace object: Service "hub" is invalid: spec.clusterIP: Invalid value: "": field is immutable && failed to replace object: Service "proxy-api" is invalid: spec.clusterIP: Invalid value: "": field is immutable && failed to replace object: Service "proxy-public" is invalid: spec.clusterIP: Invalid value: "": field is immutable

私は舵取り3.3.4にいたすが、これはただ問題です

Helm 2.14.1の問題は、 --forceなしのいずれかで発生したす

回避策 type.spec: NodePort切り替えるず、ヘルムチャヌトのアップグレヌドが修正されたした。

--forceフラグを䜿甚したv3.4.1でも同じ問題が発生したす。

@bacongobbler OPの問題6378ずは別がハむゞャックされないように

゚ラヌメッセヌゞ「゚ラヌアップグレヌドに倱敗したした _replace_ ...に倱敗し_-- forceを

゚ラヌメッセヌゞ「゚ラヌアップグレヌドに倱敗したした _patch_できたせ䜿甚しおいたせんか 再珟方法をこの号に投皿しおください。

@zpittmansf

helm3 upgrade concourse concourse/concourse -f temp.yaml  --force
Error: UPGRADE FAILED: failed to replace object: Service "concourse-web" is invalid: spec.clusterIP: Invalid value: "None": field is immutable && failed to replace object: Service "concourse-web-prometheus" is invalid: spec.clusterIP: Invalid value: "": field is immutable && failed to replace object: Service "concourse-web-worker-gateway" is invalid: spec.clusterIP: Invalid value: "": field is immutable

helm3 upgrade concourse concourse/concourse -f temp.yaml
Error: UPGRADE FAILED: cannot patch "concourse-web" with kind Service: Service "concourse-web" is invalid: spec.clusterIP: Invalid value: "None": field is immutable

Helm3.4.2でも同じ問題が発生しおいたす。 デプロむメント、サヌビスアカりント、およびサヌビスを䜜成するヘルムチャヌトを実行したす。 展開時にチャヌトの既存のラベルセットにラベルを远加したしたが、アップグレヌドを拒吊したした。

helm upgrade test-whale charts/app-template/ --install --values values.yaml --namespace whale --force
Error: UPGRADE FAILED: failed to replace object: Service "test-whale" is invalid: spec.clusterIP: Invalid value: "": field is immutable && failed to replace object: Deployment.apps "test-whale-canary" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"test-whale", "app-id":"302040", "environment":"test", "version":"latest"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable && failed to replace object: Deployment.apps "test-whale" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"test-whale", "app-id":"302040", "environment":"test", "version":"latest"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

基本的に、最初のヘルム展開を超えおラベルを远加するこずはできないようです。

ひどいように聞こえたすが、Helmは特別な扱いを受ける「䞍倉フィヌルド」のリストを実装できたすか

この堎合、「䞍倉フィヌルド」はサヌビスオブゞェクトのspec.clusterIP -Helmはそれを䞍倉ず芋なし、a眮き換えを詊みない、b削陀を詊みないようなAPIリク゚ストを生成したす。 、c曎新しようずしないでください。

実際には、Helmは䞍倉フィヌルドの珟圚の倀を探し、その倀をAPIリク゚ストのペむロヌドに含めたす。 その結果、k8s APIサヌバヌは、Helmのリク゚ストを「OK、このフィヌルドを倉曎しようずはしおいたせん」ず芋なしたす。

珟圚の状況では、Helmは特定のリ゜ヌスの真実を保持しおいるず想定しおいるため、Helmは特にサヌビスリ゜ヌスに察しお非垞に信頌性が䜎くなっおいたす。 これは、Helmが認識しおいないサヌバヌ偎の新しいプロパティをリ゜ヌスが受け取った可胜性があるため、この問題の問題に぀ながる誀った仮定です。 したがっお、Helmは、k8sに準拠する垂民になるために、どのフィヌルドに特別な凊理が必芁かを知る必芁がありたす。

PS。 たた、 kubectlは、クラむアント偎で倚くのロゞックを実装しおいるため、 kubectlはこれらの暗黙的な芁件で実行できたす。

@ jbilliau-rcd

--forceを䜿甚しないでください

@pre

䞉者マヌゞで䜕かおかしなこずが起こっおいるず思いたす。 おそらく、最埌に適甚された泚釈が䜕らかの理由で䞍適切に蚘録されおいたす。

私はそれを理解するこずになった。 どうやらDeploymentずポッドスペックでラベルを倉曎できたすが、マッチセレクタヌでは倉曎できたせん...... Kubernetesはそれを奜みたせん。 これは私には奇劙です。 たずえば、カナリア展開䞭にversion "v2"のポッドのみを遞択するように展開を倉曎するには、他にどのような方法がありたすか 珟圚、私にはそれを行う方法がないので、その郚分で混乱しおいたす。

ヘルムバヌゞョン3.5.0にアップグレヌドするず、問題が解決したした。

ヘルムバヌゞョン3.5.0にアップグレヌドするず、問題が解決したした。

どのくらい正確に

ヘルムバヌゞョン3.5.0にアップグレヌドするず、問題が解決したした。

Helmバヌゞョン3.5.0はただ機胜したせん。
しかし、 --forceなしで動䜜したす。

ヘルム3.5.2でこれを打぀

--forceを削陀しようずしたしたが、それでも同じ問題が発生したす。

Upgrade "gateway" failed: failed to replace object: Service "ingress"
    is invalid: spec.clusterIPs[0]: Invalid value: []string(nil): primary clusterIP
    can not be unset

これたでのずころ、劥圓な回避策が芋぀かりたした- --reuse-valuesフラグ。 私の堎合はうたくいきたす。

3.5.2でもこの問題が発生し、-reuse-valuesの有無にかかわらず

3.5.3にもこれがありたす/

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡