Kubernetes에서 Pod는 동적인 존재이므로, IP 주소가 변경될 수 있습니다.
이러한 Pod 간의 통신을 안정적으로 유지하고, 외부에서 Kubernetes 내부 서비스에 접근하려면 Service와 Ingress를 활용해야 합니다.
이번 글에서는 Service와 Ingress의 개념, 동작 방식, 그리고 실전 활용법을 정리하겠습니다.
🔹 Service란?
Kubernetes의 Service는 Pod의 네트워크 액세스를 안정적으로 관리하는 리소스입니다.
Pod는 재시작될 때마다 IP 주소가 변경될 수 있으므로, Service를 통해 변하지 않는 고정된 엔드포인트를 제공합니다.
✔️ 동적인 Pod에 대한 고정된 접근 경로 제공
✔️ 클러스터 내부 또는 외부에서 접근 가능
✔️ Pod 간 부하 분산 (Load Balancing) 가능
🔹 Service 유형
유형 설명
ClusterIP (기본값) | 클러스터 내부에서만 접근 가능 |
NodePort | 각 노드의 특정 포트를 통해 외부에서 접근 가능 |
LoadBalancer | 클라우드 제공자의 로드밸런서를 사용하여 외부 접근 가능 |
ExternalName | 도메인(CNAME) 기반으로 외부 서비스와 연결 |
💡 기본적으로 ClusterIP가 설정되며, 외부에서 접근하려면 NodePort 또는 LoadBalancer를 사용해야 합니다.
🔹 ClusterIP Service 예제
Pod 간 통신을 위한 기본적인 ClusterIP Service입니다.
apiVersion: v1 # Service 리소스의 API 버전
kind: Service # Service 리소스 선언
metadata:
name: my-service # Service의 이름
spec:
selector:
app: my-app # 이 레이블을 가진 Pod와 연결
ports:
- protocol: TCP # 통신 프로토콜 (TCP)
port: 80 # Service에서 노출할 포트
targetPort: 8080 # Pod의 컨테이너에서 사용하는 포트
📌 주요 필드 설명
필드 설명
selector.app | app: my-app 레이블이 있는 Pod와 연결 |
ports.port | Service에서 외부로 노출할 포트 (고정) |
ports.targetPort | 실제 Pod의 컨테이너가 사용하는 포트 |
💡 my-service:80으로 접근하면 app=my-app 레이블을 가진 Pod의 8080 포트로 트래픽이 전달됩니다.
🔹 NodePort Service 예제
외부에서 접근할 수 있도록 각 노드의 특정 포트를 개방하는 Service입니다.
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort # 외부 노출을 위한 NodePort 서비스
selector:
app: my-app
ports:
- protocol: TCP
port: 80 # Service에서 노출하는 포트
targetPort: 8080 # Pod 내부 컨테이너 포트
nodePort: 30080 # 클러스터 외부에서 접근할 포트 (30000~32767 사이)
💡 각 노드의 http://<노드 IP>:30080으로 접근하면 app=my-app Pod의 8080 포트로 연결됩니다.
🔹 LoadBalancer Service 예제
클라우드 환경(AWS, GCP, Azure)에서 외부 로드밸런서를 생성하는 Service입니다.
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer # 클라우드 로드밸런서 사용
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
💡 클라우드 환경에서 LoadBalancer 타입을 사용하면 자동으로 외부 IP가 할당됩니다.
💡 온프레미스 환경에서는 MetalLB 같은 추가 설정이 필요합니다.
🔹 Ingress란?
Ingress는 Kubernetes에서 HTTP(S) 트래픽을 관리하는 API Gateway 역할을 합니다.
✔️ 도메인 기반 라우팅 지원 (example.com → 특정 Service)
✔️ SSL/TLS 인증서 적용 가능 (HTTPS 지원)
✔️ 외부 로드밸런서를 사용하지 않고도 트래픽 관리 가능
💡 Ingress는 단독으로 동작하지 않으며, Ingress Controller(Nginx, Traefik 등)가 필요합니다.
🔹 Ingress 예제
아래 예제는 example.com 도메인으로 요청이 들어오면 my-service로 트래픽을 전달하는 설정입니다.
apiVersion: networking.k8s.io/v1 # Ingress 리소스의 API 버전
kind: Ingress # Ingress 리소스 선언
metadata:
name: my-ingress # Ingress의 이름
spec:
rules:
- host: example.com # 도메인 설정
http:
paths:
- path: "/" # 루트 경로 (`/`)
pathType: Prefix # 접두사 매칭
backend:
service:
name: my-service # 트래픽을 전달할 Service
port:
number: 80 # Service의 포트
📌 주요 필드 설명
필드 설명
rules.host | 특정 도메인에 대한 라우팅 설정 (example.com) |
paths.path | 요청 경로 (/는 모든 요청) |
backend.service.name | 요청을 보낼 Service 이름 |
backend.service.port.number | 연결할 Service 포트 |
💡 Ingress Controller(Nginx 등)가 필요하며, 도메인 example.com이 Ingress IP를 가리켜야 합니다.
🔹 Ingress + 여러 개의 서비스 라우팅
여러 개의 서비스를 example.com/api 또는 example.com/web로 분리할 수 있습니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: "/api"
pathType: Prefix
backend:
service:
name: api-service # API 요청을 처리하는 서비스
port:
number: 8080
- path: "/web"
pathType: Prefix
backend:
service:
name: web-service # 웹 애플리케이션 서비스
port:
number: 80
💡 example.com/api 요청은 api-service:8080으로,
💡 example.com/web 요청은 web-service:80으로 전달됩니다.
🚀 마무리
✔️ Service는 Pod 간의 네트워크 연결을 안정적으로 유지
✔️ Ingress는 도메인 기반으로 HTTP 트래픽을 관리
✔️ LoadBalancer와 NodePort를 활용하면 외부에서 접근 가능
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
Kubernetes 리소스 시리즈 #8: ConfigMap & Secret (구성 및 스토리지 리소스) (0) | 2025.03.05 |
---|---|
Kubernetes 리소스 시리즈 #7: NetworkPolicy (서비스 및 네트워크 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #5: Job & CronJob (워크로드 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #4: DaemonSet (워크로드 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #3: StatefulSet (워크로드 리소스) (0) | 2025.03.04 |