AKS(Azure Kubernetes Service) Virtual Nodes v2 사용(미리 보기)

가상 노드 v2는 ACI(Azure Container Instances)에서 서버리스 컴퓨팅에서 Pod를 실행하여 AKS를 VM 기반 노드 이상으로 확장하는 향상된 가상 노드 스택입니다. 워크로드는 새 노드가 프로비전될 때까지 기다리지 않고 몇 초 만에 ACI로 버스트되며, Pod가 실행되는 동안 사용하는 컴퓨팅에 대해서만 비용을 지불합니다. 가상 노드 v2는 AKS 클러스터 확장으로 제공됩니다.

Important

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

Supported

  • Init 컨테이너
  • 호스트 별칭
  • 컨테이너 수명 주기 후크(postStart 및 preStop)
  • 인수가 있는 kubectl exec
  • 영구 볼륨 및 PVC(Azure Files만 해당)
  • VNet 피어링
  • NSG 제어 송신
  • 송신을 위한 NAT Gateway
  • 기밀 컨테이너
  • 가상 노드당 최대 200개의 Pod

Limitations

다음 기능은 지원되지 않습니다.

  • Windows 컨테이너
  • DaemonSets
  • 포트 포워딩
  • IPv6
  • API 서버 권한 있는 IP 범위
  • Azure CNI 오버레이
  • 네트워크 정책으로 Cilium 또는 NPM
  • 사용자 고유(BYO)의 가상 네트워크 가져오기
  • 클러스터당 여러 확장 인스턴스
  • 대기 풀

리소스 가용성 및 할당량 제한

가상 노드 v2는 Azure Container Instances가 VNet SKU를 지원하는 모든 Azure 퍼블릭 클라우드 지역에서 사용할 수 있습니다. 자세한 내용은 ACI에 대한 리소스 가용성 및 할당량 제한을 참조하세요.

Prerequisites

  • 노드 서브넷 모드의 CNI Azure
  • 네트워크 정책으로 Calico 또는 없음
  • 워크로드 ID 활성화
  • VM 크기가 4+ vCPU이고 메모리가 16GiB인 노드 풀이 하나 이상 있습니다. 각 가상 노드는 클러스터의 AKS 노드에 약 3개의 vCPU와 12GiB의 메모리를 예약하므로 노드에 충분한 리소스가 있는지 확인합니다.
  • k8s-extension 버전 1.8 이상
  • kubectl 1.30 이상

ACI 리소스 공급자를 등록합니다.

az provider register --namespace Microsoft.ContainerInstance

Note

확장 사용 프로세스의 모든 단계에서 오류가 발생하는 경우 다음 명령을 실행합니다.

az provider register --namespace Microsoft.KubernetesConfig

가상 노드 v2 사용

확장을 설치합니다.

az k8s-extension create \
    --name <extension-name> \
    --extension-type Microsoft.virtualnodes \
    --cluster-name <cluster-name> \
    --resource-group <resource-group> \
    --cluster-type managedClusters \
    --configuration-settings replicaCount=1   # specifies number of virtual nodes - optional

확장 프로그램 설정 구성

만들기 및 업데이트 작업은 다음 구성 설정을 지원합니다.

구성 설정 Description
replicaCount 가상 노드 수입니다.
admissionControllerReplicaCount 허용 컨트롤러 Pod 수입니다.
podAnnotations 키-값 맵으로 인프라 Pod에 추가된 주석입니다.
nodeSelector 인프라 및 허용 컨트롤러 Pod를 호스트하는 AKS 노드를 선택하는 레이블입니다.
tolerations 인프라 및 허용 컨트롤러 Pod에 적용되는 허용입니다.
affinity 필요한 AKS 선호도 규칙과 병합된 추가 선호도 설정입니다.
zones Pod가 배포되는 세미콜론으로 구분된 가용성 영역입니다.
nodeLabels 쉼표로 구분된 쌍으로 가상 노드에 추가된 key=value 레이블입니다.

