1. Service 개요
Kubernetes에서 Pod는 동적으로 생성되고 삭제되므로, 특정 Pod의 IP 주소를 직접 참조하는 것은 어렵다. 이를 해결하기 위해 Kubernetes는 Service라는 추상화 개념을 제공하여, Pod 간 통신을 안정적으로 유지할 수 있도록 한다.
Service는 동일한 역할을 하는 여러 Pod를 묶어 단일 엔드포인트(IP 및 DNS)로 접근할 수 있도록 해준다. 이를 통해 클라이언트는 특정 Pod가 아니라 Service를 통해 트래픽을 전달받을 수 있다.
2. Service의 주요 타입
Kubernetes에서 제공하는 Service 유형은 다음과 같다.
2.1 ClusterIP (기본값)
- 클러스터 내부에서만 접근 가능한 서비스
- 서비스가 생성되면, 내부 가상 IP가 할당되며 클러스터 내부에서만 접근 가능
- 기본적인 내부 통신용으로 사용됨
- 예제:
apiVersion: v1
kind: Service
metadata:
name: my-clusterip-service.
spec:
selector:
app: my-app.
ports:
- protocol: TCP
port: 80
targetPort: 8080
2.2 NodePort
- 클러스터 외부에서도 접근 가능한 서비스
- 클러스터 내 모든 노드에 동일한 포트를 열어 외부 트래픽을 전달
30000-32767
범위의 포트 중 하나가 자동 할당됨- 외부에서
NodeIP:NodePort
를 통해 서비스 접근 가능 - 예제:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080
2.3 LoadBalancer
- 클라우드 환경(AWS, GCP, Azure)에서 L4 로드밸런서를 자동으로 생성
- 외부에서 직접 접근할 수 있는 퍼블릭 IP가 할당됨
- 트래픽을 클러스터 내부의 Pod로 분산
- 예제:
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
2.4 ExternalName
- DNS 이름을 직접 반환하는 서비스
- Kubernetes 내부 서비스가 아닌 외부 서비스(AWS RDS, API Gateway 등)와 연결할 때 사용
- 예제:
apiVersion: v1
kind: Service
metadata:
name: my-external-service
spec:
type: ExternalName
externalName: example.com
3. Kubernetes의 서비스 디스커버리
Kubernetes에서 서비스 디스커버리는 크게 두 가지 방식으로 이루어진다.
3.1 환경 변수 기반 디스커버리
Pod가 생성될 때, 해당 네임스페이스의 Service 정보를 자동으로 환경 변수로 추가한다.
- 예를 들어
my-service
가 존재하면, 해당 서비스의 환경 변수가 다음과 같이 설정됨:MY_SERVICE_SERVICE_HOST=10.100.200.1
MY_SERVICE_SERVICE_PORT=80
- 하지만, 환경 변수를 이용한 방식은 동적으로 변경되는 서비스를 반영하기 어렵기 때문에 DNS 기반 서비스 디스커버리가 더 일반적으로 사용됨.
3.2 DNS 기반 디스커버리 (CoreDNS 활용)
Kubernetes 클러스터에서는 기본적으로 CoreDNS가 실행되며, 모든 Service는 자동으로 svc.cluster.local
도메인으로 등록됨.
예제: 서비스 간 DNS 기반 통신
my-service
가default
네임스페이스에 존재하는 경우:my-service.default.svc.cluster.local
busybox
컨테이너에서 서비스에 접근하는 방법:nslookup my-service.default.svc.cluster.local
curl http://my-service.default.svc.cluster.local:80
4. 정리
- Kubernetes의 Service는 Pod의 동적 IP 변화를 해결하고, 안정적인 네트워크 통신을 제공한다.
- ClusterIP, NodePort, LoadBalancer, ExternalName과 같은 다양한 서비스 타입이 있으며, 환경에 맞게 선택해야 한다.
- Kubernetes의 서비스 디스커버리는 환경 변수 기반과 DNS 기반 두 가지 방식이 있으며, 일반적으로 CoreDNS를 활용한 DNS 기반 방식이 더 많이 사용된다.
Kubernetes 네트워킹을 이해하는 것은 클러스터 운영 및 애플리케이션 배포에 매우 중요하다. 다음 글에서는 Ingress 및 Ingress Controller에 대해 자세히 알아보자! 🚀