이 페이지에서는 Google Kubernetes Engine(GKE)에 포드를 함께 또는 개별적으로, 또는 특정 위치에서 예약하도록 지시하는 방법을 보여줍니다.
워크로드 분리를 사용하면 taint 및 톨러레이션(toleration)을 사용하여 GKE가 포드를 서로 다른 노드로 분리하거나, 특정 기준을 충족하는 노드에 포드를 배치하도록 지정하거나, 특정 워크로드를 함께 예약하도록 지시할 수 있습니다. 워크로드 분리를 구성하기 위해 해야 할 작업은 GKE 클러스터 구성에 따라 다릅니다. 다음 표에서 차이점을 확인하세요.
워크로드 분리 구성 | |
---|---|
|
특정 키:값 쌍의 톨러레이션을 포드 사양에 추가하고 nodeSelector를 사용하여 해당 키:값 쌍을 선택합니다. GKE는 노드를 생성하고, 해당 노드 테인트를 적용하고, 노드에 포드를 예약합니다. 자세한 내용은 이 페이지의 Autopilot 클러스터에서 워크로드 분리를 참고하세요. |
노드 자동 프로비저닝이 없는 Standard |
자세한 내용은 전용 노드 풀에서 워크로드 격리를 참고하세요. |
이 가이드에서는 서로 분리하려는 두 워크로드(배치 작업 및 웹 서버)가 있는 예시 시나리오를 사용합니다.
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 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
GKE 클러스터가 있는지 확인합니다. 클러스터를 만드는 방법을 알아보려면 다음 중 하나를 사용하세요.
Autopilot 클러스터에서 워크로드 분리
워크로드를 서로 분리하려면 워크로드가 실행되어야 하는 노드를 정의하는 각 워크로드 사양에 톨러레이션(toleration)과 노드 선택기를 추가합니다. 이 방법은 노드 자동 프로비저닝이 사용 설정된 Standard 클러스터에서도 작동합니다.
다음 매니페스트를
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가 있는 노드에 Pod를 배치할 수 있습니다. GKE는 이러한 노드에 이 내결함성이 없는 포드를 예약할 수 없습니다.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가 있는 노드에 Pod를 배치할 수 있습니다. GKE는 이러한 노드에 이 내결함성이 없는 포드를 예약할 수 없습니다.spec.nodeSelector
: GKE는group: jobs
노드 라벨이 있는 노드에 포드를 배치해야 합니다.
GKE는 이러한 포드를 실행하도록 GKE가 자동으로 프로비저닝하는 노드에 해당 라벨과 taint를 추가합니다.
워크로드를 배포합니다.
kubectl apply -f batch-job.yaml web-server.yaml
워크로드를 배포하면 GKE는 각 워크로드에 대해 다음을 실행합니다.
- GKE는 매니페스트에 지정된 해당 노드 테인트와 노드 라벨이 있는 기존 노드를 찾습니다. 노드가 있고 사용 가능한 리소스가 있는 경우 GKE는 노드에 워크로드를 예약합니다.
- GKE가 워크로드를 예약할 수 있는 적격한 기존 노드를 찾지 못하면 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로 클러스터 만들기
GKE에서 클러스터를 만들 때 클러스터에 노드 taint를 할당할 수 있습니다. 이렇게 하면 해당 클러스터로 생성되는 모든 노드에 taint가 할당됩니다.
노드 풀을 만들 경우, 노드 풀은 클러스터에서 taint를 상속하지 않습니다. 노드 풀에 taint를 사용하려면 노드 풀을 만들 때 --node-taints
플래그를 사용해야 합니다.
NoSchedule
효과 또는 NoExecute
효과가 있는 노드 taint로 Standard 클러스터를 만들면 GKE는 생성 시 GKE가 생성하는 기본 노드 풀에서 kube-dns
또는 metrics-server
와 같은 일부 GKE 관리형 구성요소를 예약할 수 없습니다. GKE는 노드 taint에 대한 해당 내결함성이 없으므로 이러한 구성요소를 예약할 수 없습니다.
다음 조건 중 하나를 충족하는 새 노드 풀을 추가해야 합니다.
- taint 없음
PreferNoSchedule
효과가 있는 taintcomponents.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로 클러스터 만들기
Google Cloud 콘솔에서 Kubernetes 클러스터 만들기 페이지로 이동합니다.
원하는 대로 클러스터를 구성합니다.
탐색창의 노드 풀에서 수정하려는 노드 풀을 펼친 후 메타데이터를 클릭합니다.
노드 taint 섹션에서 add taint 추가를 클릭합니다.
효과 드롭다운 목록에서 원하는 효과를 선택합니다.
키 필드와값 필드에 원하는 키-값 쌍을 입력합니다.
만들기를 클릭합니다.
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
: 노드 풀의 클러스터 이름