본문 바로가기

Cloud/AZURE

Azure Kubenetes Service(AKS) : Network Part 1

Today Keys :AKS, network, kubenetes, kubenet, CNI, vnet, cluster, 네트워크, 쿠버네티스, cloud


  Azure의 Managed Kubernetes 서비스인 AKS의 네트워크에 대한 첫 번째 포스팅입니다. 

  2가지 네트워크 모든 Kubenet 네트워킹, Azure CNI 네트워킹과 Load Balancer에 대한 정리입니다.   


 

Kubenet 네트워킹

  ▪  AKS 클러스터에서의 기본 네트워킹 방식
  ▪  Node는 VNet 서브넷 IP를 할당받고, Pod는 별도의 IP Address에서 할당
  ▪  Node만 라우팅이 가능한 대역을 할당받고, Pod는 NAT를 이용해서 외부와 통신
  ▪  IP 주소 공간을 절약
  ▪  Kubernets 내부 또는 외부 부하분산 장치를 사용하여 클러스터 외부에서 Pod에 연결
  ▪  Pod에 대한 네트워크  대역을 Node Subnet의 라우팅 테이블에서 UDR로 관리해야 함. (Dst : Pod 대역 / N.H. : Node IP)
  ▪  Azure CLI로 생성해야 함.

Azure CNI 네트워킹
  ▪  모든 Pod가 VNet 서브넷 IP를 사용
       - VNet에서 필요한 IP 주소 수량이 많기 때문에 IP 관리 필요 
  ▪  AKS에서 사용하는 VNet의  IP address 설계 시, Cluster의 node 수와 함께 실행할 Pod 수를 함께 고려해야 함.
  ▪  AKS 클러스터 업그레이드 시에 대한 부분도 클러스터에서 사용하는 VNet(Subnet) Sizing에 반영 필요
       - (노드 수 + 1) + ((노드 수 + 1) * 노드당 최대 Pod)
  ▪  AKS 클러스터에 대한 가상 네트워크는 아웃바운드 인터넷 연결이 필요
  ▪  클러스터 서브넷에는 VM 배포 불가


Max Pod
  ▪ AKS Cluster Node에서 생성되는 Pod의 최대 값
  ▪ kubenet 네트워킹과 Azure CNI 네트워킹에 따라서 최대 값이 다름
      - Kubenet :  Node당 기본 Pod 110 (최소 10 / 최대 110)
      - Azure CNI :  Node당 기본 Pod 30 (최소 10 / 최대 250)
  ▪ Cluster 생성 시에 Max Pod 설정은 Azure Cli에서 --max-pods 인수를 지정하거나, Resource Manager 템플릿에서 ManagedClusterAgentPoolProfile 개체에서 maxPods 속성을 지정할 수 있음 (Azure Portal에서는 지정 불가)
  ▪ Cluster 운영 중에서 최대 값 변경 시에는 새로운 maxPod수로 새 Node Pool을 생성한 후, 기존 Pod를 신규 Node Pool로 마이그레이션 후, 기존 클러스터를 삭제해야 함. 


Load Balancer
  ▪ Azure Load Balancer 배포 시, 클러스터 서브넷에서 할당됨
  ▪ 기본(Basic)과 표준(Standard) SKU 로드밸런서를 모두 사용 가능하지만,  클러스터에서 서로 다른 SKU의 로드밸런서는 지원하지 않음.
      - 표준 SKU 사용 시에는 Kubernetes 1.13이상을 사용해야 함.
  ▪ Cluster 생성 시 만들어지는 Load Balancer는 표준 SKU이며(default) internet facing임.
       - SKU를 변경하려면, az create 명령으로 Cluster 생성 시, --load-balancer-sku 매개 변수에서 지정 가능
  ▪ Cluster 생성 시에 만들어진 Load Balancer은 송신을 목적으로 사용되록 프로비저닝 된 것임.   
  ▪ Load Balancer를 Cluster 서브넷이 아닌 다른 서브넷에 구성 할 경우 
azure-load-balancer-internal-subnet 값을 annotations에 추가
      - 단, 해당 서브넷도 동일한 VNet 내에 속해 있어야 함. 
apiVersion: v1
kind: Service
metadata:
  name: internal-app
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"               // Internal LB 속성
    service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "zigi-subnet"      // 서브넷 설정
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: internal-app
  ▪ 표준 SKT 로드밸런서 사용 시, load-balancer-managed-outbound-ip-count 매개변수를 사용하여, 아웃바운드 공용 IP 수 조정 가능
   (default 1)
az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --load-balancer-managed-outbound-ip-count 2
  ▪ 아웃바운드로 로드밸런서를 이용했을 때, SNAT(PAT:NAPT)이 수행되는 데 다수의 통신 시에 소스 포트 고갈이 발생 가능
       - load-balancer-outbound-ports [포트수] 매개변 수와 load-balancer-idle-timeout [time] 옵션을 사용하여 이를 변경 가능
       - load-balancer-outbound-ports 의 경우 백엔드 Poll 크기에 따라서 아웃바운드 포트 수
             - 이 때, 값을 '0'을 주면 전체 사용 가능한 포트 수를 node 수로 나눠서 적정하게 노드별 사용 가능한 포트 수를 자동으로 배분
             - 만약 로드밸런서에 추가적인 Outbound용 IP가 추가될 경우에 최대 사용 가능한 포트 수가 증가하나,
               설정 값이 자동으로 반영되지 않기 때문에 aks update에서 재설정 필요