Cuando se emite la actualización del timón, muestra errores como, ("my-service" cambia de "clusterIP: None" a "type: LoadBalancer" sin el campo clusterIP)
Error: UPGRADE FAILED: Service "my-service" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Sin embargo, todos los demás pods con la nueva versión aún se reiniciarán, excepto que el tipo "my-service" no cambia al nuevo tipo "LoadBalancer".
Entiendo que la actualización falló porque helm no admite cambios en ciertos campos. Pero, ¿por qué helm aún actualiza otros servicios / pods reiniciándolo? ¿Helm no debe hacer nada si hay algún error durante la actualización? Exceptué a helm para tratar todo el conjunto de servicios como un paquete para actualizar todos o ninguno, pero parece que mi expectativa podría ser incorrecta.
Y si alguna vez terminamos en tal situación, entonces, ¿qué debemos hacer para salir de la situación? como actualizar "mi-servicio" para tener un nuevo tipo?
Y si uso la opción --dry-run, helm no muestra ningún error.
¿Esto se considera un error o se espera? Es decir, la actualización arroja algún error, pero algunos servicios aún se actualizan.
Salida de helm version
:
Client: &version.Version{SemVer:"v2.12.3", GitCommit:"eecf22f77df5f65c823aacd2dbd30ae6c65f186e", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Salida de kubectl version
:
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:36:53Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.27", GitCommit:"145f9e21a4515947d6fb10819e5a336aff1b6959", GitTreeState:"clean", BuildDate:"2020-02-21T18:01:40Z", GoVersion:"go1.12.12b4", Compiler:"gc", Platform:"linux/amd64"}
Proveedor de nube / plataforma (AKS, GKE, Minikube, etc.):
GKE y Minkube
No se ha proporcionado suficiente información para reproducir. Díganos cómo crear un gráfico reproducible y qué comandos de Helm usó.
Hola, aquí están los pasos para reproducir
Tener dos servicios de archivo yaml como se muestra a continuación.
nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
prometheus.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: prometheus
spec:
template:
metadata:
labels:
app: prometheus
spec:
containers:
- image: prom/prometheus
name: prometheus
ports:
- containerPort: 9090
imagePullPolicy: Always
hostname: prometheus
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: prometheus
spec:
selector:
app: prometheus
clusterIP: None
ports:
- name: headless
port: 9090
targetPort: 0
Luego coloque allí dos archivos en helm1 / templates / luego instale. Muestra que el servicio prometheus usa clusterIP y la versión de nginx es 1.14.2
# helm upgrade --install test helm1
Release "test" does not exist. Installing it now.
NAME: test
LAST DEPLOYED: Tue Apr 21 20:42:55 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35d
prometheus ClusterIP None <none> 9090/TCP 7s
# kubectl describe deployment nginx |grep Image
Image: nginx:1.14.2
Ahora actualice la sección para nginx.yaml a la nueva versión 1.16
image: nginx:1.16
y prometheus.yaml cambiándolo a LoadBalancer.
spec:
selector:
app: prometheus
ports:
- name: "9090"
port: 9090
protocol: TCP
targetPort: 9090
type: LoadBalancer
Ahora póngalos como helm2 y realice la actualización. Luego, puede ver que la actualización arroja algunos errores, pero el servicio nginx se ejecuta mediante la actualización a una nueva versión, pero prometheus no se actualiza porque todavía usa Cluster IP.
# helm upgrade --install test helm2
Error: UPGRADE FAILED: cannot patch "prometheus" with kind Service: Service "prometheus" is invalid: spec.clusterIP: Invalid value: "": field is immutable
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35d
prometheus ClusterIP None <none> 9090/TCP 5m34s
# kubectl describe deployment nginx |grep Image
Image: nginx:1.16
muestra la lista del timón
# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
test default 2 2020-04-21 20:48:20.133644429 -0700 PDT failed
historia del timón
# helm history test
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Tue Apr 21 20:42:55 2020 deployed helm-helm 1.0.0.6 Install complete
2 Tue Apr 21 20:48:20 2020 failed helm-helm 1.0.0.6 Upgrade "test" failed: cannot patch "prometheus" with kind Service: Service "prometheus" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Tenemos el mismo comportamiento con v3.2.0, la degradación a v3.1.3 es nuestra solución temporal
Tengo mucho de esto con mi migración Helm 2 -> 3. Cuando intento actualizar las versiones convertidas por primera vez, obtengo mucho de esto. Esto es para los gráficos de Nginx Ingress, Prometheus Operator, Graylog y Jaeger hasta ahora. La mayoría de ellos estoy contento con simplemente eliminar los servicios y dejar que Helm los vuelva a crear, pero para Nginx Ingress esta no es una opción ...
Acabo de encontrar este https://github.com/helm/helm/issues/6378#issuecomment -557746499 que explica el problema en mi caso.
Cerrando como duplicado de # 6378. @cablespaghetti encontró la explicación más profunda de este comportamiento, que se describe con gran detalle.
Háganos saber si eso no funciona para usted.
@GaramNick, ¿
@bacongobbler Mientras estás aquí. ¿Hay alguna forma de solucionar esta situación sin eliminar la versión y volver a implementarla? No puedo parecer una forma de hacerlo con el timón 2 o 3. Quiero piratear los datos de la versión existente para que Helm piense que el clusterIP siempre se ha omitido y, por lo tanto, no es necesario ningún parche.
¿Has probado kubectl edit
?
Tenemos el mismo problema y la degradación a 3.1.3
solucionó también para nosotros. Supongo que tiene que ver con la nueva lógica en https://github.com/helm/helm/pull/7649/commits/d829343c1514db17bee7a90624d06cdfbffde963 considerando esto un Create
y no una actualización, por lo tanto, tratando de establecer un vacío IP y no reutilizar la poblada
Interesante hallazgo. gracias por investigar.
@jlegrone, ¿hay alguna posibilidad de que tengas tiempo para investigar esto?
@bacongobbler Nuestro
helm upgrade --install --force \
--wait \
--set image.repository="$CI_REGISTRY_IMAGE" \
--set image.tag="$CI_COMMIT_REF_NAME-$CI_COMMIT_SHA" \
--set image.pullPolicy=IfNotPresent \
--namespace="$KUBE_NAMESPACE" \
"$APP_NAME" \
./path/to/charts/
En v3.2.0 este comando falla con Service "service-name" is invalid: spec.clusterIP: Invalid value: "": field is immutable
En v3.1.3 esto funciona bien.
Avísame si quieres tener más información.
Aquí igual. Tuvimos el siguiente service.yaml funcionando bien con helm2 durante muchos meses.
Después de la migración, el comando helm 3.2 helm upgrade
falló con el error de guardado anterior. La degradación a 3.1.3 lo resolvió.
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.global.name }}
namespace: {{ index .Values.global.namespace .Values.global.env }}
labels:
microservice: {{ .Values.global.name }}
spec:
type: ClusterIP
ports:
- port: 8080
selector:
microservice: {{ .Values.global.name }}
Tenemos el mismo problema y la actualización a 3.1.3 lo solucionó también para nosotros. Supongo que tiene que ver con la nueva lógica en d829343 considerando esto como una creación y no una actualización, por lo que se intenta establecer una IP vacía y no reutilizar la poblada
@ n1koo ¿Puede explicar por qué cree que este es el código que causa el problema? Como este es el código de instalación y no de actualización, y también el código en 3.1 es un ` create
y funciona.
Estoy revisando el problema con @adamreese , y pensamos que es el parche que identificó @ n1koo . El método Create omitirá la diferencia de 3 vías normal en el servicio, lo que dará como resultado que la IP del clúster del servicio se establezca en "" en lugar del valor que rellena Kubernetes. Como resultado, el manifiesto enviado al servidor de API _ parece estar restableciendo la IP del clúster, lo cual es ilegal en un servicio (y definitivamente no es lo que el usuario pretendía).
Todavía estamos investigando esto y lo actualizaré si aprendemos más.
Entonces https://github.com/helm/helm/issues/6378#issuecomment -557746499 es correcto. Léalo antes de continuar con este problema. Si se establece clusterIP: ""
, Kubernetes asignará una IP. En la próxima actualización de Helm, si clusterIP:""
nuevamente, dará el error anterior, porque parece _para Kubernetes_ que está intentando restablecer la IP. (¡Sí, Kubernetes modifica la sección spec:
de un servicio!)
Cuando el método Create
omite la diferencia de 3 vías, establece clusterIP: ""
lugar de configurarlo en la dirección IP asignada por Kubernetes.
Reproducir:
$ helm create issue7956
$ # edit issue7956/templates/service.yaml and add `clusterIP: ""` under `spec:`
$ helm upgrade --install issue7956 issue7956
...
$ helm upgrade issue7956 issue7956
Error: UPGRADE FAILED: cannot patch "issue-issue7956" with kind Service: Service "issue-issue7956" is invalid: spec.clusterIP: Invalid value: "": field is immutable
La segunda vez que ejecute la actualización, fallará.
No puedo reproducir el caso de @IdanAdar en master
.
@GaramNick no hay suficiente información sobre el servicio que está utilizando para que podamos reproducir su error.
Mi situación:
version.BuildInfo{Version:"v3.2.0", GitCommit:"e11b7ce3b12db2941e90399e874513fbd24bcb71", GitTreeState:"clean", GoVersion:"go1.13.10"}
también probado con
version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}
dada la siguiente plantilla de servicio:
apiVersion: v1
kind: Service
metadata:
name: {{ include "app.fullname" . }}
labels:
{{- include "app.labels" . | nindent 4 }}
annotations:
getambassador.io/config: |
---
apiVersion: ambassador/v1
kind: Mapping
name: {{ include "app.fullname" . }}_mapping
prefix: /{{ include "app.fullname" . }}
host: "^{{ include "app.fullname" . }}.*"
host_regex: true
service: {{ include "app.fullname" . }}.{{ .Release.Namespace }}
rewrite: ""
timeout_ms: 60000
bypass_auth: true
cors:
origins: "*"
methods: POST, GET, OPTIONS
headers:
- Content-Type
- Authorization
- x-client-id
- x-client-secret
- x-client-trace-id
- x-flow-proto
---
apiVersion: ambassador/v1
kind: Mapping
name: {{ include "app.fullname" . }}_swagger_mapping
ambassador_id: corp
prefix: /swagger
host: "^{{ include "app.fullname" . }}.corp.*"
host_regex: true
service: {{ include "app.fullname" . }}.{{ .Release.Namespace }}
rewrite: ""
bypass_auth: true
cors:
origins: "*"
methods: POST, GET, OPTIONS
headers:
- Content-Type
- x-client-id
- x-client-secret
- Authorization
- x-flow-proto
namespace: {{ .Release.Namespace }}
spec:
type: {{ .Values.service.type }}
selector:
{{- include "app.selectorLabels" . | nindent 4 }}
ports:
- port: {{ .Values.service.port }}
name: http-rest-hub
targetPort: http-rest
- port: {{ .Values.service.healthPort }}
name: http-health
targetPort : http-health
lo que da como resultado lo siguiente después de upgrade --install
:
apiVersion: v1
kind: Service
metadata:
annotations:
getambassador.io/config: |
---
apiVersion: ambassador/v1
kind: Mapping
name: hub-alt-bor_mapping
prefix: /hub-alt-bor
host: "^hub-alt-bor.*"
host_regex: true
service: hub-alt-bor.brett
rewrite: ""
timeout_ms: 60000
bypass_auth: true
cors:
origins: "*"
methods: POST, GET, OPTIONS
headers:
- Content-Type
- Authorization
- x-client-id
- x-client-secret
- x-client-trace-id
- x-flow-proto
---
apiVersion: ambassador/v1
kind: Mapping
name: hub-alt-bor_swagger_mapping
ambassador_id: corp
prefix: /swagger
host: "^hub-alt-bor.corp.*"
host_regex: true
service: hub-alt-bor.brett
rewrite: ""
bypass_auth: true
cors:
origins: "*"
methods: POST, GET, OPTIONS
headers:
- Content-Type
- x-client-id
- x-client-secret
- Authorization
- x-flow-proto
meta.helm.sh/release-name: alt-bor
meta.helm.sh/release-namespace: brett
creationTimestamp: ...
labels:
app: hub
app.kubernetes.io/instance: alt-bor
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: hub
app.kubernetes.io/version: v1.6.0-rc.26
deploy.xevo.com/stackname: bor-v0.1-test
helm.sh/chart: hub-0.0.4
owner: gateway
ownerSlack: TODOunknown
name: hub-alt-bor
namespace: brett
resourceVersion: ...
selfLink: ...
uid: ...
spec:
clusterIP: 172.20.147.13
ports:
- name: http-rest-hub
port: 80
protocol: TCP
targetPort: http-rest
- name: http-health
port: 90
protocol: TCP
targetPort: http-health
selector:
app.kubernetes.io/instance: alt-bor
app.kubernetes.io/name: hub
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
Si luego subo exactamente el mismo gráfico que la versión 0.0.5 y upgrade --install
nuevamente, obtengo lo siguiente:
Error: UPGRADE FAILED: failed to replace object: Service "hub-alt-bor" is invalid: spec.clusterIP: Invalid value: "": field is immutable
La única diferencia es el valor de la etiqueta helm.sh/chart
que ahora tiene un valor de hub-0.0.5
Este es un gran bloqueador.
@GaramNick no hay suficiente información sobre el servicio que está utilizando para que podamos reproducir su error.
@technosophos ¿Qué necesitas? ¡Feliz de proporcionar más detalles!
¡Actualizar! La actualización falla SOLO cuando se usa helm upgrade --install
w / --force
. Menos bloqueador ahora.
¡Oh! Eso es interesante. Eso debería facilitar la localización del error.
Hola @technosophos @bacongobbler , tenemos los mismos 2 problemas:
version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}
Service
sin clusterIP
pero kubernetes asignará clusterIP
automáticamente:apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}
labels:
app: {{ .Values.image.name }}
release: {{ .Release.Name }}
spec:
type: ClusterIP
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.port }}
protocol: TCP
name: http
selector:
app: {{ .Values.image.name }}
release: {{ .Release.Name }}
después de migrar a helm 3 con helm 2to3 convert
e intentar actualizar la misma versión helm3 upgrade --install --force
:
failed to replace object: Service "dummy-stage" is invalid: spec.clusterIP: Invalid value: "": field is immutable
si hago lo mismo sin --force
-> helm3 upgrade --install
funciona bien sin error.
spec.selector.matchLabels
en la implementación, que son campos inmutables sin --force
, aparece el error:cannot patch "dummy-stage" with kind Deployment: Deployment.apps "dummy-stage" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/name":"web-nerf-dummy-app"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
si hago lo mismo con --force
obtengo el error:
failed to replace object: Deployment.apps "dummy-stage" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/name":"web-nerf-dummy-app"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
¿Es posible implementar el mismo comportamiento para --force
que en helm 2
porque podemos sin ningún error actualizar el archivo inmutable?
apiVersion: v1
kind: Service
metadata:
name: zipkin-proxy
namespace: monitoring
spec:
ports:
- port: 9411
targetPort: 9411
selector:
app: zipkin-proxy
type: ClusterIP
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: zipkin-proxy
namespace: monitoring
spec:
replicas: {{ .Values.zipkinProxy.replicaCount }}
template:
metadata:
labels:
app: zipkin-proxy
annotations:
prometheus.io/scrape: 'true'
spec:
containers:
- image: {{ .Values.image.repository }}/zipkin-proxy
name: zipkin-proxy
env:
- name: STORAGE_TYPE
value: stackdriver
helm upgrade -i --debug --force --namespace monitoring zipkin-proxy --values ./values.yaml.tmp .
He intentado eliminar la opción de fuerza. Intenté con v3.1.3, v3.2.0 y v3.2.1, pero seguí teniendo el mismo problema.
Seguimiento de pila
history.go:52: [debug] getting history for release zipkin-proxy
upgrade.go:84: [debug] preparing upgrade for zipkin-proxy
upgrade.go:92: [debug] performing update for zipkin-proxy
upgrade.go:234: [debug] creating upgraded release for zipkin-proxy
client.go:163: [debug] checking 2 resources for changes
client.go:195: [debug] error updating the resource "zipkin-proxy":
cannot patch "zipkin-proxy" with kind Service: Service "zipkin-proxy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
client.go:403: [debug] Looks like there are no changes for Deployment "zipkin-proxy"
upgrade.go:293: [debug] warning: Upgrade "zipkin-proxy" failed: cannot patch "zipkin-proxy" with kind Service: Service "zipkin-proxy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Error: UPGRADE FAILED: cannot patch "zipkin-proxy" with kind Service: Service "zipkin-proxy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm.go:75: [debug] cannot patch "zipkin-proxy" with kind Service: Service "zipkin-proxy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm.sh/helm/v3/pkg/kube.(*Client).Update
/home/circleci/helm.sh/helm/pkg/kube/client.go:208
helm.sh/helm/v3/pkg/action.(*Upgrade).performUpgrade
/home/circleci/helm.sh/helm/pkg/action/upgrade.go:248
helm.sh/helm/v3/pkg/action.(*Upgrade).Run
/home/circleci/helm.sh/helm/pkg/action/upgrade.go:93
main.newUpgradeCmd.func1
/home/circleci/helm.sh/helm/cmd/helm/upgrade.go:137
github.com/spf13/cobra.(*Command).execute
/go/pkg/mod/github.com/spf13/[email protected]/command.go:826
github.com/spf13/cobra.(*Command).ExecuteC
/go/pkg/mod/github.com/spf13/[email protected]/command.go:914
github.com/spf13/cobra.(*Command).Execute
/go/pkg/mod/github.com/spf13/[email protected]/command.go:864
main.main
/home/circleci/helm.sh/helm/cmd/helm/helm.go:74
runtime.main
/usr/local/go/src/runtime/proc.go:203
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1357
UPGRADE FAILED
main.newUpgradeCmd.func1
/home/circleci/helm.sh/helm/cmd/helm/upgrade.go:139
github.com/spf13/cobra.(*Command).execute
/go/pkg/mod/github.com/spf13/[email protected]/command.go:826
github.com/spf13/cobra.(*Command).ExecuteC
/go/pkg/mod/github.com/spf13/[email protected]/command.go:914
github.com/spf13/cobra.(*Command).Execute
/go/pkg/mod/github.com/spf13/[email protected]/command.go:864
main.main
/home/circleci/helm.sh/helm/cmd/helm/helm.go:74
runtime.main
/usr/local/go/src/runtime/proc.go:203
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1357
Tengo este problema cuando la versión de Helm Chart cambia y tengo una implementación existente.
Usando Helm v3.2.0
Puedo confirmar que la degradación a 3.1.2 funciona.
@ gor181 ¿Cómo podemos reproducir eso? ¿Qué se rompió en 3.2 pero funcionó en 3.1? El gráfico (o al menos la plantilla de servicio) y los comandos son lo que necesitamos para poder averiguar qué cambió.
@azarudeena @alexandrsemak - para ambos, el --force
bandera es lo que está causando esto. Si elimina --force
, ¿funciona la actualización?
@technosophos lo intentó sin fuerza, no funcionó. Planeando probar con 3.1.2
@azarudeena , ¿puede proporcionar un conjunto de instrucciones para reproducir su problema? Mostró algún resultado de un servicio y una plantilla de implementación, pero luego también hizo referencia a un values.yaml.tmp
que no conocemos el resultado, ni al Chart.yaml.
¿Puede proporcionarnos una tabla de muestra que podamos utilizar para reproducir su problema?
@bacongobbler Estoy compartiendo la estructura.
Chart.yaml
apiVersion: v1
description: Deploys Stackdriver Trace Zipkin Proxy
name: zipkin-proxy
version: 1.0.0
He puesto mi plantilla yaml arriba,
mi valor yaml.tmp es el siguiente
zipkinProxy:
replicaCount: 1
image:
repository: openzipkin/zipkin
Lo empaqueto como paquete helm - versión
Probado rebajando a 3.1.2 y 3.1.1. Todavía no puedo conseguir este parche.
Enfrenté el mismo problema, pero con la actualización de un gráfico de timones a través del proveedor de timones terraform.
Después de haber cambiado force_update = true
a force_update = false
, el error desapareció.
Tengo este problema cuando la versión de Helm Chart cambia y tengo una implementación existente.
Usando Helm v3.2.0
La desactivación de la bandera --force lo hizo funcionar.
@technosophos --force
resolver problema con ClusterIP cuando migra a helm 3 como helm 2 no intente actualizar ClusterIP cuando helm 3 lo hace.
Helm 3 no puede resolver el problema con inmutable presentado como matchLabels
Kubernetes modifica la sección
spec:
de un servicio
¿Debería considerarse esto una falla de diseño en Kubernetes en la raíz? https://kubernetes.io/docs/concepts/services-networking/service/#choosing -your-own-ip-address no menciona este comportamiento. Hubiera esperado que se colocara un valor asignado en la sección status
.
(Existe un comportamiento similar para el .spec.nodeName
de un Pod
, pero es poco probable que afecte a los usuarios de Helm).
v3.2.3: falla con --force, pasa sin --force. No ClusterIP:
en la plantilla de gráfico. Lo que supongo que se suponía que debía solucionar https://github.com/helm/helm/pull/8000/files .
upgrade.go:121: [debug] preparing upgrade for eos-eve-srv-d1
upgrade.go:129: [debug] performing update for eos-eve-srv-d1
upgrade.go:308: [debug] creating upgraded release for eos-eve-srv-d1
client.go:173: [debug] checking 6 resources for changes
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode" with kind ServiceAccount for kind ServiceAccount
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode-imagepullsecret" with kind Secret for kind Secret
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode-config" with kind ConfigMap for kind ConfigMap
client.go:205: [debug] error updating the resource "eos-eve-srv-d1-fsnode":
failed to replace object: Service "eos-eve-srv-d1-fsnode" is invalid: spec.clusterIP: Invalid value: "": field is immutable
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode" with kind Deployment for kind Deployment
client.go:432: [debug] Replaced "eos-eve-srv-d1-fsnode" with kind Ingress for kind Ingress
upgrade.go:367: [debug] warning: Upgrade "eos-eve-srv-d1" failed: failed to replace object: Service "eos-eve-srv-d1-fsnode" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Error: UPGRADE FAILED: failed to replace object: Service "eos-eve-srv-d1-fsnode" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm.go:84: [debug] failed to replace object: Service "eos-eve-srv-d1-fsnode" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm.sh/helm/v3/pkg/kube.(*Client).Update
/private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/pkg/kube/client.go:218
helm.sh/helm/v3/pkg/action.(*Upgrade).performUpgrade
/private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/pkg/action/upgrade.go:322
helm.sh/helm/v3/pkg/action.(*Upgrade).Run
/private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/pkg/action/upgrade.go:130
main.newUpgradeCmd.func1
/private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/cmd/helm/upgrade.go:144
github.com/spf13/cobra.(*Command).execute
/private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:842
github.com/spf13/cobra.(*Command).ExecuteC
/private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:950
github.com/spf13/cobra.(*Command).Execute
/private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:887
main.main
/private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/cmd/helm/helm.go:83
runtime.main
/usr/local/Cellar/[email protected]/1.13.12/libexec/src/runtime/proc.go:203
runtime.goexit
/usr/local/Cellar/[email protected]/1.13.12/libexec/src/runtime/asm_amd64.s:1357
UPGRADE FAILED
main.newUpgradeCmd.func1
/private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/cmd/helm/upgrade.go:146
github.com/spf13/cobra.(*Command).execute
/private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:842
github.com/spf13/cobra.(*Command).ExecuteC
/private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:950
github.com/spf13/cobra.(*Command).Execute
/private/tmp/helm-20200608-50972-gq0j1j/pkg/mod/github.com/spf13/[email protected]/command.go:887
main.main
/private/tmp/helm-20200608-50972-gq0j1j/src/helm.sh/helm/cmd/helm/helm.go:83
runtime.main
/usr/local/Cellar/[email protected]/1.13.12/libexec/src/runtime/proc.go:203
runtime.goexit
/usr/local/Cellar/[email protected]/1.13.12/libexec/src/runtime/asm_amd64.s:1357
Estoy observando este problema en 3.2.3
pero no en 3.2.0
. La fuerza de desactivación también fue una solución utilizable.
Para su información, el problema planteado por el OP y los comentarios planteados aquí sobre --force
son problemas separados y discretos. Intentemos centrarnos en el problema de OP aquí.
Para aclarar, el problema que describe OP es una posible regresión @ n1koo identificada en https://github.com/helm/helm/issues/7956#issuecomment -620749552. Eso parece un error legítimo.
Los otros comentarios que mencionan la eliminación de --force
trabajando para ellos es un comportamiento intencional y esperado desde el punto de vista de Kubernetes. Con --force
, le pide a Helm que realice una solicitud PUT contra Kubernetes. Efectivamente, le está pidiendo a Kubernetes que tome sus manifiestos de destino (las plantillas representadas en su gráfico de helm upgrade
) como la fuente de la verdad y sobrescriba los recursos en su clúster con los manifiestos representados. Esto es idéntico a kubectl apply --overwrite
.
En la mayoría de los casos, sus plantillas no especifican una IP de clúster, lo que significa que helm upgrade --force
solicita eliminar (o cambiar) la IP de clúster del servicio. Esta es una operación ilegal desde el punto de vista de Kubernetes.
Esto también está documentado en # 7082.
Esta es también la razón por la que la eliminación de --force
funciona: Helm realiza una operación PATCH, a diferencia del estado en vivo, fusionando la IP del clúster en el manifiesto parcheado, conservando la IP del clúster durante la actualización.
Si desea eliminar a la fuerza y volver a crear el objeto como se hizo en Helm 2, eche un vistazo a # 7431.
Espero que esto aclare las cosas.
En el futuro, intentemos centrarnos en el problema de OP aquí.
¿Existen soluciones alternativas conocidas? Enfrenté el mismo problema al intentar actualizar https://github.com/helm/charts/tree/master/stable/rabbitmq-ha de 1.34.1 a 1.46.4. Obviamente, --force
o la reducción del timón a 3.1.3
no ayudó, eliminar el servicio en cuestión y helm upgrade
sí ayudó
@EvgeniGordeev Esta va a ser una solución cruda que funcionó para mí con un pequeño tiempo de inactividad. Desinstale el gráfico / vuelva a instalarlo.
También hemos logrado esto con el gráfico de ingreso de nginxinc. Usamos --force
generalmente.
Dado que este problema aún está abierto, ¿hay planes para algún tipo de solución para abordarlo, o se considera que funciona según lo diseñado (es difícil distinguir de esto + los otros problemas abiertos con el mismo comportamiento)? Leí una explicación de que este es un problema con el gráfico que en sí mismo y clusterIP: ""
no deben usarse y, en cambio, el valor debe omitirse por completo.
¿Es esto algo que deberíamos perseguir con los desarrolladores de gráficos?
@cdunford : la solución sugerida para dejar de usar --force
como se sugirió https://github.com/helm/helm/issues/7956#issuecomment -643432099.
Este RP también podría abordar el problema: # 7431 (como se sugiere en ese comentario) ...
Llegamos a este problema por N vez, también estamos usando la bandera --force
en nuestra canalización.
El problema original vino junto con helm2, entonces, ¿se solucionará también en helm2? @bacongobbler
@bacongobbler ¿por qué dice que proporcionar "fuerza" es diferente del problema si eliminarlo O degradar ayuda?
Quiero decir, acabo de resolver el problema con Helm 3.3.4, https://artifacthub.io/packages/helm/bitnami/nginx chart y no se cambiaron los valores. Probado en tres nubes diferentes: GCP / GKE, Azure / AKS y AWS / EKS, fallaron en las tres.
Trabajé inmediatamente después de haber degradado Helm a 3.1.3 Y también trabajé en 3.3.4 sin la bandera "--force".
Pensé que había dejado bastante claro en mi comentario anterior que hay dos casos únicos separados en los que un usuario puede ver este error. Uno es el caso de OP. El otro es del uso de --force. Nos estamos centrando en el problema de OP aquí.
Por respeto a las personas que están experimentando el mismo problema que el OP, deje de secuestrar este hilo para hablar sobre --force. Estamos tratando de discutir cómo resolver el problema de OP. Si desea hablar sobre temas que son irrelevantes para el problema que describió el OP, abra un nuevo ticket o eche un vistazo a las sugerencias que hice anteriormente.
@tibetsam con respecto a arreglar esto para Helm 2: no. Ya no proporcionamos correcciones de errores para Helm 2. Consulte https://helm.sh/blog/helm-v2-deprecation-timeline/ para obtener más información.
Creo que logré reproducir el problema de OP con el gráfico de timón jupytherhub.
Con suerte, con las instrucciones a continuación, podrá reproducir el problema:
Importante
El gráfico de timón de Jupyterhub no contiene un campo spec.clusterIP
en sus especificaciones de servicio, como puede ver (por ejemplo) aquí: https://github.com/jupyterhub/zero-to-jupyterhub-k8s/blob/c0a43af12a89d54bcd6dcb927fdcc2f623a14aca /jupyterhub/templates/hub/service.yaml#L17 -L29
Estoy usando helm y kind para reproducir el problema:
➜ helm version
version.BuildInfo{Version:"v3.4.0", GitCommit:"7090a89efc8a18f3d8178bf47d2462450349a004", GitTreeState:"clean", GoVersion:"go1.14.10"}
➜ kind version
kind v0.9.0 go1.15.2 linux/amd64
➜ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:56:40Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.1", GitCommit:"206bcadf021e76c27513500ca24182692aabd17e", GitTreeState:"clean", BuildDate:"2020-09-14T07:30:52Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
Como reproducir
kind create cluster
proxy:
secretToken: "3a4bbf7405dfe1096ea2eb9736c0df299299f94651fe0605cfb1c6c5700a6786"
Para su información, estoy siguiendo las instrucciones para la instalación del archivo helm ( enlace )
helm repo add jupyterhub https://jupyterhub.github.io/helm-chart/
helm repo update
--force
)RELEASE=jhub
NAMESPACE=jhub
helm upgrade --cleanup-on-fail --force \
--install $RELEASE jupyterhub/jupyterhub \
--namespace $NAMESPACE \
--create-namespace \
--version=0.9.0 \
--values config.yaml
Error:
Error: UPGRADE FAILED: failed to replace object: PersistentVolumeClaim "hub-db-dir" is invalid: spec: Forbidden: spec is immutable after creation except resources.requests for bound claims
core.PersistentVolumeClaimSpec{
AccessModes: []core.PersistentVolumeAccessMode{"ReadWriteOnce"},
Selector: nil,
Resources: core.ResourceRequirements{Requests: core.ResourceList{s"storage": {i: resource.int64Amount{value: 1073741824}, s: "1Gi", Format: "BinarySI"}}},
- VolumeName: "",
+ VolumeName: "pvc-c614de5c-4749-4755-bd3a-6e603605c44e",
- StorageClassName: nil,
+ StorageClassName: &"standard",
VolumeMode: &"Filesystem",
DataSource: nil,
}
&& failed to replace object: Service "hub" is invalid: spec.clusterIP: Invalid value: "": field is immutable && failed to replace object: Service "proxy-api" is invalid: spec.clusterIP: Invalid value: "": field is immutable && failed to replace object: Service "proxy-public" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Estoy en el timón 3.3.4 y esto sigue siendo un problema
Problema de Helm 2.14.1 presente sin --force
Solución alternativa : cambie a type.spec: NodePort
arregló mi actualización de helmchart.
Tenemos el mismo problema en v3.4.1 con la bandera --force.
@bacongobbler Sé que ha intentado atentamente evitar que el problema del OP (aparte del número 6378) sea secuestrado. Pensé que podría ayudar a los que publican a revisar su mensaje de error para saber si este hilo es para ellos o no:
¿Su mensaje de error es "Error: ACTUALIZACIÓN FALLIDA: no se pudo _remplazar_ ..." y usted _ usó_ --force en su comando? GOTO # 6378
¿Su mensaje de error es "Error: ACTUALIZACIÓN FALLIDA: no se puede _parchar_ ..." y usted _ no usó _ --force en su comando? Publique en este número cómo lo reprodujo.
@zpittmansf
helm3 upgrade concourse concourse/concourse -f temp.yaml --force
Error: UPGRADE FAILED: failed to replace object: Service "concourse-web" is invalid: spec.clusterIP: Invalid value: "None": field is immutable && failed to replace object: Service "concourse-web-prometheus" is invalid: spec.clusterIP: Invalid value: "": field is immutable && failed to replace object: Service "concourse-web-worker-gateway" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm3 upgrade concourse concourse/concourse -f temp.yaml
Error: UPGRADE FAILED: cannot patch "concourse-web" with kind Service: Service "concourse-web" is invalid: spec.clusterIP: Invalid value: "None": field is immutable
Tengo el mismo problema en Helm 3.4.2. Ejecuto un helm-chart que crea una implementación, una cuenta de servicio y un servicio. Agrego una etiqueta a mi conjunto de etiquetas existente en mi gráfico en la implementación, y ahora se niega a actualizar:
helm upgrade test-whale charts/app-template/ --install --values values.yaml --namespace whale --force
Error: UPGRADE FAILED: failed to replace object: Service "test-whale" is invalid: spec.clusterIP: Invalid value: "": field is immutable && failed to replace object: Deployment.apps "test-whale-canary" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"test-whale", "app-id":"302040", "environment":"test", "version":"latest"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable && failed to replace object: Deployment.apps "test-whale" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"test-whale", "app-id":"302040", "environment":"test", "version":"latest"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
Básicamente, parece que nunca puede agregar una etiqueta después de la implementación inicial del timón.
Suena terrible, pero ¿podría Helm implementar una lista de "campos inmutables" que recibirían un tratamiento especial?
En este caso, un "campo inmutable" sería el spec.clusterIP
: Helm lo consideraría inmutable y generaría una solicitud de API que a) no intentaría reemplazarlo, b) no intentaría eliminarlo , c) no intente actualizarlo.
En la práctica, Helm buscaría el valor actual de un campo inmutable e incluiría ese valor en la carga útil de la solicitud de API. Como resultado, el servidor de la API de k8s vería la solicitud de Helm como "ok, no están intentando modificar este campo".
La situación actual es que Helm es muy poco confiable, especialmente con los recursos del Servicio, porque Helm asume que contiene la verdad de un recurso dado. Esta es una suposición falsa que conduce al problema en este tema, ya que un recurso puede haber recibido nuevas propiedades del lado del servidor que Helm desconoce. Por lo tanto, Helm debe saber qué campos necesitan un tratamiento especial para ser un ciudadano conforme con k8.
PD. Además, kubectl
implementa mucha lógica del lado del cliente, lo que permite que kubectl
funcione con estos requisitos implícitos.
@ jbilliau-rcd
intenta no usar --force
@pre
Creo que está sucediendo algo extraño con la fusión de tres vías. Quizás la última anotación aplicada se está registrando incorrectamente de alguna manera.
Terminé resolviéndolo; aparentemente, puede cambiar las etiquetas en un Deployment
y en la especificación del pod, pero NO en el selector de coincidencias ... A Kubernetes no le gusta eso. Que es extraño para mí; ¿De qué otra manera se supone que debo modificar mi implementación para seleccionar solo pods en version
"v2" durante, digamos, una implementación de canary? Actualmente, no tengo forma de hacer eso, así que estoy confundido en esa parte.
La actualización a la versión 3.5.0 de helm resolvió el problema.
La actualización a la versión 3.5.0 de helm resolvió el problema.
¿cómo exactamente?
La actualización a la versión 3.5.0 de helm resolvió el problema.
Helm versión 3.5.0 todavía no funciona.
Pero sin --force
se trabaja.
Golpea esto en Helm 3.5.2
Intenté eliminar --force
pero sigo teniendo el mismo problema.
Upgrade "gateway" failed: failed to replace object: Service "ingress"
is invalid: spec.clusterIPs[0]: Invalid value: []string(nil): primary clusterIP
can not be unset
Hasta ahora he encontrado una solución razonable: la bandera --reuse-values
. Funciona para mi caso.
3.5.2 todavía tiene este problema, con / sin --reuse-values
3.5.3 también tiene esto: /
Comentario más útil
Para su información, el problema planteado por el OP y los comentarios planteados aquí sobre
--force
son problemas separados y discretos. Intentemos centrarnos en el problema de OP aquí.Para aclarar, el problema que describe OP es una posible regresión @ n1koo identificada en https://github.com/helm/helm/issues/7956#issuecomment -620749552. Eso parece un error legítimo.
Los otros comentarios que mencionan la eliminación de
--force
trabajando para ellos es un comportamiento intencional y esperado desde el punto de vista de Kubernetes. Con--force
, le pide a Helm que realice una solicitud PUT contra Kubernetes. Efectivamente, le está pidiendo a Kubernetes que tome sus manifiestos de destino (las plantillas representadas en su gráfico dehelm upgrade
) como la fuente de la verdad y sobrescriba los recursos en su clúster con los manifiestos representados. Esto es idéntico akubectl apply --overwrite
.En la mayoría de los casos, sus plantillas no especifican una IP de clúster, lo que significa que
helm upgrade --force
solicita eliminar (o cambiar) la IP de clúster del servicio. Esta es una operación ilegal desde el punto de vista de Kubernetes.Esto también está documentado en # 7082.
Esta es también la razón por la que la eliminación de
--force
funciona: Helm realiza una operación PATCH, a diferencia del estado en vivo, fusionando la IP del clúster en el manifiesto parcheado, conservando la IP del clúster durante la actualización.Si desea eliminar a la fuerza y volver a crear el objeto como se hizo en Helm 2, eche un vistazo a # 7431.
Espero que esto aclare las cosas.
En el futuro, intentemos centrarnos en el problema de OP aquí.