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을 사용 설정합니다.
containerd 구성 파일에서 writableCgroups 섹션을 추가하고 enabled 필드를 true로 설정합니다. 자세한 내용은 GKE 노드에서 containerd 구성 맞춤설정을 참고하세요.
writableCgroups:
enabled: true
다음 지원되는 경로 중 하나를 통해 쓰기 가능한 cgroup을 사용 설정할 수 있습니다.
- 새 클러스터 만들기: 새 클러스터를 만들 때
--containerd-config-from-file플래그를 사용하여 구성 파일을 지정합니다 (gcloud container clusters create또는gcloud container clusters create-auto명령어 사용). - 기존 클러스터 업데이트: 클러스터 수준 노드 기본값을 업데이트할 때
--containerd-config-from-file플래그를 사용하여 구성 파일을 지정합니다 (gcloud container clusters update명령어 사용). 클러스터 수준 노드 기본값을 업데이트해도 기존 노드에는 영향을 미치지 않습니다. Standard 클러스터에서는 기존 노드 풀을 업그레이드 (--node-pool플래그와 함께gcloud container clusters upgrade명령어 사용)하거나 다시 만들어 구성을 선택해야 합니다. - 새 노드 풀 만들기: 표준 클러스터에서 새 노드 풀을 만들 때 (
gcloud container node-pools create명령어 사용)--containerd-config-from-file플래그를 사용하여 구성 파일을 지정합니다.
워크로드에서 쓰기 가능한 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가 표시되면 파일 시스템이 읽기 전용입니다.