티스토리 뷰

쿠버네티스는 러닝커브가 가파르다고 느껴져 하나부터 열까지 알고 사용하기보다는 일단 실무에서 부딪혀보고 원리는 필요할 때 익히자라는 계획이었는데, 반복해서 접한 내용을 정리하는건 어느정도 쿠버네티스에 대한 찍먹해본 지금이 적기라고 생각해 조금씩 포스팅을 해보려고 한다. 

 

아마 다뤄야 할 주제가 산더미겠지만, 그 중에서 먼저 서비스를 활용한 cluster 내부 파드 간 통신에 대해서 학습한 내용을 정리해보려고 한다 🔥

 

반복되는 이 상황을 벗어나보자

 

 

1. 서비스란?

내부 파드 간 통신의 원리를 알기 위해 먼저 서비스와 관련된 기본적인 정보에 대해서 먼저 가볍게 살펴보자. 처음에는 와닿지 않을 수 있지만, 몇번 접하다보면 어렵지 않게 이해할 수 있는 내용이다.

용도

  • 파드 간 네트워크 연결 담당

 

필요한 이유

  • 기존 가상 머신 환경처럼 파드 간 연결에 고정된 IP 주소를 이용하면, 쿠버네티스 환경에서 새롭게 생성되는 파드는 기존 파드와 IP 주소가 다르므로 IP 주소를 환경변수 파일 등에서 수정해야 하므로 추가 시간이 필요하게 됨
  • 쿠버네티스 서비스는 이처럼 실시간으로 파드가 종료되고 생성되는 환경에서 파드 간 연결을 자동으로 가능하게 함

 

특징

  • 서비스는 쿠버네티스 리소스의 한 종류
  • 동적으로 종료/생성되는 파드를 자동으로 발견(Service Discovery)
  • (변경이 잦은) IP 주소가 아닌 지속 가능한 도메인 레코드(DNS) 기반의 쿠버네티스 서비스 이름을 이용해 통신 → 이번 포스팅에서 주로 살펴볼 내용
  • 노드 내 여러 파드로 부하를 분산하는 load balancing 기능 지원

 

종류

  • 클러스터 내부에서 파드와 파드 연결: ClusterIP → 이번 포스팅에서 살펴볼 타입, Headless
  • 클러스터 외부에서 클러스터 내부의 파드 연결: NodePortLoadBalancer

 

 

2. 디플로이먼트, 서비스 생성

이번 글에서 다룰 내용이 클러스터 내부 파드 간 통신이므로, 여러 타입 중 ClusterIP 타입의 서비스를 사용할 예정이다. 먼저 실습을 위해 디플로이먼트와 서비스를 만들어보자.

 

 

디플로이먼트 yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hello
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginxdemos/hello

 

 

디플로이먼트, 파드 생성 확인

참고로, "k='kubectl '"로 alias를 등록해두었다.

 

서비스 yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  type: ClusterIP
  ports:
    - name: tcp
      port: 80
      targetPort: 80

 

 

서비스 생성 확인

 

 

3. 엔드포인트 생성 확인

셀렉터를 이용해 서비스를 생성하면 자동으로 엔드포인트가 만들어지는데, 엔드포인트서비스에서 관리하는 도착 종료 지점이다. 공식 문서에 따르면, 엔드포인트는 일반적으로 트래픽을 전송할 수 있는 파드를 정의하기 위해 서비스에서 참조한다고 한다.

 

아래의 예시를 살펴보면, 클라이언트가 서비스 이름으로 호출 시 도착하는 실제 파드의 IP 주소를 확인할 수 있다.

 

 

엔드포인트 및 파드 정보

 

 

4. 파드 간 연결 확인

busybox 파드 생성

이번 포스팅에서 확인하고자 했던, 파드 간 연결을 살펴보기 위해 busybox 파드를 생성한다.

$ k run busybox --image=busybox:1.28 -- sleep 1d

 

busybox 파드 생성 확인

 

busybox 파드 접속

$ k exec -it busybox -- sh

 

 

busybox 파드에서 서비스 연결

busybox 파드에서 서비스 이름을 활용해 wget 명령어 수행이 가능하다. 즉, 가상 머신 환경과 다르게 파드 간 연결은 고정적이지 않은 IP 주소를 사용하는 것이 아니라 고정된 서비스 이름으로 연결 할 수 있다. → 즉, 내부 파드 간 통신이 가능함을 확인

 

wget 명령어

내부적으로 서비스 이름을 호출하면 쿠버네티스 DNS가 서비스를 생성할 때 등록한 CLUSTER-IP(서비스 타입의 ClusterIP와는 다름) 주소를 응답하므로, 결과적으로 클라이언트는 해당 CLUSTER-IP로 요청을 전달하게 된다.

 

 

이를 다른 명령어를 통해 살펴보자면 busybox 파드에서 서비스 이름으로 nslookup 명령어를 수행하면(즉, 도메인 이름 레코드 질의), 서비스를 조회했을 때 나오는 CLUSTER-IP와 같은 결과를 확인할 수 있다.

 

nslookup 명령어
서비스 조회

 

 

5. CLUSTER-IP란

직전에 살펴본 CLUSTER-IP서비스 이름으로 도메인 이름 레코드를 질의 했을 때 나오는 결과인데, 이 주소는 파드와 연결을 담당하는 가상 IP(Virtual IP)이다.

 

클라이언트가 이 CLUSTER-IP로 접속하면, 이 가상 IP 주소가 실제 파드의 IP 주소로 리다이렉트를 한다. → 서비스 타입의 이름이 ClusterIP인 이유가 CLUSTER-IP를 사용하기 때문

 

 

ClusterIP 서비스 타입의 통신 프로세스

내부 파드 간 통신 프로세스를 정리하자면 다음과 같다.

 

  • 서비스 이름을 도메인 이름으로 질의하면, 가상 IP(Cluster IP)를 응답한다.
  • 이 가상 IP는 실제 파드의 IP로 리다이렉트되어 사용자는 실제 파드의 IP와 연결할 수 있다.

 


참고 자료 🙇‍♂️

댓글