Share via


AKS(Azure Kubernetes Service)에서 인스턴스 수준 공용 IP 사용

AKS 노드는 통신에 사용할 고유한 공용 IP 주소가 필요하지 않습니다. 그러나 시나리오에 따라 고유의 전용 공용 IP 주소를 수신하기 위해 노드 풀의 노드가 필요할 수 있습니다. 홉을 최소화하기 위해 콘솔에서 클라우드 가상 머신에 직접 연결해야 하는 게임 워크로드가 대표적인 시나리오입니다. 이 시나리오는 AKS에서 노드 공용 IP를 사용하여 구현할 수 있습니다.

먼저, 새로운 리소스 그룹을 만듭니다.

az group create --name myResourceGroup2 --location eastus

새 AKS 클러스터를 만들고 노드의 공용 IP를 연결합니다. 노드 풀의 각 노드는 고유한 공용 IP를 수신합니다. Virtual Machine Scale Set 인스턴스를 살펴보면 이를 확인할 수 있습니다.

az aks create --resource-group MyResourceGroup2 --name MyManagedCluster --location eastus  --enable-node-public-ip

기존 AKS 클러스터의 경우 새 노드 풀을 추가하고 노드의 공용 IP를 연결할 수도 있습니다.

az aks nodepool add --resource-group MyResourceGroup2 --cluster-name MyManagedCluster --name nodepool2 --enable-node-public-ip

공용 IP 접두사 사용

공용 IP 접두사를 사용하면 여러 가지 이점이 있습니다. AKS에서는 새 클러스터를 만들거나 노드 풀을 추가할 때 node-public-ip-prefix 플래그를 사용하여 리소스 ID를 전달하면 노드에 기존 공용 IP 접두사의 주소를 사용할 수 있습니다.

먼저 az network public-ip prefix create를 사용하여 공용 IP 접두사를 만듭니다.

az network public-ip prefix create --length 28 --location eastus --name MyPublicIPPrefix --resource-group MyResourceGroup3

출력을 확인하고 접두사의 id를 적어 둡니다.

{
  ...
  "id": "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix",
  ...
}

마지막으로 새 클러스터를 만들거나 새 노드 풀을 추가할 때 node-public-ip-prefix 플래그를 사용하고 접두사의 리소스 ID를 전달합니다.

az aks create --resource-group MyResourceGroup3 --name MyManagedCluster --location eastus --enable-node-public-ip --node-public-ip-prefix /subscriptions/<subscription-id>/resourcegroups/MyResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix

노드의 공용 IP 찾기

다음과 같은 다양한 방법으로 노드의 공용 IP를 찾을 수 있습니다.

Important

노드 리소스 그룹에는 노드 및 노드의 공용 IP가 포함됩니다. 노드의 공용 IP를 찾는 명령을 실행할 때 노드 리소스 그룹을 사용합니다.

az vmss list-instance-public-ips --resource-group MC_MyResourceGroup2_MyManagedCluster_eastus --name YourVirtualMachineScaleSetName

노드 공용 IP에서 공용 IP 태그 사용

공용 IP 태그를 노드 공용 IP에서 활용하여 Azure 라우팅 기본 설정 기능을 활용할 수 있습니다.

요구 사항

  • AKS 버전 1.24 이상이 필요합니다.

라우팅 기본 설정 인터넷을 사용하여 새 클러스터 만들기

az aks create --name <clusterName> --location <location> --resource-group <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

라우팅 기본 설정 인터넷을 사용하여 노드 풀 추가

az aks nodepool add --cluster-name <clusterName> --name <nodepoolName> --location <location> --resource-group <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

호스트 포트 연결 허용 및 애플리케이션 보안 그룹에 노드 풀 추가

호스트 주소에서 서비스를 호스트하는 노드 공용 IP를 활용하는 AKS 노드에서는 트래픽을 허용하도록 NSG 규칙을 추가해야 합니다. 노드 풀 구성에 원하는 포트를 추가하면 클러스터 네트워크 보안 그룹에 적절한 허용 규칙이 만들어집니다.

사용자 가상 네트워크를 사용하는 클러스터가 포함된 서브넷에 네트워크 보안 그룹이 있는 경우, 해당 네트워크 보안 그룹에 허용 규칙을 추가해야 합니다. ASG(애플리케이션 보안 그룹)에 노드 풀을 추가하여 지정된 노드 풀의 노드로 제한할 수 있습니다. 허용되는 호스트 포트가 지정된 경우, 관리되는 ASG가 관리되는 리소스 그룹에 기본적으로 만들어집니다. 또한 노드 풀 매개 변수에서 NSG의 리소스 ID를 지정하여 하나 이상의 사용자 지정 ASG에 노드를 추가할 수 있습니다.

호스트 포트 사양 형식

