이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/AWS

EKS AWS CNI - Pod 간 통신

이쿠우우 2021. 5. 6. 14:05
반응형

 

 

EKS AWS CNI - Pod 간 통신

 


목적

 

AWS에서 제공되는 kubernetes인 EKS에서 사용되는 CNI인 AWS CNI의 

Network Routing 과정을 분석해봄

 

 


 

글을 읽는데 필요한 기초 개념

 

 

AWS VPC

Virtual Private Cloud

사용자의 AWS 계정 전용 가상 네트워크.

VPC별로 네트워크를 구성할 수 있고 

각각의 VPC에따라 다르게 네트워크 설정을 줄 수 있음. 

또한 각각의 VPC는 완전히 독립된 네트워크처럼 작동함.

VPC는 하나의 리전에 종속됨.

 

AWS Subnet

VPC 안에 더 많은 네트워크망을 만들기 위해

VPC를 더 작은단위로 나눠놓은 것.

서브넷은 가용영역안에 존재하며 

서브넷안에 RDS, EC2와같은 리소스들을 위치시킬 수 있음.

 

 

AWS Routing Table

VPC 내부의 Routing을 설정하는 것.

 

 

IGA : Internet Gateway AWS

인터넷게이트웨이는 VPC와 인터넷을 연결해주는 관문.

Public Subnet  : 인터넷과 연결되어있는 Subnet

Private Subnet : 인터넷과 연결되어있지 않은 Subnet

 

 

NAT Gateway

Private Subnet이 인터넷과 통신 하기위한 아웃바운드 인스턴스

 

 

 


 

Test 환경 구축

 

 

 

[ m5.large 인스턴스 Worker Node ]

Worker Node 3개 배포되어 있음.

EC2 인스턴스 정보는 아래와 같음.

 

3개의 Worker Node 중 2개의 Worker Node에 Pod가 배포되어있음.

편의상 각 Worker Node 1, 2로 표현하겠음.

 

[Worker Node 1]

 

[Worker Node 2]

 

 

 

 

[ Tomcat Deployment 배포 ]

Worker Node 1  : ip-192-168-34-143.ap-northeast-2.compute.internal

Pod Network 인터페이스 : enia6653479892

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment-tomcat

  labels:

    app: iksoon-tomcat-test

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod-tomcat

  template:

    metadata:

      labels:

        app: iksoon-pod-tomcat

    spec:

      containers:

      - name: iksoon-tomcat

        image: peksoon/iksoon_tomcat:1.0.5

        ports:

        - containerPort: 8080

 

 

[ Mysql Deployment 배포 ]

Worker Node 2 : ip-192-168-29-46.ap-northeast-2.compute.internal

Pod Network 인터페이스 : eni0b8b3d003d6

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment-mysql

  labels:

    app: iksoon-mysql-test

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod-mysql

  template:

    metadata:

      labels:

        app: iksoon-pod-mysql

    spec:

      containers:

      - name: iksoon-mysql

        image: peksoon/iksoon_mysql:1.0.2

        ports:

        - containerPort: 3306

 

 

 

 

[Pod 배포 상태 정보]

 

 

 

 

 

 


 

 

AWS CNI Routing 분석.

서로 다른 Worker Node에 있는 Pod icmp 통신

 

 

1. Tomcat Container eth0 interface

 

sudo tcpdump -i eth0 -ne icmp -vv -c 10

 

[ ICMP Pack의 정보 ]

[MAC 정보]
출발지 : ae:3a:1e:a2:c6:d0 (tomcat container의 eth0 MAC)
도착지 : 0a:94:28:38:ec:76 (Worker Node1의 enia6653479892 MAC)

 

[IP주소 정보]

출발지 : 192.168.53.154  (tomcat container의 eth0 IP)

도착지 : 192.168.25.72   (mysql container의 eth0 IP)

 

 

 

2. Worker Node 1: 보조 네트워크 인터페이스

Worker Node 1 : enia6653479892 ( tomcat pod Network interface )

sudo tcpdump -i enia6653479892 -ne icmp -vv -c 10

 

[ ICMP Pack의 정보 ]

[MAC 정보]
출발지 : ae:3a:1e:a2:c6:d0 (tomcat container의 eth0 MAC)
도착지 : 0a:94:28:38:ec:76 (Worker Node1의 enia6653479892 MAC)

 

[IP주소 정보]

출발지 : 192.168.53.154  (tomcat container의 eth0 IP)

도착지 : 192.168.25.72   (mysql container의 eth0 IP)

상위 정보와 동일함.

 

 

 

 

3. Worker Node 1 : 기본 네트워크 인터페이스

Worker Node 1 : eth0

상위의 보조 네트워크 인터페이스인 enia6653479892 와 매칭되는 

기본 네트워크 인터페이스를 찾아야함.

test환경에서는 enia6653479892과 eth0이 매칭되어있었음.

 

sudo tcpdump -i eth0 -ne icmp -vv -c 10

 

