Skip to document
pieroot log
Markdown Preview

Kubernetes Ingress를 활용한 클러스터 서비스 외부 접근 관리의 모든 것

Frontmatter

Kubernetes Ingress를 사용해 ClusterIP 서비스 앞에 외부 HTTP(S) 라우팅 규칙을 설정하고, 단일 도메인·경로로 여러 서비스를 노출할 수 있다. 네임스페이스, ConfigMap, Deployment, Service, Ingress 리소스를 순차적으로 배포하고, Traefik이나 NGINX 등 Ingress Controller와 /etc/hosts 매핑을 통해 로컬 테스트한다. Ingress는 트래픽 라우팅, 도메인 매핑, 확장성을 제공해 효율적인 서비스 외부 접근을 가능하게 한다.

Kubernetes Ingress를 활용한 클러스터 서비스 외부 접근 관리의 모든 것

Kubernetes Ingress를 활용한 외부 접근 제어

Ingress는 클러스터 내부 Service에 대한 외부 접근을 HTTP(S) 라우팅 규칙으로 제어하는 리소스입니다. ClusterIP 타입 서비스 앞단에 위치하여 하나의 엔드포인트(도메인, 경로)로 여러 서비스를 노출할 수 있습니다.
notion image

구성 요소

이번 실습에서는 다음과 같은 리소스들을 구성합니다:
  • Namespace: file-server 네임스페이스 생성 (namespace.yaml)
  • ConfigMap & Deployment: 간단한 파일 업로드 서버 배포 (deployment.yaml)
  • Service: 백엔드 서비스를 ClusterIP로 노출 (service.yaml)
  • Ingress: file.test.com 도메인으로 서비스 라우팅 (ingress.yaml)

사전 준비

  • K3s 기본 Ingress Controller(traefik) 또는 별도의 Ingress Controller가 설치되어 있어야 합니다.
  • 로컬 테스트 시 /etc/hosts 에 마스터 노드 IP와 file.test.com을 매핑합니다.
bash
sudo sh -c 'echo "<MASTER_NODE_IP> file.test.com" >> /etc/hosts'

Ingress 리소스 정의

Ingress 리소스는 외부 트래픽을 내부 서비스로 라우팅하는 규칙을 정의합니다:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-file-server-ingress
  namespace: file-server
  annotations:
    # NGINX Ingress Controller 기준: 기본 백엔드로 80 사용
    # nginx.ingress.kubernetes.io/ssl-redirect: "false"   # HTTPS 강제 리다이렉트 비활성화 (HTTP만 사용)
    traefik.ingress.kubernetes.io/router.tls: "false"
spec:
  # ingressClassName: nginx   # 설치한 Ingress Controller의 클래스명. NGINX를 쓴다면 일반적으로 "nginx"
  ingressClassName: traefik
  rules:
    - host: file.test.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: simple-file-server-svc
                port:
                  number: 80

ConfigMap 및 Deployment 구성

애플리케이션 설정과 배포 정의를 포함합니다:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: simple-file-server-config
  namespace: file-server
data:
  PORT: "3001"
  LOG_PATH: "/var/log/app.log"
  UPLOAD_DIR: "/var/uploads"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-file-server
  namespace: file-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: simple-file-server
  template:
    metadata:
      labels:
        app: simple-file-server
    spec:
      nodeSelector:
        kubernetes.io/hostname: "worker-1"
      containers:
        - name: simple-file-server
          image: ghcr.io/jung-geun/simple-file-server:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3001
          env:
            - name: PORT
              valueFrom:
                configMapKeyRef:
                  name: simple-file-server-config
                  key: PORT
            - name: LOG_PATH
              valueFrom:
                configMapKeyRef:
                  name: simple-file-server-config
                  key: LOG_PATH
            - name: UPLOAD_DIR
              valueFrom:
                configMapKeyRef:
                  name: simple-file-server-config
                  key: UPLOAD_DIR
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "250m"
              memory: "256Mi"

Service 리소스 정의

백엔드 파드를 ClusterIP 타입으로 노출합니다:
yaml
apiVersion: v1
kind: Service
metadata:
  name: simple-file-server-svc
  namespace: file-server
spec:
  selector:
    app: simple-file-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3001
  type: ClusterIP

배포 순서

다음 순서대로 리소스를 배포합니다:
bash
# 네임스페이스 생성
kubectl apply -f namespace.yaml

# 애플리케이션 및 서비스 배포
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# Ingress 생성
kubectl apply -f ingress.yaml

확인 방법

배포된 리소스 상태를 확인하고 접근 테스트를 수행합니다:
bash
# 리소스 상태 확인
kubectl get all -n file-server
kubectl describe ingress simple-file-server-ingress -n file-server

# 브라우저 또는 curl로 접근
curl http://file.test.com/

정리

이 문서에서는 Kubernetes Ingress를 사용하여 클러스터 내부 서비스를 외부에 노출하는 방법을 알아보았습니다. Ingress는 HTTP(S) 레벨에서 트래픽을 라우팅하여 효율적인 서비스 노출이 가능합니다.
  • Ingress 규칙은 기본적으로 HTTP/HTTPS 트래픽을 라우팅합니다.
  • ingress.yaml의 ingressClassName을 사용 중인 컨트롤러에 맞게 조정할 수 있습니다.
  • 여러 경로 또는 호스트를 추가하여 단일 엔드포인트로 여러 서비스를 노출할 수 있습니다.

핵심 정리

✅ Ingress 역할: ClusterIP 서비스 앞단에서 HTTP(S) 라우팅 규칙으로 외부 접근 제어
✅ 구성 요소: Namespace, ConfigMap, Deployment, Service, Ingress 리소스로 구성
✅ Ingress Controller: K3s의 기본 Traefik 또는 NGINX 등 다양한 컨트롤러 사용 가능
✅ 도메인 라우팅: 단일 엔드포인트(도메인)로 여러 서비스 노출 가능
✅ 로컬 테스트: /etc/hosts 파일 수정으로 도메인 매핑 후 curl 또는 브라우저로 접근 확인
✅ 확장성: 여러 경로(path)와 호스트(host) 규칙을 추가하여 복잡한 라우팅 구현 가능