sysnet4admin / _Book_k8sInfra

< 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 >
432 stars 174 forks source link

MetalLB 삭제시 유의점 #6

Closed sysnet4admin closed 3 years ago

sysnet4admin commented 3 years ago

문제 정의:

helm 또는 kustomize를 통해 설치된 MetalLB를 kubectl delete ns metallb-system로 삭제하고 다시 helm이나 kustomize로 설치하는 경우 아래와 같은 문제가 발생함

[root@m-k8s ~]# helm install metallb edu/metallb \
> --namespace=metallb-system \
> --create-namespace \
> --set controller.tag=v0.8.3 \
> --set speaker.tag=v0.8.3 \
> --set configmap.ipRange=192.168.1.11-192.168.1.29
Error: rendered manifests contain a resource that already exists. Unable to continue with install: PodSecurityPolicy "speaker" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "metallb"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "metallb-system"

문제 원인:

clusterrole, podsecuritypolicy, clusterrolebinding은 네임스페이스를 구분하지 않는 클러스터의 전역 리소스이기 때문에 namespace 삭제한다고 삭제되지 않는다. 실제로 해당 리소스에 -n 옵션을 넣어 get을 해보면 네임스페이스 구분없이 모든 리소스가 조회된다.

임시 방편(WorkAround)

직접 전역 리소스를 삭제한다.

[root@m-k8s ~]# kubectl delete psp -l app=metallb
podsecuritypolicy.policy "controller" deleted
podsecuritypolicy.policy "speaker" deleted

[root@m-k8s ~]# kubectl delete clusterrole -l app=metallb
clusterrole.rbac.authorization.k8s.io "metallb-system:controller" deleted
clusterrole.rbac.authorization.k8s.io "metallb-system:speaker" deleted

[root@m-k8s ~]# kubectl delete clusterrolebindings.rbac.authorization.k8s.io-l app=metallb
clusterrolebinding.rbac.authorization.k8s.io "metallb-system:controller" deleted
clusterrolebinding.rbac.authorization.k8s.io "metallb-system:speaker" deleted

해결 방안:

helm 또는 kustomize로 설치된 리소스는 설치한 도구를 통해서 삭제하는 것을 매우 권장함