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 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
- 버전 1.34.1-gke.2541000 이상을 실행하는 Autopilot 또는 Standard 클러스터가 있는지 확인합니다. 새 클러스터를 만들려면 Autopilot 클러스터 만들기를 참조하세요.
- 클러스터가 cgroup v2를 사용하는지 확인합니다. 자세한 내용은 노드를 Linux cgroup v2로 마이그레이션을 참고하세요.
노드에 쓰기 가능한 cgroup 사용 설정
containerd 구성을 맞춤설정하여 노드 풀에서 쓰기 가능한 cgroup을 사용 설정합니다. 이 구성을 전체 클러스터 또는 Standard 클러스터의 특정 노드 풀에 적용할 수 있습니다.
containerd 구성 파일에서 writableCgroups 섹션을 추가하고 enabled 필드를 true로 설정합니다. 자세한 내용은 GKE 노드에서 containerd 구성 맞춤설정을 참고하세요.
writableCgroups:
enabled: true
클러스터 또는 노드 풀을 만들거나 업데이트할 때 업데이트된 구성 파일을 지정합니다.
워크로드에서 쓰기 가능한 cgroup 사용
클러스터 또는 노드 풀에 쓰기 가능한 cgroup을 사용 설정한 후 다음 요구사항을 모두 충족하도록 워크로드를 구성합니다.
- 쓰기 가능한 cgroup이 사용 설정된 노드를 선택합니다.
- 포드에서 하나 이상의 컨테이너에 쓰기 가능한 cgroup을 사용 설정합니다.
다음 조건 중 하나를 충족하여 보장된 서비스 품질 (QoS) 클래스를 사용합니다.
- 포드 수준에서 리소스를 지정하는 워크로드의 경우 포드 사양에서
resources.requests및resources.limits의 값을 동일하게 설정합니다. - 각 컨테이너의 리소스를 지정하는 워크로드의 경우 init 컨테이너를 포함하여 포드의 모든 컨테이너 사양에서
resources.requests및resources.limits의 값을 동일하게 설정합니다.
- 포드 수준에서 리소스를 지정하는 워크로드의 경우 포드 사양에서
이러한 요구사항을 구성하려면 다음 단계를 따르세요.
쓰기 가능한 cgroup이 사용 설정된 노드를 선택하려면 포드 사양의
spec.nodeSelector필드에node.gke.io/enable-writable-cgroups: "true"라벨을 추가합니다.node.gke.io/enable-writable-cgroups: "true"워크로드에 쓰기 가능한 cgroup을 사용 설정하려면 포드 사양의
metadata.annotations필드에 다음 라벨 중 하나를 추가하세요.전체 포드에 사용 설정:
node.gke.io/enable-writable-cgroups: "true"포드의 특정 컨테이너에 사용 설정:
node.gke.io/enable-writable-cgroups.CONTAINER_NAME: "true"CONTAINER_NAME을 컨테이너 이름으로 바꿉니다.
포드에 대해 보장된 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 파일 시스템에 대한 권한을 확인하려면 다음 단계를 따르세요.
- 확인하려는 포드를 식별합니다. 워크로드에서 쓰기 가능한 cgroup 사용 섹션의 샘플 포드 중 하나를 사용할 수 있습니다.
포드에서 셸 세션을 만듭니다.
kubectl exec -it POD_NAME -- /bin/shPOD_NAME을 포드의 이름으로 바꿉니다.마운트된 cgroup 파일 시스템을 설명합니다.
mount | grep cgroup출력은 다음과 비슷합니다.
cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)이 출력에서
rw는 파일 시스템이 쓰기 가능임을 나타냅니다. 출력에ro가 표시되면 파일 시스템이 읽기 전용입니다.