<p>spec.clusterIP๋กœ helm ์—…๊ทธ๋ ˆ์ด๋“œ ์‹คํŒจ : ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’ : "": ํ•„๋“œ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2020๋…„ 04์›” 20์ผ  ยท  64์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: helm/helm

helm ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ( "my-service"๊ฐ€ "clusterIP : ์—†์Œ"์—์„œ "type : LoadBalancer"ํ•„๋“œ clusterIP์—†์ด ๋ณ€๊ฒฝ๋จ)

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

๊ทธ๋Ÿฌ๋‚˜ "my-service"์œ ํ˜•์ด ์ƒˆ ์œ ํ˜• "LoadBalancer"๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ƒˆ ๋ฒ„์ „์ด์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ํฌ๋“œ๋Š” ๊ณ„์† ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

Helm์ด ์ผ๋ถ€ ํŠน์ • ํ•„๋“œ์˜ ๋ณ€๊ฒฝ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์‹คํŒจํ•œ ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ helm์ด ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค๋ฅธ ์„œ๋น„์Šค / pod๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? helm์€ ์—…๊ทธ๋ ˆ์ด๋“œ ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ „์ฒด ์„œ๋น„์Šค ์„ธํŠธ๋ฅผ ๋ชจ๋‘ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ฑฐ๋‚˜ ์ „ํ˜€ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€๋กœ ์ทจ๊ธ‰ํ•˜๋Š” helm์„ ์ œ์™ธํ–ˆ์ง€๋งŒ ๋‚ด ๊ธฐ๋Œ€๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋Ÿฐ ์ƒํ™ฉ์— ์ฒ˜ํ•˜๊ฒŒ๋œ๋‹ค๋ฉด ๊ทธ ์ƒํ™ฉ์—์„œ ๋ฒ—์–ด๋‚˜๋ ค๋ฉด ๋ฌด์—‡์„ํ•ด์•ผํ• ๊นŒ์š”? "my-service"๋ฅผ ์ƒˆ๋กœ์šด ์œ ํ˜•์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ข‹์•„ํ•˜์‹ญ๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  --dry-run ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด helm์— ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๋ฒ„๊ทธ ๋˜๋Š” ์˜ˆ์ƒ ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๊นŒ? ์ฆ‰, ์—…๊ทธ๋ ˆ์ด๋“œ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ผ๋ถ€ ์„œ๋น„์Šค๋Š” ์—ฌ์ „ํžˆ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฉ๋‹ˆ๋‹ค.

helm version :

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

kubectl version ์ถœ๋ ฅ :

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

ํด๋ผ์šฐ๋“œ ์ œ๊ณต ์—…์ฒด / ํ”Œ๋žซํผ (AKS, GKE, Minikube ๋“ฑ) :
GKE ๋ฐ Minkube

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ฐธ๊ณ ๋กœ OP๊ฐ€ ์ œ๊ธฐ ํ•œ ๋ฌธ์ œ์™€ --force ์— ๋Œ€ํ•ด ์—ฌ๊ธฐ์—์„œ ์ œ๊ธฐ ๋œ ์˜๊ฒฌ์€ ๋ณ„๊ฐœ์˜ ๊ฐœ๋ณ„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ OP์˜ ๋ฌธ์ œ์— ์ง‘์ค‘ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด OP๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ œ๋Š” https://github.com/helm/helm/issues/7956#issuecomment -620749552์—์„œ ํ™•์ธ ๋œ ์ž ์žฌ์  ํšŒ๊ท€ @ n1koo์ž…๋‹ˆ๋‹ค. ํ•ฉ๋ฒ•์  ์ธ ๋ฒ„๊ทธ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--force ์ œ๊ฑฐ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ ํ•œ ๋‹ค๋ฅธ ์˜๊ฒฌ์€ Kubernetes์˜ ๊ด€์ ์—์„œ ์˜๋„์ ์ด๊ณ  ์˜ˆ์ƒ ๋œ ๋™์ž‘์ž…๋‹ˆ๋‹ค. --force ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Helm์— Kubernetes์— ๋Œ€ํ•œ PUT ์š”์ฒญ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” Kubernetes์—๊ฒŒ ๋Œ€์ƒ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ( helm upgrade ์—์„œ ์ฐจํŠธ์— ๋ Œ๋”๋ง ๋œ ํ…œํ”Œ๋ฆฟ)๋ฅผ ์ง„์‹ค์˜ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋ Œ๋”๋ง ๋œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฎ์–ด ์“ฐ๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. kubectl apply --overwrite ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ…œํ”Œ๋ฆฟ์€ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, helm upgrade --force ์—์„œ ์„œ๋น„์Šค์˜ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ์ œ๊ฑฐ (๋˜๋Š” ๋ณ€๊ฒฝ)ํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Kubernetes์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๋ถˆ๋ฒ•์  ์ธ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ # 7082์—๋„ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด --force ์ œ๊ฑฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ด์œ ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค. Helm์€ ๋ผ์ด๋ธŒ ์ƒํƒœ์™€ ๋น„๊ตํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ํŒจ์น˜ ๋œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ์—…๊ทธ๋ ˆ์ด๋“œ ๋™์•ˆ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ๋ณด์กดํ•˜๋Š” PATCH ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Helm 2์—์„œ ์ˆ˜ํ–‰ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐœ์ฒด๋ฅผ ๊ฐ•์ œ๋กœ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด # 7431์„ ์‚ดํŽด๋ณด์„ธ์š”.

