Helm: Helm 3 - tingkatkan nginx - spec.clusterIP: Nilai tidak valid: "": bidang tidak dapat diubah

Dibuat pada 6 Sep 2019  ·  67Komentar  ·  Sumber: helm/helm

Saya menggunakan yang berikut ini untuk menginstal/memutakhirkan bagan:

./helm upgrade --install
--set rbac.create=false
--set controller.replicaCount=2
--set controller.service.loadBalancerIP=$ip
--tunggu main-ingress stable/nginx-ingress

(Di mana $ip adalah IP, misalnya 10.0.0.1)

Itu dilakukan dalam pipa CI/CD, jadi idenya adalah menginstal pertama kali, memutakhirkan waktu berikutnya.

Ini menginstal dengan baik. Pada putaran kedua, ini menghasilkan yang berikut:

_client.go:339: Tidak dapat menambal Layanan: "main-ingress-nginx-ingress-controller" (Layanan "main-ingress-nginx-ingress-controller" tidak valid: spec.clusterIP: Nilai tidak valid: "": bidang tidak dapat diubah )
client.go:358: Gunakan --force untuk memaksa rekreasi sumber daya
client.go:339: Tidak dapat menambal Layanan: "main-ingress-nginx-ingress-default-backend" (Layanan "main-ingress-nginx-ingress-default-backend" tidak valid: spec.clusterIP: Nilai tidak valid: "" : bidang tidak dapat diubah)
client.go:358: Gunakan --force untuk memaksa rekreasi sumber daya
Kesalahan: UPGRADE GAGAL: Layanan "main-ingress-nginx-ingress-controller" tidak valid: spec.clusterIP: Nilai tidak valid: "": bidang tidak dapat diubah && Layanan "main-ingress-nginx-ingress-default-backend" tidak valid : spec.clusterIP: Nilai tidak valid: "": bidang tidak dapat diubah_

Saya juga mendapatkan ini di daftar helm:

BAGAN STATUS PERBARUI NAMA NAMESPACE REVISI
main-ingress default 1 2019-09-06 13:17:33,8463781 -0400 EDT di-deploy nginx-ingress-1.18.0
main-ingress default 2 09-06-2019 13:21:11.6428945 -0400 EDT gagal nginx-ingress-1.18.0

Jadi, rilis telah gagal.

Saya tidak punya masalah dengan Helm 2. Apakah karena perubahan perilaku di helm 3 atau apakah itu bug? Jika itu yang pertama, bagaimana saya bisa mengubah perintah agar tidak mengalami masalah itu?

Keluaran dari helm version : version.BuildInfo{Version:"v3.0.0-beta.2", GitCommit:"26c7338408f8db593f93cd7c963ad56f67f662d4", GitTreeState:"clean", GoVersion:"go1.12.9"}

Output dari kubectl version : Versi Klien: version.Info{Mayor:"1", Minor:"12", GitVersion:"v1.12.0", GitCommit:"0ed33881dc4355495f623c6f22e7dd0b7632b7c0", GitTreeState:"clean", BuildDate: "2018-09-27T17:05:32Z", GoVersion:"go1.10.4", Kompilator:"gc", Platform:"linux/amd64"}
Versi Server: version.Info{Mayor:"1", Minor:"13", GitVersion:"v1.13.10", GitCommit:"37d169313237cb4ceb2cc4bef300f2ae3053c1a2", GitTreeState:"clean", BuildDate:"2019-08-19T10:44: 49Z", GoVersion:"go1.11.13", Kompilator:"gc", Platform:"linux/amd64"}

Penyedia/Platform Cloud (AKS, GKE, Minikube, dll.): AKS

v3.x

Komentar yang paling membantu

Saya memiliki Masalah yang sama, bahkan tanpa mengatur jenis layanan atau clusterIP dengan helm v3.0.0-rc.2 jika saya menggunakan opsi --force dengan perintah helm update --install. Tanpa --force itu berfungsi dengan baik

Semua 67 komentar

Ini kemungkinan terkait dengan perubahan baru-baru ini di Helm 3 yang sekarang menggunakan strategi patch gabungan tiga arah yang mirip dengan kubectl. Lihat #6124

Jika Anda dapat memberikan langkah-langkah tentang cara mereproduksi ini, itu akan luar biasa. Terima kasih!

Tentu!

Saya membuat cluster AKS.

Saya membuat IP publik di grup sumber daya MC_*.

Saya menyimpan alamat IP dari IP publik itu di $ip.

Kemudian pada dasarnya menjalankan perintah itu dua kali:

./helm upgrade --install
--set rbac.create=false
--set controller.replicaCount=2
--set controller.service.loadBalancerIP=$ip
--tunggu main-ingress stable/nginx-ingress

Ini mirip dengan apa yang dilakukan di https://docs.microsoft.com/en-us/azure/aks/ingress-static-ip.

Perbedaannya adalah saya melakukan upgrade helm --install dua kali. Tujuannya adalah untuk memiliki satu baris perintah (tanpa syarat) di CI/CD saya.

Beri tahu saya jika Anda membutuhkan lebih banyak detail untuk mereproduksi.

Apakah itu cukup untuk mereproduksi? Saya dapat memberikan skrip bash jika itu membantu.

Maaf, off di Helm Summit EU selama seminggu jadi saya belum punya waktu untuk menanggapi.

Ah... tidak usah khawatir. Nikmati puncaknya!

Saya juga mengalami masalah ini

$ helm version --short
v3.0.0-beta.3+g5cb923e

bagan nginx-ingress terpasang dengan baik saat pertama kali dijalankan, namun pada peningkatan ...

