GKE에서 워크로드 분리 구성


이 페이지에서는 Google Kubernetes Engine(GKE)에 포드를 함께 또는 개별적으로, 또는 특정 위치에서 예약하도록 지시하는 방법을 보여줍니다.

워크로드 분리를 사용하면 taint 및 톨러레이션(toleration)을 사용하여 GKE가 포드를 서로 다른 노드로 분리하거나, 특정 기준을 충족하는 노드에 포드를 배치하도록 지정하거나, 특정 워크로드를 함께 예약하도록 지시할 수 있습니다. 워크로드 분리를 구성하기 위해 수행해야 하는 작업은 GKE 클러스터 구성에 따라 다릅니다. 다음 표에서 차이점을 확인하세요.

워크로드 분리 구성

포드 사양에 특정 키-값 쌍의 톨러레이션(toleration)을 추가하고 nodeSelector를 사용하여 해당 키:값 쌍을 선택합니다. GKE는 노드를 만들고, 해당 노드 taint를 적용하고, 노드에서 포드를 예약합니다.

자세한 내용은 이 페이지의 Autopilot 클러스터에서 개별 워크로드를 참조하세요.

노드 자동 프로비저닝 없는 표준
  1. 노드 taint와 노드 라벨을 사용하여 노드 풀 만들기
  2. 포드 사양에 해당 taint에 대한 톨러레이션(toleration) 추가

자세한 내용은 전용 노드 풀에서 워크로드 격리를 참조하세요.

이 가이드에서는 일괄 작업과 웹 서버라는 두 개의 워크로드가 있고 이를 서로 분리하려는 시나리오 예시를 사용합니다.

GKE에서 워크로드 분리를 사용해야 하는 경우

워크로드 분리는 서로 다른 역할을 수행하고 동일한 기본 머신에서 실행해서는 안 되는 워크로드에 유용합니다. 일부 시나리오 예시는 다음과 같습니다.

  • 별도로 유지하려는 작업을 만드는 일괄 조정자 워크로드가 있음
  • 세션 포드와 분리하려는 랜덤 대결 워크로드를 사용하여 게임 서버를 실행함
  • 데이터베이스에서 서버 분리와 같이 스택의 일부를 서로 분리하려고 함
  • 규정 준수 또는 정책상의 이유로 일부 워크로드를 분리하려고 함

가격 책정

Autopilot 클러스터에서는 실행 중에 포드가 요청하는 리소스에 대한 요금이 청구됩니다. 자세한 내용은 Autopilot 가격 책정을 참조하세요. 워크로드 분리를 사용하는 포드는 일반 포드보다 더 높은 최소 리소스 요청이 적용됩니다.

표준 클러스터에서는 포드가 노드에서 실행되는지 여부와 관계없이 각 노드의 하드웨어 구성 및 크기를 기준으로 요금이 청구됩니다. 자세한 내용은 표준 가격 책정을 참조하세요.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

Autopilot 클러스터에서 별도의 워크로드