์ด๊ฒƒ์ด ์ƒํ™ฉ์„ ๋ช…ํ™•ํžˆํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ์—ฌ๊ธฐ์„œ OP ๋ฌธ์ œ์— ์ง‘์ค‘ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  64 ๋Œ“๊ธ€

์žฌ์ƒ์‚ฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์ฐจํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‚ฌ์šฉํ•œ Helm ๋ช…๋ น์„ ์•Œ๋ ค์ฃผ์„ธ์š”.

์•ˆ๋…•ํ•˜์„ธ์š”, ์žฌํ˜„ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ๊ฐœ์˜ ์„œ๋น„์Šค yaml ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

nginx.yaml

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

prometheus.yaml

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

๊ทธ๋Ÿฐ ๋‹ค์Œ helm1 / templates /์— ๋‘ ๊ฐœ์˜ ํŒŒ์ผ์„ ๋„ฃ๊ณ  ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. prometheus ์„œ๋น„์Šค๊ฐ€ clusterIP๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  nginx ๋ฒ„์ „์ด 1.14.2์ž„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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

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

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

์ด์ œ nginx.yaml ์„น์…˜์„ ์ƒˆ ๋ฒ„์ „ 1.16์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค.

        image: nginx:1.16

๊ทธ๋ฆฌ๊ณ  prometheus.yaml์„ LoadBalancer๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

์ด์ œ helm2๋กœ ์„ค์ •ํ•˜๊ณ  ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—…๊ทธ๋ ˆ์ด๋“œ์—์„œ ์•ฝ๊ฐ„์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ nginx ์„œ๋น„์Šค๋Š” ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ์ง„ํ–‰๋˜์ง€๋งŒ prometheus๋Š” ์—ฌ์ „ํžˆ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

์กฐํƒ€ ๋ชฉ๋ก ์‡ผ

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

ํ‚ค ์—ญ์‚ฌ

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

v3.2.0์—์„œ๋„ ๋™์ผํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. v3.1.3์œผ๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ์ž„์‹œ ์ˆ˜์ •์ž…๋‹ˆ๋‹ค.

Helm 2-> 3 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์œผ๋กœ ๋งŽ์€ ๊ฒƒ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ๋œ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋งŽ์€ ๊ฒƒ์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง€๊ธˆ๊นŒ์ง€ Nginx Ingress, Prometheus Operator, Graylog ๋ฐ Jaeger ์ฐจํŠธ๋ฅผ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  Helm์ด ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋„๋กํ•˜๋Š” ๋ฐ ๋งŒ์กฑํ•˜์ง€๋งŒ Nginx Ingress์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค ...

๋ฐฉ๊ธˆ ๋‚ด ๊ฒฝ์šฐ์˜ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” https://github.com/helm/helm/issues/6378#issuecomment -557746499๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

# 6378์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค. @cablespaghetti ๋Š”์ด ๋™์ž‘์— ๋Œ€ํ•œ ๋” ๊นŠ์€ ์„ค๋ช…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†๋‹ค๋ฉด ์ €ํฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@GaramNick ์™œ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ๋กœ ํ•ด๊ฒฐ ๋œ "๋ฌด์—‡"์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@bacongobbler ๋‹น์‹ ์ด ์—ฌ๊ธฐ์žˆ๋Š” ๋™์•ˆ. ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ ์ด ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? Helm์€ clusterIP๊ฐ€ ํ•ญ์ƒ ์ƒ๋žต๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋„๋ก ๊ธฐ์กด ๋ฆด๋ฆฌ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ํ•ดํ‚นํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