$ helm upgrade --install first-chart stable/nginx-ingress --namespace infra
client.go:357: Cannot patch Service: "first-chart-nginx-ingress-controller" (Service "first-chart-nginx-ingress-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable)
client.go:376: Use --force to force recreation of the resource
client.go:357: Cannot patch Service: "first-chart-nginx-ingress-default-backend" (Service "first-chart-nginx-ingress-default-backend" is invalid: spec.clusterIP: Invalid value: "": field is immutable)
client.go:376: Use --force to force recreation of the resource
Error: UPGRADE FAILED: Service "first-chart-nginx-ingress-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable && Service "first-chart-nginx-ingress-default-backend" is invalid: spec.clusterIP: Invalid value: "": field is immutable
$ helm ls -n infra
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART               
first-chart     infra           1               2019-09-17 16:15:25.513997106 -0500 CDT deployed        nginx-ingress-1.20.0
first-chart     infra           2               2019-09-17 16:15:30.845249671 -0500 CDT failed          nginx-ingress-1.20.0

Saya percaya ini adalah masalah dengan bagan nginx-ingress, bukan helm3. Secara default, bagan akan selalu mencoba melewati controller.service.clusterIP = "" dan defaultBackend.service.clusterIP = "" kecuali Anda menetapkan controller.service.omitClusterIP=true dan defaultBackend.service.omitClusterIP=true .

tautan ke sumber:
https://github.com/helm/charts/blob/master/stable/nginx-ingress/values.yaml#L321
https://github.com/helm/charts/blob/master/stable/nginx-ingress/templates/controller-service.yaml#L22

solusi:

$ helm upgrade --install ingress-test stable/nginx-ingress --set controller.service.omitClusterIP=true --set defaultBackend.service.omitClusterIP=true

Saya sudah mencoba melakukannya, tetapi saya masih mendapatkan kesalahan yang sama

helm upgrade --install ingx stable/nginx-ingress -f ingx-values.yaml                                             1 ↵
client.go:357: Cannot patch Service: "ingx-nginx-ingress-controller" (Service "ingx-nginx-ingress-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable)
client.go:376: Use --force to force recreation of the resource
client.go:357: Cannot patch Service: "ingx-nginx-ingress-default-backend" (Service "ingx-nginx-ingress-default-backend" is invalid: spec.clusterIP: Invalid value: "": field is immutable)
client.go:376: Use --force to force recreation of the resource
Error: UPGRADE FAILED: Service "ingx-nginx-ingress-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable && Service "ingx-nginx-ingress-default-backend" is invalid: spec.clusterIP: Invalid value: "": field is immutable

ingx-values.yaml

rbac:
  create: true
controller:
  service:
    externalTrafficPolicy: Local
    omitClusterIP: true
  autoscaling:
    enabled: true
    minReplicas: 2
    maxReplicas: 100
    targetCPUUtilizationPercentage: "70"
    targetMemoryUtilizationPercentage: "70"
defaultBackend:
  service:
    omitClusterIP: true

Seperti yang Anda lihat di bawah, template tidak memiliki clusterIP di dalamnya

helm template ingx stable/nginx-ingress -f ingx-values.yaml

---
# Source: nginx-ingress/templates/controller-serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress
---
# Source: nginx-ingress/templates/default-backend-serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress-backend
---
# Source: nginx-ingress/templates/clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - endpoints
      - nodes
      - pods
      - secrets
    verbs:
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - services
    verbs:
      - get
      - list
      - update
      - watch
  - apiGroups:
      - extensions
      - "networking.k8s.io" # k8s 1.14+
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      - create
      - patch
  - apiGroups:
      - extensions
      - "networking.k8s.io" # k8s 1.14+
    resources:
      - ingresses/status
    verbs:
      - update
---
# Source: nginx-ingress/templates/clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: ingx-nginx-ingress
subjects:
  - kind: ServiceAccount
    name: ingx-nginx-ingress
    namespace: default
---
# Source: nginx-ingress/templates/controller-role.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress
rules:
  - apiGroups:
      - ""
    resources:
      - namespaces
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - configmaps
      - pods
      - secrets
      - endpoints
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - services
    verbs:
      - get
      - list
      - update
      - watch
  - apiGroups:
      - extensions
      - "networking.k8s.io" # k8s 1.14+
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
      - "networking.k8s.io" # k8s 1.14+
    resources:
      - ingresses/status
    verbs:
      - update
  - apiGroups:
      - ""
    resources:
      - configmaps
    resourceNames:
      - ingress-controller-leader-nginx
    verbs:
      - get
      - update
  - apiGroups:
      - ""
    resources:
      - configmaps
    verbs:
      - create
  - apiGroups:
      - ""
    resources:
      - endpoints
    verbs:
      - create
      - get
      - update
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      - create
      - patch
---
# Source: nginx-ingress/templates/controller-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ingx-nginx-ingress
subjects:
  - kind: ServiceAccount
    name: ingx-nginx-ingress
    namespace: default
---
# Source: nginx-ingress/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    component: "controller"
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress-controller
spec:
  externalTrafficPolicy: "Local"
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    app: nginx-ingress
    component: "controller"
    release: ingx
  type: "LoadBalancer"
---
# Source: nginx-ingress/templates/default-backend-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    component: "default-backend"
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress-default-backend
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
  selector:
    app: nginx-ingress
    component: "default-backend"
    release: ingx
  type: "ClusterIP"
---
# Source: nginx-ingress/templates/controller-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    component: "controller"
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress-controller
spec:
  replicas: 1
  revisionHistoryLimit: 10
  strategy:
    {}
  minReadySeconds: 0
  template:
    metadata:
      labels:
        app: nginx-ingress
        component: "controller"
        release: ingx
    spec:
      dnsPolicy: ClusterFirst
      containers:
        - name: nginx-ingress-controller
          image: "quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.1"
          imagePullPolicy: "IfNotPresent"
          args:
            - /nginx-ingress-controller
            - --default-backend-service=default/ingx-nginx-ingress-default-backend
            - --election-id=ingress-controller-leader
            - --ingress-class=nginx
            - --configmap=default/ingx-nginx-ingress-controller
          securityContext:
            capabilities:
                drop:
                - ALL
                add:
                - NET_BIND_SERVICE
            runAsUser: 33
            allowPrivilegeEscalation: true
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          livenessProbe:
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            timeoutSeconds: 1
            successThreshold: 1
            failureThreshold: 3
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
            - name: https
              containerPort: 443
              protocol: TCP
          readinessProbe:
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            timeoutSeconds: 1
            successThreshold: 1
            failureThreshold: 3
          resources:
            {}
      hostNetwork: false
      serviceAccountName: ingx-nginx-ingress
      terminationGracePeriodSeconds: 60
---
# Source: nginx-ingress/templates/default-backend-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    component: "default-backend"
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress-default-backend
spec:
  replicas: 1
  revisionHistoryLimit: 10
  template:
    metadata:
      labels:
        app: nginx-ingress
        component: "default-backend"
        release: ingx
    spec:
      containers:
        - name: nginx-ingress-default-backend
          image: "k8s.gcr.io/defaultbackend-amd64:1.5"
          imagePullPolicy: "IfNotPresent"
          args:
          securityContext:
            runAsUser: 65534
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /healthz
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 0
            periodSeconds: 5
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 6
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          resources:
            {}
      serviceAccountName: ingx-nginx-ingress-backend
      terminationGracePeriodSeconds: 60
---
# Source: nginx-ingress/templates/controller-hpa.yaml
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.20.0
    component: "controller"
    heritage: Helm
    release: ingx
  name: ingx-nginx-ingress-controller
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: ingx-nginx-ingress-controller
  minReplicas: 2
  maxReplicas: 100
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 70
    - type: Resource
      resource:
        name: memory
        targetAverageUtilization: 70

Saya menduga itu terjadi karena saya awalnya menyebarkannya tanpa menghilangkan parameter ClusterIP, dan helm v3 mencoba melakukan penggabungan 3 arah dengan manifes asli, yang memang memiliki clusterIP: "" di dalamnya

helm get manifest ingx --revision 1 | grep "clusterIP"
  clusterIP: ""
  clusterIP: ""

Saya dapat memperbaikinya dengan menghapus bagan yang ada terlebih dahulu, dan membuatnya kembali dengan opsi omitClusterIP . Intinya, solusi yang disarankan dari @bambash hanya akan berfungsi jika Anda menginstal bagan dengan opsi yang disetel ke true sejak awal

$ helm upgrade --install ingress-test stable/nginx-ingress --set controller.service.omitClusterIP=true --set defaultBackend.service.omitClusterIP=true

Akan sangat bagus jika ada cara di helm v3 untuk melewati penggabungan dengan manifes yang ada

maaf, saya seharusnya menetapkan bahwa nilai-nilai ini perlu disetel saat rilis pertama kali diinstal. Memperbarui rilis yang ada mungkin terbukti lebih sulit...

Saya mengalami masalah ini dengan metric-server-2.8.8, yang tidak memiliki clusterIP dalam nilainya, dan beberapa grafik lainnya, dengan helm v3.0.0-rc.2. ada saran? Saya tidak yakin bagaimana melanjutkannya.

Masalah saya tampaknya dengan helmfile v0.95.0. Saya akan mengejarnya di sana :)

Saya memiliki Masalah yang sama, bahkan tanpa mengatur jenis layanan atau clusterIP dengan helm v3.0.0-rc.2 jika saya menggunakan opsi --force dengan perintah helm update --install. Tanpa --force itu berfungsi dengan baik

@johannges , saya baru saja akan memposting hal yang sama. :+1:

pengaturan omitClusterIP: true tampaknya berfungsi untuk layanan defaultBackend dan pengontrol tetapi tidak untuk metrik .

Saya pikir ini masalah dengan helm dengan opsi --force selama peningkatan.
Helm mencoba membuat ulang layanan tetapi juga mengganti spec.clusterIP sehingga menimbulkan kesalahan.
Saya dapat mengonfirmasi ini menggunakan bagan khusus saya sendiri.
Error: UPGRADE FAILED: failed to replace object: Service "litespeed" is invalid: spec.clusterIP: Invalid value: "": field is immutable

Sebenarnya itu adalah kesalahan saya, menghilangkan definisi clusterIP pada inisialisasi layanan (atau bagan) berfungsi dengan baik 👍

Saya mengalami kesalahan ini juga untuk rilis grafik _kafka_ dan _redis_ yang ada. Menghapus --force memang menyelesaikan ini.

Sekarang saya mendapatkan kesalahan baru dari rilis _redis_:
Error: UPGRADE FAILED: release redis failed, and has been rolled back due to atomic being set: cannot patch "redis-master" with kind StatefulSet: StatefulSet.apps "redis-master" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden

Setuju dengan @bacongobbler bahwa ini terlihat terkait dengan strategi tambalan gabungan tiga arah Helm v3 yang kemungkinan menghasilkan meneruskan bidang (bahkan dengan nilai yang sama seperti sebelumnya) ke pembaruan/tambalan yang dianggap Kubernetes tidak dapat diubah/tidak dapat diubah setelah pembuatan pertama.

Jika ada orang yang berakhir di sini menggunakan helm v3 melalui terraform, karena Anda tidak dapat langsung melarangnya menggunakan --force saya berhasil menghapus grafik secara manual menggunakan helm delete kemudian menjalankan kembali terraform. ini menyebalkan tapi itu berhasil.

edit: seluruh kesalahan: ("nginx-ingress-singleton-controller" adalah nama rilis yang saya tetapkan. tidak memiliki arti khusus)

Error: cannot patch "nginx-ingress-singleton-controller" with kind Service: Service "nginx-ingress-singleton-controller" is invalid: spec.clusterIP: Invalid value:
"": field is immutable && cannot patch "nginx-ingress-singleton-default-backend" with kind Service: Service "nginx-ingress-singleton-default-backend" is invalid: sp
ec.clusterIP: Invalid value: "": field is immutable

  on .terraform/modules/app_dev/nginx-ingress.tf line 1, in resource "helm_release" "nginx_ingress":
   1: resource "helm_release" "nginx_ingress" {

@zen4ever menyelesaikan masalah di https://github.com/helm/helm/issues/6378#issuecomment -532766512. Saya akan coba jelaskan lebih detail....

Seperti yang telah ditunjukkan orang lain, masalah muncul ketika bagan mendefinisikan clusterIP dengan string kosong. Saat Layanan diinstal, Kubernetes mengisi bidang ini dengan clusterIP yang ditetapkan ke Layanan.

Ketika helm upgrade dipanggil, bagan meminta clusterIP untuk dihapus, oleh karena itu mengapa pesan kesalahannya adalah spec.clusterIP: Invalid value: "": field is immutable .

Ini terjadi karena perilaku berikut:

  1. Saat menginstal, bagan menentukan itu ingin clusterIP menjadi string kosong
  2. Kubernetes menetapkan Layanan secara otomatis clusterIP . Kami akan menggunakan 172.17.0.1 untuk contoh ini
  3. Pada helm upgrade , bagan ingin clusterIP menjadi string kosong (atau dalam kasus @zen4ever di atas , dihilangkan)

Saat membuat tambalan tiga arah, ia melihat bahwa status lama adalah "" , status langsung saat ini di "172.17.0.1" , dan status yang diusulkan adalah "" . Helm mendeteksi bahwa pengguna meminta untuk mengubah clusterIP dari "172.17.0.1" menjadi "", sehingga ia menyediakan patch.

Di Helm 2, ia mengabaikan status langsung, sehingga tidak melihat perubahan (status lama: clusterIP: "" ke status baru: clusterIP: "" ), dan tidak ada tambalan yang dibuat, melewati perilaku ini.

Rekomendasi saya adalah mengubah output template. Jika tidak ada clusterIP yang diberikan sebagai nilai, maka jangan setel nilai ke string kosong... Hilangkan bidang sepenuhnya.

misalnya dalam kasus stable/nginx-ingress :

spec:
{{- if not .Values.controller.service.omitClusterIP }}
  clusterIP: "{{ .Values.controller.service.clusterIP }}"
{{- end }}

Harus diubah menjadi:

spec:
{{- if not .Values.controller.service.omitClusterIP }}
  {{ with .Values.controller.service.clusterIP }}clusterIP: {{ quote . }}{{ end }}
{{- end }}

Ini juga mengapa --set controller.service.omitClusterIP=true bekerja dalam kasus ini.

TL;DR jangan lakukan ini di templat Layanan Anda:

clusterIP: ""

Jika tidak, Helm akan mencoba mengubah clusterIP layanan dari alamat IP yang dibuat secara otomatis menjadi string kosong, sehingga muncul pesan kesalahan.

Semoga ini membantu!

Sebagai solusi sementara jika Anda mencoba membuatnya berfungsi untuk saat ini sementara masalah ini teratasi, saya menemukan jika saya melakukan hal berikut, saya dapat melakukan pembaruan:

  1. Dapatkan nilai clusterIP untuk pengontrol dan backend default melalui:
    kubectl get svc | grep ingress
  2. Tambahkan penimpaan berikut ke file nilai helm Anda yang ada:
    controller: service: clusterIP: <cluster-ip-address-for-controller> defaultBackend: service: clusterIP: <cluster-ip-address-for-default-backend>
  3. Lakukan pembaruan.

Saya telah menguji ini untuk cluster yang saya jalankan dan tidak memerlukan rekreasi apa pun.

Itu juga berhasil. Panggilan yang bagus @treacher. menyetel nilai yang sama melalui --set atau dalam file nilai Anda tidak menghasilkan tambalan, karena pemutakhiran tidak ingin mengubah nilai clusterIP .

Penutupan berfungsi dengan sengaja sesuai dengan perilaku tambalan gabungan tiga arah yang dijelaskan di atas. Item tindakan adalah agar bagan ini mengikuti rekomendasi yang diberikan di atas di https://github.com/helm/helm/issues/6378#issuecomment-557746499. Tidak ada hubungannya di sini di ujung Helm. :)

https://github.com/helm/charts/pull/19146/files dibuat! Terima kasih @bacongobbler

@zen4ever menyelesaikan masalah di #6378 (komentar) . Saya akan coba jelaskan lebih detail....

Seperti yang telah ditunjukkan orang lain, masalah muncul ketika bagan mendefinisikan clusterIP dengan string kosong. Saat Layanan diinstal, Kubernetes mengisi bidang ini dengan clusterIP yang ditetapkan ke Layanan.

Ketika helm upgrade dipanggil, bagan meminta clusterIP untuk dihapus, oleh karena itu mengapa pesan kesalahannya adalah spec.clusterIP: Invalid value: "": field is immutable .

Ini terjadi karena perilaku berikut:

  1. Saat menginstal, bagan menentukan itu ingin clusterIP menjadi string kosong
  2. Kubernetes menetapkan Layanan secara otomatis clusterIP . Kami akan menggunakan 172.17.0.1 untuk contoh ini
  3. Pada helm upgrade , bagan ingin clusterIP menjadi string kosong (atau dalam kasus @zen4ever di atas , dihilangkan)

Saat membuat tambalan tiga arah, ia melihat bahwa status lama adalah "" , status langsung saat ini di "172.17.0.1" , dan status yang diusulkan adalah "" . Helm mendeteksi bahwa pengguna meminta untuk mengubah clusterIP dari "172.17.0.1" menjadi "", sehingga ia menyediakan patch.

Di Helm 2, ia mengabaikan status langsung, sehingga tidak melihat perubahan (status lama: clusterIP: "" ke status baru: clusterIP: "" ), dan tidak ada tambalan yang dibuat, melewati perilaku ini.

Rekomendasi saya adalah mengubah output template. Jika tidak ada clusterIP yang diberikan sebagai nilai, maka jangan setel nilai ke string kosong... Hilangkan bidang sepenuhnya.

misalnya dalam kasus stable/nginx-ingress :

spec:
{{- if not .Values.controller.service.omitClusterIP }}
  clusterIP: "{{ .Values.controller.service.clusterIP }}"
{{- end }}

Harus diubah menjadi:

spec:
{{- if not .Values.controller.service.omitClusterIP }}
  {{ with .Values.controller.service.clusterIP }}clusterIP: {{ quote . }}{{ end }}
{{- end }}

Hai @bacongobbler , saya pikir karena jika tidak ada nilai yang diberikan, kami masih akan berakhir dengan clusterIP: "" ... lebih baik nilai clusterIP: "" sepenuhnya dikomentari di file nilai. Ini menghilangkannya dari manifes yang diberikan saat disetel dan akan menghemat sakit kepala di masa mendatang. Namun jika menggunakan helm3 dan status helm saat ini memiliki set clusterIP: "" , seseorang perlu melakukan hardcode alamat clusterIP dalam file nilai.

Ini juga mengapa --set controller.service.omitClusterIP=true bekerja dalam kasus ini.

TL;DR jangan lakukan ini di templat Layanan Anda:

clusterIP: ""

Jika tidak, Helm akan mencoba mengubah clusterIP layanan dari alamat IP yang dibuat secara otomatis menjadi string kosong, sehingga muncul pesan kesalahan.

Semoga ini membantu!

Hai @bacongobbler , kami menghadapi masalah yang sama saat memigrasikan rilis helm v2 ke helm v3. Kami menggunakan type: ClusterIP dalam Layanan tetapi menghilangkan ClusterIP sama sekali dan kami mendapatkan:

Error: UPGRADE FAILED: failed to replace object: Service "dummy" is invalid: spec.clusterIP: Invalid value: "": field is immutable

Kami tidak memiliki spec.clusterIP: di templat helm kami, tetapi kami mendapatkan Kesalahan ini setelah rilis migrasi melalui helm 2to3

Templat layanan:

apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
  labels:
    app: {{ .Values.image.name }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "-" }}
    cluster: {{ default "unknown" .Values.cluster }}
    region: {{ default "unknown" .Values.region }}
    datacenter: {{ default "unknown" .Values.datacenter }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  type: ClusterIP
  ports:
    - port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.port }}
      protocol: TCP
      name: http
  selector:
    app: {{ .Values.image.name }}
    release: {{ .Release.Name }}

