GKE에서 워크로드 분리 구성

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

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

워크로드 분리 구성

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

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

노드 자동 프로비저닝이 없는 Standard
  1. 노드 taint 및 노드 라벨로 노드 풀 만들기
  2. 포드 사양에 해당 taint의 톨러레이션(toleration) 추가

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

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

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

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

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

가격 책정

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

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

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

Autopilot 클러스터에서 워크로드 분리

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

  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는 이러한 노드에 이 내결함성이 없는 포드를 예약할 수 없습니다.
    • 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는 이러한 노드에 이 내결함성이 없는 포드를 예약할 수 없습니다.
    • 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/

워크로드 분리에는 고유한 키를 사용해야 합니다.

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

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

노드 taint로 클러스터 만들기

GKE에서 클러스터를 만들 때 클러스터에 노드 taint를 할당할 수 있습니다. 이렇게 하면 해당 클러스터로 생성되는 모든 노드에 taint가 할당됩니다.

노드 풀을 만들 경우, 노드 풀은 클러스터에서 taint를 상속하지 않습니다. 노드 풀에 taint를 사용하려면 노드 풀을 만들 때 --node-taints 플래그를 사용해야 합니다.

NoSchedule 효과 또는 NoExecute 효과가 있는 노드 taint로 Standard 클러스터를 만들면 GKE는 생성 시 GKE가 생성하는 기본 노드 풀에서 kube-dns 또는 metrics-server와 같은 일부 GKE 관리형 구성요소를 예약할 수 없습니다. GKE는 노드 taint에 대한 해당 내결함성이 없으므로 이러한 구성요소를 예약할 수 없습니다. 다음 조건 중 하나를 충족하는 새 노드 풀을 추가해야 합니다.

  • taint 없음
  • PreferNoSchedule 효과가 있는 taint
  • components.gke.io/gke-managed-components=true:NoSchedule taint

이러한 조건 중 하나를 사용하면 GKE가 새 노드 풀에서 GKE 관리형 구성요소를 예약할 수 있습니다.

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

gcloud

노드 taint로 클러스터 만들기

gcloud container clusters create CLUSTER_NAME \
    --node-taints KEY=VALUE:EFFECT

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름
  • EFFECT: PreferNoSchedule, NoSchedule, NoExecute 효과 중 하나
  • KEY=VALUE: EFFECT와 연결된 키-값 쌍

콘솔

노드 taint로 클러스터 만들기

  1. Google Cloud 콘솔에서 Kubernetes 클러스터 만들기 페이지로 이동합니다.

    Kubernetes 클러스터 만들기로 이동

  2. 원하는 대로 클러스터를 구성합니다.

  3. 탐색창의 노드 풀에서 수정하려는 노드 풀을 펼친 후 메타데이터를 클릭합니다.

  4. 노드 taint 섹션에서 taint 추가를 클릭합니다.

  5. 효과 드롭다운 목록에서 원하는 효과를 선택합니다.

  6. 필드와 필드에 원하는 키-값 쌍을 입력합니다.

  7. 만들기를 클릭합니다.

API

API를 사용해서 클러스터를 만들 때 'nodeConfig 아래에 nodeTaints 필드를 포함합니다.

POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters

{
  'cluster': {
    'name': 'example-cluster',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'special',
          'Value': 'gpu',
          'effect': 'PreferNoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

노드 풀에서 모든 taint 삭제

노드 풀에서 모든 taint를 삭제하려면 다음 명령어를 실행하세요.

gcloud beta container node-pools update POOL_NAME \
    --node-taints="" \
    --cluster=CLUSTER_NAME

다음을 바꿉니다.

  • POOL_NAME: 변경할 노드 풀의 이름
  • CLUSTER_NAME: 노드 풀의 클러스터 이름

다음 단계