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>
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
'Kubernetes > Kubernetes 이론' 카테고리의 다른 글
kubectl 축약어 정리 (0) | 2021.07.24 |
---|---|
Kubernetes API Aggregation (1) | 2021.06.20 |
Kubernetes Pod Container의 Application PID를 Host에서 확인 (0) | 2021.04.05 |
Pod안에 CentOS(application이 없는 OS 이미지) Container 실행하기 (0) | 2021.01.12 |
kubeadm init 오류 (0) | 2021.01.12 |