GKE Sandbox를 사용하면 신뢰할 수 없거나 알 수 없는 코드를 실행하는 컨테이너로부터 Google Kubernetes Engine (GKE) 노드의 호스트 커널을 보호할 수 있습니다. 이 문서에서는 보안 전문가에게 GKE Sandbox를 사용 설정하고, 샌드박스에서 포드를 실행하고, 격리를 확인하는 방법을 보여줍니다.
GKE Sandbox에 이미 익숙해야 합니다.
사용 가능한 샌드박스 유형
GKE Sandbox는 다음 샌드박스 유형을 지원하며, 각 유형은 특정 기술을 사용하여 애플리케이션 코드를 호스트 커널에서 분리합니다.
gvisor: 승격된 권한이 필요 없는, Linux 커널 API의 사용자 공간 재구현입니다. 사용자 공간 커널은 호스트 커널을 대신하여 대부분의 시스템 호출을 가로채고 처리하므로 호스트 커널에 대한 직접 액세스가 제한됩니다.microvm: 중첩된 가상화를 사용하여 호스트 VM에 중첩된 경량 VM입니다. 노드의 각 포드는 자체 게스트 커널이 있는 자체 중첩 VM에서 실행됩니다. 코드가 전용 VM에서 실행되므로 이 샌드박스 유형은 gVisor 샌드박스보다 강력한 격리를 제공합니다.
각 샌드박스 유형의 작동 방식과 특정 유형을 사용해야 하는 경우에 대한 자세한 내용은 GKE Sandbox 정보를 참고하세요.
제한사항
GKE Sandbox 및 특정 샌드박스 기술에는 GPU 및 TPU 지원 또는 특정 Linux 및 Kubernetes 기능 지원과 같은 다양한 제한사항이 있습니다. 자세한 내용은 제한사항을 참고하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
- 자동 생성 노드의 샌드박스 유형 선택 섹션의 단계를 따르려면 기존 Autopilot 또는 Standard 클러스터를 사용하세요. 마이크로VM 샌드박스를 사용하려면 노드에서 GKE 버전 1.37.0-gke.4713000 이상을 실행해야 합니다.
자동 생성 노드의 샌드박스 유형 선택
Autopilot 모드 또는 노드 풀 자동 생성과 함께 ComputeClasses를 사용하여 GKE에서 만드는 노드에서 GKE Sandbox를 사용 설정할 수 있습니다. Autopilot 클러스터에서는 gVisor가 기본적으로 지원되므로 ComputeClass에서 샌드박스 구성을 선택적으로 생략할 수 있습니다.
자동 생성 노드에 GKE Sandbox를 구성하려면 다음 단계를 따르세요.
기존 Autopilot 또는 Standard 클러스터에 연결합니다.
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION다음을 바꿉니다.
CLUSTER_NAME: 클러스터 이름입니다.CONTROL_PLANE_LOCATION: 클러스터 컨트롤 플레인의 리전 또는 영역입니다.
원하는 샌드박스 기술에 따라 다음 ComputeClass 매니페스트 중 하나를 저장합니다.
gVisor:
apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: sandbox-gvisor-class spec: priorities: - machineFamily: n4 - machineFamily: c4 nodePoolConfig: sandbox: type: gvisor nodePoolAutoCreation: enabled: true whenUnsatisfiable: DoNotScaleUpmicroVM:
apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: sandbox-microvm-class spec: priorities: - machineFamily: n4 - machineFamily: c4 nodePoolConfig: sandbox: type: microvm priorityDefaults: enableNestedVirtualization: true nodePoolAutoCreation: enabled: true whenUnsatisfiable: DoNotScaleUp마이크로 VM 샌드박스의 ComputeClass는
enableNestedVirtualization필드를 사용하여 중첩된 가상화를 사용 설정합니다. 이 필드는 microVM 샌드박스에 필요합니다. 이 필드를 사용하려면 클러스터에서 버전 1.37.0-gke.4713000 이상을 실행해야 합니다.
이 예시 매니페스트는
nodePoolAutoCreation필드를 사용하여 노드 풀 자동 생성을 사용 설정합니다.autopilot필드를 사용하여 Autopilot 모드에서 포드를 실행하는 ComputeClass에서 샌드박스 구성을 지정할 수도 있습니다. Autopilot 클러스터를 사용하는 경우 GKE는nodePoolAutoCreation및autopilot필드를 모두 무시합니다.ComputeClass를 만듭니다.
kubectl apply -f PATH_TO_COMPUTE_CLASS_MANIFESTPATH_TO_COMPUTE_CLASS_MANIFEST을 ComputeClass 매니페스트의 경로로 바꿉니다.
이 ComputeClass를 선택하고 샌드박스 환경을 요청하려면 포드에 샌드박스 환경 요청을 참고하세요.
노드 풀을 만들 때 샌드박스 유형 선택
Standard 클러스터에서 새 노드 풀을 만들 때 GKE Sandbox를 수동으로 사용 설정할 수 있습니다. GKE Sandbox를 수동으로 사용 설정하는 경우 다음 제한사항이 적용됩니다.
- Standard 클러스터를 만드는 중에 GKE Sandbox를 사용 설정하려면 노드 풀을 하나 이상 추가로 구성해야 합니다. GKE Sandbox를 사용하지 않는 클러스터에 GKE 관리형 시스템 워크로드를 실행하려면 GKE에 노드 풀이 하나 이상 필요하므로 추가 노드 풀이 필요합니다. gcloud CLI를 사용하여 클러스터를 만드는 경우 클러스터를 만든 후 GKE Sandbox를 사용하는 노드 풀을 만들어야 합니다.
- microVM 샌드박스 유형을 선택하려면 gcloud CLI 또는 GKE API를 사용해야 합니다.Google Cloud 콘솔에서는 microVM 샌드박스 유형을 선택할 수 없습니다.
gVisor 샌드박스 유형 사용 설정
새 노드 풀을 만들 때 gVisor 샌드박스를 수동으로 사용 설정하려면 다음 옵션 중 하나를 선택하세요.
콘솔
Google Cloud 콘솔에서 Kubernetes 클러스터 페이지로 이동합니다.
수정할 클러스터의 이름을 클릭합니다. 클러스터 세부정보 페이지가 열립니다.
노드 탭을 클릭합니다.
노드 풀 섹션에서 사용자 관리 노드 풀 추가를 클릭합니다. 노드 풀 추가 페이지가 열립니다.
탐색 메뉴에서 노드를 클릭하고 다음 설정을 구성합니다.
- 이미지 유형 드롭다운 목록에서 Containerd를 포함한 Container-Optimized OS (cos_containerd)를 선택합니다.
- 머신 구성 섹션에서 노드의 머신 시리즈와 머신 유형을 선택합니다.
- 선택사항: 지원되는 GPU 유형 또는 지원되는 TPU 유형을 선택합니다.
탐색 메뉴에서 보안을 클릭합니다. 노드 보안 페이지가 열립니다.
gVisor가 포함된 샌드박스 사용 설정 체크박스를 선택합니다.
만들기를 클릭하여 노드 풀을 만듭니다.
gcloud
샌드박스에 gVisor를 사용하는 노드 풀을 만들려면 다음 명령어를 실행합니다.
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--sandbox=type=gvisor
다음을 바꿉니다.
NODE_POOL_NAME: 노드 풀의 이름입니다.CLUSTER_NAME: 클러스터 이름입니다.CONTROL_PLANE_LOCATION: 클러스터 컨트롤 플레인의 리전 또는 영역입니다.
지원되는 GPU 유형 또는 지원되는 TPU 유형을 사용하는 노드 풀을 만들 때 gVisor 샌드박스를 사용 설정할 수도 있습니다. 자세한 내용은 다음 문서를 참조하세요.
마이크로VM 샌드박스 유형 사용 설정
gcloud CLI 또는 GKE API를 사용하여 노드 풀을 만들 때 마이크로VM 샌드박스 유형을 사용 설정할 수 있습니다. Google Cloud 콘솔은 마이크로 VM 샌드박스 유형을 사용 설정하는 것을 지원하지 않습니다. 마이크로VM 샌드박스를 사용하는 노드 풀을 만들려면 다음 명령어를 실행합니다.
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--sandbox=type=microvm \
--enable-nested-virtualization \
--machine-type=MACHINE_TYPE
다음을 바꿉니다.
NODE_POOL_NAME: 노드 풀의 이름입니다.CLUSTER_NAME: 클러스터 이름입니다.CONTROL_PLANE_LOCATION: 클러스터 컨트롤 플레인의 리전 또는 영역입니다.MACHINE_TYPE: 노드의 머신 유형입니다. 이 값은 중첩 가상화를 지원하는 머신 유형이어야 합니다. 자세한 내용은 머신 시리즈 비교 표의 중첩된 가상화 행을 참조하세요.
모니터링 및 로깅 사용 설정
샌드박스에서 로그 및 측정항목을 수집하고 보려면 클러스터에서 다음 모니터링 가능성 서비스를 사용 설정해야 합니다.
이러한 서비스는 모든 새 GKE 클러스터에서 기본적으로 사용 설정됩니다.
포드에 샌드박스 환경 요청
샌드박스에서 특정 포드를 실행하려면 포드 사양에 gvisor 또는 microvm RuntimeClass를 지정하면 됩니다. GKE는 지정된 샌드박스 유형을 사용하는 노드에서 포드를 예약합니다. Pod 사양에서 샌드박스 유형을 선택하려면 다음 단계를 따르세요.
ComputeClasses를 사용하여 GKE Sandbox를 사용 설정하는지 또는 수동으로 만든 노드 풀을 사용하는지에 따라 다음 예시 배포 매니페스트 중 하나를 저장합니다.
ComputeClasses:
apiVersion: apps/v1 kind: Deployment metadata: name: sandbox-pod labels: environment: sandbox spec: replicas: 2 selector: matchLabels: environment: sandbox template: metadata: labels: environment: sandbox spec: nodeSelector: cloud.google.com/compute-class: COMPUTECLASS_NAME runtimeClassName: SANDBOX_TYPE containers: - name: nginx image: nginx다음을 바꿉니다.
COMPUTECLASS_NAME: 자동 생성 노드의 샌드박스 유형 선택에 설명된 대로 만든 ComputeClass의 이름입니다.SANDBOX_TYPE: 포드에 사용할 샌드박스 유형입니다. 다음과 같은 값이 지원됩니다.gvisormicrovm
지정하는 샌드박스 유형은 선택한 ComputeClass에서 사용 설정하는 샌드박스 유형과 일치해야 합니다.
수동으로 생성된 노드 풀:
apiVersion: apps/v1 kind: Deployment metadata: name: httpd labels: app: httpd spec: replicas: 1 selector: matchLabels: app: httpd template: metadata: labels: app: httpd spec: runtimeClassName: SANDBOX_TYPE containers: - name: httpd image: httpdSANDBOX_TYPE을 샌드박스 유형으로 바꿉니다. 다음 값이 지원됩니다.gvisormicrovm
지정하는 샌드박스 유형은 클러스터에 있는 기존 노드 풀의 샌드박스 유형과 일치해야 합니다.
배포를 만듭니다.
kubectl apply -f PATH_TO_DEPLOYMENT_MANIFESTPATH_TO_DEPLOYMENT_MANIFEST을 배포 매니페스트의 경로로 바꿉니다.포드가 생성되었는지 확인합니다.
kubectl get pods출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE httpd-db5899bc9-dk7lk 1/1 Running 0 24s
runtimeClassName 필드를 사용하여 지원되는 GPU 유형 또는 지원되는 TPU 유형에서 포드를 실행할 때 샌드박스를 요청할 수도 있습니다. 자세한 내용은 다음 문서를 참조하세요.
샌드박스 처리된 포드와 함께 일반 포드 실행
이 섹션의 단계는 Standard 모드 워크로드에 적용됩니다. Autopilot 가격 책정 모델을 사용하면 노드에 예약된 포드 수를 수동으로 최적화할 필요가 없으므로 Autopilot 모드에서 샌드박스 포드와 함께 일반 포드를 실행할 필요가 없습니다.
노드 풀에서 GKE Sandbox를 사용 설정한 후에는 노드 taint 및 내결함성을 사용하여 샌드박스를 사용하지 않고도 이러한 노드에서 신뢰할 수 있는 애플리케이션을 실행할 수 있습니다. 샌드박스 처리된 포드와 구분하기 위해 이러한 포드를 "일반 포드"라고 합니다.
일반 포드는 샌드박스 처리된 포드와 마찬가지로 다른Google Cloud 서비스나 클러스터 메타데이터에 액세스 할 수 없습니다. 이러한 액세스 차단은 노드 구성의 일부입니다. 일반 포드 또는 샌드박스 처리된 포드에서Google Cloud 서비스에 액세스해야 하는 경우 GKE용 워크로드 아이덴티티 제휴를 사용합니다.
GKE Sandbox는 샌드박스 처리된 포드를 실행할 수 있는 노드에 다음 라벨과 taint를 추가합니다.
sandbox.gke.io/runtime: SANDBOX_TYPE노드 라벨입니다.sandbox.gke.io/runtime=SANDBOX_TYPE:NoSchedule노드 taint입니다. 일치하는 톨러레이션(toleration)이 있는 포드만 노드에 예약할 수 있습니다.
RuntimeClass 필드를 사용하여 샌드박스에서 포드를 실행하는 경우 GKE는 노드 어피니티와 톨러레이션(toleration)을 포드에 자동으로 적용합니다. GKE Sandbox를 사용하는 노드에서 일반 포드를 실행하려면 포드 사양에 다음 선택기를 수동으로 적용해야 합니다.
- 필요할 때 GKE Sandbox를 사용하는 노드에서 포드를 실행하려면 노드 taint에 대한 톨러레이션(toleration)만 추가합니다.
- GKE Sandbox를 사용하는 노드에서만 포드를 실행하려면 노드 선택기와 노드 taint에 대한 톨러레이션(toleration)을 추가합니다.
다음 단계에서는 GKE Sandbox를 사용하는 노드에서 일반 포드를 실행하는 방법을 보여줍니다.
다음 배포 매니페스트를
httpd-regular.yaml로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: httpd-regular labels: app: httpd-regular spec: replicas: 1 selector: matchLabels: app: httpd-regular template: metadata: labels: app: httpd-regular spec: containers: - name: httpd-regular image: httpd affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: sandbox.gke.io/runtime operator: In values: - SANDBOX_TYPE tolerations: - effect: NoSchedule key: sandbox.gke.io/runtime operator: Equal value: SANDBOX_TYPESANDBOX_TYPE을 샌드박스 유형(예:gvisor또는microvm)으로 바꿉니다.배포를 만듭니다.
kubectl apply -f httpd-regular.yaml포드를 예약할 수 없는 경우 포드 매니페스트에서 노드 어피니티와 톨러레이션(toleration)이 올바르게 설정되어 있는지 확인합니다.
포드가 샌드박스에 있지 않은지 확인합니다.
kubectl get pods -o jsonpath=$'{range .items[*]}{.metadata.name}: {.spec.runtimeClassName}\n{end}'출력은 다음과 비슷합니다.
httpd-db5899bc9-dk7lk: SANDBOX_TYPE httpd-regular-5bf87996c6-cfmmd:httpd-regular포드에 RuntimeClass 값이 없으므로 포드가 샌드박스에 없습니다.일반 포드가 GKE Sandbox를 사용하는 노드에서 실행 중인지 확인합니다.
kubectl get pod -o jsonpath=$'{range .items[*]}{.metadata.name}: {.spec.nodeName}\n{end}'출력은 다음과 비슷합니다.
httpd-db5899bc9-dk7lk: gke-cluster-2-pool-1-75c8fc63-h373 httpd-regular-5bf87996c6-cfmmd: gke-cluster-2-pool-1-75c8fc63-h373샌드박스 처리된 포드와 일반 포드가 모두 동일한 노드에 있으므로 일반 포드가 GKE Sandbox를 사용하는 노드에서 실행되고 있음을 알 수 있습니다.
샌드박스 구성 확인
다음 섹션에서는 포드가 샌드박스에서 실행 중이고 샌드박스 처리된 포드가 호스트 커널에서 격리되어 있는지 확인하는 방법을 보여줍니다. 이 섹션에서는 포드에 대한 샌드박스 환경 요청에서 예시 배포를 만들었다고 가정합니다.
샌드박스에서 포드가 실행 중인지 확인
포드가 샌드박스를 사용하는지 확인하려면 포드의 RuntimeClass를 가져옵니다. 이 방법은 포드 내부에서 명령어를 실행하는 것보다 더 신뢰할 수 있습니다. 샌드박스 내부의 데이터가 표시되지 않기 때문입니다. 샌드박스 내에서 보고되는 내용은 결함이 있거나 악성일 수 있으므로 신뢰할 수 없습니다.
실행 중인 각 포드의 RuntimeClass를 가져옵니다.
kubectl get pods -l=app=httpd -o jsonpath=$'{range .items[*]}{.metadata.name}: {.spec.runtimeClassName}\n{end}'출력은 다음과 비슷합니다.
httpd-db5899bc9-dk7lk: gvisor httpd-db5899bc9-ab3cd: gvisor출력에
gvisor또는microvm가 표시되면 포드가 샌드박스에서 실행 중인 것입니다.
샌드박스 처리된 포드의 호스트 격리 확인
사용 가능한 가상 기기와 포드가 액세스할 수 있는 커널 버전을 확인하여 샌드박스 포드가 호스트 노드에서 격리되었는지 확인할 수 있습니다.
gVisor 및 microVM 샌드박스의 경우 포드가 액세스할 수 있는 커널 버전이 호스트 노드의 커널 버전과 다른지 확인합니다.
포드가 액세스할 수 있는 커널 버전을 가져옵니다.
kubectl exec POD_NAME -- uname -rPOD_NAME을 포드의 이름으로 바꿉니다.출력은 다음과 비슷합니다.
4.19.0-gvisor호스트 노드의 커널 버전을 가져옵니다.
kubectl get node NODE_NAME \ -o jsonpath='{.status.nodeInfo.kernelVersion}'NODE_NAME을 포드를 실행하는 노드의 이름으로 바꿉니다.출력은 다음과 비슷합니다.
6.12.94+
샌드박스 포드가 액세스할 수 있는 커널 버전은 호스트 노드의 커널 버전과 다릅니다. 포드는 gVisor의 사용자 공간 커널이나 마이크로VM의 게스트 커널만 보기 때문입니다.
microVM 샌드박스의 경우 포드가 액세스할 수 있는 기기가 Cloud Hypervisor에 의해 가상화되었는지도 확인할 수 있습니다.
kubectl exec POD_NAME -- cat /sys/class/dmi/id/product_name출력이
cloud-hypervisor이면 포드가 microVM 샌드박스에 있는 것입니다.
GKE Sandbox 사용 중지
GKE Autopilot 클러스터 또는 GKE Standard 노드 풀에서는 GKE Sandbox를 중지할 수 없습니다. GKE Sandbox 사용을 중지하려면 노드 풀을 삭제합니다.