Kubernetes

Kubernetes - Ingress Controller

rygus 2025. 10. 9. 21:01
728x90

안녕하세요. 

오늘은 Ingress Controller에 대해 알아보겠습니다. 

# Ingress Controller 란? 

쿠버네티스가 지원하는 파드, 컨트롤러와 같은 API 중 하나로 웹 기반의 서비스를 외부에서 접속 가능하게 해 줍니다.

대표적으로 아래와 같은 기능을 제공합니다. 

  • Service에 외부 URL을 제공
  • 트래픽을 로드밸런싱
  • SSL 인증서 처리
  • Virtual hosting을 지정

간단히 말해서 7 계층 로드밸런서의 역할을 합니다.

이러한 Ingress Controller에는 다양한 오픈 소스가 존재합니다. 

  • NGINX Ingress Controller
  • Traefik
  • HAProxy
  • Istio Gateway
  • 클라우드별 컨트롤러 (AWS, GCP)

저희는 NGINX Ingress Controller로 테스트를 진행하겠습니다.

 

Ingress Controller를 사용하기 위해서는 Ingress도 필요한데요.

Ingress는 일종의 경로 역할을 합니다.

예를 들어 아래와 같이 Login 홈페이지와 Main 홈페이지를 URL 기반으로 나누었을 때 

 

www.test.com/login → login 파드

www.test.com/main → main 파드

 

Ingress는 url을 감지하여 알맞은 서비스에 연결하는 역할을 합니다. 

 

정리하면 HTTP(S) 요청에 대한 "라우팅 규칙"을 정의하는 Kubernetes 리소스가 Ingress이고

그 규칙을 실제로 해석하고 요청을 라우팅 하는 역할을 수행하는 것이 Ingress Controller 입니다.

 

# 테스트

직접 배포하여 테스트해보겠습니다. 

참고로 저는 VMware 환경에서 테스트를 진행하고 있습니다.

 

먼저 헬름을 설치하겠습니다. 

# Helm 스크립트 설치
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

# 스크립트에 실행 권한 부여
chmod 700 get_helm.sh

# Helm 설치
./get_helm.sh

# Helm 버전 확인
helm version

위와 같이 나오면 설치 성공입니다.

 

helm upgrade --install ingress-nginx ingress-nginx   --repo https://kubernetes.github.io/ingress-nginx   --namespace ingress-nginx --create-namespace

 

 

이제 helm을 통해서 nginx ingress controller를 배포하겠습니다. 

 

설치 후 `kubectl get all -n ingress-nginx` 명령어시 위와 같이 출력되면 설치 성공입니다. 

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: login-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-login
  template:
    metadata:
      labels:
        app: nginx-login
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: html-volume
          mountPath: /usr/share/nginx/html
      volumes:
      - name: html-volume
        configMap:
          name: login-html
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: login-html
data:
  index.html: |
    <html>
    <body>
    login
    </body>
    </html>
---
apiVersion: v1
kind: Service
metadata:
  name: ingress-svc-login
spec:
  selector:
    app: nginx-login
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-login
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /login
        pathType: Prefix
        backend:
          service:
            name: ingress-svc-login
            port:
              number: 80

먼저 로그인 페이지 리소스들부터 배포하겠습니다.

`kubectl apply -f login.yml` 명령어로 deployment, service, ingress를 배포합니다.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: main-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-main
  template:
    metadata:
      labels:
        app: nginx-main
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: html-volume
          mountPath: /usr/share/nginx/html
      volumes:
      - name: html-volume
        configMap:
          name: main-html
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: main-html
data:
  index.html: |
    <html>
    <body>
      main
    </body>
    </html>
---
apiVersion: v1
kind: Service
metadata:
  name: ingress-svc-main
spec:
  selector:
    app: nginx-main
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-main
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /main
        pathType: Prefix
        backend:
          service:
            name: ingress-svc-main
            port:
              number: 80

이제 main 페이지용 리소스를 배포하겠습니다.

`kubectl apply -f main.yml` 명령어로 배포하겠습니다.

 

위와 같이 나오면 성공입니다. 

 

이제 테스트를 진행해야 하는데요. 

해당 EXTERNAL-IP로 접근하겠습니다. 

 

/login url 접근 

 

/main url 접근 

 

위와 같이 나오면 성공

 

감사합니다. 

 

참고 : 

https://metallb.io/

 

MetalLB :: MetalLB, bare metal load-balancer for Kubernetes

MetalLB is a load-balancer implementation for bare metal Kubernetes clusters, using standard routing protocols. Note Despite the beta status of the project / API, MetalLB is known to be stable and reliable. The project maturity page explains what that impl

metallb.io

https://kubernetes.io/docs/concepts/services-networking/ingress/

 

Ingress

Make your HTTP (or HTTPS) network service available using a protocol-aware configuration mechanism, that understands web concepts like URIs, hostnames, paths, and more. The Ingress concept lets you map traffic to different backends based on rules you defin

kubernetes.io