kubectl edit ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ 3.1.3 ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ ์—” ๊ทธ๊ฒƒ์˜ ์ƒˆ๋กœ์šด ๋กœ์ง๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค https://github.com/helm/helm/pull/7649/commits/d829343c1514db17bee7a90624d06cdfbffde963 ์ด ๊ณ ๋ ค Create ์•„๋‹Œ ์—…๋ฐ์ดํŠธ๋Š” ๋”ฐ๋ผ์„œ ๋นˆ ์„ค์ •ํ•˜๋ ค๊ณ  IP ๋ฐ ์ฑ„์›Œ์ง„ ๊ฒƒ์„ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

ํฅ๋ฏธ๋กœ์šด ๋ฐœ๊ฒฌ. ์กฐ์‚ฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@jlegrone ํ˜น์‹œ ์ด๊ฑธ ์กฐ์‚ฌ ํ•  ์‹œ๊ฐ„์ด ์žˆ์œผ์‹ ๊ฐ€์š”?

@bacongobbler CI / CD ํŒŒ์ดํ”„ ๋ผ์ธ์€ Helm์„ ์‚ฌ์šฉํ•˜์—ฌ ClusterIP ์œ ํ˜•์˜ ์„œ๋น„์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น :

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

v3.2.0์—์„œ์ด ๋ช…๋ น์€ Service "service-name" is invalid: spec.clusterIP: Invalid value: "": field is immutable ์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

v3.1.3์—์„œ๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์›ํ•˜์‹œ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ˆ˜๊ฐœ์›” ๋™์•ˆ helm2์™€ ํ•จ๊ป˜ ๋‹ค์Œ service.yaml์ด ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ›„ helm 3.2 helm upgrade ๋ช…๋ น์ด ์œ„์™€ ๊ฐ™์€ ์ €์žฅ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. 3.1.3์œผ๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ๋Š” ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ 3.1.3์œผ๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์šฐ๋ฆฌ์—๊ฒŒ๋„ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ ์—” d829343์˜ ์ƒˆ๋กœ์šด ๋…ผ๋ฆฌ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.์ด๋ฅผ ์—…๋ฐ์ดํŠธ๊ฐ€ ์•„๋‹Œ Create๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ๋นˆ IP๋ฅผ ์„ค์ •ํ•˜๊ณ  ์ฑ„์›Œ์ง„ IP๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

@ n1koo ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ฝ”๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์„ค์น˜์ด๊ณ  ์—…๊ทธ๋ ˆ์ด๋“œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— 3.1 ์˜ create ์ด๊ณ  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@adamreese ๋ฌธ์ œ๋ฅผ ๊ฒ€ํ†  @ n1koo๊ฐ€ ์‹๋ณ„ ํ•œ ํŒจ์น˜๋ผ๊ณ 

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋” ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šฐ๋ฉด ์—…๋ฐ์ดํŠธ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ https://github.com/helm/helm/issues/6378#issuecomment -557746499๊ฐ€ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๊ณ„์†ํ•˜๊ธฐ ์ „์— ์ฝ์–ด๋ณด์‹ญ์‹œ์˜ค. clusterIP: "" ๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ Kubernetes๋Š” IP๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ Helm ์—…๊ทธ๋ ˆ์ด๋“œ์—์„œ clusterIP:"" ๋‹ค์‹œ ๋‚˜ํƒ€๋‚˜๋ฉด ์œ„์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. _Kubernetes์— _ IP๋ฅผ ์žฌ์„ค์ •ํ•˜๋ ค๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (์˜ˆ, Kubernetes๋Š” ์„œ๋น„์Šค์˜ spec: ์„น์…˜์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค!)

Create ๋ฉ”์„œ๋“œ๊ฐ€ 3-way diff๋ฅผ ์šฐํšŒํ•˜๋ฉด Kubernetes๊ฐ€ ํ• ๋‹น ํ•œ IP ์ฃผ์†Œ๋กœ ์„ค์ •ํ•˜๋Š” ๋Œ€์‹  clusterIP: "" ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์žฌํ˜„ํ•˜๋ ค๋ฉด :

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

๋‘ ๋ฒˆ์งธ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

master ์—์„œ @IdanAdar ์˜ ๊ฒฝ์šฐ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@GaramNick ์€ ๊ท€ํ•˜์˜ ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ท€ํ•˜๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ์ƒํ™ฉ :
version.BuildInfo{Version:"v3.2.0", GitCommit:"e11b7ce3b12db2941e90399e874513fbd24bcb71", GitTreeState:"clean", GoVersion:"go1.13.10"}
๋˜ํ•œ
version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}

๋‹ค์Œ ์„œ๋น„์Šค ํ…œํ”Œ๋ฆฟ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

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

upgrade --install ๋’ค์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฐ ๋‹ค์Œ 0.0.5 ๋ฒ„์ „ ๋ฐ upgrade --install ์™€ ๋˜‘๊ฐ™์€ ์ฐจํŠธ๋ฅผ ๋‹ค์‹œ ์—…๋กœ๋“œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
Error: UPGRADE FAILED: failed to replace object: Service "hub-alt-bor" is invalid: spec.clusterIP: Invalid value: "": field is immutable

