AKS(Azure Kubernetes Service)를 사용한 Pod 샌드박싱(미리 보기)

신뢰할 수 없거나 잠재적으로 악성 코드로부터 컨테이너 워크로드를 보호하고 보호하기 위해 AKS에는 이제 Pod 샌드박싱(미리 보기)이라는 메커니즘이 포함되어 있습니다. Pod Sandboxing은 컨테이너 애플리케이션과 컨테이너 호스트의 공유 커널 및 컴퓨팅 리소스 간에 격리 경계를 제공합니다. 예를 들어 CPU, 메모리 및 네트워킹입니다. Pod Sandboxing은 중요한 정보를 보호하기 위한 규제, 산업 또는 거버넌스 규정 준수 요구 사항을 충족하는 데 도움이 되도록 전반적인 아키텍처를 통해 다른 보안 조치 또는 데이터 보호 제어를 보완합니다.

이 문서는 이 새로운 기능과 이를 구현하는 방법을 이해하는 데 도움이 됩니다.

필수 조건

  • Azure CLI 버전 2.44.1 이상. az --version을 실행하여 버전을 찾고 az upgrade를 실행하여 버전을 업그레이드합니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

  • aks-preview Azure CLI 확장 버전 0.5.123 이상.

  • KataVMIsolationPreview Azure 구독에 기능을 등록합니다.

  • AKS는 모든 AKS 네트워크 플러그 인을 사용하여 버전 1.24.0 이상에서 Pod 샌드박싱(미리 보기)을 지원합니다.

  • Kubernetes 클러스터를 관리하려면 Kubernetes 명령줄 클라이언트 kubectl을 사용합니다. Azure Cloud Shell은 함께 kubectl제공됩니다. az aks install-cli 명령을 사용하여 kubectl을 로컬로 설치할 수 있습니다.

aks-preview Azure CLI 확장 설치

Important

AKS 미리 보기 기능은 셀프 서비스에서 옵트인(opt-in)으로 사용할 수 있습니다. 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.

aks-preview 확장을 설치하려면 다음 명령을 실행합니다.

az extension add --name aks-preview

다음 명령을 실행하여 릴리스된 확장의 최신 버전으로 업데이트합니다.

az extension update --name aks-preview

KataVMIsolationPreview 기능 플래그 등록

KataVMIsolationPreview 다음 예제와 같이 az feature register 명령을 사용하여 기능 플래그를 등록합니다.

az feature register --namespace "Microsoft.ContainerService" --name "KataVMIsolationPreview"

상태 등록됨을 표시하는 데 몇 분 정도 걸립니다. az feature show 명령을 사용하여 등록 상태 확인합니다.

az feature show --namespace "Microsoft.ContainerService" --name "KataVMIsolationPreview"

상태 Registered가 반영되면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록새로 고칩니다.

az provider register --namespace "Microsoft.ContainerService"

제한 사항

다음은 이 Pod 샌드박싱 미리 보기(미리 보기)의 제약 조건입니다.

  • Kata 컨테이너는 기존 컨테이너가 Azure Files 및 고성능 로컬 SSD에서 도달할 수 있는 IOPS 성능 제한에 도달하지 못할 수 있습니다.

  • 컨테이너 용 Microsoft Defender는 Kata 런타임 Pod 평가를 지원하지 않습니다.

  • Kata 호스트 네트워크는 지원되지 않습니다.

  • AKS는 이 미리 보기 릴리스에서 컨테이너 스토리지 인터페이스 드라이버비밀 저장소 CSI 드라이버를 지원하지 않습니다.

작동 방법

AKS에서 이 기능을 구현하기 위해 AKS 스택용 Azure Linux 컨테이너 호스트에서 실행되는 Kata Containers 는 하드웨어 적용 격리를 제공합니다. Pod 샌드박싱은 각 Kata Pod에 대해 별도의 커널과 같은 하드웨어 격리의 이점을 확장합니다. 하드웨어 격리는 각 Pod에 대한 리소스를 할당하고 동일한 호스트에서 실행되는 다른 Kata 컨테이너 또는 네임스페이스 컨테이너와 공유하지 않습니다.

솔루션 아키텍처는 다음 구성 요소를 기반으로 합니다.

Kata 컨테이너를 사용하여 Pod 샌드박싱을 배포하는 것은 컨테이너를 배포하는 표준 컨테이너 워크플로와 유사합니다. 배포에는 Pod 템플릿에서 정의할 수 있는 kata-runtime 옵션이 포함됩니다.

이 기능을 Pod와 함께 사용하려면 Pod 사양에 runtimeClassName kata-mshv-vm-isolation을 추가하는 것이 유일한 차이점입니다.

Pod가 kata-mshv-vm-isolation runtimeClass를 사용하는 경우 컨테이너를 호스트하는 Pod 샌드박스 역할을 하는 VM을 만듭니다. 컨테이너 리소스 매니페스트(containers[].resources.limits)가 CPU 및 메모리에 대한 제한을 지정하지 않으면 VM의 기본 메모리는 2GB이고 기본 CPU는 하나의 코어입니다. 컨테이너 리소스 매니페스트에서 CPU 또는 메모리에 대한 제한을 지정하면 VM에는 containers[].resources.limits.cpu1 하나 이상의 xCPU를 사용하는 인수와 containers[].resources.limits.memory2 2GB + yMemory를 지정하는 인수가 있습니다. 컨테이너는 컨테이너의 제한에 CPU 및 메모리만 사용할 수 있습니다. containers[].resources.requests CPU 및 메모리 오버헤드를 줄이기 위해 작업하는 동안 이 미리 보기에서는 무시됩니다.

새 클러스터 배포

Azure CLI를 사용하여 Azure Linux AKS 클러스터를 배포하려면 다음 단계를 수행합니다.

  1. az aks create 명령을 사용하여 AKS 클러스터를 만들고 다음 매개 변수를 지정합니다.

    • --workload-runtime: 노드 풀에서 Pod 샌드박싱 기능을 사용하도록 설정하려면 KataMshvVmIsolation을 지정합니다. 이 매개 변수를 사용하면 이러한 다른 매개 변수가 다음 요구 사항을 충족해야 합니다. 그렇지 않으면 명령이 실패하고 해당 매개 변수와 관련된 문제를 보고합니다.
    • --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
    
  2. 다음 명령을 실행하여 Kubernetes 클러스터에 대한 액세스 자격 증명을 가져옵니다. az aks get-credentials 명령을 사용하고 클러스터 이름과 리소스 그룹 이름의 값을 바꿉니다.

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. kubectl get Pods 명령을 사용하여 모든 네임스페이스의 모든 Pod를 나열합니다 .

    kubectl get pods --all-namespaces
    

기존 클러스터에 배포

기존 AKS 클러스터에서 이 기능을 사용하려면 다음 요구 사항을 충족해야 합니다.

  • 단계에 따라 KataVMIsolationPreview 기능 플래그를 등록합니다.
  • 클러스터가 Kubernetes 버전 1.24.0 이상을 실행하고 있는지 확인합니다.

다음 명령을 사용하여 호스트할 노드 풀을 만들어 Pod 샌드박싱(미리 보기)을 사용하도록 설정합니다.

  1. az aks nodepool add 명령을 사용하여 AKS 클러스터에 노드 풀을 추가 합니다. 다음 매개 변수를 지정합니다.

    • --resource-group: AKS 클러스터를 만들 기존 리소스 그룹의 이름을 입력합니다.
    • --cluster-name: MYAKSCluster와 같은 AKS 클러스터의 고유한 이름을 입력합니다.
    • --name: nodepool2와 같은 클러스터 노드 풀의 고유한 이름을 입력합니다.
    • --workload-runtime: 노드 풀에서 Pod 샌드박싱 기능을 사용하도록 설정하려면 KataMshvVmIsolation을 지정합니다. 매개 변수와 --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
    
  2. az aks update 명령을 실행하여 클러스터에서 Pod 샌드박싱(미리 보기)을 사용하도록 설정합니다.

    az aks update --name myAKSCluster --resource-group myResourceGroup
    

신뢰할 수 있는 애플리케이션 배포

AKS 클러스터의 공유 커널에 신뢰할 수 있는 애플리케이션을 배포하는 방법을 보여 주려면 다음 단계를 수행합니다.

  1. 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"]
    
  2. kubectl apply 명령을 실행하여 Kubernetes Pod를 배포하고 trusted-app.yaml 파일을 지정합니다.

    kubectl apply -f trusted-app.yaml
    

    명령의 출력은 다음 예제와 유사합니다.

    pod/trusted created
    

신뢰할 수 없는 애플리케이션 배포

AKS 클러스터의 Pod 샌드박스에 신뢰할 수 없는 애플리케이션을 배포하는 방법을 보여 주려면 다음 단계를 수행합니다.

  1. 신뢰할 수 없는 Pod를 설명하는 untrusted-app.yaml이라는 파일을 만든 다음, 다음 매니페스트를 붙여넣습니다.

    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.

  2. kubectl apply 명령을 실행하여 Kubernetes Pod를 배포하고 신뢰할 수 없는 app.yaml 파일을 지정합니다.

    kubectl apply -f untrusted-app.yaml
    

    명령의 출력은 다음 예제와 유사합니다.

    pod/untrusted created
    

커널 격리 구성 확인

  1. AKS 클러스터 내의 컨테이너에 액세스하려면 kubectl exec 명령을 실행하여 셸 세션을 시작합니다. 이 예제에서는 신뢰할 수 없는 Pod 내의 컨테이너에 액세스합니다.

    kubectl exec -it untrusted -- /bin/bash
    

    Kubectl은 클러스터에 연결하고, 신뢰할 수 없는 Pod 내의 첫 번째 컨테이너 내에서 실행 /bin/sh 되며, 터미널의 입력 및 출력 스트림을 컨테이너의 프로세스로 전달합니다. 신뢰할 수 있는 Pod를 호스팅하는 컨테이너에 대한 셸 세션을 시작할 수도 있습니다.

  2. 신뢰할 수 없는 Pod의 컨테이너에 대한 셸 세션을 시작한 후 명령을 실행하여 신뢰할 수 없는 컨테이너가 Pod 샌드박스에서 실행되고 있는지 확인할 수 있습니다. 샌드박스 외부의 신뢰할 수 있는 컨테이너와는 다른 커널 버전이 있음을 알 수 있습니다.

    커널 버전을 보려면 다음 명령을 실행합니다.

    uname -r
    

    다음 예제는 Pod 샌드박스 커널의 출력과 유사합니다.

    root@untrusted:/# uname -r
    5.15.48.1-8.cm2
    
  3. 신뢰할 수 있는 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 호스트에 대해 자세히 알아봅니다.