본문 바로가기
[DevOps]/Kubernetes

kubernetes - Label & Selector의 역할 쉽게 이해하기

by 팡펑퐁 2023. 10. 26.
728x90

📌 Label & Selector

레이블 (Label)

  • 레이블은 쿠버네티스 리소스에 부여되는 키-값 쌍으로, 리소스를 식별하고 분류하는 데 사용된다.
  • 레이블은 사용자가 정의하며 리소스에 유연하게 메타데이터를 추가하는 데 유용하다.
    • 예를 들어, "app: frontend"라는 레이블을 가진 파드는 애플리케이션의 프런트엔드 서비스임을 나타낼 수 있다.
    • 레이블은 특정 리소스에 여러 개 할당할 수 있으며, 다양한 목적으로 사용할 수 있다.

셀렉터 (Selector)

  • 셀렉터는 레이블을 사용하여 특정 리소스를 선택하는 데 사용된다.
  • 리소스를 그룹화하고 쿼리를 만들 수 있으며 이는 특정 레이블과 일치하는 리소스를 선택하기 위한 것이다.
    • 예를 들어 "app=frontend"라는 셀렉터를 사용하면 "app: frontend" 레이블을 가진 모든 파드를 선택할 수 있다.
    • 이를 통해 파드를 그룹화하고 선택된 파드에 대해 일괄적인 작업을 수행하거나 다른 리소스와 연결할 수 있다.

📜 정리

  • 레이블과 셀렉터의 조합은 쿠버네티스에서 리소스 간의 관계를 설정하고 관리하는 데 중요한 역할을 한다.
    • 예를 들어 서비스 리소스는 셀렉터를 사용하여 특정 레이블을 가진 파드를 선택하고, 해당 파드로의 트래픽을 로드밸런싱한다.
    • 이를 통해 애플리케이션의 파드를 동적으로 확장하거나 축소할 수 있다.

 

📌 예시

⌨️ ReplicaSet에서의 레이블과 셀렉터

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image
  • my-replicaset이라는 이름의 레플리카셋을 생성하는 yml 파일이다.
  • replicas: 3은 레플리카셋이 유지해야 할 파드의 개수를 3개로 지정함을 의미한다.
  • selector.matchLabels를 통해 my-replicaset은 app: my-app 레이블을 가진 파드를 선택할 것임을 명시한다.
  • template는 레플리카셋이 생성하는 파드의 템플릿을 정의한다.
    • 여기에서는 metadata.labels를 통해 레플리카셋이 생성하는 파드에 app: my-app이라는 이름의 레이블을 부여한다.

 

⌨️ Deployment에서의 레이블과 셀렉터

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image
  • my-deployment이라는 이름의 디플로이먼트를 생성하는 yml 파일이다.
  • replicas: 3은 디플로이먼트가 유지해야 할 파드의 개수를 3개로 지정함을 의미한다.
  • selector.matchLabels를 통해 my-deployment는 app: my-app 레이블을 가진 파드를 선택할 것임을 명시한다.
  • template은 디플로이먼트가 생성하는 파드의 템플릿을 정의한다.
    • 여기에서는 metadata.labels를 통해 디플로이먼트가 생성하는 파드에 app: my-app이라는 이름의 레이블을 부여한다.

 

Service에서의 셀렉터

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  • my-service라는 이름의 서비스를 생성하는 yml 파일이다.
  • selector를 통해 my-service는 app: my-app 레이블을 가진 파드를 선택할 것임을 명시한다.
  • ports는 서비스가 노출할 포트를 정의한다.
    • 여기에서는 80번 포트로 들어오는 요청을 8080번 포트로 전달한다.

 

가장 일반적인 경우인 디플로이먼트 & 서비스에서의 Label & Selector의 사용 예시를 살펴보자.

 

