이쿠의 슬기로운 개발생활

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

Kubernetes/Kubernetes 이론

Kubernetes Pod Container의 Networking 정보를 Host에서 확인

이쿠우우 2021. 4. 5. 22:50
반응형

 

 

 

 

 

Kubernetes Pod내부 Container의 Networking 정보를 Host에서 확인

 

목적

 

Pod 내부에 배치되어있는 Tomcat Container에서 Mysql Container로 

mysql -uroot -pqwer1234 -h10.244.1.232 명령으로 통신한 패킷을

Host에서 탐지하기

 

 

Test 환경

Test 에 사용한 yaml파일 예제

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iksoon-deployment
  labels:
    app: iksoon-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iksoon-pod
  template:
    metadata:
      labels:
        app: iksoon-pod
    spec:
      containers:
      - name: iksoon-tomcat
        image: peksoon/iksoon_tomcat:1.0.5
        ports:
        - containerPort: 8080
      - name: iksoon-mysql
        image: peksoon/iksoon_mysql:1.0.2
        ports:
        - containerPort: 3306


---


apiVersion: v1
kind: Service
metadata:
  name: service-iksoon-tomcat
  labels:
   name: service-tomcat
spec:
  type: NodePort
  ports:
  - name: "iksoon-tomcat8-network-setting"
    port: 8088                   # Service 자신의 포트
    targetPort: 8080             # pod 내 컨테이너 포트
    nodePort: 30001
  selector:                        # 뒷단의 pod 와 연계
    app: iksoon-pod

 

 

[생성 결과]

tomcat, mysql container 가 동작 중.

 

 

[사전 작업]

tomcat container 에 mysql 원격 접속 용도 mysql client 설치

명령어 : apt-get update && apt-get install -y git curl libmcrypt-dev default-mysql-client

 

 

[tomcat 에서 mysql 원격 접속]

명령어 : mysql -uroot -p[password] -h[ip주소]

예)mysql -uroot -pqwer1234 -h10.244.1.232

 

 

 

 


 

 

 

Tomcat에서 Mysql 접속 후 네트워크 정보 확인(inode 정보 불가능 상태)

 

 

tomcat container에서 netstat 명령해도 mysql 관련 log도 확인가능

이유 : tomcat 과 mysql container 는 같은 pod 안에 있어서 linux namespace 자원을 공유하기 때문

 

 

1 . tomcat 에서 mysql 로 통신한 후 상태 log

tomcat 과 mysql 통신은 같은 pod 내부의 container 간 통신이므로

127.0.0.1 로 통신하는 것을 확인

 

 

 

 

 

2. MySQL Container 가 있는 Pod가 생성된 Worker Node 에서 mysql, tomcat 그리고 해당 pod 의 pause container 의 PID 정보를 확인

 

[mysql]

명령어 :  ps aux | grep mysql

확인 결과 : 15165

 

[tomcat]

명령어 :  ps aux | grep tomcat

확인 결과 : 15116

 

[pause]

먼저 pause container id를 확인 : docker ps 

해당 container Pid 확인 : docker inspect [container ID] | grep Pid

확인 결과 : 15026

 

 

 

 

3. 상위 netstat 결과 tcp6로 조회 됐음으로 cat tcp6 명령으로 확인

 

[명령어] 

cat /proc/15165/net/tcp6 /proc/15116/net/tcp6 /proc/15026/net/tcp6

 

 

# Mysql container 정보

  sl  local_address                         remote_address                        st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode

   0: 00000000000000000000000000000000:1F49 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 963245869 1 ffff9548ab406e80 100 0 0 10 0

   1: 00000000000000000000000000000000:0CEA 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000   999        0 963253353 1 ffff9548ab404400 100 0 0 10 0

   2: 00000000000000000000000000000000:1F90 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 963245865 1 ffff9548ab401980 100 0 0 10 0

   3: 0000000000000000FFFF00000100007F:1F45 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 963248341 1 ffff9548ab402a80 100 0 0 10 0

   4: 0000000000000000FFFF00000100007F:ECC0 0000000000000000FFFF00000100007F:0CEA 06 00000000:00000000 03:00001260 00000000     0        0 0 3 ffff9548e7414400

   5: 0000000000000000FFFF0000E801F40A:1F90 0000000000000000FFFF00000101F40A:B4CD 01 00000000:00000000 00:00000000 00000000     0        0 966209930 1 ffff9548b3d73300 22 4 30 10 -1

   6: 0000000000000000FFFF0000E801F40A:1F90 0000000000000000FFFF00000101F40A:5A90 01 00000000:00000000 00:00000000 00000000     0        0 966255460 1 ffff9548b3d77700 22 0 0 10 -1

 

