System Engineering/Kubernetes

Kubernetes #16. Kubernetes의 Endpoint와 DNS

ZunoXI 2023. 5. 1.

 

개요

앞선 포스팅을 통해 쿠버네티스에서 서비스가 무엇인지, 어떤 식으로 동작하는지 살펴봤다. 이번 포스팅에서는 서비스가 실제 운영단계에서 사용될 때 알고 있으면 도움이 될만한 몇 가지 추가 내용에 대해 기술해 본다.

 

참고문서

김태민님의 쿠버네티스 강의 : https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B8%B0%EC%B4%88#curriculum

 

대세는 쿠버네티스 [초급~중급] - 인프런 | 강의

쿠버네티스는 앞으로 어플리케이션 배포/운영에 주류가 될 기술 입니다. 이 강좌를 통해 여러분도 대세에 쉽게 편승할 수 있게 됩니다., - 강의 소개 | 인프런

www.inflearn.com

https://kubernetes.io/ko/docs/concepts/services-networking/endpoint-slices/

 

엔드포인트슬라이스

기능 상태: Kubernetes v1.21 [stable] 엔드포인트슬라이스 는 쿠버네티스 클러스터 내의 네트워크 엔드포인트를 추적하는 간단한 방법을 제공한다. 이것은 엔드포인트를 더 확장하고, 확장 가능한 대

kubernetes.io

https://kubernetes.io/ko/docs/concepts/services-networking/dns-pod-service/

 

서비스 및 파드용 DNS

쿠버네티스는 파드와 서비스를 위한 DNS 레코드를 생성한다. 사용자는 IP 주소 대신에 일관된 DNS 네임을 통해서 서비스에 접속할 수 있다. 소개 쿠버네티스 DNS는 클러스터의 서비스와 DNS 파드를

kubernetes.io


 

 

해당 포스팅은 기존 블로그의 서비스 포스팅에서 이어진다.

https://zunoxi.tistory.com/52

 

Kubernetes #5. Kubernetes의 Pod와 Service(쿠버네티스 파드와 서비스)

개요 쿠버네티스에서의 Pod와 Service에 대한이해 Pod, Service in k8s 최근 쿠버네티스 실습을 통해 여러개의 서버에 클러스터를 구축하고 있는데, Pod부터 시작해서 개념을 한번 정리하고 가면 좋을것

zunoxi.tistory.com

 

 

서비스의 종류

쿠버네티스 오브젝트 중 서비스에 대해 알아본다. 파드의 경우 지정되는 IP가 랜덤하게 지정되고 재시작될 때마다 변하기 때문에 고정된 엔드포인트로의 호출이 어렵다. 또한, 여러 Pod에 같은 애플리케이션을 운용할 경우 이 Pod간의 로드밸런싱을 지원해줘야 하는데 서비스가 이런 역할을 한다.

 

서비스는 사용자가 직접 지우지 않는 한 IP가 변경되지 않는다. 또한, 서비스는 IP 지정이 가능함과 더불어 여러 Pod를 묶어서 로드밸런싱이 가능하다. 고유한 DNS 이름 역시 가질 수 있다. 이런 서비스라는 것의 몇 가지 종류를 알아보자.

 

 

ClusterIP

  • 서비스의 디폴트 타입으로 사용된다. 서비스를 클러스터 내부 ip에 노출시킨다.
  • 클러스터 안에는 파드를 위한 ip대역, 서비스를 위한 ip대역이 자동으로 할당된다. 서비스가 클러스터 ip로 만들어진 서비스라면 서비스의 접근은 쿠버네티스를 구성하고 있는 서버에서만 호출이 가능하다.
  • 해당 클러스터를 접근할 수 있는 접근권한을 갖고 있는 사람만 clusterIP에 접근할 수 있기 때문에, clusterIP로 설정했다고 하는 것은 내부 관리자만 접근이 가능하게 구현해 놨다는 의미이다.

 

Nodeport

  •  Nodeport 서비스가 라우팅 되는 ClusterIP 서비스가 자동으로 생성된다. 
  • 내부망에 있는 다른 서버 혹은 단말에서 접근하기 위해서는 node port서비스를 만들면 쿠버네티스 서버들에 3만번대 포트가 만들어지고 해당 Nodeport 서비스들과 연결이 된다. 
  • 쿠버네티스 관리자는 내부망에 있는 사람들에게 서버들 중 하나의 ip와 포트를 알려주면 내부망에 있는 사람들은 이걸 통해 해당 서비스에 연결이 가능하다. (포트는 디폴트로 랜덤으로 생성되나 지정하는 것도 가능하다.)
  • auto scailing과 같은 상황으로 네트워크 환경이 동적으로 변경되는 경우를 대비하여 load balancer를 사용해야 함

 