허용할 포트 목록을 지정할 때에는 port/protocol 또는 startPort-endPort/protocol 형식의 항목과 함께 쉼표로 구분된 목록을 사용합니다.

예:

  • 80/tcp
  • 80/tcp, 443/tcp
  • 53/udp, 80/tcp
  • 50,000~60,000/tcp

요구 사항

  • AKS 버전 1.24 이상이 필요합니다.

허용되는 포트와 애플리케이션 보안 그룹을 사용하여 새 클러스터 만들기

az aks create \
  --resource-group <resourceGroup> \
  --name <clusterName> \
  --nodepool-name <nodepoolName> \
  --nodepool-allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp\
  --nodepool-asg-ids "<asgId>,<asgId>"

허용되는 포트와 애플리케이션 보안 그룹을 사용하여 새 노드 풀 추가

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --name <nodepoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

노드 풀에 허용되는 포트 및 애플리케이션 보안 그룹 업데이트

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --name <nodepoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

Pod 워크로드용 호스트 포트 자동 할당(미리 보기)

노드에 공용 IP가 구성되어 있으면 호스트 포트를 활용하여 부하 분산 장치 서비스를 구성하지 않고도 Pod에서 트래픽을 직접 수신하도록 할 수 있습니다. 이는 잘 알려진 호스트 이름의 매치메이커 서비스에서 연결 시 사용하기에 알맞은 호스트와 포트를 제공할 수 있기 때문에 노드 IP 및 포트의 임시 특성이 문제가 되지 않는 게임과 같은 시나리오에서 특히 유용합니다. 그러나 동일한 포트에서 호스트의 한 프로세스만 수신 대기할 수 있어 호스트 포트가 있는 애플리케이션을 사용하면 예약에 문제가 발생할 수 있습니다. 이 문제를 방지하기 위해 AKS는 시스템이 예약 시간에 사용 가능한 포트를 동적으로 할당하여 충돌을 방지하는 기능을 제공합니다.

Warning

Pod 호스트 포트 트래픽은 클러스터에 있는 기본 NSG 규칙에 의해 차단됩니다. 이 기능은 트래픽의 흐름을 허용하기 위해 노드 풀의 호스트 풀을 허용하는 기능과 결합해야 합니다.

Important

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

요구 사항

  • AKS 버전 1.24 이상이 필요합니다.

'PodHostPortAutoAssignPreview' 기능 플래그 등록

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

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

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

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

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

az provider register --namespace Microsoft.ContainerService

Pod에 호스트 포트 자동 할당

호스트 포트 자동 할당 트리거는 호스트 포트 없이 워크로드를 배포하고, 호스트 포트 할당이 필요한 포트 목록과 함께 kubernetes.azure.com/assign-hostports-for-containerports 주석을 적용하여 수행됩니다. 주석의 값은 port/protocol과 같이 쉼표로 구분된 항목 목록으로 지정해야 합니다. 여기서 포트는 Pod 사양에 정의된 개별 포트 번호이고, 프로토콜은 tcp 또는 udp입니다.

포트는 40000-59999 범위에서 할당되며 클러스터 전체에서 고유합니다. 애플리케이션이 할당된 포트를 확인할 수 있도록 할당된 포트도 Pod 내 환경 변수에 추가됩니다. 환경 변수의 이름 형식은 다음(아래 예제) <deployment name>_PORT_<port number>_<protocol>_HOSTPORT와 같으므로, 예를 들면 mydeployment_PORT_8080_TCP_HOSTPORT: 41932가 됩니다.

다음은 echoserver 배포 예제로, 포트 8080, 8443의 호스트 포트 매핑을 보여 줍니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver-hostport
  labels:
    app: echoserver-hostport
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echoserver-hostport
  template:
    metadata:
      annotations:
        kubernetes.azure.com/assign-hostports-for-containerports: 8080/tcp,8443/tcp
      labels:
        app: echoserver-hostport
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: echoserver-hostport
          image: k8s.gcr.io/echoserver:1.10
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            - name: https
              containerPort: 8443
              protocol: TCP

배포가 적용되면 hostPort 항목이 개별 Pod의 YAML에 포함됩니다.

$ kubectl describe pod echoserver-hostport-75dc8d8855-4gjfc
<cut for brevity>
Containers:
  echoserver-hostport:
    Container ID:   containerd://d0b75198afe0612091f412ee7cf7473f26c80660143a96b459b3e699ebaee54c
    Image:          k8s.gcr.io/echoserver:1.10
    Image ID:       k8s.gcr.io/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229                                                                                                      Ports:          8080/TCP, 8443/TCP
    Host Ports:     46645/TCP, 49482/TCP
    State:          Running
      Started:      Thu, 12 Jan 2023 18:02:50 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      echoserver-hostport_PORT_8443_TCP_HOSTPORT:  49482
      echoserver-hostport_PORT_8080_TCP_HOSTPORT:  46645

다음 단계