# Tomcat container 정보

  sl  local_address                         remote_address                        st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode

   0: 00000000000000000000000000000000:1F49 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 963245869 1 ffff9548ab406e80 100 0 0 10 0

   1: 00000000000000000000000000000000:0CEA 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000   999        0 963253353 1 ffff9548ab404400 100 0 0 10 0

   2: 00000000000000000000000000000000:1F90 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 963245865 1 ffff9548ab401980 100 0 0 10 0

   3: 0000000000000000FFFF00000100007F:1F45 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 963248341 1 ffff9548ab402a80 100 0 0 10 0

   4: 0000000000000000FFFF00000100007F:ECC0 0000000000000000FFFF00000100007F:0CEA 06 00000000:00000000 03:00001260 00000000     0        0 0 3 ffff9548e7414400

   5: 0000000000000000FFFF0000E801F40A:1F90 0000000000000000FFFF00000101F40A:B4CD 01 00000000:00000000 00:00000000 00000000     0        0 966209930 1 ffff9548b3d73300 22 4 30 10 -1

   6: 0000000000000000FFFF0000E801F40A:1F90 0000000000000000FFFF00000101F40A:5A90 01 00000000:00000000 00:00000000 00000000     0        0 966255460 1 ffff9548b3d77700 22 0 0 10 -1

 

# Pause container 정보

  sl  local_address                         remote_address                        st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode

   0: 00000000000000000000000000000000:1F49 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 963245869 1 ffff9548ab406e80 100 0 0 10 0

   1: 00000000000000000000000000000000:0CEA 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000   999        0 963253353 1 ffff9548ab404400 100 0 0 10 0

   2: 00000000000000000000000000000000:1F90 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 963245865 1 ffff9548ab401980 100 0 0 10 0

   3: 0000000000000000FFFF00000100007F:1F45 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 963248341 1 ffff9548ab402a80 100 0 0 10 0

   4: 0000000000000000FFFF00000100007F:ECC0 0000000000000000FFFF00000100007F:0CEA 06 00000000:00000000 03:00001260 00000000     0        0 0 3 ffff9548e7414400

   5: 0000000000000000FFFF0000E801F40A:1F90 0000000000000000FFFF00000101F40A:B4CD 01 00000000:00000000 00:00000000 00000000     0        0 966209930 1 ffff9548b3d73300 22 4 30 10 -1

   6: 0000000000000000FFFF0000E801F40A:1F90 0000000000000000FFFF00000101F40A:5A90 01 00000000:00000000 00:00000000 00000000     0        0 966255460 1 ffff9548b3d77700 22 0 0 10 -1

 

 

0x0CEA = 3306

상위 Container안에서 netstat 명령 내용과

worker node 의 

/proc/[mysql pid]/net/tcp6 내용과 동일함을 알 수 있음

 

[inode 가 0으로 나오는 이유]

컨테이너 내의 세션이 종료되는 순간 세션 정보의 inode number는 0이 됨

테스트에서 tomcat과 mysql 컨테이너간 통신은 순식간에 종료되어서 확인이 어려움

 

 

결론

1. Container에의 네트워크 관련 netstat 명령 정보는 모두 host 의 /proc/[pid]/net 에서 확인이 가능함.

2. Pod 내부에 생성된 Container network 정보는 host 에서 확인 했을 시 모든 container 정보가 동일함.

3. 즉 Pod 내부 Container 정보를 host에서 확인하고 싶으면 Pod 의 Pause Container 의 정보만 확인하면 됨.

 

 

 

 


 

 

 

 

Tomcat에서 Mysql 접속 후 네트워크 정보 확인(inode 정보 확인 가능 상태)

 

 

1. tomcat or mysql or pause container에서 네트워크 정보 확인

 

Pod 내부에 생성되어있는 모든 Container는 네트워크를 공유하고있기 때문에

어떤 container 상관없이 netstat 명령을 실행하면 모두 동일한 결과를 확인할 수 있음

 

[ 명령어 ]

netstat -an

이전 indoe 정보 확인 불가능 상태에서 확인했을때는 ip가 127.0.0.1 로 나왔는데

상위 그림에서는 pod ip로 조회되는 이유는 

tomcat Container -> mysql Container 통신 시

Pod IP로 통신했기 때문. 

전에는 localhost 주소로 통신함.

 

 

 

2. 해당 컨테이너가 있는 Worker Node Host에서 네트워크 정보 확인

 

[명령어]

cat /proc/[ pod 내부에 생성된 container pid (pause or tomcat or mysql)]/net/tcp6

ex) cat /proc/15165/net/tcp6

 

[결과]

 

3. 해당 통신 log 에서 inode 정보 확인

 

inode : 977090127

 

 

 

4. 확인한 inode 번호로 Pod 내부 container 간 통신의 목적지 container 찾기

 

mysql pid 의 정보로 가서 확인 매칭되는 inode 정보 확인

mysql container pid : 15165

/proc/15165/fd

 

[확인 결과]

socket 에서 

mysql container pid 에서 찾고자 하는 inode 와 매칭되는 값을 찾음

localhost address에 해당하는 container 는 mysql 로 확인

 

 

참고)

inode 정보 확인 명령어 : lsof -p <pid>

 

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

 

 

 

 

 

 

 

반응형