관리 메뉴

피터의 개발이야기

[kubernetes] network 테스트 방법 본문

Kubernetes/network

[kubernetes] network 테스트 방법

기록하는 백앤드개발자 2024. 1. 21. 02:47
반응형

ㅁ 관련글

[kubernetes] 쿠버네티스 목차

ㅇ 실무경험: [kubernetes] metricbeat kubernetes DNS lookup failure: no such host 해결방법, kubernetes DNS 접속
   ㄴ kubernetes DNS lookup 실패 오류를 해결하면서 network 테스트 수행함.

 

ㅁ 들어가며

 kubenetes의 네트워크를 확인하고 연동테스트를 하는 방법들을 정리하였다. 

 

ㅁ Kubernetes에서 DNS 쿼리 작동방식

https://www.nslookup.io/learning/the-life-of-a-dns-query-in-kubernetes/

포드가 DNS 조회를 수행하면 쿼리는 먼저 포드의 local DNS resolver로 전송된다. 이 해석기는 resolv.conf 구성 파일을 사용한다. 이 파일에서 nodelocaldns 서버는 캐시 역할을 하는 기본 재귀 DNS 확인자로 설정된다.

# pod resolv.conf 조회
$  k run dnsutil --image busybox --restart Never --rm -it -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
pod "dnsutil" deleted

 

  이 캐시에 요청된 호스트 이름에 대한 IP 주소가 포함되어 있지 않으면 쿼리가 클러스터 DNS 서버( CoreDNS )로 전달된다.

이 DNS 서버는 Kubernetes 서비스 레지스트리를 참조하여 IP 주소를 결정합니다. 이 레지스트리에는 서비스 이름과 해당 IP 주소의 매핑이 포함되어 있다. 이를 통해 클러스터 DNS 서버는 요청 Pod에 올바른 IP 주소를 반환할 수 있다. 쿼리되었지만 Kubernetes 서비스 레지스트리에 없는 모든 도메인은 업스트림 DNS 서버로 전달됩니다.

 

ㅁ 외부연동테스트

 alpine-curl image를 통해 pod를 생성하고 exec 명령어를 통해 필요한 url를 체크하는 방법이다.

apiVersion: v1 
kind: Pod
metadata:
  name: curl
  namespace: kube-public 
spec:
  containers:
  - image: byrnedo/alpine-curl:latest
    name: alpine-curl
    command: ["sleep", "5000"]

ㅇ curl-pod.yaml을 작성하여 Pod를 생성한다.

 

for i in {1..35}; do
   kubectl exec -n kube-public curl -- sh -c 'test=`wget -qO- -T 2  http://webapp-service.default.svc.cluster.local:8080/info 2>&1` && echo "$test OK" || echo "Failed"';
   echo ""
done

 

ㅇ curl-test.sh를 작성하였다.

 

http://webapp-service.default.svc.cluster.local:8080/info 라는 API의 헬스체크를 해 보았다.

 ㅇ Hello, Application Version: v1 ; Color: blue 라는 응답 값을 성공적으로 받으면 OK를 붙여준다.

 

 

ㅁ 간단한 연동테스트

쿠버네티스는 파드와 서비스를 위한 DNS 레코드를 생성한다. 사용자는 IP 주소 대신에 일관된 DNS name을 통해서 서비스에 접속할 수 있다. Kubelet은 실행 중인 컨테이너가 IP가 아닌 이름으로 서비스를 검색할 수 있도록 파드의 DNS를 설정한다.

 DNS가 정상적인지 간단히 테스트 하는 방법을 정리했다.

 

# nslookup 성공 케이스
$ k run dnsutil --image busybox --restart Never --rm -it -- nslookup 10-244-0-109.default.pod.cluster.local
Server:		10.96.0.10
Address:	10.96.0.10:53


Name:	10-244-0-109.default.pod.cluster.local
Address: 10.244.0.109

pod "dnsutil" deleted

 ㅇ kubectl run 명령어를 통해 간단히 pod를 생성하여 nslookup을 실행하였다.

 ㅇ --rm은 실행을 마치고 pod를 삭제한다.

 ㅇ --restart는 pod의 재시작 정책을 설정한다. nslookup이 실패 시 재시작하기 때문에 Never로 설정한다.

 

# nslookup 실패 케이스
$ k run dnsutil --image busybox --restart Never --rm -it -- nslookup 10-244-0-109.pod.cluster.local
Server:		10.96.0.10
Address:	10.96.0.10:53

** server can't find 10-244-0-109.pod.cluster.local: NXDOMAIN

** server can't find 10-244-0-109.pod.cluster.local: NXDOMAIN

pod "dnsutil" deleted
pod default/dnsutil terminated (Error)

 ㅇ DNS url에 namespace가 빠져 있다.

 ㅇ DNS 정보를 찾을 수 없어 실패 메시지를 리턴 받는다.

 

서비스 디버깅하기

# 테스트를 위한 임시 Pod 생성
$ k run busybox --image busybox --rm --restart Never -it -- sh

# 테스트용 deployment 생성
$ k create deployment hostnames --image=registry.k8s.io/serve_hostname --replicas=3
deployment.apps/hostnames created

# app 레이블은 자동 생성된다.
$ k get pods -l app=hostnames
NAME                         READY   STATUS    RESTARTS   AGE
hostnames-6b4b4dc7c8-4lns2   1/1     Running   0          31s
hostnames-6b4b4dc7c8-4w5jd   1/1     Running   0          31s
hostnames-6b4b4dc7c8-znp54   1/1     Running   0          31s

# 파드 IP 목록
$ k get pods -l app=hostnames \
 -o go-template='{{range .items}}{{.status.podIP}}{{"\n"}}{{end}}'
10.244.0.135
10.244.0.136
10.244.0.134

 

서비스는 존재하는가?

# 서비스 존재 확인
$ get svc hostnames
Error from server (NotFound): services "hostnames" not found

 ㄴ 아직 서비스를 만들지 않은 상태에서 not found 메시지를 확인 할 수 있다.

 

# 서비스 생성
$ kubectl expose deployment hostnames --port=80 --target-port=9376
service/hostnames exposed

# 생성 후 재조회
$ ubectl get svc hostnames
NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
hostnames   ClusterIP   10.97.199.125   <none>        80/TCP    23s

 ㄴ 서비스 생성 후 정상적인 경우 서비스가 조회된다.

 

서비스에 엔드포인트가 있는가?

$ kubectl get endpoints hostnames
NAME        ENDPOINTS                                               AGE
hostnames   10.244.0.134:9376,10.244.0.135:9376,10.244.0.136:9376   12m

ㄴ 위의 결과를 통해 엔드포인트 컨트롤러가 서비스에 대한 올바른 파드를 찾았음을 알 수 있다. ENDPOINTS 열이 <none>인 경우, 서비스의 spec.selector 필드가 파드의 metadata.labels 값을 실제로 선택하는지 확인해야 한다. 

 

ㅁ 함께 보면 좋은 사이트

ㅇ DNS URL 규칙: 서비스 및 파드용 DNS

ㅇ DNS 디버깅 상세정보: Debugging DNS Resolution

서비스 디버깅하기: 서비스가 제대로 작동하지 않을 때 테스트 방법을 설명함

 The life of a DNS query in Kubernetes

반응형

'Kubernetes > network' 카테고리의 다른 글

NAT란, Bridged Networking란, Virtual Network란?  (0) 2024.01.14
[kubernetes network] CNI란?  (0) 2022.12.13
Comments