Masalah yang sama disini. Masalahnya adalah kami belum menyentuh Layanan. Ingress-lah yang diubah sebelum peningkatan.

Ini memengaruhi sumber daya dengan bidang yang tidak dapat diubah jika menghapus flag --force dari helm upgrade --install dan jangan sentuh bidang yang tidak dapat diubah semuanya berfungsi dengan baik. Tetapi jika Anda ingin menabrak apiversion sumber daya??? Anda perlu membuat ulang sumber daya tetapi helm 3 tidak akan meningkatkan sumber daya....
@bacongobbler ^^^

mencoba memperbarui hpa dengan apiVersion baru oleh helm 3:
Error: UPGRADE FAILED: rendered manifests contain a new resource that already exists. Unable to continue with update: existing resource conflict: kind: HorizontalPodAutoscaler, namespace: stage, name: dummy-stage

@bacongobbler dan @kritcher722 jempol ke bawah komentar telah diperbarui jika Anda ingin menghapus jempol ke bawah, namun jika masih dalam ketidaksepakatan silakan jelaskan mengapa itu adalah ide yang baik untuk memiliki clusterIP: "" dalam manifes yang diberikan.

Sepertinya Microsoft adalah mentor proyek. Saya melihat gaya. :)

Silakan buka kembali. Masalah tidak diperbaiki. "Peretasan" yang disarankan oleh nasseemkullah ini tidak tepat. Jangan meminta orang untuk melompat. Perbaiki saja. Jalur migrasi yang sangat buruk. Helmnya payah.

