본문 바로가기
Containers/Kubernetes

5.2. Service 탐색

by shinebee* 2020. 8. 10.

 

  • cluster : 여러 개의 하드웨어가 하나의 서비스처럼 동작하게 만들어주는 기능
클러스터 외부 클러스터 내부
클라이언트  <--------------------------------------------------- --> 웹서비스  <--> 웹 파드 <--> DB 서비스 <--> DB 파드
  • 일반적인 웹의 구조.
  • client는 웹 서비스의 고정 IP 및 고정 port를 통해 접근할 수 있다.
  • 웹 파드는 DB 서비스의 고정 IP 및 고정 port를 통해 접근할 수 있다.

▶ 그렇다면 웹 파드의 애플리케이션은 DB 파드에 접근하기 위해 DB 서비스의 IP 및 포트를 알아야 할까?

 

  • 쿠버네티스 클러스터의 서비스는 pod에서 직접 탐색하고 접근할 수 있다.
  1.  환경변수를 이용한 탐색 방법.
  2.  DNS를 이용한 탐색 방법.

 

 

1. 환경변수를 이용한 서비스 탐색

  • 쿠버네티스 클러스터는 pod가 시작될 때, 존재하는 서비스를 pod 내의 쉘 환경변수로 설정한다.
  • 현재 실행중인 pod에 kubectl exec 명령을 이용하여 환경변수를 확인해보자.

  • 환경 변수 중 많은 부분이 kubernetes service 및 myapp service의 IP, port에 관한 변수와 값으로 구성되어있다.

 

▶ 애플리케이션은 서비스 이름만 알고 있다면 적절한 환경 변수를 참조해 접근하고자 하는 서비스의  IP와 port를 확인할 수 있다!

 

 

2. DNS를 이용한 서비스 탐색

  • 쿠버네티스 클러스터 시스템 내부에서 사용할 수 있는 DNS(CoreDNS) 서버가 동작하고 있다.
  • kube-system namespace에 DNS 관련 pod 및 controller 서비스가 존재한다.

 

1) DNS 관련 리소스 확인.

  • kube-system namespace에 DNS 관련 pod 확인.

 

2) pod 내부 DNS 설정 확인.

▶ DNS 서버는 169.254.25.10으로 설정되어있다. 이는 coredns 서비스의 IP인 10.233.0.3과 어떤 연관이 있을까?

 

3) NodeLocal DNSCache

  • 전에는 pod 내의 DNS 서버 설정도 coredns 서비스의 IP가 부여되어있었다. 하지만 이는 대규모 환경에서 병목현상을 만들어 성능이 저하된다는 단점이 있었다.
  • 쿠버네티스 1.15 버전부터는 NodeLocal DNSCache 기능이 도입되었다.
  • NodeLocal DNSCache 기능은 쿠버네티스의 각 노드에 DNS 캐시 기능을 가지고 있는 pod를 데몬 셋으로 배치하고, pod의 DNS 쿼리 및 응답을 coredns가 대신하게 되는 구조이다.
    • pod <-----> NodeLocal DNSCache (169.254.25.10) <-----> iptables <-----> coredns (10.233.0.3)

 

 

  • kube-system namespace에 nodelocaldns 데몬셋 컨트롤러가 존재한다.
  • 현재 구성은 마스터 1대, 노드 3대로  총 4대의 구성이기 때문에 4개의 pod가 배포된다.

 

  • nodelocaldns 관련 pod 목록 확인

 

  • nodelocaldns pod의 argument 설정.

  • 각 노드에서 169.254.25.10 IP인 링크로컬 주소 대역을 사용해 DNS cache 서비스를 제공한다는 의미.

 

4) FQDN을 이용한 서비스 탐색

  • nettool pod를 이용, 서비스의 FQDN을 이용하여 접근해보자.

  • myapp-svc 서비스에 접근하기 위한 FQDN 주소는 myapp-svc.default.svc.cluster.local이다.
  • myapp-svc : 서비스 이름
  • default : 서비스 리소스의 namespace 이름
  • svc : 서비스
  • cluster.local : 쿠버네티스 클러스터 도메인

 

  • FQDN의 주소 형식
< 리소스(서비스) 이름 >.< namespace >.< 리소스 종류 >.< 클러스터 도메인 >
myapp-svc.default.svc.cluster.local

 

5) 컨트롤러 및 서비스 리소스 삭제

  • 지금까지 생성했던 리소스 확인.

 

  • 모든 리소스 삭제.

 

※ service/kubernetes 서비스는 삭제되더라도 다시 생성된다.

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

클러스터 외부 서비스 - LoadBalancer  (0) 2020.08.23
클러스터 외부 서비스 - NodePort  (0) 2020.08.22
5.1. Cluster 내부 서비스  (0) 2020.08.03
4.4. DaemonSet  (0) 2020.07.29
4.3. ReplicaSet  (0) 2020.07.28

댓글