반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- eBPF
- knative
- mlops
- CI/CD
- Kubeflow
- kubernetes operator
- operator
- Continuous Deployment
- Kubernetes
- CANARY
- opentelemetry
- nginx ingress
- Pulumi
- gitops
- xdp
- Argo
- keda
- Kopf
- argocd
- 오퍼레이터
- tekton
- Litmus
- Kubernetes 인증
- serving
- Model Serving
- blue/green
- seldon core
- opensearch
- 카오스 엔지니어링
- MLflow
Archives
- Today
- Total
Kubernetes 이야기
host 서버에서 pod내부의 외부 통신 상태 (netstat) 조회 본문
반응형
개요
종종 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
반응형
'Kubernetes > 모니터링' 카테고리의 다른 글
OpenTelemetry (0) | 2022.04.16 |
---|---|
OpenTelemetry auto-instrumentation (0) | 2022.04.16 |
Robusta 를 활용한 Kubernetes 문제점 해결하기 (0) | 2022.02.27 |
Kyverno 정책 모니터링 (0) | 2022.02.20 |
Locust를 사용하여 부하테스트 실행하기 (0) | 2022.02.18 |
Comments