빠른 시작: Azure CLI를 사용하여 기밀 컴퓨팅 Intel SGX 에이전트 노드가 있는 AKS 클러스터 배포

이 빠른 시작에서는 Azure CLI를 사용하여 Enclave 인식(DCsv2/DCSv3) VM 노드가 있는 AKS(Azure Kubernetes Service) 클러스터를 배포합니다. 그런 다음, enclave에서 간단한 Hello World 애플리케이션을 실행합니다. Azure Portal에서 클러스터를 프로비전하고 기밀 컴퓨팅 노드를 추가할 수도 있지만, 이 빠른 시작에서는 Azure CLI에 대해 집중적으로 설명합니다.

AKS는 개발자 또는 클러스터 운영자가 클러스터를 신속하게 배포 및 관리할 수 있게 해주는 관리되는 Kubernetes 서비스입니다. 자세히 알아보려면 AKS 소개AKS 기밀 노드 개요를 참조하세요.

기밀 컴퓨팅 노드의 기능은 다음과 같습니다.

  • Linux 컨테이너를 지원하는 Linux 작업자 노드
  • Ubuntu 18.04 VM 노드를 사용하는 2세대 VM(가상 머신)
  • EPC(암호화된 페이지 캐시 메모리)를 활용하는 기밀성 보호 enclave에서 컨테이너를 실행하는 데 도움이 되는 Intel SGX 지원 CPU. 자세한 내용은 Azure 기밀 컴퓨팅 FAQ를 참조하세요.
  • 기밀 컴퓨팅 노드에 미리 설치된 Intel SGX DCAP 드라이버. 자세한 내용은 Azure 기밀 컴퓨팅 FAQ를 참조하세요.

참고 항목

DCsv2/DCsv3 VM은 지역 가용성이 적용되는 특수 하드웨어를 사용합니다. 자세한 내용은 사용 가능한 SKU 및 지원되는 지역을 참조하세요.

필수 조건

이 빠른 시작에는 다음이 필요합니다.

  • 구독에서 사용할 수 있는 DCsv2/DCSv3/DCdsv3 코어가 최소 8개 이상이어야 합니다.

    기본적으로 Azure 구독에 대한 Intel SGX VM 크기에 대해 미리 할당된 할당량은 없습니다. 다음 지침에 따라 구독에 대한 VM 코어 할당량을 요청해야 합니다.

enclave 인식 기밀 컴퓨팅 노드 및 Intel SGX 추가 항목을 사용하여 AKS 클러스터 만들기

다음 지침에 따라 Intel SGX 추가 항목이 사용하도록 설정된 AKS 클러스터를 만들고, 클러스터에 노드 풀을 추가하고, hello world enclave 애플리케이션을 사용하여 자신이 만든 항목을 확인합니다.

시스템 노드 풀 및 AKS Intel SGX 추가 항목을 사용하여 AKS 클러스터 만들기

참고 항목

앞서 나열된 필수 조건을 충족하는 AKS 클러스터가 이미 있는 경우 다음 클러스터 섹션으로 건너뛰어 기밀 컴퓨팅 노드 풀을 추가합니다.

Intel SGX AKS 추가 항목 "confcom"은 Pod yaml에 추가된 변경 내용을 방지하기 위해 Intel SGX 디바이스 드라이버를 컨테이너에 노출합니다.

먼저, az group create 명령을 사용하여 클러스터에 대한 리소스 그룹을 만듭니다. 다음 예제에서는 eastus2 지역에 myResourceGroup이라는 리소스 그룹을 만듭니다.

az group create --name myResourceGroup --location eastus2

이제 az aks create 명령을 사용하여 기밀 컴퓨팅 추가 항목이 사용하도록 설정된 AKS 클러스터를 만듭니다.

az aks create -g myResourceGroup --name myAKSCluster --generate-ssh-keys --enable-addons confcom

위의 명령은 기밀이 아닌 컴퓨팅 노드의 시스템 노드 풀이 있는 새 AKS 클러스터를 배포합니다. 시스템 노드 풀에는 기밀 컴퓨팅 Intel SGX 노드를 사용하지 않는 것이 좋습니다.

기밀 컴퓨팅 기능이 있는 사용자 노드 풀을 AKS 클러스터에 추가

다음 명령을 실행하여 세 개의 노드가 있는 Standard_DC4s_v3 크기의 사용자 노드 풀을 AKS 클러스터에 추가합니다. 지원되는 DCsv2/DCsv3 SKU 및 지역 목록에서 더 큰 다른 SKU를 선택할 수 있습니다.

az aks nodepool add --cluster-name myAKSCluster --name confcompool1 --resource-group myResourceGroup --node-vm-size Standard_DC4s_v3 --node-count 2

명령을 실행하면 DCsv3이 있는 새 노드 풀이 기밀 컴퓨팅 추가 항목 DaemonSet(SGX 디바이스 플러그 인)와 함께 표시되어야 합니다.

노드 풀 및 추가 기능 확인

az aks get-credentials 명령을 사용하여 AKS 클러스터의 자격 증명을 가져옵니다.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

kubectl get pods 명령을 사용하여 노드가 제대로 생성되었고 SGX 관련 DaemonSet가 DCsv2 노드 풀에서 실행 중인지 확인합니다.

kubectl get pods --all-namespaces
kube-system     sgx-device-plugin-xxxx     1/1     Running

출력이 이전 코드와 일치하면 이제 AKS 클러스터에서 기밀 애플리케이션을 실행할 준비가 된 것입니다.

이 빠른 시작의 격리된 enclave 애플리케이션에서 Hello World 배포 섹션으로 이동하여 enclave에서 앱을 테스트할 수 있습니다. 또는 다음 지침에 따라 AKS에 노드 풀을 추가합니다. (AKS는 SGX 노드 풀 및 비-SGX 노드 풀 혼합을 지원합니다.)

