label 은 쿠버네티스 오브젝트(파드 등)에 첨부된 키와 값의 쌍이다. 오브젝트의 특성을 식별하는 데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없다. 예를들어 어떤 service가 Deployment를 식별하기 위해서는 deployment에 label 존재하며, 이 label이 Service 명세에 selector 항목에 적혀있어, Service는 Deployment를 식별하게된다.
frontend deployment와 backend deployment를 하나의 Kustomize로 묶고 있었다. Kustomize 없이 배포했을 때는 아무런 문제가 없었는데, kubectl apply -k .
커맨드로 배포하면 앱이 이상하게 동작했다. curl
을 통해서 배포된 앱에 접속해보면 1/2 확률로 bad gateway
에러가 발생했다.
kustomize build .
커맨드로 빌드된 프로젝트 전체 명세와 실제 명세를 비교해보니, kustomize 명세에는 backend 앱과 frontend 앱이 모두 동일하게 app: procject-name
레이블이 들어가 있었다.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: project-name
...
commonLabels:
app: project-name
...
빌드된 명세가 이렇게 바뀐 이유는 kustomization.yaml
파일에 commonLabels
항목이 들어있기 때문이다. commonLabels
는 묶여있는 kustomization 앱에 레이블을 주어진 값으로 변경한다.
commonLabels
로 인해서 frontend service와 backend service는 자신이 연결할 pods들을 식별할 수 없게 되었다. 결국 1/2 확률로 bad gateway
에러가 발생한 것이다.
commonLabels
를 삭제하고 앱을 다시 배포했더니 앱이 정상적으로 동작했다.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: project-name
...
~~commonLabels:
app: project-name~~
...
commonLabels
는 kustomization으로 묶인 모든 리소스에 레이블을 추가할 때 사용된다. 만약 하나의 프로젝트 내부에서 deployment들을 구분하여 사용 한다면, commonLabels
에 중복되는 레이블이 들어가지 않도록 주의해야한다.