노드 시스템 구성 맞춤설정


이 문서에서는 노드 시스템 구성이라는 구성 파일을 사용하여 Google Kubernetes Engine(GKE) 노드 구성을 맞춤설정하는 방법을 보여줍니다.

개요

다양한 방법을 사용해서 노드 구성을 맞춤설정할 수 있습니다. 예를 들어 노드 풀을 만들 때 머신 유형 및 최소 CPU 플랫폼과 같은 매개변수를 지정할 수 있습니다.

노드 시스템 구성은 시스템 설정의 제한된 집합을 조정하는 방법을 제공하는 구성 파일입니다. 노드 시스템 구성을 사용하여 Kubernetes 노드 에이전트(kubelet) 및 노드 풀의 하위 수준 Linux 커널 구성(sysctl)의 커스텀 설정을 지정할 수 있습니다.

런타임 구성 파일이라는 다른 파일을 사용하여 GKE 노드에서 containerd 컨테이너 런타임을 맞춤설정할 수도 있습니다. 자세한 내용은 GKE 노드에서 containerd 구성 맞춤설정을 참조하세요.

또한 다음 방법을 사용하여 추가 맞춤설정을 지정할 수 있습니다.

노드 시스템 구성 사용

노드 시스템 구성을 사용하려면 다음 안내를 따르세요.

  1. 구성 파일을 만듭니다. 이 파일에는 kubeletsysctl 구성이 포함되어 있습니다.
  2. 클러스터를 만들 때 또는 노드 풀을 만들거나 업데이트할 때 구성을 추가합니다.

구성 파일 만들기

YAML로 노드 시스템 구성 파일을 작성합니다. 다음 예시는 kubeletsysctl 옵션에 대해 구성을 추가하는 방법을 보여줍니다.

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 \
    --system-config-from-file=SYSTEM_CONFIG_PATH

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터의 이름입니다.
  • SYSTEM_CONFIG_PATH: kubeletsysctl 구성이 포함된 파일의 경로입니다.

노드 시스템 구성을 적용한 후 클러스터의 기본 노드 풀에 정의된 설정이 사용됩니다.

노드 풀 만들기

gcloud container node-pools create POOL_NAME \
     --cluster CLUSTER_NAME \
     --system-config-from-file=SYSTEM_CONFIG_PATH

다음을 바꿉니다.

  • POOL_NAME: 노드 풀의 이름입니다.
  • CLUSTER_NAME: 노드 풀을 추가하려는 클러스터의 이름입니다.
  • SYSTEM_CONFIG_PATH: kubeletsysctl 구성이 포함된 파일의 경로입니다.

노드 풀 업데이트

gcloud container node-pools update POOL_NAME \
    --cluster=CLUSTER_NAME \
    --system-config-from-file=SYSTEM_CONFIG_PATH

다음을 바꿉니다.

  • POOL_NAME: 업데이트하려는 노드 풀의 이름입니다.
  • CLUSTER_NAME: 업데이트하려는 클러스터의 이름입니다.
  • SYSTEM_CONFIG_PATH: kubeletsysctl 구성이 포함된 파일의 경로입니다.

노드 시스템 구성 수정

노드 시스템 구성을 수정하려면 원하는 구성을 사용하여 새 노드 풀을 만들거나 기존 노드 풀의 노드 시스템 구성을 업데이트하면 됩니다.

노드 풀을 만들어 수정

노드 풀을 만들어서 노드 시스템 구성을 수정하려면 다음 안내를 따르세요.

  1. 원하는 구성을 사용하여 구성 파일을 만듭니다.
  2. 새 노드 풀에 구성을 추가합니다.
  3. 워크로드를 새 노드 풀로 마이그레이션합니다.
  4. 이전 노드 풀을 삭제합니다.

기존 노드 풀을 업데이트하여 수정

기존 노드 풀을 업데이트하여 노드 시스템 구성을 수정하려면 원하는 값을 사용하여 노드 시스템 구성을 업데이트합니다. 노드 시스템 구성을 업데이트하면 노드 풀의 시스템 구성이 새 구성으로 재정의됩니다. 업데이트 중 매개변수를 생략하면 해당 기본값으로 설정됩니다.

노드 시스템 구성을 다시 기본값으로 재설정하려면 kubeletsysctl에 빈 값을 사용해서 구성 파일을 업데이트합니다. 예를 들면 다음과 같습니다.

kubeletConfig: {}
linuxConfig:
  sysctl: {}

노드 시스템 구성 삭제

노드 시스템 구성을 삭제하려면 다음 안내를 따르세요.

  1. 노드 풀을 만듭니다.
  2. 워크로드를 새 노드 풀로 마이그레이션합니다.
  3. 이전 노드 시스템 구성이 있는 노드 풀을 삭제합니다.

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 제한 동작을 조정할 수 있습니다.
podPidsLimit 값은 1024에서 4194304 사이여야 합니다. none 이 설정은 각 포드가 사용할 수 있는 최대 프로세스 ID(PID) 수를 설정합니다.

Sysctl 구성 옵션

시스템 성능을 조정하려면 다음 커널 속성을 수정하면 됩니다.

다른 Linux 네임스페이스는 지정된 sysctl에 대해 고유 값을 가질 수 있으며, 다른 것들은 전체 노드에 대해 전역적입니다. 노드 시스템 구성을 사용하여 sysctl 옵션을 업데이트하면 노드 및 각 네임스페이스에서 sysctl이 전역적으로 적용되도록 보장하여, 각 포드가 각 Linux 네임스페이스에서 동일한 sysctl 값을 갖게 합니다.

Linux cgroup 모드 구성 옵션

kubelet 및 컨테이너 런타임은 포드에서 각 컨테이너가 액세스할 수 있는 CPU 또는 메모리 양을 제한하는 것과 같은 리소스 관리를 위해 Linux 커널 cgroups를 사용합니다. 커널에는 cgroupv1cgroupv2의 두 가지 cgroup 하위 시스템 버전이 있습니다. cgroupv2에 대한 Kubernetes 지원은 Kubernetes 버전 1.18에서 알파, 1.22에서 베타, 1.25에서 GA로 도입되었습니다. 자세한 내용은 Kubernetes cgroups v2 문서를 참조하세요.

노드 시스템 구성에 따라 노드 풀의 cgroup 구성을 맞춤설정할 수 있습니다. cgroupv1 또는 cgroupv2를 사용할 수 있습니다. GKE는 버전 1.26 이상을 실행하는 새 노드 풀에 cgroupv2를 사용하고 1.26 이전 버전에 cgroupv1을 사용합니다.

노드 시스템 구성을 사용하여 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 구성을 확인하려면 노드를 선택하고 다음 안내에 따라 연결합니다.

  1. 노드 풀의 모든 노드를 사용하여 대화형 셸을 만듭니다. 명령어의 mynode을 노드 풀의 노드 이름으로 바꿉니다.
  2. Linux 노드에서 cgroup 버전 식별합니다.

다음 단계