Load Balancer

  • aws, azure와 같이 클라우드 프로바이더를 통해 쿠버네티스 클러스터를 구축한 경우에 사용한다. (상용 클라우드 벤더를 이용한 경우)
  • 로드밸런서는 로드밸런서 타입의 서버를 만들었을 때 노드포트가 생성되며 이 포트에 로드밸런서가 연결되어 외부 사람들은 이 로드밸런서 포트를 통해 클러스터 서비스에 접근가능하다. 로드밸런서를 사용하기 위해서는 따로 물리 장비가 필요하다. 보통은 클라우드 벤더사가 제공하는 load balancer를 사용한다.
  • 즉, 외부 로드 밸런서가 라우팅 되는 Nodeport, ClusterIP 서비스를 자동으로 생성된다.

 

 

쿠버네티스 DNS 서버

  • 쿠버네티스 클러스터 안에는 dns server가 별도로 존재한다. DNS서버 안에는 서비스의 도메인 이름과 IP가 저장되는데, 예를 들어 pod가 특정 도메인에 접근을 하려고 했을 때, 쿠버네티스 DNS안에 찾는 도메인이 없을 경우 상위 내부망 DNS에 질의하여 IP를 확보한다. 
  • 마찬가지로 외부 DNS까지 접근을 할 수 있는데 이렇게 파드에서 dns를 통해 원하는 서비스나 외부에 접근이 가능하다. 

 

Headless 서비스

  • 서비스의 dns는 서비스의 이름과 네임스페이스, svc(서비스의 약어), dns 네임(cluster.local)이 조합되어 만들어진다.
  • 파드의 dns는 파드의 ip, 네임스페이스, pod(파드), dns이름이 결합되어 생성이 된다.
  • 위와 같은 방식을 FQDN이라고 하는데 pod이 pod을 다이렉트로 호출해야 할 경우, 파드의 ip를 기입해야 하기 때문에 현실적으로 사용하기 어렵다.
  • 따라서, pod가 다른 pod에 직접 연결하고 싶다면 서비스를 headless 서비스로 만들어서 연결시킬 수 있다. 이는 서비스 ClusterIP속성에 none이라고 넣는 것이고, 실제로 서비스의 ip가 만들어지지 않는다.
  • 이후 pod를 생성할 때 hostname 속성에 도메인 이름, 서브도메인에 서비스 이름을 넣는다. 
  • 예를 들어 default 네임스페이스에서 headless라는 이름을 가진 서비스를 만들고, ClusterIP를 none으로 설정, hostname이 pod1이라는 pod와 연결시키면 이 pod1에 직접연결이 필요할 시 'pod1.headlesss.default.svc.cluster.local' 을 호출해서 접근할 수 있다.

 

Endopoint

  • 서비스와 파드는 라벨을 통해서 서로 연결하게 되는데, 이것은 실제 쿠버네티스 입장에서는 사이에 엔드포인트를 만들어서 연결해 주는 매커니즘을 통해 연결하게 되는 것이다.
  • 쿠버네티스는 서비스의 이름과 동일한 Endpoint 를 설정하고 이 Endpoint안에는 파드의 접속정보를 기입하여 연결을 시켜주는 개념인데, 실제 파드와 서비스를 최초 만들 때 라벨 설정을 하지 않고 Endpoint를 수동으로 만들어서 서비스의 이름과 파드의 ip정보를 넣으면 라벨링 한 것과 동일하게 연결이 된다.
  • 이와 같은 방법으로 실제 특정 서비스가 연결된 엔드포인트에 pod ip가 아닌 특정 사이트의 도메인네임을 입력하면 해당 사이트에 연결되게 할 수 있다. 이럴 때 사용하는 것이 서비스에 external name을 다는 것이다.
  • 서비스에 External Name을 기입하면 pod가 해당 서비스를 호출했을 때 서비스는 DNS캐시를 통해 내부와 외부 DNS를 찾아 IP를 전달하고 pod는 이 정보를 통해 외부 사이트에 접근할 수 있다.
  • 해당 방법을 통해 기존 pod가 접근해야 하는 사이트의 변경이 필요한 경우 pod 재배포 필요 없이 service의 external name을 변경하여 쉽게 변경이 가능하다.

 

반응형

댓글