Post

WSL2에서 Ingress를 활용한 마이크로서비스 배포 환경 구축 A-Z

WSL2 환경에서 Docker Desktop 없이 Nginx Ingress Controller와 Kustomize를 활용하여 마이크로서비스 배포 환경을 구축하고, 초기 설정 중 발생하는 문제들을 해결하는 가이드입니다.

1. 개요

이 문서는 Docker Desktop 없이 순수 WSL2 환경에서, Kustomize와 Nginx Ingress Controller를 사용하여 확장 가능하고 유지보수가 용이한 쿠버네티스 마이크로서비스 배포 환경을 구축하는 모든 과정을 다룹니다.

이 가이드를 통해 각 서비스가 자신의 배포 설정을 독립적으로 관리하는 효율적인 GitOps 기반 아키텍처를 완성할 수 있습니다.

2. 준비물

  • WSL2 (Ubuntu 등)
  • kubectl 커맨드라인 툴
  • WSL2 내부에 설치된 쿠버네티스 클러스터 (예: k3s, Minikube, KinD)

3. 1단계: Kustomize를 활용한 디렉토리 구조 설계

마이크로서비스 아키텍처의 핵심은 각 서비스의 독립성입니다. kustomize를 사용하여 각 서비스가 자신의 배포 관련 모든 파일(Deployment, Service, Ingress 등)을 가지도록 구조를 설계합니다.

1
2
3
4
5
6
7
8
9
10
/deploy
├── backend-api/           # <--- 서비스 A
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   └── kustomization.yaml
├── user-service/          # <--- 서비스 B (미래에 추가될)
│   ├── ...
│   └── kustomization.yaml
└── kustomization.yaml     # <--- 최상위 Kustomization
  • deploy/<서비스명>/kustomization.yaml: 각 서비스에 필요한 모든 쿠버네티스 리소스를 정의합니다.

    1
    2
    3
    4
    5
    6
    
      apiVersion: kustomize.config.k8s.io/v1beta1
      kind: Kustomization
      resources:
      - deployment.yaml
      - service.yaml
      - ingress.yaml
    
  • deploy/kustomization.yaml: 전체 환경에 배포할 서비스들의 목록을 관리합니다.

    1
    2
    3
    4
    5
    
      apiVersion: kustomize.config.k8s.io/v1beta1
      kind: Kustomization
      resources:
        - backend-api
        # - user-service  #<- 새 서비스는 여기에 한 줄만 추가하면 됨
    

4. 2단계: Nginx Ingress Controller 설치

클러스터 외부의 요청을 내부 서비스로 연결해 줄 트래픽 경찰, Nginx Ingress Controller를 설치합니다.

1
2
3
4
5
# Nginx Ingress Controller 설치
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

# 설치 확인 (ingress-nginx 네임스페이스의 Pod이 Running 상태가 될 때까지 확인)
kubectl get pods -n ingress-nginx

5. 3단계: 쿠버네티스 리소스 정의 (deployment, service, ingress)

각 서비스 폴더에 필요한 파일을 작성합니다. 여기서 가장 중요한 것은 ingress.yamlingressClassName: nginx를 명시하여, 이 규칙이 Nginx 컨트롤러의 책임임을 알려주는 것입니다.

  • deployment.yaml: 애플리케이션 파드를 정의합니다.
  • service.yaml: 파드에 안정적인 내부 네트워크 주소를 제공합니다.
  • ingress.yaml: 외부 요청을 서비스로 연결하는 규칙을 정의합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: backend-api-ingress
      spec:
        ingressClassName: nginx # <-- 매우 중요!
        rules:
        - host: "api.example.local"
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: backend-api-service
                  port:
                    number: 8080 # service.yaml에 정의된 포트
    

6. 4단계: 애플리케이션 배포 및 내부 테스트

모든 준비가 끝났습니다. kustomize를 통해 클러스터에 애플리케이션을 배포하고 curl로 내부 통신이 정상적인지 확인합니다.

1
2
3
4
5
# 배포
kubectl apply -k deploy

# 내부 통신 테스트
curl --verbose --header "Host: api.example.local" http://127.0.0.1

curl 테스트가 성공하면, 클러스터 내부의 모든 설정은 완벽하게 완료된 것입니다.

This post is licensed under CC BY 4.0 by the author.