์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ด์ œ hub-0.0.5 ์˜ ๊ฐ’์ด์žˆ๋Š” helm.sh/chart ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฑฐ๋Œ€ํ•œ ์ฐจ๋‹จ์ œ์ž…๋‹ˆ๋‹ค.

@GaramNick ์€ ๊ท€ํ•˜์˜ ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ท€ํ•˜๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@technosophos ๋ฌด์—‡์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ์ •๋ณด! helm upgrade --install w / --force ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์—…๋ฐ์ดํŠธ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ฐจ๋‹จ์ œ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค.

์˜ค! ๊ทธ๊ฒƒ ์ฐธ ํฅ๋ฏธ ๋กญ๋„ค. ๊ทธ๋Ÿฌ๋ฉด ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @technosophos @bacongobbler ์šฐ๋ฆฌ๋Š” ๋™์ผํ•œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  1. ๋ฐœํ–‰๋ฌผ
    clusterIP ์—†์ด Service ํ…œํ”Œ๋ฆฟ์ด ์žˆ์ง€๋งŒ kubernetes๋Š” ์ž๋™์œผ๋กœ clusterIP ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
  labels:
    app: {{ .Values.image.name }}
    release: {{ .Release.Name }}
spec:
  type: ClusterIP
  ports:
    - port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.port }}
      protocol: TCP
      name: http
  selector:
    app: {{ .Values.image.name }}
    release: {{ .Release.Name }}

helm 2to3 convert ๋กœ helm 3์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•œ ํ›„ ๋™์ผํ•œ ๋ฆด๋ฆฌ์Šค helm3 upgrade --install --force ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

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

--force -> helm3 upgrade --install ์—†์ด ๋˜‘๊ฐ™์ดํ•˜๋ฉด ์˜ค๋ฅ˜์—†์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐœํ–‰๋ฌผ
    --force ์—†์ด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•„๋“œ ์ธ Deployment์—์„œ spec.selector.matchLabels ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
cannot patch "dummy-stage" with kind Deployment: Deployment.apps "dummy-stage" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/name":"web-nerf-dummy-app"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

--force ๋˜‘๊ฐ™์ด ํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๊ฒƒ์€์„์œ„ํ•œ ๋™์ผํ•œ ๋™์ž‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ --force ๊ฐ™์ด helm 2 ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์˜ค๋ฅ˜์—†์ด ๋ถˆ๋ณ€ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ ์ฒญ์„?

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

---

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

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

๊ฐ•์ œ ์˜ต์…˜์„ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. v3.1.3, v3.2.0 ๋ฐ v3.2.1๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์Šคํƒ ์ถ”์ 

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

Helm ์ฐจํŠธ ๋ฒ„์ „์ด ๋ณ€๊ฒฝ๋˜๊ณ  ๊ธฐ์กด ๋ฐฐํฌ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Helm v3.2.0 ์‚ฌ์šฉ

3.1.2๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์ž‘๋™ ํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ gor181 ์–ด๋–ป๊ฒŒ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? 3.2์—์„œ ๊นจ์กŒ์ง€๋งŒ 3.1์—์„œ ์ž‘๋™ ํ•œ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฐจํŠธ (๋˜๋Š” ์ตœ์†Œํ•œ svc ํ…œํ”Œ๋ฆฟ)์™€ ๋ช…๋ น์€ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@azarudeena @ alexandrsemak- ๋‘ ์‚ฌ๋žŒ ๋ชจ๋‘์—๊ฒŒ --force ํ”Œ๋ž˜๊ทธ๊ฐ€ ์›์ธ์ž…๋‹ˆ๋‹ค. --force ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

@technosophos ๋Š” ํž˜์—†์ด ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. 3.1.2๋กœ ์‹œ๋„ ํ•  ๊ณ„ํš

@azarudeena ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์„œ๋น„์Šค ๋ฐ ๋ฐฐํฌ ํ…œํ”Œ๋ฆฟ์˜ ์ผ๋ถ€ ์ถœ๋ ฅ์„ ๋ณด์—ฌ ์ฃผ์—ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋Š” values.yaml.tmp ๋„ ์ฐธ์กฐํ–ˆ๊ฑฐ๋‚˜ Chart.yaml๋„ ์ฐธ์กฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ƒ˜ํ”Œ ์ฐจํŠธ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@bacongobbler ๊ตฌ์กฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Chart.yaml

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

์œ„์— ํ…œํ”Œ๋ฆฟ yaml์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฐ€์น˜ yaml.tmp๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