@antonakv apa cara untuk memulai tahun :)
Saya pikir secara umum kita bermain dengan api ketika memberikan clusterIP sebagai nilai yang dapat dikonfigurasi dalam bagan, dan tidak dapat sepenuhnya menyalahkan satu alat/orang/PR pada khususnya.
Jika clusterIP perlu menjadi nilai yang dapat dikonfigurasi, secara default seharusnya tidak ada dalam template yang diberikan, itulah ide saya mengomentari file nilai sesuai https://github.com/helm/charts/blob/270172836fd8cf56d787cf7d04d938856de0c794/stable /nginx-ingress/values.yaml#L236

Ini, jika saya tidak salah, harus mencegah sakit kepala di masa depan bagi mereka yang memasang bagan pada perubahan itu. Tetapi bagi kita (termasuk saya sendiri) yang telah menginstalnya sebelumnya, dan kemudian bermigrasi ke helm3, saya khawatir melakukan hardcording nilai clusterIP saat ini dalam file nilai kami ATAU mencopot dan menginstal ulang grafik (menyebabkan downtime!) adalah satu-satunya pilihan yang saya miliki. melihat.

Opini adalah milik saya sendiri, saya tidak dibayar untuk bekerja sebagai pimpinan, hanya pengguna akhir seperti Anda. Mereka yang dibayar untuk bekerja pada waktu penuh ini mungkin dapat memberikan lebih banyak wawasan.

