이 페이지에서는 Google Kubernetes Engine(GKE)에 포드를 함께 또는 개별적으로, 또는 특정 위치에서 예약하도록 지시하는 방법을 보여줍니다.
워크로드 분리를 사용하면 taint 및 톨러레이션(toleration)을 사용하여 GKE가 포드를 서로 다른 노드로 분리하거나, 특정 기준을 충족하는 노드에 포드를 배치하도록 지정하거나, 특정 워크로드를 함께 예약하도록 지시할 수 있습니다. 워크로드 분리를 구성하기 위해 수행해야 하는 작업은 GKE 클러스터 구성에 따라 다릅니다. 다음 표에서 차이점을 확인하세요.
워크로드 분리 구성 | |
---|---|
|
포드 사양에 특정 키-값 쌍의 톨러레이션(toleration)을 추가하고 nodeSelector를 사용하여 해당 키:값 쌍을 선택합니다. GKE는 노드를 만들고, 해당 노드 taint를 적용하고, 노드에서 포드를 예약합니다. 자세한 내용은 이 페이지의 Autopilot 클러스터에서 개별 워크로드를 참조하세요. |
노드 자동 프로비저닝 없는 표준 |
자세한 내용은 전용 노드 풀에서 워크로드 격리를 참조하세요. |
이 가이드에서는 일괄 작업과 웹 서버라는 두 개의 워크로드가 있고 이를 서로 분리하려는 시나리오 예시를 사용합니다.
GKE에서 워크로드 분리를 사용해야 하는 경우
워크로드 분리는 서로 다른 역할을 수행하고 동일한 기본 머신에서 실행해서는 안 되는 워크로드에 유용합니다. 일부 시나리오 예시는 다음과 같습니다.
- 별도로 유지하려는 작업을 만드는 일괄 조정자 워크로드가 있음
- 세션 포드와 분리하려는 랜덤 대결 워크로드를 사용하여 게임 서버를 실행함
- 데이터베이스에서 서버 분리와 같이 스택의 일부를 서로 분리하려고 함
- 규정 준수 또는 정책상의 이유로 일부 워크로드를 분리하려고 함
가격 책정
Autopilot 클러스터에서는 실행 중에 포드가 요청하는 리소스에 대한 요금이 청구됩니다. 자세한 내용은 Autopilot 가격 책정을 참조하세요. 워크로드 분리를 사용하는 포드는 일반 포드보다 더 높은 최소 리소스 요청이 적용됩니다.
표준 클러스터에서는 포드가 노드에서 실행되는지 여부와 관계없이 각 노드의 하드웨어 구성 및 크기를 기준으로 요금이 청구됩니다. 자세한 내용은 표준 가격 책정을 참조하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
GKE 클러스터가 있는지 확인합니다. 클러스터를 만드는 방법을 알아보려면 다음 중 하나를 사용하세요.
Autopilot 클러스터에서 별도의 워크로드
워크로드를 서로 분리하려면 워크로드가 실행되어야 하는 노드를 정의하는 각 워크로드 사양에 톨러레이션(toleration) 및 노드 선택기를 추가합니다. 이 방법은 노드 자동 프로비저닝이 사용 설정된 표준 클러스터에서도 작동합니다.
다음 매니페스트를
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를 추가합니다.
다음 매니페스트를
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를 추가합니다.
워크로드를 배포합니다.
kubectl apply -f batch-job.yaml web-server.yaml
워크로드를 배포하면 GKE가 각 워크로드에 대해 다음을 수행합니다.
- GKE는 매니페스트에 지정된 노드 taint와 노드 라벨이 있는 기존 노드를 찾습니다. 노드가 있고 사용 가능한 리소스가 있는 경우 GKE는 노드에서 워크로드를 예약합니다.
- 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 및 노드 라벨이 있는 노드 풀을 수동으로 만들어야 합니다. 자세한 내용은 전용 노드 풀에서 워크로드 격리를 참조하세요. 노드 풀을 수동으로 관리해야 하는 특정 요구사항이 있는 경우에만 이 방법을 사용합니다.