[k8s] DNS를 통해 내부 서비스간 접근하는 방법

sang yun Lee·2023년 6월 5일
0

Devops 실습

목록 보기
13/21

개요



위의 그림과 같이 service-1 에 있는 Podservice-2 에 접근하기 위해서는 어떻게 해야될까요.
service-2ip (10.2.0.0) 를 통해서 접근하면 가능합니다. 하지만 service-2ip 는 고정적인 값이 아니고 아래의 그림과 같이 매번 serviceip 를 확인하는 것도 매우 번거롭습니다.

이를 해소하기 위해서 k8s 에서는 내부 service 에 접근하기 위한 DNS 를 제공하고 있습니다. 따라서 service-1service-2ip 를 알고 있지 않더라도 service-2 의 서비스 명칭만 알고 있으면 IP 대신 서비스명도메인 으로 사용해 service-2 와 통신할 수 있습니다.
결론부터 말하자면 , 만약 namespacedefault 이고 서비스명이 service-2 이라면 service-2도메인명demo-2.default.svc 이 됩니다.
이에 관해 간단히 실습방법을 공유하려 합니다. 자세한 DNS 원리는 아래의 블로그에 자세히 나와있습니다.

쿠버네티스 서비스(Service) Deep Dive - (3) Cluster DNS

실습


우선 IP 를 통해 HTTP 통신 을 해보고 그 다음 도메인 을 통해 접근을 해본다.

STEP 0: 리소스 생성 (service, deployment)

테스트에 사용할 리소스를 생성한다.

# deployment 리소스 생성 (demo-1, demo-2)
$ kubectl create deployment demo-1 --image=httpd:alpine --port=80
$ kubectl create deployment demo-2 --image=httpd:alpine --port=80
# service 리소스 생성 (demo-1, demo-2)
$ kubectl expose deployment demo-1
$ kubectl expose deployment demo-2

ip 를 통해 demo-1 에서 demo-2 에 접속해본다.

STEP 1: demo-2 의 Cluster IP 확인

$ kubectl get service             
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
...
demo-2       ClusterIP   10.108.166.211  <none>        80/TCP    6m9s
...
  • Cluster IP : <10.108.166.211> 임을 확인함

STEP 2: demo-1 의 터미널에 접속

# demo-1 에 해당하는 pod 명 획득하기
$ kubectl get pod | grep demo-1
# 결과
demo-1-6fb965977d-kszkg

# demo-1 에 해당하는 pod 에 접속
# kubectl exec --stdin --tty <demo-pod 이름> -- sh
$ kubectl exec --stdin --tty demo-1-6fb965977d-kszkg -- sh

STEP 3: IP 를 사용하여 HTTP 요청

demo-1 터미널에서 demo-2Cluster IP 을 통해 http 요청을 하고 성공적으로 값을 얻어오는 것을 확인한다.

# demo-1 터미널에 접속되어 있는 상태.

# wget <demo-2 의 Cluster IP>
$ wget 10.108.166.211
# 정상적으로 얻어옴을 확인할 수 있다.
Connecting to 10.108.166.211 (10.108.166.211:80)
saving to 'index.html'
index.html           100% |************************************************************************************|    45  0:00:00 ETA
'index.html' saved

STEP 4: 도메인 을 사용하여 HTTP 요청

demo-1 터미널에서 demo-2도메인 을 통해 http 요청을 하고 성공적으로 값을 얻어오는 것을 확인한다.


# demo-1 터미널에 접속되어 있는 상태.
# wget <{접속하고자 하는 서비스명}.{namespace}.svc>
 # namespace 확인 방법: 'kubectl get  service -A'
$ wget demo-2.default.svc
# 결과 (정상적으로 얻어옴을 확인할 수 있다)
Connecting to demo-2 (10.108.166.211:80)
saving to 'index.html'
index.html           100% |************************************************************************************|    45  0:00:00 ETA
'index.html' saved

이로써 도메인을 통한 접속은 확인할 수 있었습니다. 이어서 쿠버네틱스 DNS 에 대해서 간단히 확인해보겠습니다.

도메인을 통한 접속 원리

여기 블로그에 자세히 나와있습니다.
쿠버네티스 서비스(Service) Deep Dive - (3) Cluster DNS

참고자료:

0개의 댓글