Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #6: Service & Ingress (서비스 및 네트워크 리소스)

ygtoken 2025. 3. 5. 00:15
728x90

Kubernetes에서 Pod는 동적인 존재이므로, IP 주소가 변경될 수 있습니다.
이러한 Pod 간의 통신을 안정적으로 유지하고, 외부에서 Kubernetes 내부 서비스에 접근하려면 ServiceIngress를 활용해야 합니다.

이번 글에서는 Service와 Ingress의 개념, 동작 방식, 그리고 실전 활용법을 정리하겠습니다.


🔹 Service란?

Kubernetes의 ServicePod의 네트워크 액세스를 안정적으로 관리하는 리소스입니다.
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를 활용하면 외부에서 접근 가능

 

728x90