본문 바로가기
DevOps/Kubernetes

쿠버네티스 - Label, Label Selector, Node Selector

by 재성스 2024. 10. 4.
반응형

Label, Label Selector

Label은 쿠버네티스에서 오브젝트를 식별하고 그룹화하는 키-값 쌍이다. Label Selector는 이러한 label을 사용해 특정 리소스를 선택하는 메커니즘이다. 이를 통해 서비스나 다른 리소스들이 특정 pod를 선택해 트래픽을 전달 할 수 있다.

apiVersion: v1  # API 버전.
kind: Pod  # 리소스 종류(Pod).
metadata:
  name: pod-2  # 파드 이름.
  labels:  # 파드에 적용할 레이블.
    type: web  # 'type' 레이블 키에 'web' 값을 설정.
    lo: dev    # 'lo' 레이블 키에 'dev' 값을 설정.
spec:
  containers:
  - name: container  # 컨테이너의 이름.
    image: kubetm/init  # 사용할 컨테이너 이미지.

설명:  위 예시에서 pod-2 이름을 가진 파드는 type: web, lo: dev 라는 레이블을 가지며, 이 레이블은 나중에 서비스가 해당 파드을 지정해서 선택할 수 있도록 사용된다.

 

Sevice와 Label Selector 예

apiVersion: v1  # API 버전.
kind: Service  # 리소스 종류(Service).
metadata:
  name: svc-1  # 서비스 이름.
spec:
  selector:  # 서비스가 트래픽을 전달할 파드를 선택하는 기준.
    type: web  # 'type' 레이블이 'web'인 파드를 선택.
  ports:
  - port: 8080  # 외부에서 이 서비스로 접근할 때 사용할 포트.

 설명: svc-1 서비스는 type: web 레이블을 가진 파드에 트래픽을 전달한다. 이 경우, 가장 위에 있는 예시의 pod-2가 해당 레이블을 가지고 있으므로 서비스가 이 파드에 트래픽을 전달하게 된다.

 

Label의 여러 사용 사례

  • Label은 서비스만을 위한 것이 아니다. Kubernetes에서 레이블은 다양한 목정을 위해 사용되며, 예를 들어 특정 작업(배포, 모니터링, 로그 수집)을 위한 파드를 그룹화하거나, 배포 단계 (개발, 스테이징, 프로덕션)를 표시할 때도 사용된다. 
  • 레이블 기반 업데이트 및 삭제 : 레이블을 사용하면 특정 레이블을 가진 파드를 한 번에 업데이트하거나 삭제할 수 있다. 예를 들어, "kubectl delete pod -l type=web" 명령어를 통해 특정 레이블을 가진 모든 파드를 삭제할 수 있다.

Node 스케줄링과 자원 관리

NodeSelector는 파드를 특정 노드에서만 실행하도록 할 수 있는 설정이다. 또한, 자원 요청(Requests)과 제한(Limits)을 통해 파드가 사용할 CPI 및 메모리 양을 제어할 수 있다.

NodeSelector를 사용한 Pod 예시

apiVersion: v1  # API 버전.
kind: Pod  # 리소스 종류(Pod).
metadata:
  name: pod-3  # 파드 이름.
spec:
  nodeSelector:  # 특정 노드에 파드를 배치하도록 지정.
    kubernetes.io/hostname: k8s-node1  # 파드를 'k8s-node1' 노드에서만 실행.
  containers:
  - name: container  # 컨테이너 이름.
    image: kubetm/init  # 사용할 컨테이너 이미지.

설명 : 이 파드는 k8s-node1 이라는 특정 노드에서만 실행된다. 특정 노드에만 파드를 배포하고 할 때 유용하다.

자원 요청 및 제한 설정 예시

apiVersion: v1  # API 버전.
kind: Pod  # 리소스 종류(Pod).
metadata:
  name: pod-4  # 파드 이름.
spec:
  containers:
  - name: container  # 컨테이너 이름.
    image: kubetm/init  # 사용할 컨테이너 이미지.
    resources:  # 이 컨테이너가 사용할 자원 설정.
      requests:  # 파드가 요청하는 최소 메모리.
        memory: 2Gi  # 최소 2Gi 메모리를 요청.
      limits:  # 파드가 사용할 수 있는 최대 메모리.
        memory: 3Gi  # 최대 3Gi 메모리까지 사용 가능.

설명: 이 파드는 최소 2Gi 메모리를 요청하며, 최대 3Gi 메모리까지만 사용할 수 있도록 설정됐다. 이 설정은 자원 관리 효율성을 높이는 데 유용하다.

 

자원 관리

  • 자원을 명시적으로 요청하고 제한을 설정하면, Kubernetes 스케줄러는 클러스터의 자원 상태에 따라 파드를 적절한 노드에 배치한다.
  • 그러나, 만약 자원 요청이 클러스터에서 지원되지 않으면 파드가 실행되지 않고 "Pending" 상태에 머물게 된다.
  • CPU와 메모리 요청과 제한의 의미
    • Requests: 파드가 실행되기 위해 필요한 최고한의 자원이다. 스케줄러는 이를 기준으로 파드를 배치한다.
    • Limits: 파드가 사용할 수 있는 최대 자원량이다. 파드가 설정된 제한을 초과하지 않도록 제어한다. 
    • Overcommitment: 노드에서 자원을 효율적으로 사용하기 위해, 실제로 사용할 자원보다 요청값을 낮게 설정하는 경우가 있는데, 이 경우 노드가 자원을 초과할 때 메모리 초과 등의 문제가 발생할 수 있다.
반응형