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
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:
clusterIP
menjadi string kosongclusterIP
. Kami akan menggunakan 172.17.0.1
untuk contoh inihelm 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:
kubectl get svc | grep ingress
controller:
service:
clusterIP: <cluster-ip-address-for-controller>
defaultBackend:
service:
clusterIP: <cluster-ip-address-for-default-backend>
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 memintaclusterIP
untuk dihapus, oleh karena itu mengapa pesan kesalahannya adalahspec.clusterIP: Invalid value: "": field is immutable
.Ini terjadi karena perilaku berikut:
- Saat menginstal, bagan menentukan itu ingin
clusterIP
menjadi string kosong- Kubernetes menetapkan Layanan secara otomatis
clusterIP
. Kami akan menggunakan172.17.0.1
untuk contoh ini- Pada
helm upgrade
, bagan inginclusterIP
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 mengubahclusterIP
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 nilaiclusterIP: ""
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 setclusterIP: ""
, 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 menghilangkanClusterIP
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 2to3Templat 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 menghilangkanClusterIP
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 memilikispec.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 -
- berhasilhelm template ... | kubectl replace -f -
- menghasilkan _Layanan "dummy" tidak valid: spec.clusterIP : Nilai tidak valid: "": bidang tidak dapat helm template ... | kubectl replace --force -f -
- berhasilversi 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 2helm 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 2helm install —force
.Ada baiknya ini terjadi. Bahkan dengan menghilangkan tanda
--force
, saya masih mendapatkan kesalahan saat memutakhirkan grafik. Misalnya, dengancert-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
).
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