⌨️ 프론트엔드 Deployment & Service

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
        - name: frontend-container
          image: frontend-image
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
  • frontend-deployment라는 이름의 프론트엔드 디플로이먼트를 생성한다.
  • replicas: 3은 프론트엔드 파드의 복제본 개수를 3개로 지정함을 의미한다.
  • selector.matchLabels를 통해 frontend-deployment는 app: frontend라는 이름의 레이블을 가진 파드를 선택할 것임을 명시한다.
  • template은 frontend-deployment가 생성하는 파드의 템플릿을 정의한다.
    • 여기에서는 metadata.labels를 통해 frontend-deployment가 생성하는 파드에 app: frontend라는 이름의 레이블을 부여한다.
  • frontend-container라는 이름의 컨테이너를 정의하고 frontend-image를 사용한다.
  • 프론트엔드 파드의 80번 포트를 열어서 요청을 처리한다.
  • frontend-service라는 이름의 서비스를 생성한다.
  • selector를 통해 app: frontend 레이블을 가진 파드를 선택한다.
  • 80번 포트로 들어오는 요청을 프론트엔드 파드의 80번 포트로 전달한다.
  • type: LoadBalancer를 지정하여 로드 밸런서를 통해 외부로 서비스를 노출한다.

 

⌨️ 백엔드 Deployment & Service

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
        - name: backend-container
          image: backend-image
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  • backend-deployment라는 이름의 백엔드 디플로이먼트를 생성한다.
  • replicas: 2는 백엔드 파드의 복제본 개수를 2개로 지정함을 의미한다.
  • selector.matchLabels를 통해 backend-deployment는 app: backend라는 이름의 레이블을 가진 파드를 선택할 것임을 명시한다.
  • template은 backend-deployment가 생성하는 파드의 템플릿을 정의한다.
    • 여기에서는 metadata.labels를 통해 backend-deployment가 생성하는 파드에 app: backend라는 이름의 레이블을 부여한다.
  • backend-container라는 이름의 컨테이너를 정의하고, backend-image를 사용한다.
  • 백엔드 파드의 8080번 포트를 열어서 요청을 처리한다.
  • backend-service라는 이름의 서비스를 생성한다.
  • selector를 통해 app: backend 레이블을 가진 파드를 선택한다.
  • 8080번 포트로 들어오는 요청을 백엔드 파드의 8080번 포트로 전달한다.

 

🤔 matchLabels VS labels

matchLabels

  • 이 필드는 ReplicaSet과 Pod를 선택하기 위해 사용된다.
  • matchLabels에 지정된 라벨과 동일한 라벨을 가지고 있는 ReplicaSet과 Pod만이 Deployment에 의해 관리된다.
  • 예를 들어 위의 YAML 파일에서 matchLabels는 [app: frontend] or [app: backend]로 지정되어 있다.
    • 이는 Deployment가 app이라는 라벨의 값이 frontend or backend인 ReplicaSet과 Pod만을 선택하여 관리한다는 의미이다.

labels

  • labels는 Pod 템플릿에서 사용된다.
    • Pod에 라벨을 부여하는 역할을 한다.
    • Deployment가 관리하는 Pod는 Pod 템플릿에 지정된 labels를 가지게 된다.
    • 예를 들어 위의 YAML 파일에서 labels는 [app: frontend] or [app: backend]로 지정되어 있다.
      • 이는 Deployment에 의해 생성되는 Pod가 "app" 라벨의 값으로 frontend or backend라는 이름을 가지게 된다는 의미이다.

📜 정리

  • matchLabels는 Deployment의 selector를 지정하여 특정 ReplicaSet과 Pod를 선택하고 관리하는 데 사용되며, labels는 Deployment에 의해 생성되는 Pod에 라벨을 부여하는 데 사용된다.
  • 이를 통해 Deployment는 특정한 라벨을 가진 ReplicaSet과 Pod만을 관리하고 제어할 수 있다.

 

 

 

참고

뤼튼

728x90