워크로드를 서로 분리하려면 워크로드가 실행되어야 하는 노드를 정의하는 각 워크로드 사양에 톨러레이션(toleration) 및 노드 선택기를 추가합니다. 이 방법은 노드 자동 프로비저닝이 사용 설정된 표준 클러스터에서도 작동합니다.

  1. 다음 매니페스트를 web-server.yaml로 저장합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server
    spec:
      replicas: 6
      selector:
        matchLabels:
          pod: nginx-pod
      template:
        metadata:
          labels:
            pod: nginx-pod
        spec:
          tolerations:
          - key: group
            operator: Equal
            value: "servers"
            effect: NoSchedule
          nodeSelector:
            group: "servers"
          containers:
          - name: web-server
            image: nginx
    

    이 매니페스트에는 다음 필드가 포함됩니다.

    • spec.tolerations: GKE는 group=servers:NoSchedule taint가 있는 노드에 포드를 배치할 수 있습니다. GKE는 이러한 노드에 이 톨러레이션(toleration)이 없는 포드를 예약할 수 없습니다.
    • spec.nodeSelector: GKE는 group: servers 노드 라벨이 있는 노드에 포드를 배치해야 합니다.

    GKE는 GKE가 이러한 포드 실행을 위해 자동으로 프로비저닝하는 노드에 해당 라벨과 taint를 추가합니다.

  2. 다음 매니페스트를 batch-job.yaml로 저장합니다.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: batch-job
    spec:
      completions: 5
      backoffLimit: 3
      ttlSecondsAfterFinished: 120
      template:
        metadata:
          labels:
            pod: pi-pod
        spec:
          restartPolicy: Never
          tolerations:
          - key: group
            operator: Equal
            value: "jobs"
            effect: NoSchedule
          nodeSelector:
            group: "jobs"
          containers:
          - name: pi
            image: perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    

    이 매니페스트에는 다음 필드가 포함됩니다.

    • spec.tolerations: GKE는 group=jobs:NoSchedule taint가 있는 노드에 포드를 배치할 수 있습니다. GKE는 이러한 노드에 이 톨러레이션(toleration)이 없는 포드를 예약할 수 없습니다.
    • spec.nodeSelector: GKE는 group: jobs 노드 라벨이 있는 노드에 포드를 배치해야 합니다.

    GKE는 GKE가 이러한 포드 실행을 위해 자동으로 프로비저닝하는 노드에 해당 라벨과 taint를 추가합니다.

  3. 워크로드를 배포합니다.

    kubectl apply -f batch-job.yaml web-server.yaml
    

워크로드를 배포하면 GKE가 각 워크로드에 대해 다음을 수행합니다.

  1. GKE는 매니페스트에 지정된 노드 taint와 노드 라벨이 있는 기존 노드를 찾습니다. 노드가 있고 사용 가능한 리소스가 있는 경우 GKE는 노드에서 워크로드를 예약합니다.
  2. GKE에서 워크로드를 예약할 적격한 기존 노드를 찾지 못하면 GKE는 새 노드를 만들고 매니페스트에 따라 해당 노드 taint 및 노드 라벨을 적용합니다. GKE는 포드를 새 노드에 배치합니다.

노드 taint에 NoSchedule 효과가 있으면 톨러레이션(toleration)이 없는 워크로드가 노드에 배치되지 않습니다.

워크로드 분리 확인

노드 이름을 찾기 위해 포드를 나열하세요.

kubectl get pods --output=wide

출력은 다음과 비슷합니다.

NAME                          READY   ...   NODE
batch-job-28j9h               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-78rcn               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-gg4x2               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-qgsxh               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-v4ksf               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
web-server-6bb8cd79b5-dw4ds   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm
web-server-6bb8cd79b5-g5ld6   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-jcdx5   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-pxdzw   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-s66rw   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-zq8hh   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm

이 출력은 batch-job 포드 및 web-server 포드가 항상 다른 노드에서 실행됨을 보여줍니다.

taint 및 톨러레이션(toleration)을 사용한 워크로드 분리 제한사항

워크로드 분리에는 다음 키 프리픽스를 사용할 수 없습니다.

  • GKE 및 Kubernetes 관련 키
  • *cloud.google.com/
  • *kubelet.kubernetes.io/
  • *node.kubernetes.io/

워크로드 분리를 위해 고유한 자체 키를 사용해야 합니다.

노드 자동 프로비저닝 없이 표준 클러스터에서 워크로드 분리

노드 자동 프로비저닝 없이 표준 클러스터에서 워크로드를 분리하려면 워크로드를 수용하기에 적절한 노드 taint 및 노드 라벨이 있는 노드 풀을 수동으로 만들어야 합니다. 자세한 내용은 전용 노드 풀에서 워크로드 격리를 참조하세요. 노드 풀을 수동으로 관리해야 하는 특정 요구사항이 있는 경우에만 이 방법을 사용합니다.

다음 단계