2주차 - EKS Networking(1)(AWS VPC CNI)

728x90

etc-image-0

CNI

  • Container Network Inferface로 컨테이너 간 네트워크를 구성
    • 다양한 CNI가 존재( Flannel, Calico, Cilium, Weave Net, AWS VPC )

AWS VPC CNI

  • Node와 Pod의 IP 대역이 같아 직접 통신이 가능하여 네트워크 통신의 최적화(성능, 지연)
  • VPC 와 통합 : VPC Flow logs , VPC 라우팅 정책, 보안 그룹(Security group) 을 사용 가능함
  • VPC ENI 에 미리 할당된 IP(=Local-IPAM Warm IP Pool)를 파드에서 사용할 수 있음

etc-image-1
etc-image-2

Node Network 정보

  • aws-node(cni)와 kube-proxy는 Node의 Root Net Namespace를 사용
    • aws-node와 kube-proxy의 경우 Node의 IP를 그대로 사용

etc-image-3

  • core-dns의 경우 Per Pod Net Namespace를 사용
    • core-dns는 Node의 IP가 아닌 별도의 IP를 사용
    • coredns 파드는 veth 으로 호스트에는 eniY@ifN 인터페이스와 파드에 eth0 과 연결

etc-image-4
etc-image-5

 

  • t3.medium 의 경우 ENI 마다 최대 6개의 IP를 가질 수 있다
  • ENI0, ENI1 으로 2개의 ENI는 자신의 IP 이외에 추가적으로 5개의 보조 프라이빗 IP를 가질수 있다

etc-image-6

 

  • Pod 생성 시, Pod IP가 각 노드에 라우팅 테이블에 설정
# [터미널1~3] 노드 모니터링
ssh ec2-user@$N1
watch -d "ip link | egrep 'ens|eni' ;echo;echo "[ROUTE TABLE]"; route -n | grep eni"

ssh ec2-user@$N2
watch -d "ip link | egrep 'ens|eni' ;echo;echo "[ROUTE TABLE]"; route -n | grep eni"

ssh ec2-user@$N3
watch -d "ip link | egrep 'ens|eni' ;echo;echo "[ROUTE TABLE]"; route -n | grep eni"

# 테스트용 netshoot-pod 디플로이먼트 생성
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: netshoot-pod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: netshoot-pod
  template:
    metadata:
      labels:
        app: netshoot-pod
    spec:
      containers:
      - name: netshoot-pod
        image: nicolaka/netshoot
        command: ["tail"]
        args: ["-f", "/dev/null"]
      terminationGracePeriodSeconds: 0
EOF

 

etc-image-7

 

각 Pod IP가 노드의 라우팅테이블에 추가 확인

etc-image-8

 

 

728x90