GKE에서 워크로드 분리 구성


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

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

워크로드 분리 구성

포드 사양에 특정 키-값 쌍의 톨러레이션을 추가하고 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를 실행하여 최신 버전을 가져옵니다.

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는 매니페스트에 지정된 해당 노드 오염 및 노드 라벨이 있는 기존 노드를 찾습니다. 노드가 있고 사용 가능한 리소스가 있는 경우 GKE는 노드에 워크로드를 예약합니다.
  2. GKE가 워크로드를 예약할 수 있는 기존 노드를 찾지 못하면 새 노드를 만들고 매니페스트를 기반으로 해당 노드 태그 및 노드 라벨을 적용합니다. 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 및 톨러레이션을 사용한 워크로드 분리의 제한사항

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

  • 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 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

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

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

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

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

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

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

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

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: 노드 풀의 클러스터 이름

다음 단계