Selamat tahun baru dan semoga sukses! Jangan putus asa, bersama-sama kita bisa membuatnya lebih baik.

Hai @bacongobbler , kami menghadapi masalah yang sama saat memigrasikan rilis helm v2 ke helm v3. Kami menggunakan type: ClusterIP dalam Layanan tetapi menghilangkan ClusterIP sama sekali dan kami mendapatkan:

Error: UPGRADE FAILED: failed to replace object: Service "dummy" is invalid: spec.clusterIP: Invalid value: "": field is immutable

Kami tidak memiliki spec.clusterIP: di templat helm kami, tetapi kami mendapatkan Kesalahan ini setelah rilis migrasi melalui helm 2to3

Templat layanan:

apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
  labels:
    app: {{ .Values.image.name }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "-" }}
    cluster: {{ default "unknown" .Values.cluster }}
    region: {{ default "unknown" .Values.region }}
    datacenter: {{ default "unknown" .Values.datacenter }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  type: ClusterIP
  ports:
    - port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.port }}
      protocol: TCP
      name: http
  selector:
    app: {{ .Values.image.name }}
    release: {{ .Release.Name }}

Kami memiliki masalah yang sama. Kami tidak mendefinisikan clusterIP sama sekali di bagan kami dan tidak ada di template akhir. Namun, kami masih mendapatkan kesalahan yang sama dan hanya dengan flag --force .

Kami mengalami masalah yang sama:

