이 문서에서는 노드 시스템 구성이라는 구성 파일을 사용하여 Google Kubernetes Engine(GKE) 노드 구성을 맞춤설정하는 방법을 보여줍니다.
개요
다양한 방법을 사용해서 노드 구성을 맞춤설정할 수 있습니다. 예를 들어 노드 풀을 만들 때 머신 유형 및 최소 CPU 플랫폼과 같은 매개변수를 지정할 수 있습니다.
노드 시스템 구성은 시스템 설정의 제한된 집합을 조정하는 방법을 제공하는 구성 파일입니다. 노드 시스템 구성을 사용하여 Kubernetes 노드 에이전트(kubelet
) 및 노드 풀의 하위 수준 Linux 커널 구성(sysctl
)의 커스텀 설정을 지정할 수 있습니다.
런타임 구성 파일이라는 다른 파일을 사용하여 GKE 노드에서 containerd 컨테이너 런타임을 맞춤설정할 수도 있습니다. 자세한 내용은 GKE 노드에서 containerd 구성 맞춤설정을 참조하세요.
DaemonSet로 GKE 노드 자동 부트스트랩에서와 같이 DaemonSet를 사용하여 노드를 맞춤설정할 수도 있습니다.
노드 시스템 구성 사용
노드 시스템 구성을 사용하려면 다음 안내를 따르세요.
- 구성 파일을 만듭니다. 이 파일에는
kubelet
및sysctl
구성이 포함되어 있습니다. - 클러스터를 만들 때 또는 노드 풀을 만들거나 업데이트할 때 구성을 추가합니다.
구성 파일 만들기
YAML로 노드 시스템 구성 파일을 작성합니다. 다음 예시는 kubelet
및 sysctl
옵션에 대해 구성을 추가하는 방법을 보여줍니다.
kubeletConfig:
cpuManagerPolicy: static
linuxConfig:
sysctl:
net.core.somaxconn: '2048'
net.ipv4.tcp_rmem: '4096 87380 6291456'
예를 들면 다음과 같습니다.
cpuManagerPolicy: static
은 정적 CPU 관리 정책을 사용하도록kubelet
를 구성합니다.net.core.somaxconn: '2048'
은socket listen()
백로그를 2,048바이트로 제한합니다.net.ipv4.tcp_rmem: '4096 87380 6291456'
은 TCP 소켓의 최솟값, 기본값, 최댓값을 각각 4,096바이트, 87,380바이트, 6,291,456바이트로 설정합니다.
kubelet
또는 sysctl
에 대해서만 구성을 추가하려면 구성 파일에 해당 섹션만 포함합니다. 예를 들어 kubelet
구성을 추가하려면 다음 파일을 만듭니다.
kubeletConfig:
cpuManagerPolicy: static
구성 파일에 추가할 수 있는 필드의 전체 목록은 Kubelet 구성 옵션 및 Sysctl 구성 옵션 섹션을 참조하세요.
노드 풀에 구성 추가
구성 파일을 만든 후 Google Cloud CLI를 사용하여 --system-config-from-file
플래그를 추가합니다. 클러스터를 만들 때 또는 노드 풀을 만들거나 업데이트할 때 이 플래그를 추가할 수 있습니다. Google Cloud Console을 사용해서는 노드 시스템 구성을 추가할 수 없습니다.
노드 시스템 구성을 추가하려면 다음 명령어를 실행합니다.
클러스터 만들기
gcloud container clusters create CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
다음을 바꿉니다.
CLUSTER_NAME
: 클러스터의 이름입니다.LOCATION
: 클러스터의 컴퓨팅 영역 또는 리전SYSTEM_CONFIG_PATH
:kubelet
및sysctl
구성이 포함된 파일의 경로입니다.
노드 시스템 구성을 적용한 후 클러스터의 기본 노드 풀에 정의된 설정이 사용됩니다.
노드 풀 만들기
gcloud container node-pools create POOL_NAME \
--cluster CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
다음을 바꿉니다.
POOL_NAME
: 노드 풀의 이름입니다.CLUSTER_NAME
: 노드 풀을 추가하려는 클러스터의 이름입니다.LOCATION
: 클러스터의 컴퓨팅 영역 또는 리전SYSTEM_CONFIG_PATH
:kubelet
및sysctl
구성이 포함된 파일의 경로입니다.
노드 풀 업데이트
gcloud container node-pools update POOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
다음을 바꿉니다.
POOL_NAME
: 업데이트하려는 노드 풀의 이름입니다.CLUSTER_NAME
: 업데이트하려는 클러스터의 이름입니다.LOCATION
: 클러스터의 컴퓨팅 영역 또는 리전SYSTEM_CONFIG_PATH
:kubelet
및sysctl
구성이 포함된 파일의 경로입니다.
노드 시스템 구성 수정
노드 시스템 구성을 수정하려면 원하는 구성을 사용하여 새 노드 풀을 만들거나 기존 노드 풀의 노드 시스템 구성을 업데이트하면 됩니다.
노드 풀을 만들어 수정
노드 풀을 만들어서 노드 시스템 구성을 수정하려면 다음 안내를 따르세요.
- 원하는 구성을 사용하여 구성 파일을 만듭니다.
- 새 노드 풀에 구성을 추가합니다.
- 워크로드를 새 노드 풀로 마이그레이션합니다.
- 이전 노드 풀을 삭제합니다.
기존 노드 풀을 업데이트하여 수정
기존 노드 풀을 업데이트하여 노드 시스템 구성을 수정하려면 원하는 값을 사용하여 노드 시스템 구성을 업데이트합니다. 노드 시스템 구성을 업데이트하면 노드 풀의 시스템 구성이 새 구성으로 재정의됩니다. 업데이트 중 매개변수를 생략하면 해당 기본값으로 설정됩니다.
노드 시스템 구성을 다시 기본값으로 재설정하려면 kubelet
및 sysctl
에 빈 값을 사용해서 구성 파일을 업데이트합니다. 예를 들면 다음과 같습니다.
kubeletConfig: {}
linuxConfig:
sysctl: {}
노드 시스템 구성 삭제
노드 시스템 구성을 삭제하려면 다음 안내를 따르세요.
- 노드 풀을 만듭니다.
- 워크로드를 새 노드 풀로 마이그레이션합니다.
- 이전 노드 시스템 구성이 있는 노드 풀을 삭제합니다.
Kubelet 구성 옵션
다음 표에서는 수정할 수 있는 kubelet
옵션을 보여줍니다.
Kubelet 구성 설정 | 제한사항 | 기본 설정 | 설명 |
---|---|---|---|
cpuManagerPolicy |
값은 none 또는 static 이어야 합니다.
|
none
|
이 설정은 kubelet의 CPU 관리자 정책을 제어합니다. 기본값은 OS 스케줄러가 자동으로 수행하는 것 이상의 어피니티를 제공하지 않는 기본 CPU 어피니티 스키마인 none 입니다.이 값을 static 으로 설정하면 보장 QoS 클래스에서 정수 CPU 요청을 사용하는 포드에 단독 CPU 사용을 지정할 수 있습니다. |
cpuCFSQuota |
값은 true 또는 false 이어야 합니다.
|
true
|
이 설정은 포드의 CPU 한도를 적용합니다. 이 값을 false 로 설정하면 포드의 CPU 한도가 무시됩니다.포드가 CPU 한도에 민감한 경우 특정 경우에 CPU 한도를 무시하는 것이 좋습니다. cpuCFSQuota 를 사용 중지할 경우 악의적인 포드가 의도한 것보다 더 많은 CPU 리소스를 사용할 수 있습니다.
|
cpuCFSQuotaPeriod | 값은 기간이어야 합니다. |
"100ms"
|
이 설정은 CPU CFS 할당량 기간 값인 cpu.cfs_period_us 를 설정합니다. 이 값은 CPU 리소스에 대한 cgroup의 액세스를 다시 할당해야 하는 빈도에 대한 기간을 지정합니다. 이 옵션을 사용하면 CPU 제한 동작을 조정할 수 있습니다. |
insecureKubeletReadonlyPortEnabled |
값은 불리언 값(true 또는 false )이어야 합니다. |
true |
이 설정은 클러스터의 모든 새 노드 풀에서 비보안 kubelet 읽기 전용 포트 10255 를 사용 중지합니다. 이 파일에서 이 설정을 구성하면 GKE API 클라이언트를 사용하여 클러스터 수준에서 설정을 변경할 수 없습니다. |
podPidsLimit | 값은 1024에서 4194304 사이여야 합니다. |
none
|
이 설정은 각 포드가 사용할 수 있는 최대 프로세스 ID(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
다른 Linux 네임스페이스는 지정된 sysctl
에 대해 고유 값을 가질 수 있으며, 다른 것들은 전체 노드에 대해 전역적입니다. 노드 시스템 구성을 사용하여 sysctl
옵션을 업데이트하면 노드 및 각 네임스페이스에서 sysctl
이 전역적으로 적용되도록 보장하여, 각 포드가 각 Linux 네임스페이스에서 동일한 sysctl
값을 갖게 합니다.
Linux cgroup 모드 구성 옵션
kubelet 및 컨테이너 런타임은 포드에서 각 컨테이너가 액세스할 수 있는 CPU 또는 메모리 양을 제한하는 것과 같은 리소스 관리를 위해 Linux 커널 cgroups를 사용합니다. 커널에는 cgroupv1
및 cgroupv2
의 두 가지 cgroup 하위 시스템 버전이 있습니다.
cgroupv2
에 대한 Kubernetes 지원은 Kubernetes 버전 1.18에서 알파, 1.22에서 베타, 1.25에서 정식 버전으로 도입되었습니다. 자세한 내용은 Kubernetes cgroups v2 문서를 참조하세요.
노드 시스템 구성에 따라 노드 풀의 cgroup 구성을 맞춤설정할 수 있습니다. cgroupv1
또는 cgroupv2
를 사용할 수 있습니다. GKE는 버전 1.26 이상을 실행하는 새 Standard 노드 풀에 cgroupv2
를 사용하고 1.26 이전 버전에 cgroupv1
을 사용합니다. 노드 자동 프로비저닝으로 만든 노드 풀의 경우 cgroup 구성은 노드 풀 버전이 아닌 초기 클러스터 버전에 따라 다릅니다.
노드 시스템 구성을 사용하여 cgroupv1
또는 cgroupv2
를 명시적으로 사용하도록 노드 풀 설정을 변경할 수 있습니다. 기존 노드 풀을 1.26으로 업그레이드해도 설정은 cgroupv2
로 변경되지 않습니다. 맞춤설정된 cgroup 구성이 없는 1.26 이전 버전을 실행하는 기존 노드 풀은 계속 사용되기 때문입니다. 명시적으로 지정하지 않으면 계속 cgroupv1
를 사용합니다.
예를 들어 cgroupv2
를 사용하도록 노드 풀을 구성하려면 다음과 같이 노드 시스템 구성 파일을 사용합니다.
linuxConfig:
cgroupMode: 'CGROUP_MODE_V2'
지원되는 cgroupMode
옵션은 다음과 같습니다.
CGROUP_MODE_V1
: 노드 풀에cgroupv1
을 사용합니다.CGROUP_MODE_V2
: 노드 풀에cgroupv2
을 사용합니다.CGROUP_MODE_UNSPECIFIED
: 기본 GKE cgroup 구성을 사용합니다.
cgroupv2
를 사용하려면 다음 요구사항 및 제한사항이 적용됩니다.
- 1.26 이전 버전을 실행하는 노드 풀의 경우 gcloud CLI 버전 408.0.0 이상을 사용해야 합니다. 또는 395.0.0 이상 버전의 gcloud beta를 사용합니다.
- 클러스터 및 노드 풀에서 GKE 버전 1.24.2-gke.300 이상을 실행해야 합니다.
- Container-Optimized OS를 컨테이너화된 노드 이미지와 함께 사용해야 합니다.
- 워크로드가 cgroup 파일 시스템(
/sys/fs/cgroup/...
) 읽기에 의존할 경우cgroupv2
API와 호환되는지 확인합니다.- 모니터링 또는 타사 도구가
cgroupv2
와 호환되는지 확인합니다.
- 모니터링 또는 타사 도구가
- JDK(Java 워크로드)를 사용하는 경우 JDK
8u372
, JDK 11.0.16 이상, JDK 15 이상을 포함하여 cgroupv2를 완전히 지원하는 버전을 사용하는 것이 좋습니다.
cgroup 구성 확인
노드 시스템 구성을 추가할 때 변경사항을 적용하려면 GKE에서 노드를 다시 만들어야 합니다. 노드 풀에 구성을 추가하고 노드가 다시 생성되면 새 구성을 확인할 수 있습니다.
이 노드 풀에 있는 노드의 cgroup 구성을 확인하려면 노드를 선택하고 다음 안내에 따라 연결합니다.
- 노드 풀의 모든 노드를 사용하여 대화형 셸을 만듭니다. 명령어의
mynode
을 노드 풀의 노드 이름으로 바꿉니다. - Linux 노드에서 cgroup 버전 식별합니다.
Linux Huge Page 구성 옵션
노드 시스템 구성 파일을 사용하여 Linux 커널 기능 Huge Page를 사용할 수 있습니다.
Kubernetes는 노드에서 CPU 또는 메모리와 유사한 리소스 유형으로 Huge Page를 지원합니다. 다음 매개변수를 사용하여 포드가 사용할 Huge Page를 사전 할당하도록 Kubernetes 노드에 지시합니다. 포드의 Huge Page 소비를 관리하려면 HugePages 관리를 참조하세요.
노드에 Huge Page를 사전 할당하려면 양 및 크기를 지정합니다. 예를 들어 1GB 크기의 Huge Page 3개와 2MB 크기의 Huge Page 1,024개를 할당하도록 노드를 구성하려면 다음과 같은 노드 시스템 구성을 사용합니다.
linuxConfig:
hugepageConfig:
hugepage_size2m: 1024
hugepage_size1g: 3
Huge Page를 사용하려면 다음 제한사항 및 요구사항이 적용됩니다.
- 노드가 Huge Page로 완전히 채워지지 않도록 할당된 Huge Page의 전체 크기가 총 메모리의 60%를 초과할 수 없습니다. 예를 들어 메모리가 8GB인 e2-standard-2 머신을 사용하면 Huge Page를 4.8GB 이상 할당할 수 없습니다.
- 1GB 크기의 Huge Page는 A3, C2D, C3, C3A, C3D, C4, CT5E, CT5L, CT5LP, CT6E, H3, M2, M3, Z3 머신 유형에서만 사용 가능합니다.