기존 AKS 클러스터에 기밀 컴퓨팅 노드 풀 추가

이 섹션에서는 이 빠른 시작의 앞부분에 나열된 필수 조건을 충족하는 AKS 클러스터를 이미 실행하고 있다고 가정합니다.

기존 클러스터에서 기밀 컴퓨팅 AKS 추가 기능 사용

다음 명령을 실행하여 기밀 컴퓨팅 추가 기능을 사용하도록 설정합니다.

az aks enable-addons --addons confcom --name MyManagedCluster --resource-group MyResourceGroup

클러스터에 DCsv3 사용자 노드 풀 추가

참고 항목

기밀 컴퓨팅 기능을 사용하려면 기존 AKS 클러스터에 하나 이상의 DCsv2/DCsv3 VM SKU 기반 노드 풀이 있어야 합니다. 기밀 컴퓨팅용 DCs-v2/Dcs-v3 VM SKU에 대한 자세한 내용은 사용 가능한 SKU 및 지원되는 지역을 참조하세요.

다음 명령을 실행하여 노드 풀을 만듭니다.

az aks nodepool add --cluster-name myAKSCluster --name confcompool1 --resource-group myResourceGroup --node-count 2 --node-vm-size Standard_DC4s_v3

이름이 confcompool1인 새 노드 풀이 생성되었는지 확인합니다.

az aks nodepool list --cluster-name myAKSCluster --resource-group myResourceGroup

DaemonSet가 기밀 노드 풀에서 실행되고 있는지 확인

기존 AKS 클러스터에 로그인하여 다음 확인을 수행합니다.

kubectl get nodes

출력에 AKS 클러스터에 새로 추가된 confcompool1 풀이 표시됩니다. 다른 DaemonSet가 표시될 수도 있습니다.

kubectl get pods --all-namespaces
kube-system     sgx-device-plugin-xxxx     1/1     Running

출력이 이전 코드와 일치하면 이제 AKS 클러스터에서 기밀 애플리케이션을 실행할 준비가 된 것입니다.

격리된 enclave 애플리케이션에서 Hello World 배포

이제 테스트 애플리케이션을 배포할 준비가 되었습니다.

hello-world-enclave.yaml이라는 파일을 만들고, 다음 YAML 매니페스트를 붙여넣습니다. Open Enclave 프로젝트에서 이 애플리케이션 예제 코드를 찾을 수 있습니다. 이 배포에서는 사용자가 confcom 추가 항목을 배포했다고 가정합니다.

참고 항목

다음 예제에서는 Docker 허브에서 공용 컨테이너 이미지를 가져옵니다. 익명의 끌어오기 요청을 하는 대신 Docker Hub 계정을 사용하여 인증하도록 끌어오기 비밀을 설정하는 것이 좋습니다. 공용 콘텐츠를 사용할 때 신뢰성을 향상시키려면 개인 Azure Container Registry에서 이미지를 가져오고 관리하세요. 공용 이미지 사용에 대해 자세히 알아봅니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: oe-helloworld
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: oe-helloworld
    spec:
      containers:
      - name: oe-helloworld
        image: mcr.microsoft.com/acc/samples/oe-helloworld:latest
        resources:
          limits:
            sgx.intel.com/epc: "10Mi"
          requests:
            sgx.intel.com/epc: "10Mi"
        volumeMounts:
        - name: var-run-aesmd
          mountPath: /var/run/aesmd
      restartPolicy: "Never"
      volumes:
      - name: var-run-aesmd
        hostPath:
          path: /var/run/aesmd
  backoffLimit: 0

또는 아래와 같이 컨테이너 배포에 대한 노드 풀 선택 배포를 수행할 수도 있습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: oe-helloworld
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: oe-helloworld
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: agentpool
                operator: In
                values:
                - acc # this is the name of your confidential computing nodel pool
                - acc_second # this is the name of your confidential computing nodel pool
      containers:
      - name: oe-helloworld
        image: mcr.microsoft.com/acc/samples/oe-helloworld:latest
        resources:
          limits:
            sgx.intel.com/epc: "10Mi"
          requests:
            sgx.intel.com/epc: "10Mi"
        volumeMounts:
        - name: var-run-aesmd
          mountPath: /var/run/aesmd
      restartPolicy: "Never"
      volumes:
      - name: var-run-aesmd
        hostPath:
          path: /var/run/aesmd
  backoffLimit: 0

이제 다음 예제 출력과 같이 kubectl apply 명령을 사용하여 보안 enclave에서 열 샘플 작업을 만듭니다.

kubectl apply -f hello-world-enclave.yaml
job "oe-helloworld" created

다음 명령을 실행하여 워크로드에서 신뢰할 수 있는 실행 환경(enclave)을 성공적으로 만들었는지 확인할 수 있습니다.

kubectl get jobs -l app=oe-helloworld
NAME       COMPLETIONS   DURATION   AGE
oe-helloworld   1/1           1s         23s
kubectl get pods -l app=oe-helloworld
NAME             READY   STATUS      RESTARTS   AGE
oe-helloworld-rchvg   0/1     Completed   0          25s
kubectl logs -l app=oe-helloworld
Hello world from the enclave
Enclave called into host to print: Hello World!

리소스 정리

이 빠른 시작에서 만든 기밀 컴퓨팅 노드 풀을 제거하려면 다음 명령을 사용합니다.

az aks nodepool delete --cluster-name myAKSCluster --name confcompool1 --resource-group myResourceGroup

AKS 클러스터를 삭제하려면 다음 명령을 사용합니다.

az aks delete --resource-group myResourceGroup --cluster-name myAKSCluster

다음 단계