zipkinProxy:
  replicaCount: 1

image:
  repository: openzipkin/zipkin

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ helm ํŒจํ‚ค์ง€ --version์œผ๋กœ ํŒจํ‚ค์ง•ํ•ฉ๋‹ˆ๋‹ค.์—…๊ทธ๋ ˆ์ด๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? 3.1.2๋กœ ์‹œ๋„ํ•˜๋ฉด ์—ฌ๊ธฐ์—์„œ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค

3.1.2 ๋ฐ 3.1.1๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ์ด ํŒจ์น˜๋ฅผ๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์ง€๋งŒ terraform helm ๊ณต๊ธ‰์ž๋ฅผ ํ†ตํ•ด helm ์ฐจํŠธ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.
force_update = true ์„ force_update = false ๋กœ ๋ณ€๊ฒฝ ํ•œ ํ›„ ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

Helm ์ฐจํŠธ ๋ฒ„์ „์ด ๋ณ€๊ฒฝ๋˜๊ณ  ๊ธฐ์กด ๋ฐฐํฌ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Helm v3.2.0 ์‚ฌ์šฉ

--force ํ”Œ๋ž˜๊ทธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

@technosophos --force helm 2๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ๋•Œ ClusterIP ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค Helm 3์ด ์ˆ˜ํ–‰ ํ•  ๋•Œ ClusterIP๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
Helm 3์—์„œ matchLabels ๋กœ ์ œ์ถœ ๋œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Œ

Kubernetes๋Š” ์„œ๋น„์Šค์˜ spec: ์„น์…˜์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ฟ  ๋ฒ„๋„ค ํ‹ฐ์Šค์˜ ๊ทผ๋ณธ์ ์ธ ์„ค๊ณ„ ๊ฒฐํ•จ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? https://kubernetes.io/docs/concepts/services-networking/service/#choosing -your-own-ip-address๋Š”์ด ๋™์ž‘์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. status ์„น์…˜์— ํ• ๋‹น ๋œ ๊ฐ’์ด ๋ฐฐ์น˜ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(A ๋น„์Šทํ•œ ๋™์ž‘์€ ์กด์žฌ .spec.nodeName (A)์˜ Pod ,ํ•˜์ง€๋งŒ ํˆฌ๊ตฌ ์‚ฌ์šฉ์ž์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

v3.2.3 : --force๋กœ ์‹คํŒจํ•˜๊ณ  --force์—†์ด ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ฐจํŠธ ํ…œํ”Œ๋ฆฟ์— ClusterIP: ์—†์Šต๋‹ˆ๋‹ค. https://github.com/helm/helm/pull/8000/files ๊ฐ€ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์ด ๋ฌธ์ œ๋Š” 3.2.3 ์—์„œ ๊ด€์ฐฐ๋˜์ง€๋งŒ 3.2.0 ๊ด€์ฐฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ•์ œ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ๋„ ์œ ์šฉํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ OP๊ฐ€ ์ œ๊ธฐ ํ•œ ๋ฌธ์ œ์™€ --force ์— ๋Œ€ํ•ด ์—ฌ๊ธฐ์—์„œ ์ œ๊ธฐ ๋œ ์˜๊ฒฌ์€ ๋ณ„๊ฐœ์˜ ๊ฐœ๋ณ„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ OP์˜ ๋ฌธ์ œ์— ์ง‘์ค‘ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด OP๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ œ๋Š” https://github.com/helm/helm/issues/7956#issuecomment -620749552์—์„œ ํ™•์ธ ๋œ ์ž ์žฌ์  ํšŒ๊ท€ @ n1koo์ž…๋‹ˆ๋‹ค. ํ•ฉ๋ฒ•์  ์ธ ๋ฒ„๊ทธ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--force ์ œ๊ฑฐ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ ํ•œ ๋‹ค๋ฅธ ์˜๊ฒฌ์€ Kubernetes์˜ ๊ด€์ ์—์„œ ์˜๋„์ ์ด๊ณ  ์˜ˆ์ƒ ๋œ ๋™์ž‘์ž…๋‹ˆ๋‹ค. --force ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Helm์— Kubernetes์— ๋Œ€ํ•œ PUT ์š”์ฒญ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” Kubernetes์—๊ฒŒ ๋Œ€์ƒ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ( helm upgrade ์—์„œ ์ฐจํŠธ์— ๋ Œ๋”๋ง ๋œ ํ…œํ”Œ๋ฆฟ)๋ฅผ ์ง„์‹ค์˜ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋ Œ๋”๋ง ๋œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฎ์–ด ์“ฐ๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. kubectl apply --overwrite ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ…œํ”Œ๋ฆฟ์€ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, helm upgrade --force ์—์„œ ์„œ๋น„์Šค์˜ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ์ œ๊ฑฐ (๋˜๋Š” ๋ณ€๊ฒฝ)ํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Kubernetes์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๋ถˆ๋ฒ•์  ์ธ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ # 7082์—๋„ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด --force ์ œ๊ฑฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ด์œ ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค. Helm์€ ๋ผ์ด๋ธŒ ์ƒํƒœ์™€ ๋น„๊ตํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ํŒจ์น˜ ๋œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ์—…๊ทธ๋ ˆ์ด๋“œ ๋™์•ˆ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ๋ณด์กดํ•˜๋Š” PATCH ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Helm 2์—์„œ ์ˆ˜ํ–‰ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐœ์ฒด๋ฅผ ๊ฐ•์ œ๋กœ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด # 7431์„ ์‚ดํŽด๋ณด์„ธ์š”.

