본문 바로가기
DevOps/K8S

쿠버네티스의 selector, matchLabels, labels의 이해

by 가나무마 2024. 9. 29.
728x90

TL; DR

  • selector는 라벨(label)을 기준으로 리소스를 그룹화 한다.
  • selector.matchLabels는 Job, Deployment, Replica Set, Daemon Set만 지원한다.
  • selector.matchExpression도 Job, Deployment, Replica Set, Daemon Set만 지원한다.
  • Service 리소스의 selector는 matchLabels와 matchExpression을 사용하지 않는다.
  • Service 리소스는 matchLabels와 matchExpression을 사용하지 않을뿐 매핑은 label의 값을 통해서 지원한다.

1. Deployment

우선 코드를 분석하기 전에 앞서 전체 코드를 먼저 확인하고 부분적으로 분석해보겠습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: practice-nginx-deployment
  namespace: test
  labels:
    app.kubernetes.io/name: practice-nginx-deployment
    app.kubernetes.io/environment: test
    app.kubernetes.io/component: backend
    app.kubernetes.io/part-of: practice-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: practice-nginx-label
  template:
    metadata:
      name: practice-nginx-pod
      labels:
        app.kubernetes.io/name: practice-nginx-label
    spec:
      containers:
      - name: practice-nginx-container
        image: nginx
        ports:
        - containerPort: 80
          protocol: TCP

위의 코드는 nginx 백엔드 서비스를 제공하는 간단한 Deployment입니다.
우선 맨 위에 name을 확인하겠습니다.


apiVersion: apps/v1
kind: Deployment
metadata:
  name: practice-nginx-deployment
  namespace: test
  • metadata의 name은 label과 다르게 유일(Unique)한 값입니다. (동일한 namespace에서 동일한 리소스를 사용한다는 가정 하에 유일합니다.)
  • 따라서 아래와 같이 namespace와 name을 통해서 리소스를 식별할 수 있습니다.
# namespace를 명시하지 않으면 default 네임스페이스를 사용한다.
$ kubectl delete deploy practice-nginx-deployment Errr from server (NotFound): deployments.apps "practice-nginx-deployment" not found

$ kubectl delete deploy -n test practice-nginx-deployment
deployment.apps "practice-nginx-deployment" deleted

   labels:
    app.kubernetes.io/name: practice-nginx-deployment
    app.kubernetes.io/environment: test
    app.kubernetes.io/component: backend
    app.kubernetes.io/part-of: practice-service
  • labels는 name과 다르게 유일하지 않은 값입니다.
  • labels를 통해 여러 가지 리소스를 그룹화할 수 있습니다.
  • 예를 들어, test 환경을 가진 모든 리소스를 삭제하려면 리소스를 하나씩 삭제하거나 극단적으로는 모든 리소스를 삭제하는 방법이 있습니다. 이를 라벨링을 통해서 아래와 같이 간단하게 삭제가 가능합니다.
$ kubectl delete deployment -n test -l app.kubernetes.io/environment=test
deployment.apps "practice-nginx-deployment" deleted

spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: practice-nginx-label
  template:
    metadata:
      name: practice-nginx-pod
      labels:
        app.kubernetes.io/name: practice-nginx-label

이제 selector와 matchLabels를 볼 차례입니다.

matchLabels는 Job, Deployment, Replica Set, Daemon Set만 지원합니다. 위의 예제에선 selector.matchLabels를 통해서 파드의 labels와 매핑되며 이를 통해 레플리카셋의 개수를 조절합니다.


2. Service

  selector:
    app.kubernetes.io/name: practice-nginx-label

서비스의 selector는 위처럼 matchLabels를 사용하지 않지만 라벨을 통해 리소스와 매핑합니다.

서비스의 역할은 트래픽을 라우팅하는 것이고, 이 목적에 맞게 단순한 라벨 selector만으로 충분한 매칭이 가능합니다. matchLabels나 matchExpressions 같은 복잡한 매칭은 필요하지 않으므로 사용하지 않습니다.

결론

  • 라벨(Label)은 리소스를 그룹화 하기 위해 사용됩니다.
  • 서비스의 selector는 다른 selector와 마찬가지로 라벨을 통해 자원을 매핑(select)하지만 matchLabels나 matchExpression과 같은 표현식을 사용하지 않습니다.

출처

https://medium.com/@zwhitchcox/matchlabels-labels-and-selectors-explained-in-detail-for-beginners-d421bdd05362

728x90
반응형