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 관리 필요
- VNet에서 필요한 IP 주소 수량이 많기 때문에 IP 관리 필요
▪ AKS에서 사용하는 VNet의 IP address 설계 시, Cluster의 node 수와 함께 실행할 Pod 수를 함께 고려해야 함.
▪ AKS 클러스터 업그레이드 시에 대한 부분도 클러스터에서 사용하는 VNet(Subnet) Sizing에 반영 필요
- (노드 수 + 1) + ((노드 수 + 1) * 노드당 최대 Pod)
- (노드 수 + 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에 추가
▪ 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)
(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에서 재설정 필요
설정 값이 자동으로 반영되지 않기 때문에 aks update에서 재설정 필요