๋ค์์ ์ฌ์ฉํ์ฌ ์ฐจํธ๋ฅผ ์ค์น/์ ๊ทธ๋ ์ด๋ํฉ๋๋ค.
./helm ์
๊ทธ๋ ์ด๋ --์ค์น
--set rbac.create=false
--set controller.replicaCount=2
--set controller.service.loadBalancerIP=$ip
--main-ingress ์์ /nginx-ingress ๋๊ธฐ
(์ฌ๊ธฐ์ $ip๋ IP, ์: 10.0.0.1)
์ด๋ CI/CD ํ์ดํ๋ผ์ธ์์ ์ํ๋๋ฏ๋ก ์ฒ์์๋ ์ค์นํ๊ณ ๋ค์์๋ ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ์ค์น๋ฉ๋๋ค. ๋ ๋ฒ์งธ ์คํ์์๋ ๋ค์์ ์ถ๋ ฅํฉ๋๋ค.
_client.go:339: ํจ์นํ ์ ์์ ์๋น์ค: "main-ingress-nginx-ingress-controller"(์๋น์ค "main-ingress-nginx-ingress-controller"๊ฐ ์ ํจํ์ง ์์: spec.clusterIP: ์ ํจํ์ง ์์ ๊ฐ: "": ํ๋๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ )
client.go:358: --force๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ก ๋ฆฌ์์ค ์ฌ์์ฑ
client.go:339: ์๋น์ค๋ฅผ ํจ์นํ ์ ์์: "main-ingress-nginx-ingress-default-backend"(์๋น์ค "main-ingress-nginx-ingress-default-backend"๊ฐ ์ ํจํ์ง ์์: spec.clusterIP: ์ ํจํ์ง ์์ ๊ฐ: "" : ํ๋๋ ๋ณ๊ฒฝํ ์ ์์)
client.go:358: --force๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ก ๋ฆฌ์์ค ์ฌ์์ฑ
์ค๋ฅ: ์
๊ทธ๋ ์ด๋ ์คํจ: ์๋น์ค "main-ingress-nginx-ingress-controller"๊ฐ ์ ํจํ์ง ์์: spec.clusterIP: ์ ํจํ์ง ์์ ๊ฐ: "": ํ๋๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ && ์๋น์ค "main-ingress-nginx-ingress-default-backend"๊ฐ ์ ํจํ์ง ์์ : spec.clusterIP: ์๋ชป๋ ๊ฐ: "": ํ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋๋ ๋ํ ์ด๊ฒ์ ์กฐํ ๋ชฉ๋ก์์ ์ป์ต๋๋ค.
์ด๋ฆ ๋ค์์คํ์ด์ค ๊ฐ์ ํ ์
๋ฐ์ดํธ ์ํ ์ฐจํธ
๊ธฐ๋ณธ ์์ ๊ธฐ๋ณธ 1 2019-09-06 13:17:33.8463781 -0400 EDT ๋ฐฐํฌ nginx-ingress-1.18.0
๊ธฐ๋ณธ ์์ ๊ธฐ๋ณธ๊ฐ 2 2019-09-06 13:21:11.6428945 -0400 EDT ์คํจ nginx-ingress-1.18.0
๊ทธ๋์ ์ถ์์ ์คํจํ์ต๋๋ค.
Helm 2์์๋ ๊ทธ๋ฐ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. helm 3์์ ๋์์ด ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ธ๊ฐ์ ์๋๋ฉด ๋ฒ๊ทธ์ธ๊ฐ์? ์ ์๋ผ๋ฉด ๊ทธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋ช ๋ น์ ์ด๋ป๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๊น?
helm version
์ถ๋ ฅ: version.BuildInfo{Version:"v3.0.0-beta.2", GitCommit:"26c7338408f8db593f93cd7c963ad56f67f662d4", GitTreeState:"clean", GoVersion:"go1.12.
kubectl version
๋น๋ ์ถ๋ ฅ: ํด๋ผ์ด์ธํธ ๋ฒ์ : version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.0", GitCommit:"0ed33881dc4355495f623c6f22e7dd0b7632b7c0", GitTreeState:" "2018-09-27T17:05:32Z", GoVersion:"go1.10.4", ์ปดํ์ผ๋ฌ:"gc", ํ๋ซํผ:"linux/amd64"}
์๋ฒ ๋ฒ์ : version.Info{์ฃผ:"1", ๋ถ:"13", GitVersion:"v1.13.10", GitCommit:"37d169313237cb4ceb2cc4bef300f2ae3053c1a2", GitTreeState:"clean", BuildDate:"20 49Z", GoVersion:"go1.11.13", ์ปดํ์ผ๋ฌ:"gc", ํ๋ซํผ:"linux/amd64"}
ํด๋ผ์ฐ๋ ์ ๊ณต์/ํ๋ซํผ(AKS, GKE, Minikube ๋ฑ): AKS
์ด๊ฒ์ ํ์ฌ kubectl๊ณผ ์ ์ฌํ 3๋ฐฉํฅ ๋ณํฉ ํจ์น ์ ๋ต์ ์ฌ์ฉํ๋ Helm 3์ ์ต๊ทผ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค. #6124 ์ฐธ์กฐ
์ด๊ฒ์ ์ฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋จ๊ณ๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ฉด ํ๋ฅญํ ๊ฒ์ ๋๋ค. ๊ฐ์ฌ ํด์!
ํ์ ํ๋!
AKS ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค์์ต๋๋ค.
MC_* ๋ฆฌ์์ค ๊ทธ๋ฃน์ ๊ณต์ฉ IP๋ฅผ ์์ฑํฉ๋๋ค.
ํด๋น ๊ณต์ธ IP์ IP ์ฃผ์๋ฅผ $ip์ ์ ์ฅํ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ๋ช ๋ น์ ๋ ๋ฒ ์คํํ์ต๋๋ค.
./helm ์
๊ทธ๋ ์ด๋ --์ค์น
--set rbac.create=false
--set controller.replicaCount=2
--set controller.service.loadBalancerIP=$ip
--main-ingress ์์ /nginx-ingress ๋๊ธฐ
์ด๋ https://docs.microsoft.com/en-us/azure/aks/ingress-static-ip ์์ ์ํ๋๋ ์์ ๊ณผ ์ ์ฌํฉ๋๋ค
์ฐจ์ด์ ์ ๋ด๊ฐ helm upgrade --install ์ ๋ ๋ฒ ์ํํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ ๋ชฉ์ ์ ๋ด CI/CD์ ๋จ์ผ ๋ช ๋ น์ค(๋ฌด์กฐ๊ฑด)์ ํฌํจํ๋ ๊ฒ์ ๋๋ค.
์ฌํํ๊ธฐ ์ํด ๋ ์์ธํ ์ ๋ณด๊ฐ ํ์ํ๋ฉด ์๋ ค์ฃผ์ญ์์ค.
์ฌํํ๊ธฐ์ ์ถฉ๋ถํ์ต๋๊น? ๋์์ด๋๋ค๋ฉด bash ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ํ ์ฃผ ๋์ Helm Summit EU์ ์ฐธ์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์์ง ๋ต๋ณํ ์๊ฐ์ด ์์์ต๋๋ค.
์... ๊ฑฑ์ ๋ง์ธ์. ์ ์ ํ๋ด์ ์ฆ๊ธฐ์ญ์์ค!
๋๋ ๋ํ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ค
$ helm version --short
v3.0.0-beta.3+g5cb923e
nginx-ingress ์ฐจํธ๋ ์ฒ์ ์คํํ ๋ ์ ์ค์น๋์ง๋ง ์ ๊ทธ๋ ์ด๋ ์์๋ ...
$ 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
๋๋ ์ด๊ฒ์ด helm3๊ฐ ์๋๋ผ nginx-ingress ์ฐจํธ์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐจํธ๋ controller.service.omitClusterIP=true
๋ฐ defaultBackend.service.omitClusterIP=true
๋ฅผ ์ค์ ํ์ง ์๋ ํ ํญ์ controller.service.clusterIP = ""
๋ฐ defaultBackend.service.clusterIP = ""
์ ๋ฌ์ ์๋ํฉ๋๋ค.
์ถ์ฒ ๋งํฌ:
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
ํด๊ฒฐ ๋ฐฉ๋ฒ:
$ helm upgrade --install ingress-test stable/nginx-ingress --set controller.service.omitClusterIP=true --set defaultBackend.service.omitClusterIP=true
ํด๋ดค๋๋ฐ ๊ณ์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋จ๋ค์
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
์๋์์ ๋ณผ ์ ์๋ฏ์ด ํ ํ๋ฆฟ์๋ clusterIP๊ฐ ์์ต๋๋ค.
helm ํ ํ๋ฆฟ 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
์๋ omitClusterIP ๋งค๊ฐ๋ณ์ ์์ด ๋ฐฐํฌํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ๊ฒ์ผ๋ก ์์ฌ๋๋ฉฐ helm v3์ clusterIP: ""
๋ ์๋ ๋งค๋ํ์คํธ์ 3๋ฐฉํฅ ๋ณํฉ์ ์๋ํฉ๋๋ค.
helm get manifest ingx --revision 1 | grep "clusterIP"
clusterIP: ""
clusterIP: ""
๊ธฐ์กด ์ฐจํธ๋ฅผ ๋จผ์ ์ญ์ ํ๊ณ omitClusterIP
์ต์
์ผ๋ก ๋ค์ ์์ฑํ์ฌ ํด๊ฒฐํ ์ ์์์ต๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก @bambash ์์ ์ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์
$ helm upgrade --install ingress-test stable/nginx-ingress --set controller.service.omitClusterIP=true --set defaultBackend.service.omitClusterIP=true
helm v3์ ๊ธฐ์กด ๋งค๋ํ์คํธ์์ ๋ณํฉ์ ๊ฑด๋๋ธ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ฃ์กํฉ๋๋ค. ๋ฆด๋ฆฌ์ค๋ฅผ ์ฒ์ ์ค์นํ ๋ ์ด ๊ฐ์ ์ค์ ํด์ผ ํ๋ค๊ณ ์ง์ ํ์ด์ผ ํ์ต๋๋ค. ๊ธฐ์กด ๋ฆด๋ฆฌ์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ๋ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค...
๊ฐ์ clusterIP๊ฐ ์๋ metric-server-2.8.8๊ณผ helm v3.0.0-rc.2๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ฐจํธ์์ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ต๋๋ค. ์ด๋ค ์ถฉ๊ณ ? ์ด๋ป๊ฒ ์งํํด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ด ๋ฌธ์ ๋ helmfile v0.95.0์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ณณ์ผ๋ก ๊ฐ๊ฒ ์ต๋๋ค :)
helm update --install ๋ช ๋ น๊ณผ ํจ๊ป --force ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ helm v3.0.0-rc.2๋ก ์๋น์ค ์ ํ ๋๋ clusterIP๋ฅผ ์ค์ ํ์ง ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. --force ์์ด๋ ์ ์๋ํฉ๋๋ค.
@johannges , ๋ฐฉ๊ธ ๊ฐ์ ๊ฒ์ ๊ฒ์ํ๋ ค๊ณ ํ์ต๋๋ค. :+1:
omitClusterIP: true
์ค์ ์ defaultBackend ๋ฐ ์ปจํธ๋กค๋ฌ ์๋น์ค์์๋ ์๋ํ์ง๋ง ๋ฉํธ๋ฆญ ์๋น์ค์์๋ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์
๊ทธ๋ ์ด๋ ์ค --force
์ต์
์ด ์๋ ์กฐํ ์ฅ์น์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Helm์ ์๋น์ค๋ฅผ ์ฌ์์ฑํ๋ ค๊ณ ํ์ง๋ง spec.clusterIP๋ ๋์ฒดํ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋๋ง์ ๋ง์ถค ์ฐจํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
Error: UPGRADE FAILED: failed to replace object: Service "litespeed" is invalid: spec.clusterIP: Invalid value: "": field is immutable
์ฌ์ค ์๋น์ค(๋๋ ์ฐจํธ) ์ด๊ธฐํ์์ clusterIP ์ ์๋ฅผ ์๋ตํ๋ฉด ์ ์๋ํฉ๋๋ค ๐
๊ธฐ์กด์ ๋ฐฐํฌ๋ _kafka_ ๋ฐ _redis_ ์ฐจํธ ๋ฆด๋ฆฌ์ค์์๋ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. --force
์ ๊ฑฐํ๋ฉด ์ค์ ๋ก ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
์ด์ _redis_ ๋ฆด๋ฆฌ์ค์์ ์๋ก์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Error: UPGRADE FAILED: release redis failed, and has been rolled back due to atomic being set: cannot patch "redis-master" with kind StatefulSet: StatefulSet.apps "redis-master" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden
@bacongobbler ๋ ์ด๊ฒ์ด Helm v3 3๋ฐฉํฅ ๋ณํฉ ํจ์น ์ ๋ต๊ณผ ๊ด๋ จ์ด ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ด ์ ๋ต์ Kubernetes๊ฐ ์ฒ์ ์์ฑ ํ ๋ณ๊ฒฝํ ์ ์๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ์ ๋ฐ์ดํธ/ํจ์น์ ํ๋(์ด์ ๊ณผ ๋์ผํ ๊ฐ ํฌํจ)๋ฅผ ์ ๋ฌํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋๊ตฐ๊ฐ terraform์ ํตํด helm v3๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ --force
๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ์ง์ ๋งํ ์ ์๊ธฐ ๋๋ฌธ์ helm delete
๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจํธ๋ฅผ ์๋์ผ๋ก ์ญ์ ํ ๋ค์ terraform์ ๋ค์ ์คํํ๋ ๋ฐ ์ฑ๊ณตํ์ต๋๋ค. ์ด๊ฒ์ ์ง์ฆ๋์ง๋ง ์๋ํฉ๋๋ค.
ํธ์ง: ์ ์ฒด ์ค๋ฅ: ( "nginx-ingress-singleton-controller"๋ ๋ด๊ฐ ์ค์ ํ ๋ฆด๋ฆฌ์ค ์ด๋ฆ์ ๋๋ค. ํน๋ณํ ์๋ฏธ๊ฐ ์์ต๋๋ค)
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 ๋ https://github.com/helm/helm/issues/6378#issuecomment -532766512์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์ข ๋ ์์ธํ ์ค๋ช ํด ๋ณด๋๋ก ํ ๊ฒ์....
๋ค๋ฅธ ์ฌ๋๋ค์ด ์ง์ ํ๋ฏ์ด ์ฐจํธ๊ฐ ๋น ๋ฌธ์์ด๋ก clusterIP๋ฅผ ์ ์ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋น์ค๊ฐ ์ค์น๋๋ฉด Kubernetes๋ ์๋น์ค์ ํ ๋น๋ clusterIP๋ก ์ด ํ๋๋ฅผ ์ฑ์๋๋ค.
helm upgrade
๊ฐ ํธ์ถ๋๋ฉด ์ฐจํธ์์ clusterIP
๋ฅผ ์ ๊ฑฐํ๋๋ก ์์ฒญํ๋ฏ๋ก ์ค๋ฅ ๋ฉ์์ง๊ฐ spec.clusterIP: Invalid value: "": field is immutable
์ด์ ๋ ๋ฌด์์
๋๊น?
์ด๊ฒ์ ๋ค์ ๋์์ผ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค.
clusterIP
๊ฐ ๋น ๋ฌธ์์ด์ด ๋๊ธฐ๋ฅผ ์ํ๋ค๊ณ ์ง์ ํ์ต๋๋ค.clusterIP
์๋น์ค๋ฅผ ์๋ ํ ๋นํ์ต๋๋ค. ์ด ์์์๋ 172.17.0.1
๋ฅผ ์ฌ์ฉํฉ๋๋ค.helm upgrade
์์ ์ฐจํธ๋ clusterIP
๊ฐ ๋น ๋ฌธ์์ด์ด ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค (๋๋ ์์ ๊ฒฝ์ฐ ์๋ต๋จ).3๋ฐฉํฅ ํจ์น๋ฅผ ์์ฑํ ๋ ์ด์ ์ํ๋ ""
, ๋ผ์ด๋ธ ์ํ๋ ํ์ฌ "172.17.0.1"
, ์ ์๋ ์ํ๋ ""
์์ ํ์ธํฉ๋๋ค. Helm์ ์ฌ์ฉ์๊ฐ clusterIP
๋ฅผ "172.17.0.1"์์ ""๋ก ๋ณ๊ฒฝํ๋๋ก ์์ฒญํ ๊ฒ์ ๊ฐ์งํ์ฌ ํจ์น๋ฅผ ์ ๊ณตํ์ต๋๋ค.
Helm 2์์๋ ๋ผ์ด๋ธ ์ํ๋ฅผ ๋ฌด์ํ๋ฏ๋ก ๋ณ๊ฒฝ ์ฌํญ์ด ์์๊ณ (์ด์ ์ํ: clusterIP: ""
์์ ์ ์ํ๋ก: clusterIP: ""
) ์ด ๋์์ ์ฐํํ์ฌ ํจ์น๊ฐ ์์ฑ๋์ง ์์์ต๋๋ค.
๋ด ๊ถ์ฅ ์ฌํญ์ ํ
ํ๋ฆฟ ์ถ๋ ฅ์ ๋ณ๊ฒฝํ๋ ๊ฒ์
๋๋ค. clusterIP
๊ฐ ๊ฐ์ผ๋ก ์ ๊ณต๋์ง ์์ผ๋ฉด ๊ฐ์ ๋น ๋ฌธ์์ด๋ก ์ค์ ํ์ง ๋ง์ญ์์ค... ํ๋๋ฅผ ์์ ํ ์๋ตํ์ญ์์ค.
์: stable/nginx-ingress
:
spec:
{{- if not .Values.controller.service.omitClusterIP }}
clusterIP: "{{ .Values.controller.service.clusterIP }}"
{{- end }}
๋ค์์ผ๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
spec:
{{- if not .Values.controller.service.omitClusterIP }}
{{ with .Values.controller.service.clusterIP }}clusterIP: {{ quote . }}{{ end }}
{{- end }}
์ด๊ฒ์ด ์ด ๊ฒฝ์ฐ --set controller.service.omitClusterIP=true
์๋ํ๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค.
TL;DR์ ์๋น์ค ํ ํ๋ฆฟ์์ ๋ค์์ ์ํํ์ง ๋ง์ญ์์ค.
clusterIP: ""
๊ทธ๋ ์ง ์์ผ๋ฉด Helm์ ์๋น์ค์ clusterIP๋ฅผ ์๋ ์์ฑ๋ IP ์ฃผ์์์ ๋น ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๋ ค๊ณ ์๋ํ๋ฏ๋ก ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ ๋์ ์ด ๊ธฐ๋ฅ์ ์๋์ํค๋ ค๋ ๊ฒฝ์ฐ ์์ ํด๊ฒฐ์ฑ ์ผ๋ก ๋ค์์ ์ํํ๋ฉด ์ ๋ฐ์ดํธ๋ฅผ ์ํํ ์ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
kubectl get svc | grep ingress
controller:
service:
clusterIP: <cluster-ip-address-for-controller>
defaultBackend:
service:
clusterIP: <cluster-ip-address-for-default-backend>
์คํ ์ค์ธ ํด๋ฌ์คํฐ์ ๋ํด ์ด๊ฒ์ ํ ์คํธํ์ผ๋ฉฐ ์ฌ์์ฑ์ด ํ์ํ์ง ์์์ต๋๋ค.
๊ทธ๊ฒ๋ ์๋ํฉ๋๋ค. ์ข์ ์ ํ @treacher. --set
๋๋ ๊ฐ ํ์ผ์ ํตํด ๋์ผํ ๊ฐ์ ์ค์ ํ๋ฉด ์
๊ทธ๋ ์ด๋๊ฐ clusterIP
๊ฐ์ ๋ณ๊ฒฝํ์ง ์๊ธฐ ๋๋ฌธ์ ํจ์น๊ฐ ์์ฑ๋์ง ์์ต๋๋ค.
์์์ ์ค๋ช ํ 3๋ฐฉํฅ ๋ณํฉ ํจ์น ๋์์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ์๋ํ์ฌ ๋ซ์ต๋๋ค. ์กฐ์น ํญ๋ชฉ์ ์ด ์ฐจํธ๊ฐ https://github.com/helm/helm/issues/6378#issuecomment-557746499์ ์ ๊ณต๋ ๊ถ์ฅ ์ฌํญ์ ๋ฐ๋ฅด๋ ๊ฒ์ ๋๋ค. Helm์ ๋์์ ํ ์ผ์ด ์์ต๋๋ค. :)
https://github.com/helm/charts/pull/19146/files ์์ฑ๋์์ต๋๋ค! @bacongobbler๋ ๊ฐ์ฌ
@zen4ever ๋ # 6378 (๋๊ธ) ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์ข ๋ ์์ธํ ์ค๋ช ํด ๋ณด๋๋ก ํ ๊ฒ์....
๋ค๋ฅธ ์ฌ๋๋ค์ด ์ง์ ํ๋ฏ์ด ์ฐจํธ๊ฐ ๋น ๋ฌธ์์ด๋ก clusterIP๋ฅผ ์ ์ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋น์ค๊ฐ ์ค์น๋๋ฉด Kubernetes๋ ์๋น์ค์ ํ ๋น๋ clusterIP๋ก ์ด ํ๋๋ฅผ ์ฑ์๋๋ค.
helm upgrade
๊ฐ ํธ์ถ๋๋ฉด ์ฐจํธ์์clusterIP
๋ฅผ ์ ๊ฑฐํ๋๋ก ์์ฒญํ๋ฏ๋ก ์ค๋ฅ ๋ฉ์์ง๊ฐspec.clusterIP: Invalid value: "": field is immutable
์ด์ ๋ ๋ฌด์์ ๋๊น?์ด๊ฒ์ ๋ค์ ๋์์ผ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค.
- ์ค์น ์ ์ฐจํธ๋
clusterIP
๊ฐ ๋น ๋ฌธ์์ด์ด ๋๊ธฐ๋ฅผ ์ํ๋ค๊ณ ์ง์ ํ์ต๋๋ค.- Kubernetes๋
clusterIP
์๋น์ค๋ฅผ ์๋ ํ ๋นํ์ต๋๋ค. ์ด ์์์๋172.17.0.1
๋ฅผ ์ฌ์ฉํฉ๋๋ค.helm upgrade
์์ ์ฐจํธ๋clusterIP
๊ฐ ๋น ๋ฌธ์์ด์ด ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค (๋๋ ์์ ๊ฒฝ์ฐ ์๋ต๋จ).3๋ฐฉํฅ ํจ์น๋ฅผ ์์ฑํ ๋ ์ด์ ์ํ๋
""
, ๋ผ์ด๋ธ ์ํ๋ ํ์ฌ"172.17.0.1"
, ์ ์๋ ์ํ๋""
์์ ํ์ธํฉ๋๋ค. Helm์ ์ฌ์ฉ์๊ฐclusterIP
๋ฅผ "172.17.0.1"์์ ""๋ก ๋ณ๊ฒฝํ๋๋ก ์์ฒญํ ๊ฒ์ ๊ฐ์งํ์ฌ ํจ์น๋ฅผ ์ ๊ณตํ์ต๋๋ค.Helm 2์์๋ ๋ผ์ด๋ธ ์ํ๋ฅผ ๋ฌด์ํ๋ฏ๋ก ๋ณ๊ฒฝ ์ฌํญ์ด ์์๊ณ (์ด์ ์ํ:
clusterIP: ""
์์ ์ ์ํ๋ก:clusterIP: ""
) ์ด ๋์์ ์ฐํํ์ฌ ํจ์น๊ฐ ์์ฑ๋์ง ์์์ต๋๋ค.๋ด ๊ถ์ฅ ์ฌํญ์ ํ ํ๋ฆฟ ์ถ๋ ฅ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋๋ค.
clusterIP
๊ฐ ๊ฐ์ผ๋ก ์ ๊ณต๋์ง ์์ผ๋ฉด ๊ฐ์ ๋น ๋ฌธ์์ด๋ก ์ค์ ํ์ง ๋ง์ญ์์ค... ํ๋๋ฅผ ์์ ํ ์๋ตํ์ญ์์ค.์:
stable/nginx-ingress
:spec: {{- if not .Values.controller.service.omitClusterIP }} clusterIP: "{{ .Values.controller.service.clusterIP }}" {{- end }}
๋ค์์ผ๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
spec: {{- if not .Values.controller.service.omitClusterIP }} {{ with .Values.controller.service.clusterIP }}clusterIP: {{ quote . }}{{ end }} {{- end }}
์๋ ํ์ธ์ @bacongobbler๋ , ๊ฐ์ด ์ ๊ณต๋์ง ์์ผ๋ฉด
clusterIP: ""
clusterIP: ""
๋ง๋ฌด๋ฆฌ๋ ๊ฒ์ด๋ฏ๋กclusterIP: ""
์ค์ ๋์ด ์์ผ๋ฉด ๊ฐ ํ์ผ์ clusterIP ์ฃผ์๋ฅผ ํ๋์ฝ๋ฉํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ์ด ๊ฒฝ์ฐ
--set controller.service.omitClusterIP=true
์๋ํ๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค.TL;DR์ ์๋น์ค ํ ํ๋ฆฟ์์ ๋ค์์ ์ํํ์ง ๋ง์ญ์์ค.
clusterIP: ""
๊ทธ๋ ์ง ์์ผ๋ฉด Helm์ ์๋น์ค์ clusterIP๋ฅผ ์๋ ์์ฑ๋ IP ์ฃผ์์์ ๋น ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๋ ค๊ณ ์๋ํ๋ฏ๋ก ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
@bacongobbler๋ , helm v2 ๋ฆด๋ฆฌ์ค๋ฅผ helm v3์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๋์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ์๋น์ค์์ type: ClusterIP
๋ฅผ ์ฌ์ฉํ์ง๋ง ClusterIP
๋ฅผ ์ ํ ์๋ตํ๋ฉด ๋ค์์ ์ป์ต๋๋ค.
Error: UPGRADE FAILED: failed to replace object: Service "dummy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm ํ
ํ๋ฆฟ์ spec.clusterIP:
๊ฐ ์์ง๋ง helm 2to3์ ํตํด ๋ฆด๋ฆฌ์ค๋ฅผ ๋ง์ด๊ทธ๋ ์ด์
ํ ํ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์๋น์ค ํ ํ๋ฆฟ:
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 }}
๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ ์๋น์ค๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์๋ค๋ ๊ฒ์ ๋๋ค. ์ ๊ทธ๋ ์ด๋ ์ ๋ณ๊ฒฝ๋ ์ธ๊ทธ๋ ์ค์ ๋๋ค.
helm upgrade --install
์์ --force
ํ๋๊ทธ๋ฅผ ์ญ์ ํ๊ณ ๋ถ๋ณ ํ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ผ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์๋ํ๋ ๋ถ๋ณ ํ๋๊ฐ ์๋ ๋ฆฌ์์ค์ ์ํฅ์ ์ค๋๋ค. ๊ทธ๋ฌ๋ ์์์ apiversion์ ์ถฉ๋์ํค๊ณ ์ถ๋ค๋ฉด??? ๋ฆฌ์์ค๋ฅผ ๋ค์ ์์ฑํด์ผ ํ์ง๋ง helm 3๋ ๋ฆฌ์์ค๋ฅผ ์
๊ทธ๋ ์ด๋ํ์ง ์์ต๋๋ค....
@bacongobbler ^^
helm 3์ ์๋ก์ด apiVersion์ผ๋ก ์
๋ฐ์ดํธ hpa๋ฅผ ์๋ํ์ต๋๋ค.
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 ๋ฐ @kritcher722 ์ถ์ฒ ์ํจ ๋๊ธ์ด ์
๋ฐ์ดํธ๋์์ต๋๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ์ถ์ฒ์ ์ญ์ ํ๊ณ ์ถ๋ค๋ฉด, ์ฌ์ ํ ์๊ฒฌ์ด ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ๋ ๋๋ง๋ ๋งค๋ํ์คํธ์ clusterIP: ""
๋ฅผ ํฌํจํ๋ ๊ฒ์ด ์ข์ ์ด์ ์ ๋ํด ์์ธํ ์ค๋ช
ํด ์ฃผ์ญ์์ค.
Microsoft๊ฐ ํ๋ก์ ํธ์ ๋ฉํ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์คํ์ผ์ด ๋ณด์ ๋๋ค. :)
๋ค์ ์ด์ด์ฃผ์ธ์. ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์์ต๋๋ค. nasseemkullah๊ฐ ์ ์ํ ์ด "ํดํน"์ ์ ์ ํ์ง ์์ต๋๋ค. ์ฌ๋๋ค์๊ฒ ๋จธ๋ฆฌ ์๋ก ๋ฐ์ด์ค๋ผ๊ณ ์๊ตฌํ์ง ๋ง์ญ์์ค. ๊ทธ๋ฅ ๊ณ ์ณ. ๋งค์ฐ ์ด์ ํ ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝ๋ก. ํฌ๋ฆ์ ์ง์ฆ๋๋ค.
@antonakv ํ ํด๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ :)
๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ฐจํธ์์ ๊ตฌ์ฑ ๊ฐ๋ฅํ ๊ฐ์ผ๋ก clusterIP๋ฅผ ์ ๊ณตํ ๋ ์ฐ๋ฆฌ๊ฐ ๋ถ์ฅ๋์ ํ๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉฐ, ํนํ ํ๋์ ๋๊ตฌ/์ฌ๋/PR์ ์ ์ ์ผ๋ก ๋น๋ํ ์๋ ์์ต๋๋ค.
clusterIP๊ฐ ๊ตฌ์ฑ ๊ฐ๋ฅํ ๊ฐ์ด์ด์ผ ํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋๋ง๋ ํ
ํ๋ฆฟ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ https://github.com/helm/charts/blob/270172836fd8cf56d787cf7d04d938856de0c794/stable ์ ๋ฐ๋ผ ๊ฐ ํ์ผ์์ ์ฃผ์ ์ฒ๋ฆฌํ๋ ์์ด๋์ด์
๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ํ๋ฆฌ์ง ์์๋ค๋ฉด ๊ทธ ๋ณ๊ฒฝ ์์ ์ ์ฐจํธ๋ฅผ ์ค์นํ๋ ์ฌ๋๋ค์๊ฒ ๋ฏธ๋์ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฐฉํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ์ ์ฌ๋๋ค์ ์ํด ์ฌ์ ์ ์ค์นํ๊ณ helm3๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ฌ๋ (์์ ํฌํจ), ๋๋ ์ ์ผํ ์ต์ I๋ ์ฐ๋ฆฌ์ ๊ฐ์น ํ์ผ์ ํ์ฌ clusterIP ๊ฐ์ hardcording ๋๋ ์ ๊ฑฐํ๊ณ ์ฐจํธ๋ฅผ (์์ธ ๊ฐ๋ ์ค๋จ!) ๋ค์ ์ค์น ๋๋ ค์ ๋ณด๋ค.
์๊ฒฌ์ ์ ์๊ฒฌ์ ๋๋ค. ์ ๋ ์กฐํ ์์ ์ ์ํด ๋์ ๋ฐ๋ ๊ฒ์ด ์๋๋ผ ๋น์ ๊ณผ ๊ฐ์ ์ต์ข ์ฌ์ฉ์์ผ ๋ฟ์ ๋๋ค. ์ด ํํ์์ผ๋ก ์ผํ๊ธฐ ์ํด ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ๋๋ค์ ๋ ๋ง์ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ํด ๋ณต ๋ง์ด ๋ฐ์ผ์๊ณ ํ์ด์ ๋น๋๋ค! ์ฃผ๋๊ถ์ ํฌ๊ธฐํ์ง ๋ง์ญ์์ค. ํจ๊ป๋ผ๋ฉด ๋ ๋์์ง ์ ์์ต๋๋ค.
@bacongobbler๋ , helm v2 ๋ฆด๋ฆฌ์ค๋ฅผ helm v3์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ์๋น์ค์์
type: ClusterIP
๋ฅผ ์ฌ์ฉํ์ง๋งClusterIP
๋ฅผ ์ ํ ์๋ตํ๋ฉด ๋ค์์ ์ป์ต๋๋ค.
Error: UPGRADE FAILED: failed to replace object: Service "dummy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm ํ ํ๋ฆฟ์
spec.clusterIP:
๊ฐ ์์ง๋ง helm 2to3์ ํตํด ๋ฆด๋ฆฌ์ค๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ ํ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.์๋น์ค ํ ํ๋ฆฟ:
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 }}
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฐจํธ์์ clusterIP
๋ฅผ ์ ํ ์ ์ํ์ง ์์ผ๋ฉฐ ์ต์ข
ํ
ํ๋ฆฟ์๋ ์กด์ฌํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ --force
ํ๋๊ทธ๋ง ์์ต๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
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
๋ ์๋น์ค ํ
ํ๋ฆฟ์ ์ผ๋ถ๊ฐ ์๋์ง๋ง ์์ง Helm 3.0.2 ๋ฐ helm upgrade ... --force --install
ํธ์ถ์ ํตํด ๋ค์๋ ๋ณด๊ณ ๋ฉ๋๋ค.
์ค๋ฅ: ์ ๊ทธ๋ ์ด๋ ์คํจ: ๊ฐ์ฒด ๊ต์ฒด ์คํจ: ์๋น์ค "๋๋ฏธ"๊ฐ ์ ํจํ์ง ์์: spec.clusterIP: ์ ํจํ์ง ์์ ๊ฐ: "": ํ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ค์ ์ด์ด์ฃผ์ธ์.
@tomcruise81 --force
์ ๋ํ ์ค๋ ๋๋ https://github.com/helm/helm/issues/7350 ์ ์ฐธ์กฐ kubectl replace
๊ฐ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์๋น์ค ํด๋ฌ์คํฐ IP ๋ฐ 3๋ฐฉํฅ ๋ณํฉ ํจ์น ์ ๋ต( --force
ํ๋๊ทธ๊ฐ ์๋ helm upgrade
๊ณผ ๊ด๋ จ๋ ์ฌ๊ธฐ์ ์ค๋ช
๋ ๊ฒ๊ณผ๋ ๋ณ๊ฐ์ ๋ฌธ์ ์
๋๋ค.
@bacongobbler - ๋น ๋ฅธ ์๋ต๊ณผ ์ค๋ช ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ณด๊ณ :
https://github.com/helm/helm/blob/a963736f6675e972448bf7a5fd141628fd0ae4df/pkg/kube/client.go#L405 -L411
https://github.com/kubernetes/cli-runtime/blob/master/pkg/resource/helper.go#L155 -L181์ ์ฌ์ฉํ๋ฉด helper.Replace
๋ํ ํธ์ถ์ด kubectl replace -f ... --force
์ ๋์ผํฉ๋๋ค(๋ง์ง๋ง์ --force ์ฐธ๊ณ ).
์ฌ๊ธฐ์ ๋ง์ ํผ๋์ด ์ผ์ด๋๋ ๊ฒ ๊ฐ์์.
๋๋ helm upgrade ... --force
๋ํ ๋์ ๊ธฐ๋์น๋ฅผ ์๊ณ ์์ผ๋ฉฐ ๋์ฒด ์ ๋ต์ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ kubectl replace -f ... --force
์ ๊ฐ์ ์ผ์ ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ด์์ต๋๋ค.
@bacongobbler๋ , helm v2 ๋ฆด๋ฆฌ์ค๋ฅผ helm v3์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ์๋น์ค์์
type: ClusterIP
๋ฅผ ์ฌ์ฉํ์ง๋งClusterIP
๋ฅผ ์ ํ ์๋ตํ๋ฉด ๋ค์์ ์ป์ต๋๋ค.
Error: UPGRADE FAILED: failed to replace object: Service "dummy" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm ํ ํ๋ฆฟ์spec.clusterIP:
๊ฐ ์์ง๋ง helm 2to3์ ํตํด ๋ฆด๋ฆฌ์ค๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ ํ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์๋น์ค ํ ํ๋ฆฟ: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 }}
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฐจํธ์์
clusterIP
๋ฅผ ์ ํ ์ ์ํ์ง ์์ผ๋ฉฐ ์ต์ข ํ ํ๋ฆฟ์๋ ์กด์ฌํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ--force
ํ๋๊ทธ๋ง ์์ต๋๋ค.
๋ํ ๋ฆด๋ฆฌ์ค ๋งค๋ํ์คํธ์ clusterIP
๊ฐ ์๋์ง ํ์ธํ์ต๋๋ค.
$ helm get manifest paywall-api-ee | grep clusterIP
$
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ClusterIP
์ด๋์๋ ์ ์ํ์ง ์์ง๋ง ์ฌ์ ํ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค.
์ด๊ฒ์ผ๋ก ์ข ๋ ์ฅ๋์ ์น๋ฉด์ ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ค์ ๊ด์ฐฐํ์ต๋๋ค.
helm upgrade ... --force --install
- ๊ฒฐ๊ณผ _์๋น์ค "๋๋ฏธ"๊ฐ ์ ํจํ์ง ์์ ํ์ง ์์ ๊ฐ: "": ํ๋๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ_helm template ... | kubectl apply -f -
- ์๋helm template ... | kubectl replace -f -
- ๊ฒฐ๊ณผ _์๋น์ค "๋๋ฏธ"๊ฐ ์ ํจํ์ง ์์ ํ์ง ์์ ๊ฐ: "": ํ๋๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ_helm template ... | kubectl replace --force -f -
- ์๋kubectl ๋ฒ์ - 1.14.6
์กฐํ ๋ฒ์ - 3.0.2
@tomcruise81 helm ํ๋ฌ๊ทธ์ธ 2to3์ ์ฌ์ฉํด ๋ณด๊ณ helm2์์ helm3 ๋ฆด๋ฆฌ์ค๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ณ ์ด์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ --force
์ญ์ ํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ์ฐ๋ฆฌ๋ฅผ ์ํ ์ผ์
๋๋ค.
๋์ ๊ดํด์๋ ๋ค๋ฅธ ์ฌ๋๋ค์ฒ๋ผ --force
์ ์๋ชป๋ ํ๋์ด ์์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ๋ ๋ถ๋ณ ํ๋๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
@alexandrsemak - ์ถ์ฒ ๊ฐ์ฌํฉ๋๋ค. ์ ๊ฒฝ์ฐ์๋ helm 3์ ์ฌ์ฉํ์ฌ ์ค์นํ๊ฑฐ๋ ์ ๊ทธ๋ ์ด๋ํ ์ฐจํธ์์๋ง ์ด๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋์ ๊ฐ์ ๋ฌธ์ ! ์ฌ์ฉ
$ helm install my-release xxxxx
$ helm upgrade --install --force my-release xxxxx
์ ๊ฒฝ์ฐ์๋ ์ฐจํธ์ ์ฌ์ฉ๋ ์๋น์ค์ ๋ํด ClusterIP ๋ฅผ ์ ์ํ์ง ์์ง๋ง ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํฉ๋๋ค(์๋ ์ฌ์ ์ฐธ์กฐ).
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 }}
๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ด์ ์ ๋งํ๋ฏ์ด Kubernetes๋ ์ฒ์์ผ๋ก ์๋น์ค์ ํด๋ฌ์คํฐ IP๋ฅผ ํ ๋นํ๊ณ (์: clusterIP: 10.96.26.65
) ์
๊ทธ๋ ์ด๋ํ๋ ค๊ณ ํ ๋ clusterIP: ""
์ ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ด ํ
ํ๋ฆฟ์์ ์ด๊ฒ์ ์์ฑํ์ง ์๋๋ค๋ ์ ์ ์ ์ํ์ญ์์ค: clusterIP: ""
@bacongobbler๋ฅผ ๋ค์ ์ด์ด์ฃผ์ธ์
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@juan131 @Ronsevet : ์ ๊ฑฐ --force ์๋ฏธ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.
์ฌ์ฉ์ ์ง์ ์ฐจํธ์์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋์๋ clusterip์ ์ ์ํ์ง ์์ต๋๋ค.
ํฌ๊ตฌ v3.0.2
kubectl 1.14.8
๋ฌธ์ ๋ ํฌ๋๊ฐ ์์ฑ๋์ด ์คํ ์ค์ด๋๋ผ๋ ์ฐจํธ๊ฐ ์คํจํ ์ํ๋ก ์ ์ง๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๋์ผํ ๋ฆด๋ฆฌ์ค๋ฅผ ์
๊ทธ๋ ์ด๋ํ๋ ค๊ณ ํ๋ฉด ๊ฐ์ ๋ก ์๋ํ์ง ์์ต๋๋ค.
ํฌ๋๊ฐ ์คํ ์ค์ด๋ฏ๋ก ๋ฆด๋ฆฌ์ค๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ๋ง๋ค ์ ์์ต๋๋ค.
"ํ"์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค
๋์๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ฐฉ๊ธ ์๋น์ค์ ๋ ์ด๋ธ์ ์ถ๊ฐํ๋๋ฐ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ํ ๋๋ ์ด๋์๋ ClusterIP๋ฅผ ์ ์ํ์ง ์์ต๋๋ค - ๋ฌธ์ ๋ฅผ ๋ค์ ์ฌ์ญ์์ค
@bacongobbler ์ฐจํธ์ ์ผ๋ถ๋ก StorageClass ๋ฅผ ๋ฐฐํฌํ๊ณ ์์ผ๋ฉฐ StorageClass์ ๋งค๊ฐ๋ณ์๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์ ๋ฆด๋ฆฌ์ค์์๋ ์ผ๋ถ StorageClass ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์
๋ฐ์ดํธํ ๋ helm upgrade --force
๋ ์คํจํฉ๋๋ค.
StorageClasses ์
๋ฐ์ดํธ์ ๋ํด ์ด ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๋ค ์ ์?
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.
helm v2์์๋ helm upgrade --force
StorageClass๋ฅผ ๊ฐ์ ๋ก ์ญ์ ํ๊ณ ๋ค์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ ๋๋ฏ๋ก ์ ๋๋ก ์๋ํ์ต๋๋ค.
https://github.com/helm/helm/helm/issues/6378#issuecomment -557746499์ ์ ๊ณต๋ ์ค๋ช ์ ๊ฒฐ๊ณผ๊ฐ ์๋ ์ฆ์์ ๊ฒช๊ณ ์๋ ์ฌ๋์ด ์๋ ๊ฒฝ์ฐ ๋ฐ๊ฒฌํ ๋ด์ฉ๊ณผ ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ์ โโ๋ฌธ์ ๋ฅผ ์ด์ด ์ฃผ์๊ฒ ์ต๋๊น? ์ฐ๋ฆฌ ์ชฝ์ด์ผ?
OP์์ ์ ๊ธฐํ ๋ฌธ์ ๋ ์์ ์ ๊ณต๋ ์๋๋ฆฌ์ค๋ก ์ธํด ์ฐจํธ๊ฐ ์ค์น ์ ClusterIP๋ฅผ ๋น ๋ฌธ์์ด๋ก ์ค์ ํ์ต๋๋ค. --force
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ธ๊ธํ ๊ฒ๊ณผ ๊ฐ์ด ์ด ํน์ ์ฌ๋ก๊ฐ ๋ฐ์ํ ์ ์๋ ๋ค๋ฅธ ์๋๋ฆฌ์ค๊ฐ ์์ ์ ์์ต๋๋ค. ์ง๋จ ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์ ์ ๊ณต๋ ์กฐ์ธ๊ณผ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ์ด๋ฌํ ๊ฒฝ์ฐ๋ ๋ณ๋๋ก ๋
ผ์ํด์ผ ํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค!
@mssachan ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด #7082 ๋ฐ #7431์ ์ ์ ์ด์์ ์ฐธ์กฐํ์ธ์. ์ด ์ ์์ kubectl replace โforce
๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ฉฐ ์ด๋ Helm 2์ helm install โforce
๋์๊ณผ ์ ์ฌํฉ๋๋ค.
@mssachan ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด #7082 ๋ฐ #7431์ ์ ์ ์ด์์ ์ฐธ์กฐํ์ธ์. ์ด ์ ์์
kubectl replace โforce
๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ฉฐ ์ด๋ Helm 2์helm install โforce
๋์๊ณผ ์ ์ฌํฉ๋๋ค.
์ด๋ฐ ์ผ์ด ์ผ์ด๋๊ณ ์๋ ๊ฒ์ด ์ข์ต๋๋ค. --force
ํ๋๊ทธ๋ฅผ ์๋ตํด๋ ์ฐจํธ๋ฅผ ์
๊ทธ๋ ์ด๋ํ ๋ ์ฌ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด 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 ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด #7082 ๋ฐ #7431์ ์ ์ ์ด์์ ์ฐธ์กฐํ์ธ์. ์ด ์ ์์
kubectl replace โforce
๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ฉฐ ์ด๋ Helm 2์helm install โforce
๋์๊ณผ ์ ์ฌํฉ๋๋ค.์ด๋ฐ ์ผ์ด ์ผ์ด๋๊ณ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
--force
ํ๋๊ทธ๋ฅผ ์๋ตํด๋ ์ฐจํธ๋ฅผ ์ ๊ทธ๋ ์ด๋ํ ๋ ์ฌ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ดcert-manager
:
2020-03-05 12:15:19 CRITICAL: Command returned [ 1 ] exit code and error message [ Error: UPGRADE FAILED: cannot patch "cert-manager-cainjector" with kind Deployment: Deployment.apps "cert-manager-cainjector" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"cainjector", "app.kubernetes.io/instance":"cert-manager", "app.kubernetes.io/managed-by":"Helm", "app.kubernetes.io/name":"cainjector"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable && cannot patch "cert-manager" with kind Deployment: Deployment.apps "cert-manager" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"cert-manager", "app.kubernetes.io/instance":"cert-manager", "app.kubernetes.io/managed-by":"Helm", "app.kubernetes.io/name":"cert-manager"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable && cannot patch "cert-manager-webhook" with kind Deployment: Deployment.apps "cert-manager-webhook" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"webhook", "app.kubernetes.io/instance":"cert-manager", "app.kubernetes.io/managed-by":"Helm", "app.kubernetes.io/name":"webhook"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
@ sc250024 helm v2๋ฅผ v3์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ํ์๋ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ๊ทธ๋ ์ด๋ ์งํ์ด ์ํํ๊ณ ์ค๋ฅ๊ฐ ์์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ helm์์ cert-manager๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๋ ค๊ณ ์๋ํ์ง๋ง ๋์ผํ ์ถ๋ ฅ์ผ๋ก ์คํจํ์ต๋๋ค.
# 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"}
--force๊ฐ ์ฌ์ฉ๋์ง ์๊ฑฐ๋ clusterIP
์ ๋ํ ์ต์
์ด ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ. ์ด๊ฒ์ ๋ด ์๋น์ค ๋งค๋ํ์คํธ์
๋๋ค.
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 ์ด์ ๋ํ ํด๊ฒฐ์ฑ
์ ์ฐพ์ ์ ์ด ์์ต๋๊น? ๋๋ ๋ด ๋์์ ๊ฐ์ ๊ฒ์๋ณด๊ณ ์์ผ๋ฉฐ ๋ด ์๋น์ค๋ ๊ทํ์ ์๋น์ค์ ๋์ผํ๊ฒ ์ ์๋ฉ๋๋ค. clusterIP
๋ํ ์ต์
์ด ์ค์ ๋์ง ์์์ง๋ง Helm์ ์ฌ์ ํ โโ์
๊ทธ๋ ์ด๋์ ์คํจํฉ๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง
์ด๊ฒ๋ ์ป๊ณ , ๋ค์: ์์ ๋ ๊ฐ์ง ์๊ฒฌ.
๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ์ธ์. ์์ธ์ด๋ ๊ทํ์ ์ฌ๋ก์์ ์ด ๋ฌธ์ ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ์ดํดํ์ง ์๊ณ ๋ ๋์์ ๋๋ฆด ์ ์์ต๋๋ค. ๊ฐ์ฌ ํด์.
@antonakv ์ด ๋ฌธ์ ๋ 7956๊ณผ ์ค๋ณต๋ฉ๋๋ค.
@bacongobbler ์ถ๊ฐ ์ ๋ณด
helm update --install ๋ช ๋ น๊ณผ ํจ๊ป --force ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ helm v3.0.0-rc.2๋ก ์๋น์ค ์ ํ ๋๋ clusterIP๋ฅผ ์ค์ ํ์ง ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. --force ์์ด๋ ์ ์๋ํฉ๋๋ค.
์์ํ! ๋๋ helmfile yaml์์ force: ..
ํ์ ์ฃผ์์ ๋ฌ์์ผ ํ๋ค๋ ๊ทํ์ ๋ต๋ณ์์ ์๊ฐ์ ์ป์์ต๋๋ค.
helmDefaults:
tillerless: true
verify: false
wait: true
timeout: 600
# force: true <---- THI ONE IS COMMENTED
์๋ํฉ๋๋ค ๐
๋๋ ์์ ๋ชจ๋ ๊ฒ์ ์๋ํ์ง๋ง ์๋ฌด๋ ๋๋ฅผ ์ํด ์ผํ์ง ์์์ต๋๋ค. ๋ด ์ฐจํธ์์ nginx-ingress
์ ๋นํ์ฑํํ๊ณ ์
๊ทธ๋ ์ด๋๋ฅผ ์ํํ๊ณ ๋ค์ ํ์ฑํํ๊ณ ๋ค์ ์
๊ทธ๋ ์ด๋ํด์ผ ํ์ต๋๋ค. ์ด๋ก ์ธํด ํด๋ผ์ฐ๋ ๊ณต๊ธ์๊ฐ ํ ๋นํ IP ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋์์ง๋ง ์๋ฌด๋ฐ ํผํด๊ฐ ์์์ต๋๋ค.
helm update --install ๋ช ๋ น๊ณผ ํจ๊ป --force ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ helm v3.0.0-rc.2๋ก ์๋น์ค ์ ํ ๋๋ clusterIP๋ฅผ ์ค์ ํ์ง ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. --force ์์ด๋ ์ ์๋ํฉ๋๋ค.
์ต๊ณ ์ ์๋ฃจ์ , ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค, ๊ฐ์ฌํฉ๋๋ค!
์ฐ๋ฆฌ๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ผ๋ฉฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฌํํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
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
--force
๊ฐ ์ฌ๊ธฐ์์ ์๋ํ์ง ์๋ ์ด์ ๊ฐ ๊ถ๊ธํฉ๋๋ค. ์ด๊ฒ์ด ๊ต์ฒด ์ ๋ต์ด๋ผ๋ฉด ์๋น์ค๋ฅผ ์ ๊ฑฐํ ๋ค์ ๊ต์ฒดํด์ผ ํ๋ ๊ฒฝ์ฐ force resource updates through a replacement strategy
๋ก ๋์ด ์์ง ์์ต๋๊น?
@bacongobbler https://github.com/helm/helm/issues/7956 ์ ํ์ธํ ํ ์ด ์ค๋ ๋์ ์ ์ํ์ต๋๋ค.
์ด์ ์ ๋ชจ๋ ๋๊ธ ์์ฑ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ํ๋ฆฟ์ "clusterIP"๊ฐ ์ ํ ์์ง๋ง --force ํ๋๊ทธ๊ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ต์ Helm์ ์ค๋ฅ๊ฐ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
ํฌ๊ตฌ ๋ฒ์ : 3.4.1
"helm -n kube-system get manifest CHART_NAME | grep clusterIP"๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ์ง ์์ต๋๋ค.
์ค๋ฅ:
field is immutable && failed to replace object: Service "SERVICE_NAME" is invalid: spec.clusterIP: Invalid value: "": field is immutable
https://github.com/helm/helm/issues/6378#issuecomment -557746499์ ์ ๊ณต๋ ๋์ผํ ์ค๋ช
์ด @nick4fake์ ๊ฒฝ์ฐ์๋ ์ฌ๊ธฐ์ ์ ์ฉ๋ฉ๋๋ค. ์ฐจ์ด์ ์ --force
๋ฅผ ์ฌ์ฉํ๋ฉด Kubernetes์ ์์ ํ ๋ ๋๋ง๋ ๋งค๋ํ์คํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ ํ์ฌ ๋ผ์ด๋ธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ๋ก ๋ฎ์ด์ฐ๋๋ก ์์ฒญํ๋ค๋ ๊ฒ์
๋๋ค. ๋งค๋ํ์คํธ์ clusterIP
ํ๋๊ฐ ํฌํจ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ Kubernetes๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ ๊ฐ์ฒด์์ clusterIP
ํ๋๋ฅผ ์ ๊ฑฐํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํ๋ฏ๋ก Invalid value: "": field is immutable
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
@bacongobbler ์ฌ๊ธฐ์ ๋ญ๊ฐ ๋์น๋ฉด ์ ๋ง ์ฃ์กํฉ๋๋ค. ๋จ์ํ Helm ๋ด๋ถ์ ๋ํด ์ถฉ๋ถํ ์์ง ๋ชปํ๋ ๊ฒ์ผ ์๋ ์์ต๋๋ค.
"๋ด ๊ถ์ฅ ์ฌํญ์ ํ ํ๋ฆฟ ์ถ๋ ฅ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋๋ค. clusterIP๊ฐ ๊ฐ์ผ๋ก ์ ๊ณต๋์ง ์์ผ๋ฉด ๊ฐ์ ๋น ๋ฌธ์์ด๋ก ์ค์ ํ์ง ๋ง์ญ์์ค... ํ๋๋ฅผ ์์ ํ ์๋ตํ์ญ์์ค."
๊ทธ๋์ ํด๊ฒฐ์ฑ ์ ๋ฌด์์ ๋๊น? clusterIP ํ๋๊ฐ ์ผ๋ถ ์ ์ ๊ฐ์ผ๋ก ์ค์ ๋์ด ์์ง ์์ผ๋ฉด "--force" ํ๋๊ทธ๋ฅผ ์ ํ ์ฌ์ฉํ ์ ์๋ค๋ ์๋ฏธ์ ๋๊น?
Kubernetes์ ๊ดํ ํ: ๊ทธ๋ ์ต๋๋ค.
๋ด ์ดํด์ ๋ฐ๋ฅด๋ฉด "๊ฐ์ ๋ก ๋ฎ์ด์ฐ๊ธฐ"๋ "์ญ์ ๋ฐ ๋ค์ ๋ง๋ค๊ธฐ"์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ Kubernetes์ ๋ฌธ์ ์ ๋๋ค. ์ ์คํธ๋ฆผ ๋ฒ๊ทธ๊ฐ ์์ต๋๊น?
๋ฐ๋ฉด --force
๋ "๋์ฒด ์ ๋ต์ ํตํ ๊ฐ์ ๋ฆฌ์์ค ์
๋ฐ์ดํธ"๋ก ์ค๋ช
๋์ด ์๊ธฐ ๋๋ฌธ์ Helm๋ ์คํด์ ์์ง๊ฐ ์์ต๋๋ค. ์ค์ ๋ก๋ ๊ต์ฒด๋ฅผ ์ํํ์ง ์์ง๋ง ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ๋ก ๋ฎ์ด์ฐ๋ ค๊ณ ์๋ํฉ๋๋ค(ํ๋๊ทธ ์ด๋ฆ์ --force-overwrite
๋ก ์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค). ๊ฐ์ ๊ต์ฒด๋ ์ญ์ ํ๊ณ ๋ค์ ๋ง๋๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค( --force-recreate
ํ๋๊ทธ๊ฐ ์์ ์ ์์). ๋ฌผ๋ก --force-recreate
๋ ์ผ๋ถ ๋ฆฌ์์ค์ ์ฌ์ฉํ๊ธฐ์๋ ์ฝ๊ฐ ์ํํ ์ ์์ง๋ง ํญ์ ์ฑ๊ณตํฉ๋๋ค.
์ด์จ๋ Helm์ ์ด๋ฌํ ์ ํ์ ๋ฌธ์ ์ ๋ํ ๋์ฒด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ตฌํํ ์ ์์ต๋๋ค. ํ์ฌ ๋์( --force-overwrite
)์ด ์คํจํ๊ณ ๋ณ๊ฒฝํ ์ ์๋ ํ๋ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๋ฉด ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ์์ฑํด์ผ ํฉ๋๋ค( --force-recreate
).
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
helm update --install ๋ช ๋ น๊ณผ ํจ๊ป --force ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ helm v3.0.0-rc.2๋ก ์๋น์ค ์ ํ ๋๋ clusterIP๋ฅผ ์ค์ ํ์ง ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. --force ์์ด๋ ์ ์๋ํฉ๋๋ค.