허용되는 kubernetes.io 레이블은 다음과 같습니다.

  • beta.kubernetes.io/arch
  • beta.kubernetes.io/instance-type
  • beta.kubernetes.io/os
  • failure-domain.beta.kubernetes.io/region
  • failure-domain.beta.kubernetes.io/zone
  • kubernetes.io/arch
  • kubernetes.io/hostname
  • kubernetes.io/os
  • node.kubernetes.io/instance-type
  • topology.kubernetes.io/region
  • topology.kubernetes.io/zone

확장을 확인합니다.

az k8s-extension show \
    --name <extension-name> \
    --cluster-type managedClusters \
    --cluster-name <cluster-name> \
    --resource-group <resource-group>

provisioningState이 Succeeded인지 확인합니다. 몇 분 동안은 Pending 상태를 유지할 수 있습니다.

vn-system 네임스페이스에서 확장 Pod가 실행되고 있는지 확인합니다.

kubectl get pods --namespace vn-system

확장 업데이트

az k8s-extension update --name <extension-name> --cluster-name <aks-cluster-name> --resource-group <aks-resource-group> --cluster-type managedClusters

Note

--auto-upgrade-mode 매개 변수는 none, patch 또는 compatible를 지원합니다. --version를 사용하여 특정 확장 버전을 고정하려면 --auto-upgrade-mode를 none로 설정합니다.

Azure Container Registry 액세스

ACR(프라이빗 Azure Container Registry)에서 이미지를 끌어오려면 확장 관리 ID 또는 Kubernetes 이미지 끌어오기 비밀을 사용합니다.

확장 관리 ID 사용

확장에 대해 생성된 관리 ID에 AcrPull 역할을 부여합니다. 이 역할은 확장의 가상 노드에서 실행되는 모든 Pod에게 추가 Pod 구성 없이 레지스트리에서 이미지를 끌어올 수 있는 액세스 권한을 부여합니다. 레지스트리에서 역할 할당을 생성할 권한이 있어야 합니다.

확장 관리 ID의 보안 주체 ID를 가져옵니다.

$extensionPrincipalId = az k8s-extension show --name <extension-name> --cluster-name <aks-cluster-name> --resource-group <aks-resource-group> --cluster-type managedClusters --query aksAssignedIdentity.principalId --output tsv

컨테이너 레지스트리의 리소스 ID를 가져옵니다.

$acrId = az acr show --name <acr-name> --resource-group <acr-resource-group> --query id --output tsv

AcrPull 레지스트리 범위에서 확장 관리 ID에 역할을 할당합니다.

az role assignment create --assignee-object-id $extensionPrincipalId --assignee-principal-type ServicePrincipal --role AcrPull --scope $acrId

레지스트리에서 이미지를 끌어오는 워크로드를 배포하기 전에 역할 할당이 전파되기까지 몇 분 정도 기다립니다.

이미지 끌어오기 비밀 사용

자세한 내용은 ACR 인증에 대한 Kubernetes 끌어오기 비밀을 참조하십시오.

Virtual Nodes v2에 워크로드 배포

virtualization: virtualnode2 노드 선택기 및 virtual-kubelet.io/provider 톨러레이션을 사용하여 가상 노드에서 Pod를 예약합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name: hello
          image: mcr.microsoft.com/azuredocs/aci-helloworld
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: "1"
              memory: 1Gi
      nodeSelector:
        virtualization: virtualnode2
        kubernetes.io/os: linux
      tolerations:
        - key: virtual-kubelet.io/provider
          operator: Exists
          effect: NoSchedule

매니페스트를 demo.yaml로 저장한 다음 적용합니다.

kubectl apply -f demo.yaml

Pod가 실행 중인지 확인합니다.

kubectl get pods -l app=demo -o wide

가상 노드 v2 사용 안 함

Warning

가상 노드 확장을 사용하지 않도록 설정하면 AKS 클러스터가 지원 Azure Container Instances 컨테이너 그룹에서 연결을 끊습니다. 계속 실행되고 요금이 발생하는 분리된 인스턴스를 방지하려면 확장을 사용하지 않도록 설정하기 전에 가상 노드에서 실행되는 워크로드를 삭제합니다.

확장을 삭제하고 가상 노드 리소스를 정리합니다.

az k8s-extension delete \
    --name <extension-name> \
    --cluster-name <cluster-name> \
    --resource-group <resource-group> \
    --cluster-type managedClusters
kubectl delete node <virtual-node-name>

다음 단계