CNI
개념
- Container Network Interface
- CNCF(Cloud Native Computing Foundation)의 프로젝트 중 하나
- 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준
- 쿠버네티스에서는 Pod 간의 통신을 위해서 CNI 를 사용
- 쿠버네티스는 kubenet 이라는 자체적인 CNI 플러그인을 제공
- CNI 외에 다양한 플러그인 존재 : 관련 k8s 문서
동작
- 브릿지 인터페이스 만듦
- 컨테이너 네트워크 대역대 쪼갬
- 라우팅 테이플 생성
- 각 컨테이너가 통신하도록 함
AWS VPC CNI
개념
Amazon VPC CNI plugin for Kubernetes는 Amazon EKS 클러스터에 있는 Pod 네트워킹용 네트워킹 플러그 인입니다. 플러그인은 Kubernetes 노드에 VPC IP 주소를 할당하고 각 노드의 Pods에 대한 필수 네트워킹을 구성하는 역할을 합니다.
출처 : AWS docs
- 하는 일 : 파드에 ip 할당 -> 파드 ip 네트워크 대역과 노드(워커)의 ip 대역이 같아서 직접 통신 가능
- 직접 통신이 중요한 이유 : k8s cni 중 하나인 calico는 대역이 달라 오버레이(VXLAN, IP-IP) 통신
- vpc 와 통합되어 기능(vpc flow log, 라우팅 정책, 보안그룹)을 사용 가능
- Secondary IP 모드가 디폴트 설정 > 이 모드는 vpc eni 에 미리 할당된(warm pool) ip를 파드에서 사용 가능
+)
워커 노드에 생성 가능한 최대 파드 갯수에 대하여
prefix 모드
노드에 더 많은 수의 Pod를 실행시킬 필요가 있다면 prefix 모드로 변경이 필요
IP 대신 /28 CIDR을 각 ENI에 할당해 더 많은 IP를 사용 가능
실습
플러그인 설치 시, L-IPAM(Local IP Address Manager)를 daemonset으로 설치 > 파드의 IP 할당받음
kubectl get daemonset --namespace kube-system
#daemonset 확인
# CNI 정보 확인
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
# kube-proxy config 확인
kubectl describe cm -n kube-system kube-proxy-config
# 노드 IP 확인
aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
# 파드 IP 확인
kubectl get pod -n kube-system -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase
# 파드 이름 확인
kubectl get pod -A -o name
# 파드 갯수 확인
kubectl get pod -A -o name | wc -l
CNI 정보
노드 IP & 파드 IP > 대역 같은 것 확인
노드의 네트워크 로그 파일 확인
iptable 정보 확인
# CNI 정보 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i tree /var/log/aws-routed-eni; echo; done
ssh ec2-user@$N1 sudo cat /var/log/aws-routed-eni/plugin.log | jq
ssh ec2-user@$N1 sudo cat /var/log/aws-routed-eni/ipamd.log | jq
ssh ec2-user@$N1 sudo cat /var/log/aws-routed-eni/egress-v6-plugin.log | jq
ssh ec2-user@$N1 sudo cat /var/log/aws-routed-eni/ebpf-sdk.log | jq
ssh ec2-user@$N1 sudo cat /var/log/aws-routed-eni/network-policy-agent.log | jq
# 네트워크 정보 확인 : eniY는 pod network 네임스페이스와 veth pair
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -br -c addr; echo; done
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c addr; echo; done
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c route; echo; done
ssh ec2-user@$N1 sudo iptables -t nat -S
ssh ec2-user@$N1 sudo iptables -t nat -L -n -v
결론
node 와 pod 가 모두 AWS VPC CIDR 범위 내에 있음
쿠버네티스용의 CNI 가 할 일을 AWS 관할 내에서 하도록 하는 것
+)
오버레이 통신?
물리적 네트워크 인프라 위에 가상 네트워크를 생성하는 방식으로 작동
호스트 간의 네트워크 연결을 가상화하고, 컨테이너들은 마치 동일한 물리적 네트워크에 연결된 것처럼 통신
가상화된 터널을 통해 데이터 전송
VXLAN 등의 추가 자료 첨부
https://white-polarbear.tistory.com/69
출처 및 참고 문헌
https://captcha.tistory.com/78
'Infra & DevOps > k8s(EKS)' 카테고리의 다른 글
[EKS] Observability (0) | 2024.03.31 |
---|---|
[EKS] Storage (0) | 2024.03.22 |
[EKS] network (0) | 2024.03.17 |
[EKS] 설치 및 기본 사용 (0) | 2024.03.10 |
[Kubernetes] http 에러 검증, 파드, pv (0) | 2022.04.26 |