Ich verwende Folgendes, um ein Diagramm zu installieren / zu aktualisieren:
./helm upgrade --install
--set rbac.create=false
--set controller.replicaCount=2
--set controller.service.loadBalancerIP=$ip
--wait main-ingress stable/nginx-ingress
(Wo $ip eine IP ist, zB 10.0.0.1)
Dies geschieht in einer CI/CD-Pipeline, die Idee ist also, das erste Mal zu installieren und das nächste Mal zu aktualisieren.
Es lässt sich gut installieren. Beim zweiten Durchlauf gibt es Folgendes aus:
_client.go:339: Dienst: "main-ingress-nginx-ingress-controller" kann nicht gepatcht werden (Dienst "main-ingress-nginx-ingress-controller" ist ungültig: spec.clusterIP: Ungültiger Wert: "": Feld ist unveränderlich )
client.go:358: Verwenden Sie --force, um die Wiederherstellung der Ressource zu erzwingen
client.go:339: Dienst: "main-ingress-nginx-ingress-default-backend" kann nicht gepatcht werden (Dienst "main-ingress-nginx-ingress-default-backend" ist ungültig: spec.clusterIP: Ungültiger Wert: "" : Feld ist unveränderlich)
client.go:358: Verwenden Sie --force, um die Wiederherstellung der Ressource zu erzwingen
Fehler: UPGRADE FAILED: Dienst "main-ingress-nginx-ingress-controller" ist ungültig: spec.clusterIP: Ungültiger Wert: "": Feld ist unveränderlich && Dienst "main-ingress-nginx-ingress-default-backend" ist ungültig : spec.clusterIP: Ungültiger Wert: "": Feld ist unveränderlich_
Ich bekomme dies auch auf der Helmliste:
NAME NAMESPACE REVISION AKTUALISIERTES STATUSDIAGRAMM
Main-Ingress-Standard 1 2019-09-06 13:17:33.8463781 -0400 EDT bereitgestellt nginx-ingress-1.18.0
main-ingress default 2 2019-09-06 13:21:11.6428945 -0400 EDT fehlgeschlagen nginx-ingress-1.18.0
Die Freigabe ist also fehlgeschlagen.
Bei Helm 2 hatte ich dieses Problem nicht. Liegt es an einer Verhaltensänderung in Helm 3 oder ist es ein Fehler? Wenn es ersteres ist, wie könnte ich den Befehl ändern, um dieses Problem nicht zu haben?
Ausgabe von helm version
: version.BuildInfo{Version:"v3.0.0-beta.2", GitCommit:"26c7338408f8db593f93cd7c963ad56f67f662d4", GitTreeState:"clean", GoVersion:"go1.12.9"}
Ausgabe von kubectl version
: Client-Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.0", GitCommit:"0ed33881dc4355495f623c6f22e7dd0b7632b7c0", GitTreeState:"clean", BuildDate: "2018-09-27T17:05:32Z", GoVersion:"go1.10.4", Compiler:"gc", Plattform:"linux/amd64"}
Serverversion: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.10", GitCommit:"37d169313237cb4ceb2cc4bef300f2ae3053c1a2", GitTreeState:"clean", BuildDate:"2019-08-19T10:44: 49Z", GoVersion:"go1.11.13", Compiler:"gc", Plattform:"linux/amd64"}
Cloud-Anbieter/Plattform (AKS, GKE, Minikube usw.): AKS
Dies hängt wahrscheinlich mit einer kürzlichen Änderung in Helm 3 zusammen, bei der jetzt eine Dreiwege-Merge-Patch-Strategie ähnlich wie bei kubectl verwendet wird. Siehe #6124
Wenn Sie Schritte zur Reproduktion angeben können, wäre das wunderbar. Danke!
Sicher!
Ich habe einen AKS-Cluster erstellt.
Ich erstelle eine öffentliche IP in der Ressourcengruppe MC_*.
Ich habe die IP-Adresse dieser öffentlichen IP in $ip gespeichert.
Dann habe ich diesen Befehl im Grunde zweimal ausgeführt:
./helm upgrade --install
--set rbac.create=false
--set controller.replicaCount=2
--set controller.service.loadBalancerIP=$ip
--wait main-ingress stable/nginx-ingress
Dies ähnelt der Vorgehensweise in https://docs.microsoft.com/en-us/azure/aks/ingress-static-ip.
Der Unterschied besteht darin, dass ich ein Helm-Upgrade durchführe --installiere zweimal. Der Zweck davon ist, eine einzige Befehlszeile (unbedingt) in meinem CI/CD zu haben.
Lassen Sie es mich wissen, wenn Sie mehr Details zum Reproduzieren benötigen.
War das genug, um sich zu reproduzieren? Ich kann ein Bash-Skript bereitstellen, wenn es hilft.
Entschuldigung, ich habe die Woche Zeit beim Helm Summit EU, also hatte ich noch keine Zeit, um zu antworten.
Ah... keine Sorge. Genieße den Gipfel!
Ich habe auch dieses Problem
$ helm version --short
v3.0.0-beta.3+g5cb923e
Das nginx-ingress-Diagramm lässt sich beim ersten Durchlauf problemlos installieren, bei einem Upgrade jedoch ...
$ 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
Ich glaube, dies ist ein Problem mit dem nginx-Ingress-Diagramm, nicht mit helm3. Standardmäßig versucht das Diagramm immer, controller.service.clusterIP = ""
und defaultBackend.service.clusterIP = ""
zu passieren, es sei denn, Sie legen controller.service.omitClusterIP=true
und defaultBackend.service.omitClusterIP=true
.
Link zu Quellen:
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
Problemumgehung:
$ helm upgrade --install ingress-test stable/nginx-ingress --set controller.service.omitClusterIP=true --set defaultBackend.service.omitClusterIP=true
Ich habe es versucht, aber ich erhalte immer noch den gleichen Fehler
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
Wie Sie unten sehen können, enthält die Vorlage keine clusterIP.
Helm-Vorlage 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
Ich vermute, dass es passiert ist, weil ich es ursprünglich ohne omitClusterIP-Parameter bereitgestellt habe und helm v3 versucht, eine 3-Wege-Zusammenführung mit dem ursprünglichen Manifest durchzuführen, das clusterIP: ""
helm get manifest ingx --revision 1 | grep "clusterIP"
clusterIP: ""
clusterIP: ""
Ich konnte es beheben, indem ich zuerst das vorhandene Diagramm löschte und es mit den Optionen omitClusterIP
. Unterm Strich funktioniert die vorgeschlagene @bambash nur, wenn Sie Chart installieren und diese Optionen von Anfang an auf "true" gesetzt haben
$ helm upgrade --install ingress-test stable/nginx-ingress --set controller.service.omitClusterIP=true --set defaultBackend.service.omitClusterIP=true
Es wäre großartig, wenn es in helm v3 eine Möglichkeit gäbe, die Zusammenführung mit dem bestehenden Manifest zu überspringen
Entschuldigung, ich hätte angeben sollen, dass diese Werte bei der Erstinstallation der Version festgelegt werden müssen. Das Aktualisieren einer vorhandenen Version kann sich als schwieriger erweisen...
Ich stoße auf dieses Problem mit metric-server-2.8.8, das keine clusterIP in seinen Werten hat, und einigen anderen Diagrammen mit helm v3.0.0-rc.2. irgendein Rat? Ich bin mir nicht sicher, wie ich vorgehen soll.
Mein Problem scheint mit helmfile v0.95.0 zu sein. Ich werde es dort verfolgen :)
Ich habe das gleiche Problem, auch ohne den Diensttyp oder die ClusterIP mit helm v3.0.0-rc.2 einzustellen, wenn ich die Option --force mit dem Befehl helm update --install verwende. Ohne die --force funktioniert es gut
@johannges , das gleiche
Die Einstellung omitClusterIP: true
scheint für defaultBackend- und Controller- Dienste zu funktionieren, aber nicht für die Metriken .
Ich denke, dies ist ein Problem mit Helm mit der Option --force
während des Upgrades.
Helm versucht, den Dienst neu zu erstellen, ersetzt jedoch auch spec.clusterIP, sodass ein Fehler ausgegeben wird.
Ich kann dies mit meinem eigenen benutzerdefinierten Diagramm bestätigen.
Error: UPGRADE FAILED: failed to replace object: Service "litespeed" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Eigentlich war es ein Fehler von meiner Seite, das Weglassen der clusterIP-Definition bei der Initialisierung des Dienstes (oder des Diagramms) funktioniert gut 👍
Dieser Fehler trat auch bei vorhandenen bereitgestellten _kafka_- und _redis_-Diagrammversionen auf. Das Entfernen von --force
dies tatsächlich behoben.
Jetzt erhalte ich einen neuen Fehler von der _redis_-Version:
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
Mit @bacongobbler vereinbart, dass dies mit der Drei-Wege-Merge-Patch-Strategie von Helm v3 zusammenhängt, die wahrscheinlich dazu führt, dass Felder (sogar mit den gleichen Werten wie zuvor) an das Update/den Patch übergeben werden, den Kubernetes nach der ersten Erstellung als unveränderlich/unveränderlich betrachtet.
Falls jemand hier landet, der helm v3 über Terraform verwendet, da Sie ihm nicht direkt sagen können, dass er --force
ich Erfolg, das Diagramm manuell mit helm delete
löschen und dann Terraform erneut auszuführen. das ist scheiße aber es funktioniert.
Bearbeiten: der ganze Fehler: ("nginx-ingress-singleton-controller" ist der Release-Name, den ich gesetzt habe. Er hat keine spezifische Bedeutung)
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 hat das Problem in https://github.com/helm/helm/issues/6378#issuecomment -532766512 genagelt. ich versuche es mal genauer zu erklären....
Wie andere darauf hingewiesen haben, tritt das Problem auf, wenn ein Diagramm eine ClusterIP mit einer leeren Zeichenfolge definiert. Wenn der Dienst installiert ist, füllt Kubernetes dieses Feld mit der ClusterIP, die es dem Dienst zugewiesen hat.
Wenn helm upgrade
aufgerufen wird, fordert das Diagramm zum Entfernen von clusterIP
auf, daher lautet die Fehlermeldung spec.clusterIP: Invalid value: "": field is immutable
.
Dies geschieht aufgrund des folgenden Verhaltens:
clusterIP
eine leere Zeichenfolge sein sollclusterIP
zugewiesen. Wir verwenden 172.17.0.1
für dieses Beispielhelm upgrade
möchte das Diagramm, dass clusterIP
eine leere Zeichenfolge ist (oder im obigen Fall von @zen4ever wird es weggelassen).Beim Generieren des Drei-Wege-Patches sieht es, dass der alte Zustand ""
, der Live-Zustand derzeit "172.17.0.1"
und der vorgeschlagene Zustand ""
. Helm hat festgestellt, dass der Benutzer angefordert hat, clusterIP
von "172.17.0.1" in "" zu ändern, und hat daher einen Patch bereitgestellt.
In Helm 2 ignorierte es den Live-Status, sodass keine Änderung (alter Status: clusterIP: ""
zu neuer Status: clusterIP: ""
) und kein Patch generiert wurde, der dieses Verhalten umging.
Meine Empfehlung wäre, die Vorlagenausgabe zu ändern. Wenn kein clusterIP
als Wert angegeben wird, dann setzen Sie den Wert nicht auf einen leeren String... Lassen Sie das Feld komplett weg.
zB im Fall von stable/nginx-ingress
:
spec:
{{- if not .Values.controller.service.omitClusterIP }}
clusterIP: "{{ .Values.controller.service.clusterIP }}"
{{- end }}
Sollte geändert werden in:
spec:
{{- if not .Values.controller.service.omitClusterIP }}
{{ with .Values.controller.service.clusterIP }}clusterIP: {{ quote . }}{{ end }}
{{- end }}
Deshalb funktioniert auch --set controller.service.omitClusterIP=true
in diesem Fall.
TL;DR macht dies in Ihren Dienstvorlagen nicht:
clusterIP: ""
Andernfalls versucht Helm, die ClusterIP des Dienstes von einer automatisch generierten IP-Adresse in eine leere Zeichenfolge zu ändern, daher die Fehlermeldung.
Hoffe das hilft!
Als vorübergehende Lösung, wenn Sie versuchen, dies vorerst zum Laufen zu bringen, während dieses Problem behoben wird, habe ich festgestellt, dass ich ein Update durchführen konnte, wenn ich Folgendes tat:
kubectl get svc | grep ingress
controller:
service:
clusterIP: <cluster-ip-address-for-controller>
defaultBackend:
service:
clusterIP: <cluster-ip-address-for-default-backend>
Ich habe dies für einen von mir ausgeführten Cluster getestet und es war keine Erholung erforderlich.
Das funktioniert auch. Guter Anruf @treacher. Wenn Sie den gleichen Wert über --set
oder in Ihrer Wertedatei festlegen, wird kein Patch generiert, da das Upgrade den Wert von clusterIP
nicht ändern möchte.
Das Schließen funktioniert absichtlich gemäß dem oben beschriebenen Verhalten des Drei-Wege-Merge-Patches. Aktionspunkt ist, dass diese Diagramme der Empfehlung oben in https://github.com/helm/helm/issues/6378#issuecomment-557746499 folgen. Hier auf Helms Seite ist nichts zu tun. :)
https://github.com/helm/charts/pull/19146/files erstellt! Danke @bacongobbler
@zen4ever hat das Problem in #6378 (Kommentar) genagelt. ich versuche es mal genauer zu erklären....
Wie andere darauf hingewiesen haben, tritt das Problem auf, wenn ein Diagramm eine ClusterIP mit einer leeren Zeichenfolge definiert. Wenn der Dienst installiert ist, füllt Kubernetes dieses Feld mit der ClusterIP, die es dem Dienst zugewiesen hat.
Wenn
helm upgrade
aufgerufen wird, fordert das Diagramm zum Entfernen vonclusterIP
auf, daher lautet die Fehlermeldungspec.clusterIP: Invalid value: "": field is immutable
.Dies geschieht aufgrund des folgenden Verhaltens:
- Bei der Installation gab das Diagramm an, dass
clusterIP
eine leere Zeichenfolge sein soll- Kubernetes hat dem Dienst automatisch
clusterIP
zugewiesen. Wir verwenden172.17.0.1
für dieses Beispiel- Auf
helm upgrade
möchte das Diagramm, dassclusterIP
eine leere Zeichenfolge ist (oder im obigen Fall von @zen4ever wird es weggelassen).Beim Generieren des Drei-Wege-Patches sieht es, dass der alte Zustand
""
, der Live-Zustand derzeit"172.17.0.1"
und der vorgeschlagene Zustand""
. Helm hat festgestellt, dass der Benutzer angefordert hat,clusterIP
von "172.17.0.1" in "" zu ändern, und hat daher einen Patch bereitgestellt.In Helm 2 ignorierte es den Live-Status, sodass keine Änderung (alter Status:
clusterIP: ""
zu neuer Status:clusterIP: ""
) und kein Patch generiert wurde, der dieses Verhalten umging.Meine Empfehlung wäre, die Vorlagenausgabe zu ändern. Wenn kein
clusterIP
als Wert angegeben wird, dann setzen Sie den Wert nicht auf einen leeren String... Lassen Sie das Feld komplett weg.zB im Fall von
stable/nginx-ingress
:spec: {{- if not .Values.controller.service.omitClusterIP }} clusterIP: "{{ .Values.controller.service.clusterIP }}" {{- end }}
Sollte geändert werden in:
spec: {{- if not .Values.controller.service.omitClusterIP }} {{ with .Values.controller.service.clusterIP }}clusterIP: {{ quote . }}{{ end }} {{- end }}
Hallo @bacongobbler , ich denke, da wir, wenn kein Wert angegeben wird, immer noch
clusterIP: ""
... besser wäre es, wenn der WertclusterIP: ""
in der Wertedatei vollständig auskommentiert ist. Dadurch wird es aus gerenderten Manifesten weggelassen, wenn es festgelegt ist, und sollte zukünftige Kopfschmerzen ersparen. Wenn jedoch helm3 verwendet wird und der aktuelle HelmstatusclusterIP: ""
gesetzt hat, müssen die ClusterIP-Adressen in Wertedateien hartcodiert werden.
Aus diesem Grund funktioniert auch
--set controller.service.omitClusterIP=true
in diesem Fall.TL;DR macht dies in Ihren Dienstvorlagen nicht:
clusterIP: ""
Andernfalls versucht Helm, die ClusterIP des Dienstes von einer automatisch generierten IP-Adresse in eine leere Zeichenfolge zu ändern, daher die Fehlermeldung.
Hoffe das hilft!
Hey @bacongobbler , wir hatten das gleiche Problem während der Migration von helm v2 auf helm v3. Wir verwenden type: ClusterIP
im Service, lassen aber ClusterIP
überhaupt weg und wir erhalten:
Error: UPGRADE FAILED: failed to replace object: Service "dummy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Wir haben spec.clusterIP:
in unserer Helm-Vorlage nicht, aber wir haben diesen Fehler nach der Migration der Veröffentlichung über Helm 2to3 erhalten
Servicevorlage:
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 }}
Selbes Problem hier. Die Sache ist, dass wir den Service nicht angerührt haben. Es ist Ingress, der vor dem Upgrade geändert wurde.
Es wirkt sich auf Ressourcen mit unveränderlichem Feld aus, wenn das Flag --force
von helm upgrade --install
gelöscht und das unveränderliche Feld nicht berührt wird. Alles funktioniert gut. Aber wenn Sie stoßende Apiversion von Ressourcen wollen??? Sie müssen Ressourcen neu erstellen, aber Helm 3 wird die Ressourcen nicht aktualisieren....
@bacongobbler ^^^
habe versucht, hpa mit neuer apiVersion von helm 3 zu aktualisieren:
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 und @ kritcher722 Daumen abgestürzten Kommentar wurde aktualisiert, wenn Sie dies wünschen unten die Daumen zu entfernen, aber wenn noch freundlich in Uneinigkeit erarbeiten, warum es eine gute Idee, clusterIP: ""
in den gerenderten Manifeste.
Sieht so aus, als ob Microsoft Mentor des Projekts ist. Ich sehe Stil. :)
Bitte wieder öffnen. Problem ist nicht behoben. Dieser von nasseemkullah vorgeschlagene "Hack" ist nicht angemessen. Bitten Sie die Leute nicht, auf den Kopf zu springen. Repariere es einfach. Sehr schlechter Migrationsweg. Helm ist scheiße.
@antonakv was für ein Start ins Jahr :)
Ich denke, im Allgemeinen spielen wir mit dem Feuer, wenn wir clusterIP als konfigurierbaren Wert in einem Diagramm bereitstellen, und können nicht einem Tool/einer Person/PR im Besonderen die Schuld geben.
Wenn clusterIP ein konfigurierbarer Wert sein muss, die standardmäßig nicht in der gerenderten Vorlage sein soll, ist , dass die Idee meiner Kommentierung aus in den Werten Dateien per https://github.com/helm/charts/blob/270172836fd8cf56d787cf7d04d938856de0c794/stable /nginx-ingress/values.yaml#L236
Dies sollte, wenn ich mich nicht irre, künftige Kopfschmerzen für diejenigen vermeiden, die das Diagramm ab dieser Änderung installieren. Aber für diejenigen von uns (mich eingeschlossen), die es zuvor installiert und dann zu helm3 migriert haben, befürchte ich, dass das Festhalten der aktuellen clusterIP-Werte in unseren Wertedateien ODER das Deinstallieren und Neuinstallieren des Diagramms (verursacht Ausfallzeiten!) die einzigen Optionen sind, die ich sehen.
Meine Meinung ist meine eigene, ich werde nicht dafür bezahlt, am Steuer zu arbeiten, nur ein Endbenutzer wie Sie. Diejenigen, die für diese Vollzeitarbeit bezahlt werden, können möglicherweise mehr Einblicke bieten.
Frohes neues Jahr und viel Glück! Geben Sie das Ruder nicht auf, gemeinsam können wir es besser machen.
Hey @bacongobbler , wir hatten das gleiche Problem während der Migration von helm v2 auf helm v3. Wir verwenden
type: ClusterIP
im Service, lassen aberClusterIP
überhaupt weg und wir erhalten:
Error: UPGRADE FAILED: failed to replace object: Service "dummy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Wir haben
spec.clusterIP:
in unserer Helm-Vorlage nicht, aber wir haben diesen Fehler nach der Migration der Veröffentlichung über Helm 2to3 erhaltenServicevorlage:
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 }}
Wir haben das gleiche Problem. Wir definieren clusterIP
in unserem Diagramm überhaupt nicht und es ist in der endgültigen Vorlage nicht vorhanden. Wir erhalten jedoch immer noch den gleichen Fehler und nur mit --force
Flag.
Wir haben das gleiche Problem:
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
ist nicht Teil der Service-Vorlage, aber mit Helm 3.0.2 und einem helm upgrade ... --force --install
Aufruf sehen wir auch:
Fehler: UPGRADE FAILED: Objekt konnte nicht ersetzt werden: Dienst "Dummy" ist ungültig: spec.clusterIP: Ungültiger Wert: "": Feld ist unveränderlich
Bitte wieder öffnen.
@tomcruise81 siehe https://github.com/helm/helm/issues/7350 für den Thread zu --force
. Das führt zu demselben Fehler, aber es liegt daran, wie kubectl replace
zu funktionieren scheint. Es ist ein anderes Problem als das hier beschriebene, das sich auf DienstclusterIPs und die Dreiwege-Merge-Patch-Strategie bezieht ( helm upgrade
ohne das --force
Flag).
@bacongobbler - danke für die schnelle Antwort und Klarstellung. Anschauen:
https://github.com/helm/helm/blob/a963736f6675e972448bf7a5fd141628fd0ae4df/pkg/kube/client.go#L405 -L411
die https://github.com/kubernetes/cli-runtime/blob/master/pkg/resource/helper.go#L155 -L181 verwenden, scheint der Aufruf von helper.Replace
dies nicht zu tun dasselbe wie kubectl replace -f ... --force
(beachten Sie die --force am Ende).
Ich vermute, dass hier die Verwirrung groß ist.
Ich kenne meine Erwartung von helm upgrade ... --force
und die Verwendung einer Ersatzstrategie war, dass es dasselbe tun würde wie kubectl replace -f ... --force
.
Hey @bacongobbler , wir hatten das gleiche Problem während der Migration von helm v2 auf helm v3. Wir verwenden
type: ClusterIP
im Service, lassen aberClusterIP
überhaupt weg und wir erhalten:
Error: UPGRADE FAILED: failed to replace object: Service "dummy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Wir habenspec.clusterIP:
in unserer Helm-Vorlage nicht, aber wir haben diesen Fehler nach der Migration der Veröffentlichung über Helm 2to3 erhalten
Servicevorlage: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 }}
Wir haben das gleiche Problem. Wir definieren
clusterIP
in unserem Diagramm überhaupt nicht und es ist in der endgültigen Vorlage nicht vorhanden. Wir erhalten jedoch immer noch den gleichen Fehler und nur mit--force
Flag.
Ich habe auch überprüft, dass im Release-Manifest kein clusterIP
:
$ helm get manifest paywall-api-ee | grep clusterIP
$
Das gleiche hier - wir definieren ClusterIP
nirgendwo, sehen aber immer noch den Fehler
Wenn ich noch etwas damit herumspiele, habe ich Folgendes beobachtet:
helm upgrade ... --force --install
- ergibt _Der Dienst "Dummy" ist ungültig:spec.clusterIP : Ungültiger Wert: "": Feld ist unveränderlich_helm template ... | kubectl apply -f -
- funktionierthelm template ... | kubectl replace -f -
- ergibt _Der Dienst "Dummy" ist ungültig:spec.clusterIP : Ungültiger Wert: "": Feld ist unveränderlich_helm template ... | kubectl replace --force -f -
- funktioniertkubectl-Version - 1.14.6
Helmversion - 3.0.2
@tomcruise81 Sie können versuchen, das Helm-Plugin 2to3 zu verwenden und von der helm2 zur helm3-Version zu migrieren und --force
löschen, wenn Sie es zuvor verwendet haben.
Es ist Arbeit für uns.
Was mich betrifft und wie für andere Leute aussieht, hat --force
ein Fehlverhalten und sollte diesen Fall mit unveränderlichem Feld wie bei mir behandeln
@alexandrsemak - danke für die Empfehlung. In meinem Fall sehe ich dies auf einem Diagramm, das nur mit Helm 3 installiert oder aktualisiert wurde.
Gleiches Problem bei mir! Verwenden von
$ helm install my-release xxxxx
$ helm upgrade --install --force my-release xxxxx
In meinem Fall definiere ich ClusterIP für keinen der in meinem Diagramm verwendeten Dienste, aber ich
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 }}
Wie andere Benutzer bereits sagten, liegt der Grund darin, dass Kubernetes dem Dienst beim ersten Mal automatisch eine ClusterIP zuweist (zB clusterIP: 10.96.26.65
) und es beim Upgradeversuch mit clusterIP: ""
kollidiert. Bitte beachte, dass ich dies nicht in meinen Vorlagen erzeuge: clusterIP: ""
Bitte öffne diesen
Ich habe das gleiche Problem.
@juan131 @Ronsevet : remove --force Die Bedeutung hat sich geändert.
mit dem gleichen Problem in benutzerdefinierten Diagrammen konfrontiert.
Wir definieren Clusterip nirgendwo.
Helm v3.0.2
kubectl 1.14.8
Das Problem besteht darin, dass ein Diagramm manchmal im Fehlerzustand bleibt, obwohl die Pods erstellt wurden und ausgeführt werden. Wenn wir versuchen, dieselbe Version zu aktualisieren, funktioniert dies nicht ohne Gewalt.
Da die Pods ausgeführt werden, kann die Version nicht gelöscht und neu erstellt werden.
Es muss eine Möglichkeit geben, "Kraft" anzuwenden
Das gleiche gilt für mich - ich habe dem Dienst gerade ein zusätzliches Label hinzugefügt und bin mit diesem Fehler konfrontiert. Außerdem definiere ich ClusterIP nirgendwo - bitte öffnen Sie das Problem erneut
@bacongobbler Wir stellen StorageClasses als Teil unseres Diagramms bereit und die Parameter von helm upgrade --force
fehl.
Nicht sicher, wie dieser Fall für die StorageClasses-Aktualisierung behandelt werden soll. Irgendwelche Vorschläge?
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.
Es funktionierte in helm v2 gut, da helm upgrade --force
verwendet wurde, um das Löschen zu erzwingen und StorageClass neu zu erstellen .
Wenn jemand Symptome hat, die nicht auf die Erklärung in https://github.com/helm/helm/issues/6378#issuecomment -557746499 zurückzuführen sind, können Sie bitte eine neue Ausgabe mit Ihren Ergebnissen und wie wir sie reproduzieren können, eröffnen? es auf unserer Seite?
Das vom OP angesprochene Problem war auf das oben beschriebene Szenario zurückzuführen, bei dem ein Diagramm die ClusterIP bei der Installation auf eine leere Zeichenfolge festlegte. Es ist durchaus möglich, dass es andere Szenarien gibt, in denen dieser spezielle Fall auftreten kann, wie andere mit der Verwendung des --force
Flags erwähnt haben. Diese Fälle sollten separat besprochen werden, da Diagnose und Lösung von den zuvor gegebenen Ratschlägen abweichen können.
Danke schön!
@mssachan siehe #7082 und den Entwurfsvorschlag in #7431 für Ihren Anwendungsfall. Dieser Vorschlag zielt darauf ab, kubectl replace —force
zu implementieren, was dem Verhalten von helm install —force
von Helm 2 ähnlich wäre.
@mssachan siehe #7082 und den Entwurfsvorschlag in #7431 für Ihren Anwendungsfall. Dieser Vorschlag zielt darauf ab,
kubectl replace —force
zu implementieren, was dem Verhalten vonhelm install —force
von Helm 2 ähnlich wäre.
Es ist gut, dass dies geschieht. Auch wenn das Flag --force
weggelassen wird, erhalte ich beim Aktualisieren von Diagrammen immer noch den Fehler. Zum Beispiel mit 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 siehe #7082 und den Entwurfsvorschlag in #7431 für Ihren Anwendungsfall. Dieser Vorschlag zielt darauf ab,
kubectl replace —force
zu implementieren, was dem Verhalten vonhelm install —force
von Helm 2 ähnlich wäre.Es ist gut, dass dies geschieht. Auch wenn das Flag
--force
weggelassen wird, erhalte ich beim Aktualisieren von Diagrammen immer noch den Fehler. Zum Beispiel mitcert-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 Ich habe genau das gleiche Problem, nachdem ich Helm v2 auf v3 aktualisiert habe. Der Upgrade-Fortschritt war reibungslos und ohne Fehler, dann versuche ich, den cert-manager von helm zu aktualisieren, scheiterte mit der gleichen Ausgabe.
# 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"}
Alle Problemumgehungen für den Fall, dass --force nicht verwendet wird oder überhaupt keine Option für das Setzen von clusterIP
wird. Dies ist mein Service-Manifest:
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 hast du dafür schon mal eine lösung gefunden? Ich sehe dasselbe auf meiner Seite und meine Dienste sind genau so definiert wie Ihre. Es wird keine Option für clusterIP
festgelegt, und dennoch schlägt Helm bei einem Upgrade fehl.
Hier gilt das gleiche
Bekomme dies auch, re: die beiden obigen Kommentare.
Bitte geben Sie weitere Informationen an. Wir können Ihnen nicht helfen, ohne die Ursache zu verstehen oder zu verstehen, wie dieses Problem in Ihrem Fall auftritt. Danke.
@antonakv dieses Problem Duplikat von 7956
@bacongobbler mehr Infos
Ich habe das gleiche Problem, auch ohne den Diensttyp oder die ClusterIP mit helm v3.0.0-rc.2 einzustellen, wenn ich die Option --force mit dem Befehl helm update --install verwende. Ohne die --force funktioniert es gut
Cool! Ich habe mich von Ihrer Antwort inspirieren lassen, dass ich die Zeile force: ..
in der Helmdatei yaml kommentieren muss:
helmDefaults:
tillerless: true
verify: false
wait: true
timeout: 600
# force: true <---- THI ONE IS COMMENTED
Es funktioniert
Ich habe alle oben genannten ausprobiert, keine hat bei mir funktioniert. Ich musste nginx-ingress
aus meinem Diagramm deaktivieren, ein Upgrade durchführen, es wieder aktivieren und erneut aktualisieren. Dies führte zu einer Änderung der vom Cloud-Anbieter zugewiesenen IP-Adresse, die jedoch nicht geschadet hat.
Ich habe das gleiche Problem, auch ohne den Diensttyp oder die ClusterIP mit helm v3.0.0-rc.2 einzustellen, wenn ich die Option --force mit dem Befehl helm update --install verwende. Ohne die --force funktioniert es gut
Beste Lösung, bei mir funktioniert es, danke!
Wir haben das gleiche Problem und konnten keine Abhilfe finden.
Es ist ziemlich einfach zu reproduzieren
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
Ich habe mich gefragt, warum das --force
hier nicht funktioniert, sollte es nicht force resource updates through a replacement strategy
wenn dies eine Ersetzungsstrategie ist, dann sollte der Dienst entfernt und dann ersetzt werden?
@bacongobbler Ich bin zu diesem Thread gekommen, nachdem ich https://github.com/helm/helm/issues/7956 überprüft habe
Wie bei allen vorherigen Kommentatoren: Wir haben "clusterIP" überhaupt nicht in Vorlagen, aber der Fehler ist mit dem neuesten Helm immer noch vorhanden, wenn das Flag --force verwendet wird.
Helmversion: 3.4.1
"helm -n kube-system get manifest CHART_NAME | grep clusterIP" zeigt keine Ergebnisse.
Fehler:
field is immutable && failed to replace object: Service "SERVICE_NAME" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Dieselbe Erklärung in https://github.com/helm/helm/issues/6378#issuecomment -557746499 gilt auch hier in Ihrem Fall @nick4fake. Der Unterschied besteht darin, dass Sie bei --force
Kubernetes auffordern, Ihr vollständig gerendertes Manifest zu übernehmen und das aktuelle Live-Objekt gewaltsam zu überschreiben. Da Ihr Manifest kein Feld clusterIP
, nimmt Kubernetes dies an und geht davon aus, dass Sie versuchen, das Feld clusterIP
aus dem Live-Objekt zu entfernen, daher der Fehler Invalid value: "": field is immutable
.
@bacongobbler Es tut mir wirklich leid, wenn ich hier etwas übersehe, vielleicht weiß ich einfach nicht genug über Helm-Interna.
"Meine Empfehlung wäre, die Vorlagenausgabe zu ändern. Wenn keine ClusterIP als Wert bereitgestellt wird, dann setzen Sie den Wert nicht auf eine leere Zeichenfolge... Lassen Sie das Feld vollständig aus."
Was ist also die Lösung? Bedeutet das, dass das Flag "--force" überhaupt nicht verwendet werden kann, wenn das clusterIP-Feld nicht auf einen statischen Wert gesetzt ist?
Was Kubernetes betrifft: ja.
Nach meinem Verständnis ein Problem bei Kubernetes, da sich "erzwungenes Überschreiben" nicht wie "löschen und neu erstellen" verhält. Gibt es einen Upstream-Fehler?
Andererseits ist Helm auch irreführend, denn --force
wird als "Ressourcenaktualisierung durch eine Ersatzstrategie erzwingen" beschrieben. Während es in Wirklichkeit keinen Ersatz durchführt, versucht es nur, Ressourcen gewaltsam zu überschreiben (es wäre besser, das Flag --force-overwrite
). Erzwungenes Ersetzen würde wie Löschen und erneutes Erstellen aussehen (es könnte ein Flag --force-recreate
). Natürlich könnte --force-recreate
für einige Ressourcen etwas gefährlich sein, aber es würde immer erfolgreich sein.
Wie auch immer, Helm könnte einen Fallback-Workaround für solche Probleme implementieren. Wenn das aktuelle Verhalten (beschrieben als --force-overwrite
) fehlschlägt und einen unveränderlichen Feldfehler erkennt, sollte es die Ressource löschen und neu erstellen (als --force-recreate
).
Hilfreichster Kommentar
Ich habe das gleiche Problem, auch ohne den Diensttyp oder die ClusterIP mit helm v3.0.0-rc.2 einzustellen, wenn ich die Option --force mit dem Befehl helm update --install verwende. Ohne die --force funktioniert es gut