이 페이지에서는 AWS용 GKE에서 노드 풀을 만드는 방법과 구성 파일을 사용하여 노드 구성을 맞춤설정하는 방법을 보여줍니다.
노드 풀을 만들려면 다음 리소스를 제공해야 합니다.
- 노드 풀을 만들 기존 AWS 클러스터의 이름
- 노드 풀 VM의 IAM 인스턴스 프로필
- 노드 풀 VM이 실행될 서브넷
노드에 SSH로 액세스하려면 EC2 키 쌍 만들기를 수행하면 됩니다.
이 페이지는 클라우드 인프라를 설정, 모니터링, 관리하려는 IT 관리자와 운영자를 위해 작성되었습니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE Enterprise 사용자 역할 및 태스크를 참조하세요.
표준 노드 풀 만들기
이러한 리소스를 사용할 수 있게 되면 다음 명령어로 노드 풀을 만들 수 있습니다.
gcloud container aws node-pools create NODE_POOL_NAME \
--cluster CLUSTER_NAME \
--instance-type INSTANCE_TYPE \
--root-volume-size ROOT_VOLUME_SIZE \
--iam-instance-profile NODEPOOL_PROFILE \
--node-version NODE_VERSION \
--min-nodes MIN_NODES \
--max-nodes MAX_NODES \
--max-pods-per-node MAX_PODS_PER_NODE \
--location GOOGLE_CLOUD_LOCATION \
--subnet-id NODEPOOL_SUBNET \
--ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
--config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
--tags "Name=CLUSTER_NAME-NODE_POOL_NAME"
다음을 바꿉니다.
NODE_POOL_NAME
: 노드 풀에 대해 선택한 이름CLUSTER_NAME
: 노드 풀을 연결할 클러스터의 이름INSTANCE_TYPE
: 이 노드 풀에 원하는 AWS 머신 인스턴스 유형(예:m5.large
)ROOT_VOLUME_SIZE
: 각 노드의 루트 볼륨에 원하는 크기(Gb)NODEPOOL_PROFILE
: 노드 풀 VM의 IAM 인스턴스 프로필 IAM 인스턴스 프로필 업데이트 방법에 대한 자세한 내용은 AWS IAM 인스턴스 프로필 업데이트를 참조하세요.NODE_VERSION
: 노드 풀의 각 노드에 설치할 Kubernetes 버전(예: "1.31.6-gke.200")MIN_NODES
: 노드 풀에 포함할 수 있는 최소 노드 수MAX_NODES
: 노드 풀에 포함할 수 있는 최대 노드 수MAX_PODS_PER_NODE
: 풀의 단일 노드에 생성할 수 있는 최대 포드 수GOOGLE_CLOUD_LOCATION
: 이 노드 풀이 관리될 Google Cloud위치의 이름NODEPOOL_SUBNET
: 노드 풀이 실행될 서브넷의 ID입니다.- 클러스터의 포드/서비스 IP 범위와 노드 풀 서브넷 네트워크 간에는 겹치지 않아야 합니다. 클러스터의 포드 및 서비스 IP 범위 선택에 대한 자세한 내용은 클러스터의 CIDR 범위 선택을 참조하세요.
- 이 서브넷이 VPC 기본 CIDR 블록 외부에 있으면 몇 가지 추가 단계가 필요합니다. 자세한 내용은 보안 그룹을 참조하세요.
SSH_KEY_PAIR_NAME
: SSH 액세스를 위해 생성된 AWS SSH 키 쌍의 이름입니다(선택사항).CONFIG_KMS_KEY_ARN
: 사용자 데이터를 암호화하는 AWS KMS 키의 Amazon 리소스 이름(ARN)입니다.
있으면 --tags
파라미터는 노드 풀에 있는 모든 노드에 지정된 태그를 적용합니다. 이 예시에서는 풀의 모든 노드에 노드가 속한 노드 클러스터와 풀의 이름으로 태그를 지정합니다.
노드 시스템 구성 맞춤설정
다양한 방법을 사용해서 노드 구성을 맞춤설정할 수 있습니다. 예를 들어 노드 풀을 만들 때 포드의 CPU 한도와 같은 파라미터를 지정할 수 있습니다.
노드 시스템 구성을 사용하여 Kubernetes 노드 에이전트(kubelet
) 및 노드 풀의 하위 수준 Linux 커널 구성(sysctl
)에 대한 커스텀 설정을 지정할 수 있습니다.
kubelet
에이전트 구성
kubelet
을 사용하여 노드 구성을 맞춤설정하려면 Google Cloud CLI 또는 Terraform을 사용합니다.
gcloud
노드 풀을 만들 때 Kubernetes 노드 에이전트(kubelet
)의 커스텀 설정을 지정할 수 있습니다. 예를 들어 kubelet
에서 정적 CPU 관리 정책을 사용하도록 구성하려면 다음 명령어를 실행합니다.
gcloud container aws node-pools create POOL_NAME \
--cluster CLUSTER_NAME \
--location=LOCATION \
--kubelet_config_cpu_manager_policy=static
다음을 바꿉니다.
POOL_NAME
: 노드 풀 이름입니다.CLUSTER_NAME
: 노드 풀을 추가하려는 클러스터의 이름입니다.LOCATION
: 클러스터의 컴퓨팅 영역 또는 리전입니다.
위 명령어에 추가할 수 있는 필드의 전체 목록은 Kubelet 구성 옵션을 참조하세요.
Terraform
AWS 환경의 Terraform에 대한 자세한 내용은 Terraform 노드 풀 참조를 확인하세요.
variables.tf
파일에 다음 블록을 포함하여 Terraform 변수를 설정합니다.variable "node_pool_kubelet_config_cpu_manager" { default = "none" } variable "node_pool_kubelet_config_cpu_cfs_quota" { default = "true" } variable "node_pool_kubelet_config_cpu_cfs_quota_period" { default = "100ms" } variable "node_pool_kubelet_config_pod_pids_limit" { default = -1 }
Terraform 구성에 다음 블록을 추가합니다.
resource "google_container_aws_node_pool" "NODE_POOL_RESOURCE_NAME" { provider = google cluster = CLUSTER_NAME name = POOL_NAME subnet_id = SUBNET_ID version = CLUSTER_VERSION location = CLUSTER_LOCATION kubelet_config { cpu_manager_policy = var.node_pool_kubelet_config_cpu_manager cpu_cfs_quota = var.node_pool_kubelet_config_cpu_cfs_quota cpu_cfs_quota_period = var.node_pool_kubelet_config_cpu_cfs_quota_period pod_pids_limit = var.node_pool_kubelet_config_pod_pids_limit } }
다음을 바꿉니다.
NODE_POOL_RESOURCE_NAME
: Terraform 템플릿의 노드 풀 리소스 이름입니다.CLUSTER_NAME
: 기존 클러스터의 이름입니다.POOL_NAME
: 맞춤설정할 노드 풀의 이름입니다.SUBNET_ID
: 노드 풀에 할당된 서브넷입니다.CLUSTER_VERSION
: AWS용 GKE 클러스터 컨트롤 플레인과 노드의 버전입니다.CLUSTER_LOCATION
: 클러스터의 Compute Engine 리전 또는 영역입니다.
sysctl
유틸리티 구성
sysctl
을 사용하여 노드 시스템 구성을 맞춤설정하려면 awsClusters.awsNodePools.create
메서드에 POST
요청을 보냅니다.
이 POST 요청은 지정된 맞춤설정을 사용하여 노드 풀을 만듭니다. 다음 예시에서는 busy_poll
및 busy_read
파라미터가 각각 5,000마이크로초로 구성되어 있습니다.
POST https://ENDPOINT/v1/projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/CLUSTER_NAME/awsNodePools
{
"name": NODE_POOL_NAME,
"version": CLUSTER_VERSION,
"config": {
"linuxNodeConfig": {
"sysctls": {
"net.core.busy_poll": "5000",
"net.core.busy_read": "5000",
}
}
}
}
다음을 바꿉니다.
ENDPOINT
: Google Cloud 서비스 엔드포인트입니다.PROJECT_ID
: Google Cloud 프로젝트 ID입니다.GOOGLE_CLOUD_LOCATION
: 클러스터의 Google Cloud 위치입니다.CLUSTER_NAME
: 노드 풀을 추가하려는 클러스터의 이름입니다.NODE_POOL_NAME
: 노드 풀 이름입니다.CLUSTER_VERSION
: 클러스터 버전 번호입니다(예: 1.31.0-gke.500).
위 JSON 요청에 추가할 수 있는 키-값 쌍의 전체 목록은 Sysctl 구성 옵션을 참조하세요.
kubelet
에이전트 구성 옵션
다음 표에서는 수정할 수 있는 kubelet
옵션을 보여줍니다.
Kubelet 구성 설정 | 제한사항 | 기본 설정 | 설명 |
---|---|---|---|
kubelet_config_cpu_manager_policy |
값은 none 또는 static 이어야 합니다.
|
"none"
|
이 설정은 kubelet의 CPU 관리자 정책을 제어합니다. 기본값은 OS 스케줄러가 자동으로 수행하는 것 이상의 어피니티를 제공하지 않는 기본 CPU 어피니티 스키마인 none 입니다.이 값을 static 으로 설정하면 보장 QoS 클래스에서 정수 CPU 요청을 사용하는 포드에 단독 CPU 사용을 지정할 수 있습니다. |
kubelet_config_cpu_cfs_quota |
값은 true 또는 false 이어야 합니다.
|
true
|
이 설정은 포드의 CPU 한도를 적용합니다. 이 값을 false 로 설정하면 포드의 CPU 한도가 무시됩니다.포드가 CPU 한도에 민감한 경우 특정 경우에 CPU 한도를 무시하는 것이 좋습니다. cpuCFSQuota 를 사용 중지할 경우 악의적인 포드가 의도한 것보다 더 많은 CPU 리소스를 사용할 수 있습니다.
|
kubelet_config_cpu_cfs_quota_period | 값은 기간이어야 합니다. |
"100ms"
|
이 설정은 CPU CFS 할당량 기간 값인 cpu.cfs_period_us 를 설정합니다. 이 값은 CPU 리소스에 대한 cgroup의 액세스를 다시 할당해야 하는 빈도에 대한 기간을 지정합니다. 이 옵션을 사용하면 CPU 제한 동작을 조정할 수 있습니다. |
kubelet_config_pod_pids_limit | 값은 1024에서 4194304 사이여야 합니다. |
-1
|
이 설정은 각 포드가 사용할 수 있는 최대 프로세스 ID(PID) 수를 설정합니다. 기본값으로 설정하면 PID 한도가 기본 머신 크기에 따라 자동으로 조정됩니다. |
sysctl
유틸리티 구성 옵션
시스템 성능을 조정하려면 다음 속성을 수정하면 됩니다.
net.core.busy_poll
net.core.busy_read
net.core.netdev_max_backlog
net.core.rmem_max
net.core.wmem_default
net.core.wmem_max
net.core.optmem_max
net.core.somaxconn
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
net.ipv4.tcp_tw_reuse
net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.default.disable_ipv6
vm.max_map_count
Spot 인스턴스 노드 풀
AWS용 GKE는 프리뷰 기능으로 AWS Spot 인스턴스 노드 풀을 지원합니다. Spot 인스턴스 노드 풀은 AWS에서 더 저렴한 비용으로 제공되는 Amazon EC2 Spot 인스턴스의 풀입니다.
스테이트리스(Stateless), 내결함성, 가변형 애플리케이션의 경우 Spot 인스턴스로 비용을 절감할 수 있습니다. 하지만 유연하지 않거나, 스테이트풀(Stateful)이거나, 내결함성이 없거나, 인스턴스 노드 간에 긴밀하게 결합된 워크로드에는 적합하지 않습니다. Spot 인스턴스는 EC2에서 용량이 다시 필요할 때 Amazon EC2에 의해 중단될 수 있으므로 Spot 시장의 변동성에 영향을 받습니다. 워크로드 용량을 보장해야 하고 간헐적인 사용 불가 기간을 감당할 수 없는 경우 Spot 인스턴스 노드 풀 대신 표준 노드 풀을 선택하세요.
AWS용 GKE는 용량 가용성이 가장 높은 Spot 인스턴스 풀을 선택하여 중단 위험을 최소화하는 데 집중하는 할당 전략을 사용합니다. 이 접근 방식은 이미지 및 미디어 렌더링이나 딥 러닝과 같이 중단 비용이 높은 워크로드에서 특히 유용합니다.
구체적으로, Spot 인스턴스 할당 전략의 설명과 같이 capacityOptimized
할당 전략이 구현되었습니다.
Spot 노드 풀 만들기
Spot 인스턴스 노드 풀을 만들려면 다음 명령어를 실행합니다.
gcloud container aws node-pools create NODE_POOL_NAME \
--cluster CLUSTER_NAME \
--spot-instance-types INSTANCE_TYPE_LIST \
--root-volume-size ROOT_VOLUME_SIZE \
--iam-instance-profile NODEPOOL_PROFILE \
--node-version NODE_VERSION \
--min-nodes MIN_NODES \
--max-nodes MAX_NODES \
--max-pods-per-node MAX_PODS_PER_NODE \
--location GOOGLE_CLOUD_LOCATION \
--subnet-id NODEPOOL_SUBNET \
--ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
--config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
--tags "Name=CLUSTER_NAME-NODE_POOL_NAME"
다음을 바꿉니다.
- NODE_POOL_NAME: 이 노드 풀에 할당하려는 이름입니다.
- CLUSTER_NAME: 이 노드 풀을 연결하려는 클러스터의 이름입니다.
- INSTANCE_TYPE_LIST: AWS EC2 인스턴스 유형의 쉼표로 구분된 목록입니다. 노드 풀은 이러한 인스턴스 유형으로 스팟 인스턴스를 프로비저닝합니다. 인스턴스 유형의 CPU 아키텍처, CPU 수, 메모리 양이 동일해야 합니다. 예: 'c6g.large,c6gd.large,c6gn.large,c7g.large,t4g.medium'. Amazon EC2 인스턴스 선택기 도구를 사용하면 CPU 및 메모리 구성이 동일한 인스턴스 유형을 찾을 수 있습니다.
ROOT_VOLUME_SIZE
: 각 노드의 루트 볼륨에 원하는 크기(Gb)NODEPOOL_PROFILE
: 노드 풀 VM의 IAM 인스턴스 프로필NODE_VERSION
: 노드 풀의 각 노드에 설치할 Kubernetes 버전(예: "1.31.6-gke.200")MIN_NODES
: 노드 풀에 포함할 수 있는 최소 노드 수MAX_NODES
: 노드 풀에 포함할 수 있는 최대 노드 수MAX_PODS_PER_NODE
: 풀의 단일 노드에 생성할 수 있는 최대 포드 수GOOGLE_CLOUD_LOCATION
: 이 노드 풀이 관리될 Google Cloud위치의 이름NODEPOOL_SUBNET
: 노드 풀이 실행될 서브넷의 ID입니다.- 클러스터의 포드/서비스 IP 범위와 노드 풀 서브넷 네트워크 간에는 겹치지 않아야 합니다. 클러스터의 포드 및 서비스 IP 범위 선택에 대한 자세한 내용은 클러스터의 CIDR 범위 선택을 참조하세요.
- 이 서브넷이 VPC 기본 CIDR 블록 외부에 있으면 몇 가지 추가 단계가 필요합니다. 자세한 내용은 보안 그룹을 참조하세요.
SSH_KEY_PAIR_NAME
: SSH 액세스를 위해 생성된 AWS SSH 키 쌍의 이름입니다(선택사항).CONFIG_KMS_KEY_ARN
: 사용자 데이터를 암호화하는 AWS KMS 키의 Amazon 리소스 이름(ARN)입니다.
INSTANCE_TYPE_LIST 필드에 여러 인스턴스 유형을 나열하는 것이 좋습니다. 이 권장사항이 중요한 이유는, 노드 풀이 단일 인스턴스 유형으로만 구성되면 원하는 가용성 영역에서 해당 인스턴스 유형을 사용할 수 없는 경우 노드 풀이 새 노드를 프로비저닝할 수 없기 때문입니다. 이로 인해 애플리케이션의 가용성이 저하되고 서비스 중단이 발생할 수 있습니다.
spot-instance-types
필드는 instance-type
필드와 상호 배타적입니다. 즉, 이러한 필드 중 하나만 제공할 수 있습니다.