apiVersion: v1
kind: Service
{{ include "mde.metadata" $ }}
spec:
  ports:
  - name: {{ include "mde.portName" $ | quote }}
    port: {{ include "mde.port" $ }}
    protocol: TCP
    targetPort: {{ include "mde.port" $ }}
  selector:
    app: {{ include "mde.name" $ }}
  sessionAffinity: None
  type: ClusterIP

spec.clusterIP bukan bagian dari template Layanan, namun dengan Helm 3.0.2 dan panggilan helm upgrade ... --force --install , kami juga melihat:

Kesalahan: UPGRADE FAILED: gagal mengganti objek: Layanan "dummy" tidak valid: spec.clusterIP: Nilai tidak valid: "": bidang tidak dapat diubah

Silakan buka kembali.

@tomcruise81 silakan lihat https://github.com/helm/helm/issues/7350 untuk utas di --force . Itu menghasilkan kesalahan yang sama, tetapi ini karena cara kerja kubectl replace . Ini adalah masalah terpisah dari apa yang dijelaskan di sini, yang berkaitan dengan Service clusterIPs dan strategi patch gabungan tiga arah ( helm upgrade tanpa flag --force ).

@bacongobbler - terima kasih atas tanggapan dan klarifikasinya yang cepat. Melihat ke:

https://github.com/helm/helm/blob/a963736f6675e972448bf7a5fd141628fd0ae4df/pkg/kube/client.go#L405 -L411

yang menggunakan https://github.com/kubernetes/cli-runtime/blob/master/pkg/resource/helper.go#L155 -L181, tampaknya panggilan ke helper.Replace tidak hal yang sama dengan kubectl replace -f ... --force (perhatikan --force di bagian akhir).

Saya menduga bahwa ini adalah di mana banyak kebingungan.

Saya tahu harapan saya tentang helm upgrade ... --force dan menggunakan strategi pengganti adalah bahwa ia akan melakukan hal yang sama seperti kubectl replace -f ... --force .

Hai @bacongobbler , kami menghadapi masalah yang sama saat memigrasikan rilis helm v2 ke helm v3. Kami menggunakan type: ClusterIP dalam Layanan tetapi menghilangkan ClusterIP sama sekali dan kami mendapatkan:
Error: UPGRADE FAILED: failed to replace object: Service "dummy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Kami tidak memiliki spec.clusterIP: di templat helm kami, tetapi kami mendapatkan Kesalahan ini setelah rilis migrasi melalui helm 2to3
Templat layanan:

apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
  labels:
    app: {{ .Values.image.name }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "-" }}
    cluster: {{ default "unknown" .Values.cluster }}
    region: {{ default "unknown" .Values.region }}
    datacenter: {{ default "unknown" .Values.datacenter }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  type: ClusterIP
  ports:
    - port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.port }}
      protocol: TCP
      name: http
  selector:
    app: {{ .Values.image.name }}
    release: {{ .Release.Name }}

Kami memiliki masalah yang sama. Kami tidak mendefinisikan clusterIP sama sekali di bagan kami dan tidak ada di template akhir. Namun, kami masih mendapatkan kesalahan yang sama dan hanya dengan flag --force .

Saya juga memeriksa, bahwa tidak ada clusterIP dalam manifes rilis:

$ helm get manifest paywall-api-ee | grep clusterIP
$

sama di sini- kami tidak mendefinisikan ClusterIP mana pun tetapi masih melihat kesalahannya

Bermain-main dengan ini lagi, saya telah mengamati bahwa:

  • helm upgrade ... --force --install - menghasilkan _Layanan "dummy" tidak valid: spec.clusterIP : Nilai tidak valid: "": bidang tidak dapat
  • helm template ... | kubectl apply -f - - berhasil
  • helm template ... | kubectl replace -f - - menghasilkan _Layanan "dummy" tidak valid: spec.clusterIP : Nilai tidak valid: "": bidang tidak dapat
  • helm template ... | kubectl replace --force -f - - berhasil

versi kubectl - 1.14.6
versi helm - 3.0.2

@tomcruise81 Anda dapat mencoba menggunakan plugin helm 2to3 dan bermigrasi dari helm2 ke helm3 rilis dan hapus --force jika Anda sebelumnya menggunakannya.
Ini adalah pekerjaan untuk kita.
Adapun saya dan sepertinya orang lain --force memiliki perilaku yang salah dan harus menangani kasus ini dengan bidang yang tidak dapat diubah seperti untuk saya

@alexandrsemak - terima kasih atas rekomendasinya. Dalam contoh saya, saya melihat ini pada bagan yang hanya diinstal atau ditingkatkan menggunakan helm 3.

Masalah yang sama untuk saya! Menggunakan

$ helm install my-release xxxxx
$ helm upgrade --install --force my-release xxxxx

Dalam kasus saya, saya tidak mendefinisikan ClusterIP pada salah satu layanan yang digunakan pada bagan saya, tetapi saya menghadapi masalah yang sama (lihat spesifikasi di bawah):

spec:
  type: {{ .Values.service.type }}
  {{- if and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP)) }}
  loadBalancerIP: {{ .Values.service.loadBalancerIP }}
  {{- end }}
  ports:
    - name: htttp-XXX
      port: {{ .Values.service.port }}
      targetPort: XXX
      {{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) (not (empty .Values.service.nodePort)) }}
      nodePort: {{ .Values.service.nodePort }}
      {{- else if eq .Values.service.type "ClusterIP" }}
      nodePort: null
      {{- end }}
  selector:
    app.kubernetes.io/name: XXX
    app.kubernetes.io/instance: {{ .Release.Name }}

Seperti yang dikatakan pengguna lain sebelumnya, alasannya adalah Kubernetes secara otomatis menetapkan Service sebuah clusterIP untuk pertama kalinya (misalnya . clusterIP: 10.96.26.65 ) dan itu bertentangan dengan clusterIP: "" ketika Anda mencoba untuk meningkatkan. Harap perhatikan bahwa saya tidak membuat ini di template saya: clusterIP: ""

Tolong buka kembali @bacongobbler ini

Saya memiliki masalah yang sama.