์ด๊ฒƒ์ด ์ƒํ™ฉ์„ ๋ช…ํ™•ํžˆํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ์—ฌ๊ธฐ์„œ OP ๋ฌธ์ œ์— ์ง‘์ค‘ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•Œ๋ ค์ง„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? https://github.com/helm/charts/tree/master/stable/rabbitmq-ha ๋ฅผ 1.34.1์—์„œ 1.46.4๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ --force ๋˜๋Š” 3.1.3 ๋กœ์˜ helm ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  helm upgrade ๊ฐ€ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@EvgeniGordeev ์ด๊ฒƒ์€ ์ž‘์€ ๋‹ค์šด ํƒ€์ž„์œผ๋กœ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ์กฐ์žกํ•œ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐจํŠธ๋ฅผ ์ œ๊ฑฐ / ๋‹ค์‹œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

nginxinc ์ธ ๊ทธ๋ ˆ์Šค ์ฐจํŠธ์—์„œ๋„์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ --force ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์•„์ง ์—ด๋ ค ์žˆ๊ธฐ ๋•Œ๋ฌธ์—์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ์ผ์ข…์˜ ์ˆ˜์ • ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์„ค๊ณ„๋œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๊นŒ (์ด + ๋™์ผํ•œ ๋™์ž‘์œผ๋กœ ์—ด๋ฆฐ ๋‹ค๋ฅธ ๋ฌธ์ œ์™€ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค)? ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ฐจํŠธ ์ž์ฒด์™€ clusterIP: "" ํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ ๋Œ€์‹  ๊ฐ’์„ ์™„์ „ํžˆ ์ƒ๋žตํ•ด์•ผํ•œ๋‹ค๋Š” ์„ค๋ช…์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ฐจํŠธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ํ•จ๊ป˜ ์ซ“์•„ ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ?

@cdunford - https: //github.com/helm/helm/issues/7956#issuecomment -643432099์— ์ œ์•ˆ ๋œ๋Œ€๋กœ --force ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜๋„๋ก ์ œ์•ˆ ๋œ ์ˆ˜์ • ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

์ด PR์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. # 7431 (ํ•ด๋‹น ์˜๊ฒฌ์—์„œ ์ œ ์•ˆ๋จ) ...

์ด ๋ฌธ์ œ๋Š” N ๋ฒˆ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ํŒŒ์ดํ”„ ๋ผ์ธ์—์„œ๋„ --force ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์›๋ž˜ ๋ฌธ์ œ๋Š” helm2์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์—ˆ์œผ๋ฏ€๋กœ helm2์—์„œ๋„ ์ˆ˜์ •๋ฉ๋‹ˆ๊นŒ? ๋ฟก ๋นต๋€จ

@bacongobbler ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด๋œ๋‹ค๋ฉด "๊ฐ•์ œ"๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์™€ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด ๋ง์€, Helm 3.3.4, https://artifacthub.io/packages/helm/bitnami/nginx ์ฐจํŠธ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. GCP / GKE, Azure / AKS ๋ฐ AWS / EKS์˜ ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์œผ๋ฉฐ ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘์—์„œ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

Helm์„ 3.1.3์œผ๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  "--force"ํ”Œ๋ž˜๊ทธ์—†์ด 3.3.4์—์„œ ์ž‘์—… ํ•œ ์งํ›„์— ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€์ด ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๊ณ ์œ  ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ์„ ์ด์ „ ์˜๊ฒฌ์—์„œ ์ƒ๋‹นํžˆ ๋ถ„๋ช…ํžˆ ๋ฐํ˜”์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” OP์˜ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” --force์˜ ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” OP ๋ฌธ์ œ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