[ ICMP Pack의 정보 ]

[MAC 정보]
출발지 : 0e:86:5a:82:6b:e6 (Worker Node 1 eth0 MAC address)
도착지 : 0e:26:9f:32:7d:d6 (??? AWS 라우팅 테이블 설정으로 예상됨)

 

[IP주소 정보]

출발지 : 192.168.53.154  (tomcat container의 eth0 IP)

도착지 : 192.168.25.72   (mysql container의 eth0 IP)

 

[Worker Node 1의 ARP Tables]

 

 

4. Worker Node 2 : 기본 네트워크 인터페이스

Worker Node 2 : eth1

sudo tcpdump -i eth1 -ne icmp -vv -c 10

 

[ ICMP Pack의 정보 ]

[MAC 정보]
출발지 : 06:b6:b2:63:c0:90 (??? AWS 라우팅 테이블 설정으로 예상됨)
도착지 : 06:f6:57:ed:97:f4 (Worker Node 2 eth1 MAC)

 

[IP주소 정보]

출발지 : 192.168.53.154  (tomcat container의 eth0 IP)

도착지 : 192.168.25.72   (mysql container의 eth0 IP)

 

[Worker Node 2의 ARP Tables]

 

 

 

5. Worker Node 2 : 보조 네트워크 인터페이스

Worker Node 2 : mysql pod Network interface 

sudo tcpdump -i  eni0b8b3d003d6  -ne icmp -vv -c 10

 

[ ICMP Pack의 정보 ]

[MAC 정보]
출발지 : 3e:b8:07:8c:e0:02 (Worker Node 2의 eni0b8b3d003d6 MAC)
도착지 : 06:a7:eb:f8:5d:cc (MySQL container의 eth0 MAC)

 

[IP주소 정보]

출발지 : 192.168.53.154  (tomcat container의 eth0 IP)

도착지 : 192.168.25.72   (mysql container의 eth0 IP)

 

 

6. MySQL Container eth0 interface

sudo tcpdump -i eth0 -ne icmp -vv -c 10

 

[ ICMP Pack의 정보 ]

[MAC 정보]
출발지 : 3e:b8:07:8c:e0:02 (Worker Node 2의 eni0b8b3d003d6 MAC)
도착지 : 06:a7:eb:f8:5d:cc (MySQL container의 eth0 MAC)

 

[IP주소 정보]

출발지 : 192.168.53.154  (tomcat container의 eth0 IP)

도착지 : 192.168.25.72   (mysql container의 eth0 IP)

 

 

 

 

 

 


 

 

 

 

 

 

AWS CNI Routing 분석.

external 에서 Service LoadBalancer Type으로 접속

 

 

LoadBalancer External IP : 15.165.139.93

 

external에서 접속한 주소 : http://15.165.139.93:8080/iksoon_test/iksoon_home.jsp

 

 

1. Worker Node 1 : 기본 네트워크 인터페이스

 

sudo tcpdump -i eth0 -ne tcp port 8080 -vv -c 10

[MAC 정보]
출발지 : 0e:26:9f:32:7d:d6  (??? AWS 라우팅 테이블 설정으로 예상됨)
도착지 : 0e:86:5a:82:6b:e6 (Worker Node 1 eth0 MAC address)

 

[IP주소 정보]

출발지 : 192.168.73.157  (????)

도착지 : 192.168.53.154 (tomcat container의 eth0 IP)

 

[Port]

출발지 : 8482 (랜덤)

도착지 : webcache (LoadBalancer Service Object에 설정된 Port 8080)

 

 

 

2. Worker Node 1 : 보조 네트워크 인터페이스

 

sudo tcpdump -i enia6653479892  -ne tcp port 8080 -vv -c 10

 

[MAC 정보]
출발지 : 0a:94:28:38:ec:76  (Worker Node1의 enia6653479892 MAC)
도착지 : ae:3a:1e:a2:c6:d0 (tomcat container의 eth0 MAC)

 

[IP주소 정보]

출발지 :  192.168.29.46  (Worker Node2의 eth0 MAC)

도착지 : 192.168.53.154 (tomcat container의 eth0 IP)

 

[Port]

출발지 : 8482 (랜덤)

도착지 : webcache (LoadBalancer Service Object에 설정된 Port 8080)

출발지 IP가 Worker Node2의 IP인것을 봐서

LoadBalancer를 통해 패킷이 Worker Node 2로 갔다가

다시 목적지 pod가 있는 Woker Node 1으로 왔음을 알 수 있음.

 

 

 

 

 

 

반응형

'클라우드 > AWS' 카테고리의 다른 글

EKS AWS CNI를 Flannel로 교체  (2) 2021.05.06
EKS Network Policy 분석  (0) 2021.05.06
EKS AWS CNI 분석  (2) 2021.05.03
AWS Kubernetes (EKS)  (0) 2021.02.23
AWS API 사용 (Python)  (0) 2020.08.12