@juan131 @Ronsevet : hapus --force Artinya berubah.

menghadapi masalah yang sama, pada bagan khusus.
Kami tidak mendefinisikan clusterip di mana pun.
Helm v3.0.2
kubectl 1.14.8

Masalahnya adalah, kadang-kadang sebuah grafik tetap dalam status gagal meskipun pod dibuat dan dijalankan. Jika kami mencoba memutakhirkan rilis yang sama, itu tidak berfungsi tanpa paksaan.
Karena Pod sedang berjalan, rilis tidak dapat dihapus dan dibuat ulang.
Harus ada beberapa cara untuk menggunakan "kekuatan"

sama untuk saya - saya baru saja menambahkan label tambahan ke layanan dan menghadapi kesalahan ini. Saya juga tidak mendefinisikan ClusterIP di mana pun - silakan buka kembali masalahnya

@bacongobbler Kami menggunakan StorageClasses sebagai bagian dari bagan kami dan parameter StorageClass tidak dapat diubah. Jadi di rilis berikutnya, ketika kami memperbarui nilai dari beberapa parameter StorageClass, maka helm upgrade --force juga gagal.
Tidak yakin bagaimana menangani kasus ini untuk pembaruan StorageClasses. Ada saran?

Error: UPGRADE FAILED: failed to replace object: StorageClass.storage.k8s.io "ibmc-s3fs-standard-cross-region" is invalid: parameters: Forbidden: updates to parameters are forbidden.

Itu berfungsi dengan baik di helm v2 karena helm upgrade --force digunakan untuk memaksa menghapus dan membuat ulang StorageClass .

Jika ada yang mengalami gejala yang bukan akibat dari penjelasan yang diberikan di https://github.com/helm/helm/issues/6378#issuecomment -557746499, dapatkah Anda membuka masalah baru dengan temuan Anda dan bagaimana kami dapat mereproduksi itu di pihak kita?

Masalah yang diangkat oleh OP adalah karena skenario yang disediakan di atas, di mana bagan mengatur ClusterIP ke string kosong saat diinstal. Sangat mungkin bahwa ada skenario lain di mana kasus khusus ini dapat muncul, seperti yang telah disebutkan orang lain dengan penggunaan flag --force . Kasus-kasus tersebut harus didiskusikan secara terpisah, karena diagnosis dan solusi mungkin berbeda dari saran yang diberikan sebelumnya.

Terima kasih!

@mssachan lihat #7082 dan draf proposal di #7431 untuk kasus penggunaan Anda. Proposal itu bertujuan untuk mengimplementasikan kubectl replace —force , yang akan mirip dengan perilaku Helm 2 helm install —force .

@mssachan lihat #7082 dan draf proposal di #7431 untuk kasus penggunaan Anda. Proposal itu bertujuan untuk mengimplementasikan kubectl replace —force , yang akan mirip dengan perilaku Helm 2 helm install —force .

Ada baiknya ini terjadi. Bahkan dengan menghilangkan tanda --force , saya masih mendapatkan kesalahan saat memutakhirkan grafik. Misalnya, dengan cert-manager :

