Cloud/AWS

EKS CNI Custom Network를 이용한 Pod 대역 분리

지기(ZIGI) 2022. 5. 17. 23:20
Today Keys : eks, cni, custom, network, pod, ip, 대역, 주소, 분리, aws, node

이번 포스팅은 EKS에서 CNI Custom Network 설정을 이용하여, node와 pod 대역을 분리를 해보는 내용입니다.  서브넷에서 활용 가능한 IP 수의 제한이나, 보안상의 이슈 등으로 Node와 pod의 대역을 분리하여 별도 서브넷(IP 대역)으로 사용하고자 할 때, 이용할 수 있습니다.
 

오늘 진행 할 EKS 초기 환경입니다.
EKS Cluster 생성 시에 EKS-Sub1, EKS-Sub2 서브넷을 지정하여,
EKS Control plane과 통신하는 ENI가 해당 서브넷에 생성되어 있고
EKS Node는 EKS-Node-Sub1과 EKS-Node-Sub2라는 서브넷에 구성되어 있습니다.   
그리고, 이후에 Node와 분리되어 생성 될 pod 대역을 위해서
EKS-pod-Sub1, EKS-pod-Sub2 서브넷이 다른 IP 대역으로 만들어져 있습니다. 
 
 
 
현재 구성된 네트워크 인터페이스를 확인해 보면,
아래와 같이 EKS Cluster 생성 시에 구성된 ENI (10.0.0.70, 10.0.1.74)와
Worker Node 생성 시에 구성된 ENI (10.0.0.158, 10.0.1.145, 10.0.1.169) 가 있는 것을 볼 수 있습니다.
Worker Node ENI의 경우 VPC CNI 사용 시에
pod의 IP가 Worker Node의 네트워크 인터페이스의 Secondary IP를 사용하기 때문에
보조 프라이빗 IPv4 주소에 추가적인 주소가 함께 할당 된 것을 볼 수 있습니다.
 
 
 
이제 EKS에서 pod 대역을 Worker Node와 분리하기 위해서
VPC CNI에서 Custom Network 설정을 진행합니다.
 
 
CNI Custom Network 설정을 위해서는
aws-node DaemonSet의 AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG 환경 변수를 true로 설정해야 합니다.
먼저, 현재 aws-node pod 한 개에서 해당 환경 변수 값을 확인해 보면,
아래와 같이 false로 설정되어 있는 것을 볼 수 있습니다.
 
 
 
다음과 같은 명령을 통해서 aws-node DaemonSet 환경 변수 설정을 false에서 true로 설정합니다. 
kubectl set env daemonset aws-node \
    -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
 
DaemonSet 환경 변수 값을 변경하고 나면,
기존의 aws-node pod가 변경된 환경 변수 값을 가진 pod로 교체 되는 것을 아래와 같이 볼 수 있습니다.
 
 

 

이제 ENIConfig라는 Custom 리소스를 생성합니다.
이 설정 값은 pod용 대역 사용을 위한 ENI에 적용 될 값이 들어갑니다.
ENI가 생성될 서브넷과 ENI 생성 시에 연결된 Security Group 값을 지정합니다.
name의 값은 Unique한 값을 설정해야 하는 데,
Multi-AZ Node Group 설정을 쉽게 하기 위해서
AWS에서는 설정한 서브넷의 가용 영역 이름으로 지정하는 것을 권고합니다.
포스팅 내에서는 pod 대역으로 EKS-pod-Sub1, EKS-pod-Sub2 서브넷을 생성했고,
각각 서로 다른 가용 영역으로 2개의 가용 영역 사용했기 대문에 ENIConfig Custom 리소스 생성을 2번을 합니다.
 
 
 
EKS가 Node의 가용 영역을 topology.kubernetes.io/zone 레이블로 설정하는 데,
앞서, ENIConfig Custom 리소스의 name을 가용 영역으로 설정한 경우에 
다음 명령을 통해서 EKS가 Node의 가용 영역에 해당하는 ENIConfig를 자동으로 적용하도록 설정 할 수 있습니다.

 

kubectl set env daemonset aws-node \
    -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone
 
이제 EKS에서 CNI Custom Network 사용을 위한 설정이 끝났습니다.
설정 된 내용을 확인하기 위해서
기본 관리형 노드그룹으로 추가 Worker Node 2대를 생성합니다.
추가로 생성된 Node 2대의 Network Interface는 아래의 그림에 있는
EKS-Node1-2-1, EKS-Node1-2-2 와, EKS-Node2-2-1, EKS-Node2-2-2 입니다.
 
참고로 ENI의 Naming은
 
  EKS-Node가용영역-Instance-Network Interface

 

입니다.
 
즉, EKS-Node-1-2-1은
가용영역1에 있는 2번째 Instace의 1번째 Network Interface(Primary) 를 뜻합니다.
이제 아래 Network Interface의 정보를 확인해 보면
각 Instace의 Primary Network Interface는 Node 대역인
10.0.0.128/25  10.0.1.128/25 대역 내의 IP를 갖고 있으며,
pod 대역을 위한 Secondary IP가 Primary Network Interface에 할당되어 있지 않습니다.
대신 Secondary Network Interface에는 pod에 할당하기 위한
100.64.0.0/24, 100.64.1.0/24 대역을 갖고 있으며 Secondary IP 주소도 할당된 것을 볼 수 있습니다.
 

 

 
이제 Pod에 할당되는 IP 대역을 확인하기 위해
20개의 nginx pod를 replicaset으로 배포하였습니다.
배포는 각 Worker Node별로 배포된 pod의 IP를 확인해 보면,
신규로 배포된 EKSNode1-2, EKSNode2-2에서는 100.64.X.X 대역으로 pod가 배포된 것을 볼 수 있고
기존의 EKSNode1-1, EKSNode2-1은 초기에 구성된 10.0.0.128/25, 10.0.1.128/25 대역과 함께
100.64.X.X  대역의 Pod도 함께 있는 것을 볼 수 있습니다.

 

즉, CNI Custom Network 사용 설정을 적용하기 전에
배포된 Worker Node의 기본 Network Interface는 유지되는 것을 볼 수 있고
이후 생성된 Worker Node는 Primary Network Interface에는 pod 할당을 위한 추가 IP를 할당받지 않고
pod에 할당될 IP 대역을 가진 Secondary Network Interface에서만
추가 IP를 미리 할당 받아서 관리되는 것을 알 수 있습니다. 
 
 
 
마지막, 원하는 동작을 위해서 CNI Custom Network 사용 설정 이후에 생성한 Node를 제외하고
그 이전에 구성된 Node를 삭제하고, Replicaset 사이즈를 조정하고 나서  pod 정보를 확인해 보면
초기에 구성하고자 했던 Worker Node의 IP 대역과 pod 대역이 정상적으로 분리 된 것을 볼 수 있습니다.
 
 
 
EKS에서 CNI Custom Network를 적용하여
Node 대역과 Pod 대역을 분리한 구성을 정리하면 다음과 같은 그림이 됩니다.