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

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

쓰기 가능한 cgroup을 사용해야 하는 경우

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

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

시작하기 전에

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

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

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

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

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

writableCgroups:
  enabled: true

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

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

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

  • 쓰기 가능한 cgroup이 사용 설정된 노드를 선택합니다.
  • 포드에서 하나 이상의 컨테이너에 쓰기 가능한 cgroup을 사용 설정합니다.
  • 다음 조건 중 하나를 충족하여 보장된 서비스 품질 (QoS) 클래스를 사용합니다.

    • 포드 수준에서 리소스를 지정하는 워크로드의 경우 포드 사양에서 resources.requestsresources.limits의 값을 동일하게 설정합니다.
    • 각 컨테이너의 리소스를 지정하는 워크로드의 경우 init 컨테이너를 포함하여 포드의 모든 컨테이너 사양에서 resources.requestsresources.limits의 값을 동일하게 설정합니다.

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

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

    node.gke.io/enable-writable-cgroups: "true"
    
  2. 워크로드에 쓰기 가능한 cgroup을 사용 설정하려면 포드 사양의 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"
    

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

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

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

    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"
    
  • 이 예시에서는 다중 컨테이너 포드에서 특정 컨테이너의 쓰기 가능한 cgroup을 사용 설정합니다.

    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. 확인하려는 포드를 식별합니다. 워크로드에서 쓰기 가능한 cgroup 사용 섹션의 샘플 포드 중 하나를 사용할 수 있습니다.
  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가 표시되면 파일 시스템이 읽기 전용입니다.

다음 단계