2020-03-05 12:15:19 CRITICAL: Command returned [ 1 ] exit code and error message [ Error: UPGRADE FAILED: cannot patch "cert-manager-cainjector" with kind Deployment: Deployment.apps "cert-manager-cainjector" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"cainjector", "app.kubernetes.io/instance":"cert-manager", "app.kubernetes.io/managed-by":"Helm", "app.kubernetes.io/name":"cainjector"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable && cannot patch "cert-manager" with kind Deployment: Deployment.apps "cert-manager" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"cert-manager", "app.kubernetes.io/instance":"cert-manager", "app.kubernetes.io/managed-by":"Helm", "app.kubernetes.io/name":"cert-manager"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable && cannot patch "cert-manager-webhook" with kind Deployment: Deployment.apps "cert-manager-webhook" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"webhook", "app.kubernetes.io/instance":"cert-manager", "app.kubernetes.io/managed-by":"Helm", "app.kubernetes.io/name":"webhook"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

@mssachan lihat #7082 dan draf proposal di #7431 untuk kasus penggunaan Anda. Proposal itu bertujuan untuk mengimplementasikan kubectl replace —force , yang akan mirip dengan perilaku Helm 2 helm install —force .

Ada baiknya ini terjadi. Bahkan dengan menghilangkan tanda --force , saya masih mendapatkan kesalahan saat memutakhirkan grafik. Misalnya, dengan cert-manager :

2020-03-05 12:15:19 CRITICAL: Command returned [ 1 ] exit code and error message [ Error: UPGRADE FAILED: cannot patch "cert-manager-cainjector" with kind Deployment: Deployment.apps "cert-manager-cainjector" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"cainjector", "app.kubernetes.io/instance":"cert-manager", "app.kubernetes.io/managed-by":"Helm", "app.kubernetes.io/name":"cainjector"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable && cannot patch "cert-manager" with kind Deployment: Deployment.apps "cert-manager" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"cert-manager", "app.kubernetes.io/instance":"cert-manager", "app.kubernetes.io/managed-by":"Helm", "app.kubernetes.io/name":"cert-manager"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable && cannot patch "cert-manager-webhook" with kind Deployment: Deployment.apps "cert-manager-webhook" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"webhook", "app.kubernetes.io/instance":"cert-manager", "app.kubernetes.io/managed-by":"Helm", "app.kubernetes.io/name":"webhook"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

@ sc250024 Saya memiliki masalah yang sama persis setelah saya

# helm upgrade cert-manager jetstack/cert-manager --namespace cert-manager --atomic --cleanup-on-fail

# helm version
version.BuildInfo{Version:"v3.1.1", GitCommit:"afe70585407b420d0097d07b21c47dc511525ac8", GitTreeState:"clean", GoVersion:"go1.13.8"}

Solusi apa pun ketika --force tidak digunakan, atau tidak ada opsi apa pun di sekitar clusterIP yang disetel. Ini adalah manifes Layanan saya:

apiVersion: v1
kind: Service
metadata:
  name: "{{ .Values.deploymentBaseName }}-{{ .Values.skaffoldUser }}"
  labels:
    name: "{{ .Values.deploymentBaseName }}-{{ .Values.skaffoldUser }}"
spec:
  ports:
    - port: {{ .Values.servicePort }}
      targetPort: {{ .Values.containerPort }}
      protocol: TCP
      name: http
    - name: debugger-http
      port: {{ .Values.debuggerPort }}
      targetPort: {{ .Values.debuggerPort }}
      protocol: TCP
  selector:
    app: "{{ .Values.deploymentBaseName }}-{{ .Values.skaffoldUser }}"
  type: ClusterIP

@davidfernandezm apakah Anda pernah menemukan solusi untuk ini? Saya melihat hal yang sama di pihak saya dan layanan saya didefinisikan persis seperti milik Anda. Tidak ada opsi untuk clusterIP yang disetel, namun Helm masih gagal dalam peningkatan.

Sama disini

Mendapatkan ini juga, re: dua komentar di atas.

Harap berikan informasi lebih lanjut. Kami tidak dapat membantu Anda tanpa memahami penyebabnya atau bagaimana masalah ini muncul dalam kasus Anda. Terima kasih.

@antonakv masalah ini duplikat dari 7956
@bacongobbler info lebih lanjut

Saya memiliki Masalah yang sama, bahkan tanpa mengatur jenis layanan atau clusterIP dengan helm v3.0.0-rc.2 jika saya menggunakan opsi --force dengan perintah helm update --install. Tanpa --force itu berfungsi dengan baik

Dingin! Saya terinspirasi dari jawaban Anda, bahwa saya harus mengomentari baris force: .. di helmfile yaml :

helmDefaults:
  tillerless: true
  verify: false
  wait: true
  timeout: 600
  # force: true <---- THI ONE IS COMMENTED

Ini bekerja

Saya mencoba semua hal di atas, tidak ada yang berhasil untuk saya. Saya harus menonaktifkan nginx-ingress dari bagan saya, melakukan peningkatan, mengaktifkannya lagi, dan meningkatkan lagi. Hal ini menyebabkan perubahan alamat IP yang ditetapkan oleh penyedia cloud, tetapi tidak ada salahnya dilakukan.

Saya memiliki Masalah yang sama, bahkan tanpa mengatur jenis layanan atau clusterIP dengan helm v3.0.0-rc.2 jika saya menggunakan opsi --force dengan perintah helm update --install. Tanpa --force itu berfungsi dengan baik

Solusi terbaik, ini berhasil untuk saya, terima kasih!

Kami mengalami masalah yang sama dan tidak dapat menemukan solusi untuk mengatasinya.
Ini cukup sederhana untuk direproduksi

helm install in stable/inbucket 
helm upgrade in stable/inbucket 
Error: UPGRADE FAILED: cannot patch "in-inbucket" with kind Service: Service "in-inbucket" is invalid: spec.clusterIP: Invalid value: "": field is immutable

Saya bertanya-tanya mengapa --force tidak berfungsi di sini, bukankah seharusnya force resource updates through a replacement strategy jika ini adalah strategi penggantian maka layanan harus dihapus kemudian diganti?

@bacongobbler Saya mendapatkan utas ini setelah memeriksa https://github.com/helm/helm/issues/7956

Seperti semua komentator sebelumnya: kami tidak memiliki "clusterIP" di templat sama sekali, tetapi kesalahan masih ada dengan Helm terbaru jika --force flag digunakan.

Versi helm: 3.4.1

"helm -n kube-system get manifest CHART_NAME | grep clusterIP" tidak menunjukkan hasil.

Kesalahan:
field is immutable && failed to replace object: Service "SERVICE_NAME" is invalid: spec.clusterIP: Invalid value: "": field is immutable

Penjelasan yang sama yang diberikan di https://github.com/helm/helm/issues/6378#issuecomment -557746499 juga berlaku di sini dalam kasus Anda @nick4fake. Perbedaannya adalah bahwa dengan --force , Anda meminta Kubernetes untuk mengambil manifes yang dirender sepenuhnya dan secara paksa menimpa objek langsung saat ini. Karena manifes Anda tidak berisi bidang clusterIP , Kubernetes mengambilnya dan menganggap Anda mencoba menghapus bidang clusterIP dari objek langsung, maka kesalahannya Invalid value: "": field is immutable .

@bacongobbler Saya benar-benar minta maaf jika saya melewatkan sesuatu di sini, mungkin saya tidak cukup tahu tentang internal Helm.

"Rekomendasi saya adalah mengubah output template. Jika tidak ada clusterIP yang diberikan sebagai nilai, maka jangan setel nilai ke string kosong... Hilangkan bidang sepenuhnya."

Jadi apa solusinya? Apakah itu berarti bahwa flag "--force" tidak dapat digunakan sama sekali jika bidang clusterIP tidak disetel ke beberapa nilai statis?

Sejauh menyangkut Kubernetes: ya.

Menurut pemahaman saya ini masalah dengan Kubernetes, karena "menimpa secara paksa" tidak berperilaku dengan cara yang sama seperti "menghapus dan membuat ulang lagi". Apakah ada bug hulu?

Di sisi lain, Helm juga menyesatkan, karena --force digambarkan sebagai "memaksa pembaruan sumber daya melalui strategi penggantian". Meskipun pada kenyataannya tidak melakukan penggantian apa pun, ia hanya mencoba untuk menimpa sumber daya secara paksa (akan lebih baik untuk memberi nama flag --force-overwrite ). Penggantian paksa akan terlihat seperti menghapus dan membuat ulang lagi (mungkin ada tanda --force-recreate ). Tentu saja, --force-recreate bisa menjadi sedikit berbahaya untuk digunakan untuk beberapa sumber daya, tetapi itu akan selalu berhasil.

Bagaimanapun, Helm dapat menerapkan solusi mundur untuk jenis masalah seperti itu. Jika perilaku saat ini (digambarkan sebagai --force-overwrite ) gagal dan mendeteksi kesalahan bidang yang tidak dapat diubah, itu harus menghapus dan membuat ulang sumber daya (sebagai --force-recreate ).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat