다음을 통해 공유


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 샌드박싱(미리 보기)의 제약 조건은 다음과 같습니다.

작동 방식

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

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

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 클러스터를 배포하려면 다음 단계를 수행합니다.

  1. 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
    
  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: 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을 들 수 있습니다.

    다음 예제에서는 myResourceGroupnodepool2에 노드가 한 개 있는 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. 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입니다.

  2. kubectl apply 명령을 실행하여 Kubernetes Pod를 배포하고 untrusted-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 Host에 대해 자세히 알아봅니다.