OP์™€ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์กด์ค‘ํ•˜๊ธฐ ์œ„ํ•ด์ด ์Šค๋ ˆ๋“œ๋ฅผ ํƒˆ์ทจํ•˜์—ฌ --force์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์„ ์ค‘์ง€ํ•˜์‹ญ์‹œ์˜ค. OP ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋…ผ์˜ ์ค‘์ž…๋‹ˆ๋‹ค. OP์—์„œ ์„ค๋ช…ํ•œ ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด์—†๋Š” ์ฃผ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒˆ ํ‹ฐ์ผ“์„ ์—ด๊ฑฐ ๋‚˜ ์ด์ „์— ์ œ์•ˆํ•œ ์ œ์•ˆ์„ ์‚ดํŽด๋ณด์„ธ์š”.

Helm 2์— ๋Œ€ํ•œ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ @tibetsam : ์•„๋‹ˆ์š”. Helm 2์— ๋Œ€ํ•œ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ๋” ์ด์ƒ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://helm.sh/blog/helm-v2-deprecation-timeline/ ์„ ์ฐธ์กฐ

jupytherhub helm chart๋กœ OP์˜ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ์ง€์นจ์— ๋”ฐ๋ผ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.


์ค‘๋Œ€ํ•œ
Jupyterhub helm ์ฐจํŠธ๋Š” ์„œ๋น„์Šค ์‚ฌ์–‘์— spec.clusterIP ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/jupyterhub/zero-to-jupyterhub-k8s/blob/c0a43af12a89d54bcd6dcb927fdcc2f623a14aca /jupyterhub/templates/hub/service.yaml#L17 -L29


๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ‚ค์™€ ์นœ์ ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

โžœ kind version
kind v0.9.0 go1.15.2 linux/amd64

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

์žฌ์ƒ์‚ฐ ๋ฐฉ๋ฒ•

  1. ์ƒˆ ์ข…๋ฅ˜ ํด๋Ÿฌ์Šคํ„ฐ ๋งŒ๋“ค๊ธฐ
kind create cluster
  1. ๋‹ค์Œ ์ฝ˜ํ…์ธ  (๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ ๋œ 16 ์ง„์ˆ˜)๋กœ config.yaml์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
proxy:
  secretToken: "3a4bbf7405dfe1096ea2eb9736c0df299299f94651fe0605cfb1c6c5700a6786"

์ฐธ๊ณ ๋กœ Helm ํŒŒ์ผ ์„ค์น˜ ์ง€์นจ์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ( ๋งํฌ ).

  1. Helm ์ €์žฅ์†Œ ์ถ”๊ฐ€
helm repo add jupyterhub https://jupyterhub.github.io/helm-chart/
helm repo update
  1. ์ฐจํŠธ ์„ค์น˜ ( --force ์˜ต์…˜ ์‚ฌ์šฉ)
RELEASE=jhub
NAMESPACE=jhub

helm upgrade --cleanup-on-fail --force \
  --install $RELEASE jupyterhub/jupyterhub \
  --namespace $NAMESPACE \
  --create-namespace \
  --version=0.9.0 \
  --values config.yaml
  1. 5 ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜:

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

๋‚˜๋Š” helm 3.3.4์— ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

Helm 2.14.1 ๋ฌธ์ œ๊ฐ€ --force

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : type.spec: NodePort ์ „ํ™˜ํ•˜์—ฌ helmchart ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

