컨테이너의 쓰기 가능한 cgroup 구성

Google Kubernetes Engine (GKE) 워크로드는 Linux cgroups API를 사용하여 하위 프로세스의 CPU 및 메모리와 같은 리소스를 관리할 수 있습니다. 이 문서에서는 권한이 있는 모드에서 컨테이너를 실행하지 않고도 컨테이너에 cgroups API에 대한 읽기/쓰기 액세스 권한을 제공하는 방법을 보여줍니다.

쓰기 가능한 cgroups를 사용해야 하는 경우

기본적으로 Kubernetes는 각 컨테이너에 /sys/fs/cgroup 파일 시스템을 마운트하여 모든 Linux 컨테이너에 cgroups API에 대한 읽기 전용 액세스 권한을 제공합니다. 선택적으로 GKE가 특정 포드에서 이 파일 시스템을 읽기/쓰기 모드로 마운트하여 루트 프로세스가 하위 프로세스의 리소스를 관리하고 제한하도록 할 수 있습니다.

이러한 쓰기 가능한 cgroups는 동일한 컨테이너에서 시스템 프로세스와 사용자 코드를 실행하는 Ray와 같은 애플리케이션의 안정성을 개선하는 데 도움이 됩니다. /sys/fs/cgroup 파일 시스템에 쓰기하여 Ray는 중요한 프로세스를 위해 컨테이너 리소스의 일부를 예약할 수 있습니다. 쓰기 가능한 cgroups를 사용하면 컨테이너에 권한이 있는 모드를 사용하는 보안 위험 없이 이러한 애플리케이션의 안정성을 개선할 수 있습니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

노드에 쓰기 가능한 cgroups 사용 설정

containerd 구성을 맞춤설정하여 노드 풀에서 쓰기 가능한 cgroups를 사용 설정합니다. 이 구성은 전체 클러스터 또는 Standard 클러스터의 특정 노드 풀에 적용할 수 있습니다.

containerd 구성 파일에서 writableCgroups 섹션을 추가하고 enabled 필드를 true로 설정합니다. 자세한 내용은 GKE 노드에서 containerd 구성 맞춤설정을 참조하세요.

writableCgroups:
  enabled: true

클러스터 또는 노드 풀을 만들거나 업데이트할 때 업데이트된 구성 파일을 지정합니다.

워크로드에서 쓰기 가능한 cgroups 사용

클러스터 또는 노드 풀에 쓰기 가능한 cgroups를 사용 설정한 후 다음 요구사항을 모두 충족하도록 워크로드를 구성합니다.

이러한 요구사항을 구성하려면 다음 단계를 따르세요.

  1. 쓰기 가능한 cgroups가 사용 설정된 노드를 선택하려면 포드 사양의 spec.nodeSelector 필드에 node.gke.io/enable-writable-cgroups: "true" 라벨을 추가합니다.

    node.gke.io/enable-writable-cgroups: "true"
    
  2. 워크로드에 쓰기 가능한 cgroups를 사용 설정하려면 포드 사양의 metadata.annotations 필드에 다음 라벨 중 하나를 추가합니다.

    • 전체 포드에 사용 설정:

      node.gke.io/enable-writable-cgroups: "true"
      
    • 포드의 특정 컨테이너에 사용 설정:

      node.gke.io/enable-writable-cgroups.CONTAINER_NAME: "true"
      

      CONTAINER_NAME을 컨테이너 이름으로 바꿉니다.

  3. 포드의 보장된 QoS 클래스를 구성하려면 다음 예와 같이 포드의 모든 컨테이너 또는 전체 포드에 동일한 CPU 및 메모리 요청과 한도를 지정합니다.

    resources:
      requests:
        cpu: "100m"
        memory: "100Mi"
      limits:
        cpu: "100m"
        memory: "100Mi"
    

    포드의 컨테이너 중 하나에만 쓰기 가능한 cgroups를 사용 설정하더라도 모든 컨테이너에 동일한 요청과 한도를 지정해야 합니다.

최종 포드 사양은 다음 예와 비슷해야 합니다.

  • 이 예에서는 포드의 모든 컨테이너에 쓰기 가능한 cgroups를 사용 설정합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: writable-cgroups-pod
      annotations:
        node.gke.io/enable-writable-cgroups: "true"
    spec:
      nodeSelector:
        node.gke.io/enable-writable-cgroups: "true"
      containers:
      - name: container
        image: busybox:stable
        command: ["/bin/sh", "-c"]
        args:
        -   |
          trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM
          echo "Waiting for termination signal..."
          while true; do sleep 1; done
      resources:
        requests:
          cpu: "100m"
          memory: "100Mi"
        limits:
          cpu: "100m"
          memory: "100Mi"
    
  • 이 예에서는 다중 컨테이너 포드의 특정 컨테이너에 쓰기 가능한 cgroups를 사용 설정합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: writable-cgroups-per-container
      annotations:
        node.gke.io/enable-writable-cgroups.busybox-container: "true"
    spec:
      nodeSelector:
        node.gke.io/enable-writable-cgroups: "true"
      containers:
      - name: busybox-container
        image: busybox:stable
        command: ["/bin/sh", "-c"]
        args:
        -   |
          trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM
          echo "Waiting for termination signal..."
          while true; do sleep 1; done
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
          limits:
            cpu: "100m"
            memory: "100Mi"
      - name: container-disabled
        image: busybox:stable
        command: ["/bin/sh", "-c"]
        args:
        -   |
          trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM
          echo "Waiting for termination signal..."
          while true; do sleep 1; done
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
          limits:
            cpu: "100m"
            memory: "100Mi"
    

cgroup 파일 시스템이 쓰기 가능한지 확인

포드 또는 컨테이너의 /sys/fs/cgroup 파일 시스템에 대한 권한을 확인하려면 다음 단계를 따르세요.

  1. 확인하려는 포드를 식별합니다. 워크로드에서 쓰기 가능한 cgroups 사용 섹션의 샘플 포드 중 하나를 사용할 수 있습니다.
  2. 포드에서 셸 세션을 만듭니다.

    kubectl exec -it POD_NAME -- /bin/sh
    

    POD_NAME을 포드의 이름으로 바꿉니다.

  3. 마운트된 cgroup 파일 시스템을 설명합니다.

    mount | grep cgroup
    

    출력은 다음과 비슷합니다.

    cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)
    

    이 출력에서 rw는 파일 시스템이 쓰기 가능함을 나타냅니다. 출력에 ro가 표시되면 파일 시스템은 읽기 전용입니다.

다음 단계