AKS(Azure Kubernetes Service)에서 Pod 샌드박싱(미리 보기)
신뢰할 수 없거나 잠재적 악성 코드로부터 컨테이너 워크로드를 안전하게 보호하기 위해 현재 AKS에는 Pod 샌드박싱(미리 보기)이라는 메커니즘이 포함되어 있습니다. Pod 샌드박싱은 컨테이너 애플리케이션과 컨테이너 호스트의 공유 커널 및 컴퓨팅 리소스 간에 격리 경계를 제공합니다. 예로 CPU와 메모리, 네트워킹을 들 수 있습니다. Pod 샌드박싱은 전체 아키텍처에서 다른 보안 조치 또는 데이터 보호 제어를 보완하여 중요한 정보를 보호하기 위한 규정, 산업 또는 거버넌스 규정 준수 요구 사항을 충족하는 데 도움을 줍니다.
이 문서는 이 새로운 기능과 그 구현 방법을 이해하는 데 도움이 됩니다.
필수 조건
Azure CLI 버전 2.44.1 이상.
az --version
을 실행하여 버전을 찾고az upgrade
를 실행하여 버전을 업그레이드합니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.aks-preview
Azure CLI 확장 버전 0.5.123 이상.Azure 구독에
KataVMIsolationPreview
기능을 등록합니다.AKS는 모든 AKS 네트워크 플러그 인을 통해 버전 1.24.0 이상에서 Pod 샌드박싱(미리 보기)을 지원합니다.
Kubernetes 클러스터를 관리하려면 Kubernetes 명령줄 클라이언트인 kubectl을 사용합니다. Azure Cloud Shell은
kubectl
과 함께 제공됩니다. az aks install-cli 명령을 사용하여 kubectl을 로컬로 설치할 수 있습니다.
aks-preview Azure CLI 확장 설치
Important
AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.
aks-preview 확장을 설치하려면 다음 명령을 실행합니다.
az extension add --name aks-preview
다음 명령을 실행하여 릴리스된 확장의 최신 버전으로 업데이트합니다.
az extension update --name aks-preview
KataVMIsolationPreview 기능 플래그 등록
다음 예제와 같이 az feature register 명령을 사용하여 KataVMIsolationPreview
기능 플래그를 등록합니다.
az feature register --namespace "Microsoft.ContainerService" --name "KataVMIsolationPreview"
상태가 Registered로 표시되는 데 몇 분 정도 걸립니다. az feature show 명령을 사용하여 등록 상태를 확인합니다.
az feature show --namespace "Microsoft.ContainerService" --name "KataVMIsolationPreview"
상태가 등록됨으로 표시되면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 새로 고칩니다.
az provider register --namespace "Microsoft.ContainerService"
제한 사항
이 Pod 샌드박싱(미리 보기)의 제약 조건은 다음과 같습니다.
Kata 컨테이너는 기존 컨테이너가 Azure Files 고성능 로컬 SSD에 도달할 수 있는 IOPS 성능 제한에 도달하지 못할 수도 있습니다.
컨테이너용 Microsoft Defender는 Kata 런타임 Pod 평가를 지원하지 않습니다.
Kata 호스트 네트워크는 지원되지 않습니다.
AKS는 이 미리 보기 릴리스에서 Container Storage Interface 드라이버와 비밀 저장소 드라이버를 지원하지 않습니다.
작동 방식
AKS에서 이 기능을 구현하기 위해 AKS 스택용 Azure Linux 컨테이너 호스트에서 실행되는 Kata 컨테이너는 하드웨어 적용 격리를 제공합니다. Pod 샌드박싱은 각 Kata Pod에 적합한 별도의 커널과 같은 하드웨어 격리의 이점을 확장해 줍니다. 하드웨어 격리는 각 Pod에 리소스를 할당하고 동일한 호스트에서 실행되는 다른 Kata 컨테이너 또는 네임스페이스 컨테이너와 이를 공유하지 않습니다.
솔루션 아키텍처는 다음 구성 요소를 기반으로 합니다.
- AKS용 Azure Linux 컨테이너 호스트
- Microsoft Hyper-V 하이퍼바이저
- Azure 튜닝 Dom0 Linux 커널
- 오픈 소스 클라우드 하이퍼바이저 VMM(Virtual Machine Monitor)
- Kata Container Framework와의 통합
Kata 컨테이너를 사용하여 Pod 샌드박싱을 배포하는 과정은 컨테이너를 배포하는 표준 컨테이너 워크플로와 유사합니다. 배포에는 Pod 템플릿에서 정의할 수 있는 kata-runtime 옵션이 포함됩니다.
이 기능을 Pod와 함께 사용하는 경우 유일한 차이점은 runtimeClassName kata-mshv-vm-isolation을 Pod 사양에 추가하는 것뿐입니다.
Pod에서 kata-mshv-vm-isolation runtimeClass를 사용할 때 컨테이너를 호스트하는 Pod 샌드박스 역할을 하는 VM을 만듭니다. VM의 기본 메모리는 2GB이고, 컨테이너 리소스 매니페스트(containers[].resources.limits
)에서 CPU와 메모리에 제한을 지정하지 않는 경우 기본 CPU는 1코어입니다. 컨테이너 리소스 매니페스트에서 CPU 또는 메모리에 제한을 지정하면 VM에 1 + xCPU를 사용할 수 있는 1
인수와 containers[].resources.limits.cpu
가 포함되고, 2GB + yMemory를 지정할 수 있는 2
인수와 containers[].resources.limits.memory
가 포함됩니다. 컨테이너는 컨테이너 한도 내에서만 CPU와 메모리를 사용할 수 있습니다. CPU와 메모리 오버헤드를 줄이기 위해 작업하는 동안 이 미리 보기에서는 containers[].resources.requests
가 무시됩니다.
새 클러스터 배포
Azure CLI를 사용하여 Azure Linux AKS 클러스터를 배포하려면 다음 단계를 수행합니다.
az aks create 명령을 사용하고 다음 매개 변수를 지정하여 AKS 클러스터를 만듭니다.
- --workload-runtime: KataMshvVmIsolation을 지정하여 노드 풀에서 Pod 샌드박싱 기능을 사용합니다. 이 매개 변수를 사용하면 다른 매개 변수에서 다음 요구 사항을 충족해야 합니다. 그렇지 않으면 명령이 실패하고 해당 매개 변수에 문제가 보고됩니다.
- --os-sku: AzureLinux. 이 미리 보기 릴리스에서는 Azure Linux os-sku만 이 기능을 지원합니다.
- --node-vm-size: 2세대 VM이고 중첩된 가상화 작업을 지원하는 모든 Azure VM 크기입니다. 예로 Dsv3 VM을 들 수 있습니다.
다음 예에서는 myResourceGroup에 하나의 노드가 있는 myAKSCluster라는 클러스터를 만듭니다.
az aks create --name myAKSCluster \ --resource-group myResourceGroup \ --os-sku AzureLinux \ --workload-runtime KataMshvVmIsolation \ --node-vm-size Standard_D4s_v3 \ --node-count 1 \ --generate-ssh-keys
다음 명령을 실행하여 Kubernetes 클러스터에 대한 액세스 자격 증명을 가져옵니다. az aks get-credentials 명령을 사용하고 클러스터 이름과 리소스 그룹 이름의 값을 바꿉니다.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
kubectl get pods 명령을 사용하여 모든 네임스페이스에 Pod를 전부 나열합니다.
kubectl get pods --all-namespaces
기존 클러스터에 배포
기존 AKS 클러스터에서 이 기능을 사용하려면 다음 요구 사항을 충족해야 합니다.
- 단계에 따라 KataVMIsolationPreview 기능 플래그를 등록합니다.
- 클러스터가 Kubernetes 버전 1.24.0 이상을 실행하고 있는지 확인합니다.
다음 명령을 사용하여 호스트할 노드 풀을 만들어 Pod 샌드박싱(미리 보기)을 사용합니다.
az aks nodepool add 명령을 사용하여 AKS 클러스터에 노드 풀을 추가합니다. 다음 매개 변수를 지정합니다.
- --resource-group: AKS 클러스터를 만들 기존 리소스 그룹의 이름을 입력합니다.
- --cluster-name: AKS 클러스터의 고유한 이름(예: myAKSCluster)을 입력합니다.
- --name: 클러스터 노드 풀의 고유한 이름(예: nodepool2)을 입력합니다.
- --workload-runtime: KataMshvVmIsolation을 지정하여 노드 풀에서 Pod 샌드박싱 기능을 사용합니다.
--workload-runtime
매개 변수와 함께 이러한 다른 매개 변수는 다음 요구 사항을 충족해야 합니다. 그렇지 않으면 명령이 실패하고 해당 매개 변수에 문제가 보고됩니다.- --os-sku: AzureLinux. 미리 보기 릴리스에서는 Azure Linux os-sku만 이 기능을 지원합니다.
- --node-vm-size: 2세대 VM이고 중첩된 가상화 작업을 지원하는 모든 Azure VM 크기입니다. 예로 Dsv3 VM을 들 수 있습니다.
다음 예제에서는 myResourceGroup의 nodepool2에 노드가 한 개 있는 myAKSCluster에 노드 풀을 추가합니다.
az aks nodepool add --cluster-name myAKSCluster --resource-group myResourceGroup --name nodepool2 --os-sku AzureLinux --workload-runtime KataMshvVmIsolation --node-vm-size Standard_D4s_v3
az aks update 명령을 실행하여 클러스터에서 Pod 샌드박싱(미리 보기)을 사용합니다.
az aks update --name myAKSCluster --resource-group myResourceGroup
신뢰할 수 있는 애플리케이션 배포
AKS 클러스터의 공유 커널에 신뢰할 수 있는 애플리케이션을 배포하는 방법을 보여 주려면 다음 단계를 수행합니다.
trusted-app.yaml이라는 파일을 만들어 신뢰할 수 있는 Pod를 설명한 후 다음 매니페스트를 붙여넣습니다.
kind: Pod apiVersion: v1 metadata: name: trusted spec: containers: - name: trusted image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11 command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
kubectl apply 명령을 실행하여 Kubernetes Pod를 배포하고 trusted-app.yaml 파일을 지정합니다.
kubectl apply -f trusted-app.yaml
명령의 출력은 다음 예제와 유사합니다.
pod/trusted created
신뢰할 수 없는 애플리케이션 배포
신뢰할 수 없는 애플리케이션을 AKS 클러스터의 Pod 샌드박스에 배포하는 방법을 보여 주려면 다음 단계를 수행합니다.
untrusted-app.yaml이라는 파일을 만들어 신뢰할 수 없는 Pod를 설명한 후 다음 매니페스트를 붙여넣습니다.
kind: Pod apiVersion: v1 metadata: name: untrusted spec: runtimeClassName: kata-mshv-vm-isolation containers: - name: untrusted image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11 command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
runtimeClassNameSpec 값은
kata-mhsv-vm-isolation
입니다.kubectl apply 명령을 실행하여 Kubernetes Pod를 배포하고 untrusted-app.yaml 파일을 지정합니다.
kubectl apply -f untrusted-app.yaml
명령의 출력은 다음 예제와 유사합니다.
pod/untrusted created
커널 격리 구성 확인
AKS 클러스터 내의 컨테이너에 액세스하려면 kubectl exec 명령을 실행하여 셸 세션을 시작합니다. 이 예제에서는 신뢰할 수 없는 Pod 내의 컨테이너에 액세스합니다.
kubectl exec -it untrusted -- /bin/bash
Kubectl은 클러스터에 연결되고, 신뢰할 수 없는 Pod 내의 첫 번째 컨테이너 안에서
/bin/sh
를 실행하며, 터미널의 입력/출력 스트림을 컨테이너의 프로세스로 전달합니다. 신뢰할 수 있는 Pod를 호스트하는 컨테이너에 대한 셸 세션도 시작할 수 있습니다.신뢰할 수 없는 Pod의 컨테이너에 대한 셸 세션을 시작한 후 명령을 실행하여 신뢰할 수 없는 컨테이너가 Pod 샌드박스에서 실행되고 있는지 확인할 수 있습니다. 샌드박스 외부의 신뢰할 수 있는 컨테이너와 비교해 보면 다른 커널 버전이 있음을 알 수 있습니다.
커널 버전을 보려면 다음 명령을 실행합니다.
uname -r
다음 예제는 Pod 샌드박스 커널의 출력과 유사합니다.
root@untrusted:/# uname -r 5.15.48.1-8.cm2
신뢰할 수 있는 Pod의 컨테이너에 대한 셸 세션을 시작하여 커널 출력을 확인합니다.
kubectl exec -it trusted -- /bin/bash
커널 버전을 보려면 다음 명령을 실행합니다.
uname -r
다음 예제는 Pod 샌드박스 내에서 실행되는 신뢰할 수 없는 Pod와 다른 커널인 신뢰할 수 있는 Pod를 실행하는 VM의 출력과 유사합니다.
5.15.80.mshv2-hvl1.m2
정리
이 기능 평가를 마쳤으면 Azure 요금이 청구되지 않도록 불필요한 리소스를 정리합니다. 평가 또는 테스트의 일부로 새 클러스터를 배포한 경우 az aks delete 명령을 사용하여 클러스터를 삭제할 수 있습니다.
az aks delete --resource-group myResourceGroup --name myAKSCluster
기존 클러스터에서 Pod 샌드박싱(미리 보기)을 사용하는 경우 kubectl delete Pod 명령을 사용하여 Pod를 제거할 수 있습니다.
kubectl delete pod pod-name
다음 단계
하드웨어 격리를 사용하고 Azure 플랫폼 유지 관리 이벤트를 제어하기 위한 AKS 클러스터가 있는 노드용 Azure Dedicated Host에 대해 자세히 알아봅니다.
Azure Kubernetes Service