티스토리 뷰
쿠버네티스는 러닝커브가 가파르다고 느껴져 하나부터 열까지 알고 사용하기보다는 일단 실무에서 부딪혀보고 원리는 필요할 때 익히자라는 계획이었는데, 반복해서 접한 내용을 정리하는건 어느정도 쿠버네티스에 대한 찍먹해본 지금이 적기라고 생각해 조금씩 포스팅을 해보려고 한다.
아마 다뤄야 할 주제가 산더미겠지만, 그 중에서 먼저 서비스
를 활용한 cluster 내부 파드
간 통신에 대해서 학습한 내용을 정리해보려고 한다 🔥
1. 서비스란?
내부 파드
간 통신의 원리를 알기 위해 먼저 서비스
와 관련된 기본적인 정보에 대해서 먼저 가볍게 살펴보자. 처음에는 와닿지 않을 수 있지만, 몇번 접하다보면 어렵지 않게 이해할 수 있는 내용이다.
용도
파드
간 네트워크 연결 담당
필요한 이유
- 기존 가상 머신 환경처럼
파드
간 연결에 고정된 IP 주소를 이용하면, 쿠버네티스 환경에서 새롭게 생성되는파드
는 기존파드
와 IP 주소가 다르므로 IP 주소를 환경변수 파일 등에서 수정해야 하므로 추가 시간이 필요하게 됨 - 쿠버네티스
서비스
는 이처럼 실시간으로파드
가 종료되고 생성되는 환경에서파드
간 연결을 자동으로 가능하게 함
특징
서비스
는 쿠버네티스 리소스의 한 종류- 동적으로 종료/생성되는
파드
를 자동으로 발견(Service Discovery
) - (변경이 잦은) IP 주소가 아닌 지속 가능한 도메인 레코드(
DNS
) 기반의 쿠버네티스서비스
이름을 이용해 통신 → 이번 포스팅에서 주로 살펴볼 내용 - 노드 내 여러
파드
로 부하를 분산하는load balancing
기능 지원
종류
- 클러스터 내부에서
파드
와파드
연결:ClusterIP
→ 이번 포스팅에서 살펴볼 타입,Headless
- 클러스터 외부에서 클러스터 내부의
파드
연결:NodePort
,LoadBalancer
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
디플로이먼트, 파드 생성 확인
서비스 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 파드 접속
$ k exec -it busybox -- sh
busybox 파드에서 서비스 연결
busybox 파드
에서 서비스
이름을 활용해 wget 명령어 수행이 가능하다. 즉, 가상 머신 환경과 다르게 파드 간 연결은 고정적이지 않은 IP 주소를 사용하는 것이 아니라 고정된 서비스
이름으로 연결 할 수 있다. → 즉, 내부 파드 간 통신이 가능함을 확인
내부적으로 서비스
이름을 호출하면 쿠버네티스 DNS가 서비스를 생성할 때 등록한 CLUSTER-IP(서비스 타입의 ClusterIP와는 다름) 주소를 응답하므로, 결과적으로 클라이언트는 해당 CLUSTER-IP로 요청을 전달하게 된다.
이를 다른 명령어를 통해 살펴보자면 busybox 파드
에서 서비스
이름으로 nslookup 명령어를 수행하면(즉, 도메인 이름 레코드 질의), 서비스
를 조회했을 때 나오는 CLUSTER-IP
와 같은 결과를 확인할 수 있다.
5. CLUSTER-IP란
직전에 살펴본 CLUSTER-IP
란 서비스
이름으로 도메인 이름 레코드를 질의 했을 때 나오는 결과인데, 이 주소는 파드
와 연결을 담당하는 가상 IP(Virtual IP)이다.
클라이언트가 이 CLUSTER-IP
로 접속하면, 이 가상 IP 주소가 실제 파드
의 IP 주소로 리다이렉트를 한다. → 서비스 타입의 이름이 ClusterIP인 이유가 CLUSTER-IP를 사용하기 때문
ClusterIP 서비스 타입의 통신 프로세스
내부 파드
간 통신 프로세스를 정리하자면 다음과 같다.
서비스
이름을 도메인 이름으로 질의하면, 가상 IP(Cluster IP)를 응답한다.- 이 가상 IP는 실제
파드
의 IP로 리다이렉트되어 사용자는 실제파드
의 IP와 연결할 수 있다.
참고 자료 🙇♂️
'컨테이너' 카테고리의 다른 글
[container] 리눅스 기능을 활용해 컨테이너 만들어보기 (1) | 2024.03.22 |
---|