Kubernetes 이야기

host 서버에서 pod내부의 외부 통신 상태 (netstat) 조회 본문

Kubernetes/모니터링

host 서버에서 pod내부의 외부 통신 상태 (netstat) 조회

kmaster 2022. 3. 22. 16:20
반응형

개요

 

종종 Pod내부에서 외부 통신 (예를 들어 외부 mariadb의 3306 ) 상태를 조회하거나 몇개가 연결되어 있는지 확인해야 하는 경우가 있다. 또는 Pod 내부에서 사용하는 서버가 정상적으로 listen 중인지 확인해야 할 경우가 있다. 이 때 보통 netstat 명령어를 사용하는데 Container안에 netstat 설치가 안되어 있거나 pod 내부에 접근 권한이 없는 경우 곤란한 상황을 맞이할 때가 있다.

 

테스트 전 아래와 같이 예제를 배포해 구성해 보자.

 

 

예제파일

 

1) Container (사용자 app)

FROM tomcat:8.0.51-jre8-alpine

ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN rm -Rf /usr/local/tomcat/webapps
RUN mkdir -p /usr/local/tomcat/webapps/ROOT
COPY ds.jsp /usr/local/tomcat/webapps/ROOT/.
COPY mariadb-java-client-3.0.3.jar /usr/local/tomcat/lib/.

 

위의 Container는 tomcat WAS에 db연결하는 "ds.jsp" 샘플이 있다.

 

이제 앱을 배포해 보자.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcatapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcatapp
  template:
    metadata:
      labels:
        app: tomcatapp
    spec:
      containers:
      - name: front
        image: ghcr.io/kmaster8/tomcatapp:1.0
        ports:
        - containerPort: 8080
        imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: tomcatapp
spec:
  type: NodePort
  selector:
    app: tomcatapp
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

 

netstat 상태 모니터링

 

먼저 tomcatapp container의 pod 상태를 조회해 보자.

 

# kubectl get po -n test -o wide
pod/tomcatapp-74844447fd-66fkt   1/1     Running   0          23s    172.32.24.36     node2    <none>           <none>

 

node2번에 pod가 생성되었으니 node2 번으로 이동해 보자.

 

# netstat -anp | grep 3306
# // 아무것도 조회되지 않는다.

 

Pod안에 들어가서 확인해 보자.

 

# kubectl exec -it -n test tomcatapp-74844447fd-knpls -- /bin/bash
bash-4.4# netstat -anp | grep 3306
tcp        0      0 ::ffff:172.32.24.9:41306 ::ffff:10.20.100.41:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:172.32.24.9:43354 ::ffff:10.20.100.41:3306 ESTABLISHED 1/java

bash-4.4# netstat -anp | grep 8080
tcp        0      0 :::8080                 :::*                    LISTEN      1/java

 

이제 Node 에서 조회하는 방법을 보자.

 

1) nsenter

# crictl ps | grep tomcat ( docker 인 경우는 docker ps 로 확인 )
CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID

d8051f9093821       a6da35f8373fb       10 seconds ago      Running             tomcatapp                 0                   4456de0a20446

 

CONTAINER 값을 가지고 pid를 구한다.

 

# crictl inspect d8051f9093821 | grep pid  // container이름을 알면 ps -eaf 로도 찾을 수 있다.
    "pid": 12352,
            "pid": 1
            "type": "pid"

 

# nsenter -t 12352 -n netstat -nap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      12352/java
tcp6       0      0 :::8009                 :::*                    LISTEN      12352/java
tcp6       0      0 :::8080                 :::*                    LISTEN      12352/java
tcp6       0      0 172.32.24.16:8080       172.32.183.128:27901    ESTABLISHED 12352/java
tcp6       0      0 172.32.24.16:60768      10.20.100.41:3306       ESTABLISHED 12352/java
tcp6       0      0 172.32.24.16:60808      10.20.100.41:3306       ESTABLISHED 12352/java
tcp6       0      0 172.32.24.16:60770      10.20.100.41:3306       ESTABLISHED 12352/java
tcp6       0      0 172.32.24.16:8080       172.32.183.128:32636    ESTABLISHED 12352/java
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
unix  2      [ ]         STREAM     CONNECTED     802038148 12352/java

 

위와 같이 8080 listen이나 3306 port와 연결된 상태를 조회할 수 있다.

 

container는 namespace라는 리눅스의 기술을 활용하여 독립적인 프로세스 할당, 네트워크 할당 등의 기능을 제공하기 때문에 이러한 상태를 조회하기 위해 nsenter라는 명령어를 이용하여 확인할 수 있다.
nsenter는 "namespace enter"의 약어이다.

 

2) conntrack

# conntrack -L | grep 3306
tcp      6 85489 ESTABLISHED src=172.32.24.16 dst=10.20.100.41 sport=60768 dport=3306 src=10.20.100.41 dst=10.20.200.123 sport=3306 dport=60768 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 use=1
tcp      6 85489 ESTABLISHED src=172.32.24.16 dst=10.20.100.41 sport=60770 dport=3306 src=10.20.100.41 dst=10.20.200.123 sport=3306 dport=60770 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 use=1
tcp      6 85490 ESTABLISHED src=172.32.24.16 dst=10.20.100.41 sport=60808 dport=3306 src=10.20.100.41 dst=10.20.200.123 sport=3306 dport=60808 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 use=1
conntrack v1.4.4 (conntrack-tools): 568 flow entries have been shown.

 

host 서버에서 conntract -L 명령어로도 확인이 가능하다.

 

3) ip

 

ip -all netns exec netstat -tapn | grep 3306
tcp6       0      0 172.32.24.16:60768      10.20.100.41:3306       ESTABLISHED 12352/java
tcp6       0      0 172.32.24.16:60808      10.20.100.41:3306       ESTABLISHED 12352/java
tcp6       0      0 172.32.24.16:60770      10.20.100.41:3306       ESTABLISHED 12352/java
반응형
Comments