--force ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ v3.4.1์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@bacongobbler ๋‚˜๋Š” ๋‹น์‹ ์ด OP์˜ ๋ฌธ์ œ (# 6378๊ณผ๋Š” ๋ณ„๋„๋กœ)๊ฐ€ ๋‚ฉ์น˜ ๋‹นํ•˜์ง€ ์•Š๋„๋ก ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ์„์œ„ํ•œ ๊ฒƒ์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ "์˜ค๋ฅ˜ : ์—…๊ทธ๋ ˆ์ด๋“œ ์‹คํŒจ : _replace_ ... ์‹คํŒจ"์ด๊ณ  ๋ช…๋ น์—์„œ --force๋ฅผ _did use_ ํ–ˆ์Šต๋‹ˆ๊นŒ? ์ด๋™ # 6378

"์˜ค๋ฅ˜ : ์—…๊ทธ๋ ˆ์ด๋“œ ์‹คํŒจ : _patch_ ... ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ _ ๋ช…๋ น์— _ --force๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜ ์Šต๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์žฌํ˜„ํ–ˆ๋Š”์ง€ ๊ฒŒ์‹œ ํ•ด์ฃผ์„ธ์š”.

๋ฟก ๋นต๋€จ

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

Helm 3.4.2์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ, ์„œ๋น„์Šค ๊ณ„์ • ๋ฐ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” helm-chart๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ์‹œ ์ฐจํŠธ์˜ ๊ธฐ์กด ๋ ˆ์ด๋ธ” ์ง‘ํ•ฉ์— ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ์ด์ œ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

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

๊ธฐ๋ณธ์ ์œผ๋กœ ์ดˆ๊ธฐ helm ๋ฐฐํฌ ์ดํ›„์—๋Š” ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋”์ฐํ•˜๊ฒŒ ๋“ค๋ฆฌ์ง€๋งŒ Helm์ด ํŠน๋ณ„ํ•œ ๋Œ€์šฐ๋ฅผ๋ฐ›์„ "๋ถˆ๋ณ€ ํ•„๋“œ"๋ชฉ๋ก์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๊ฒฝ์šฐ "๋ถˆ๋ณ€ ํ•„๋“œ"๋Š” ์„œ๋น„์Šค ๊ฐ์ฒด์˜ spec.clusterIP . Helm์€์ด๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  a) ๊ต์ฒด๋ฅผ ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ  b) ์ œ๊ฑฐ๋ฅผ ์‹œ๋„ํ•˜์ง€ ์•Š๋Š” ์ด๋Ÿฌํ•œ API ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. , c) ์—…๋ฐ์ดํŠธํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์‹ค์ œ๋กœ Helm์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•„๋“œ์˜ ํ˜„์žฌ ๊ฐ’์„ ์ฐพ๊ณ  API ์š”์ฒญ์˜ ํŽ˜์ด๋กœ๋“œ์— ํ•ด๋‹น ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ k8s API ์„œ๋ฒ„๋Š” Helm์˜ ์š”์ฒญ์„ "ํ™•์ธ,์ด ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํ™ฉ์€ Helm์ด ํŠน์ • ๋ฆฌ์†Œ์Šค์˜ ์ง„์‹ค์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค์—์„œ Helm์ด ๋งค์šฐ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž์›์ด Helm์ด ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒˆ๋กœ์šด ํŠน์„ฑ์„ ์„œ๋ฒ„ ์ธก์— ์ˆ˜์‹ ํ–ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ์ด ๋ฌธ์ œ์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ž˜๋ชป๋œ ๊ฐ€์ •์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Helm์€ ์ ํ•ฉํ•œ k8s ์‹œ๋ฏผ์ด๋˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ํ•„๋“œ๋ฅผ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์ถ”์‹ . ๋˜ํ•œ kubectl ๋Š” ๋งŽ์€ ๋…ผ๋ฆฌ ํด๋ผ์ด์–ธํŠธ ์ธก์„ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ kubectl ๊ฐ€ ์ด๋Ÿฌํ•œ ์•”์‹œ ์  ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ jilliau-rcd

--force๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค

@pre

3 ๋ฐฉํ–ฅ ๋ณ‘ํ•ฉ์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ ์šฉ๋œ ์ฃผ์„์ด ์–ด๋–ป๊ฒŒ ๋“  ๋ถ€์ ์ ˆํ•˜๊ฒŒ ๊ธฐ๋ก๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„ ๋‚ด๊ฒŒ๋˜์—ˆ๋‹ค. ๋ถ„๋ช…ํžˆ Deployment ๋ฐ ํฌ๋“œ ์‚ฌ์–‘์—์„œ ๋ ˆ์ด๋ธ”์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค์น˜ ์„ ํƒ๊ธฐ์—์„œ๋Š” ... Kubernetes๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ๋Š” ์ด์ƒํ•˜๋‹ค. ์นด๋‚˜๋ฆฌ์•„ ๋ฐฐํฌ์™€ ๊ฐ™์ด version "v2"์—์„œ ํฌ๋“œ ๋งŒ ์„ ํƒํ•˜๋„๋ก ๋ฐฐํฌ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ํ˜„์žฌ ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์–ด์„œ ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ–ˆ์Šต๋‹ˆ๋‹ค.

Helm ๋ฒ„์ „ 3.5.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Helm ๋ฒ„์ „ 3.5.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ?

Helm ๋ฒ„์ „ 3.5.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Helm ๋ฒ„์ „ 3.5.0์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ --force ์—†์ด๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ—ฌ๊ธฐ 3.5.2์—์„œ ์ด๊ฒƒ์„ ๋ˆ„๋ฅด์‹ญ์‹œ์˜ค.

--force ์„ (๋ฅผ) ์ œ๊ฑฐํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

์ง€๊ธˆ๊นŒ์ง€ ํ•ฉ๋ฆฌ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค- --reuse-values ํ”Œ๋ž˜๊ทธ. ๋‚ด ๊ฒฝ์šฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

3.5.2๋Š” --reuse-values๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

3.5.3์—๋„ ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