NGINX Ingress Controller 라우팅 Host 및 Path 기반으로 설정

이 포스트는 Kubernetes 클러스터에 Ingress를 정의하여 NGINX Ingress Controller 라우팅 설정을 하는 방법에 대해 설명합니다.

Kubernetes의 역동적인 세계에서는 애플리케이션의 원활한 운영을 위해 효율적인 트래픽 관리가 가장 중요합니다. Kubernetes 클러스터 내에서 트래픽을 관리하는 가장 강력한 도구 중 하나는 NGINX Ingress Controller입니다. 이 다목적 도구를 사용하면 사전 정의된 규칙을 기반으로 외부 트래픽을 적절한 서비스로 라우팅할 수 있으므로 모든 Kubernetes 배포에 중요한 구성 요소가 됩니다.

목차

1. 소개
2. NGINX Ingress Controller 라우팅 설정을 위한 사전구성
3. Host 기반 NGINX Ingress Controller 라우팅 설정

4. Path 기반 NGINX Ingress Controller 라우팅 설정
5. 와일드카드 라우팅 설정

1. 소개

NGINX Ingress Controller 라우팅

NGINX Ingress Controller은 Kubernetes 환경에서 클러스터 내부의 서비스에 대한 라우팅 및 로드 밸런싱을 설정할 수 있습니다. Ingress 리소스를 사용하여 host 기반, path 기반, 그리고 와일드카드와 같은 다양한 라우팅 규칙을 정의할 수 있습니다. 이를 통해 서비스에 대한 진입점을 동적으로 관리하고 외부에서의 접근을 관리할 수 있습니다.

NGINX Ingress Controller는 Kubernetes 생태계의 필수 부분으로 트래픽 라우팅을 위한 안정적이고 확장 가능한 방법을 제공합니다. Ingress Controller로서 Kubernetes Ingress 리소스에 대한 변경 사항을 수신하고 NGINX 구성을 동적으로 업데이트합니다. 이를 통해 개발자는 클러스터 내의 다양한 서비스로 트래픽을 전달하는 라우팅 규칙을 정의할 수 있습니다.

Kubernetes의 라우팅은 단순히 트래픽을 전달하는 것 이상입니다. 올바른 구성으로 올바른 서비스에 도달하도록 보장하는 것입니다. 적절한 라우팅은 최적의 성능을 보장하고 보안을 강화하며 전반적인 사용자 경험을 향상시킵니다. NGINX Ingress Controller를 사용하면 관리자는host 및 path 기반 라우팅을 모두 활용하여 최신 애플리케이션의 요구 사항을 충족하는 정교한 트래픽 관리 전략을 만들 수 있습니다.

2. NGINX Ingress Controller 라우팅 설정을 위한 사전구성

NGINX Ingress Controller를 통해서 라우팅 될 backend1, backend2 의 deployment, 서비스를 다음과 같이 구성하였습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend1
  template:
    metadata:
      labels:
        app: backend1
    spec:
      containers:
      - name: backend1
        image: nginxdemos/nginx-hello:plain-text
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: backend1-svc
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: backend1
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend2
  template:
    metadata:
      labels:
        app: backend2
    spec:
      containers:
      - name: backend2
        image: nginxdemos/nginx-hello:plain-text
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: backend2-svc
  labels:
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: backend2

컨테이너의 서버는 200 코드와 함께 서버 주소, 서버 이름, 요청 시간, 요청 URI, 요청 ID를 반환합니다.

server {
    listen 8080;
    listen [::]:8080;

    location / {
        default_type text/plain;
        expires -1;
        return 200 'Server address: $server_addr:$server_port\nServer name: $hostname\nDate: $time_local\nURI: $request_uri\nRequest ID: $request_id\n';
    }
}

생성된 pod와 서비스는 다음과 같습니다.

kubectl get pod,service


NAME                            READY   STATUS    RESTARTS   AGE
pod/backend1-584b5f78fb-bcc4f   1/1     Running   0          29s
pod/backend1-584b5f78fb-zrdtl   1/1     Running   0          29s
pod/backend2-7464c479f8-rpg62   1/1     Running   0          29s

NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/backend1-svc   ClusterIP   10.102.194.233    <none>        80/TCP    29s
service/backend2-svc   ClusterIP   10.107.124.18     <none>        80/TCP    29s

Kubernetes 클러스터 외부에서 Ingress Controller를 통해 클러스터 내부의 서비스에 접근하기 위해 NodePort 서비스의 포트 번호가 필요합니다.
배포 중인 Ingress controller의 NodePort 서비스를 확인합니다.

# kubectl get svc -n nginx-ingress

NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
nginx-ingress   NodePort   10.102.97.200   <none>        80:30348/TCP,443:32253/TCP   15m

30348 포트로 http 요청을 수신함을 확인할 수 있습니다.

3. Host 기반 NGINX Ingress Controller 라우팅 설정

host 기반 라우팅 설정을 통해 특정 주소와 해당하는 서비스를 연결할 수 있습니다.

host 기반 라우팅 설정을 위한 Ingress 파일을 작성합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
  name: ingress-host
spec:
  rules:
  - host: example1.com
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: backend1-svc
              port:
                number: 80
  - host: example2.com
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: backend2-svc
              port:
                number: 80

example1.com으로 연결 시 backend1-svc 서비스로, example2.com으로 연결 시 backend2-svc 서비스로 연결됩니다.

작성한 Ingress 규칙을 배포하고, 작동을 확인합니다.

# kubectl apply -f host.yaml

# kubectl get ingress

NAME           CLASS    HOSTS                       ADDRESS   PORTS   AGE
ingress-host   <none>   example1.com,example2.com             80      78s

도메인명과 IP 주소를 매핑하기 위해 /etc/hosts 파일을 수정합니다.

# vi /etc/hosts

192.168.200.161 example1.com
192.168.200.42 example2.com

설정한 도메인에 Ingress controller를 통해 확인한 포트로 요청을 보내 결과를 확인합니다.

# curl example1.com:30348

Server address: 10.244.1.26:8080
Server name: backend1-584b5f78fb-bcc4f
Date: 08/Apr/2024:01:43:59 +0000
URI: /
Request ID: a16c176b0665df4396073754ce3f4b58

# curl example2.com:30348

Server address: 10.244.1.24:8080
Server name: backend2-7464c479f8-rpg62
Date: 08/Apr/2024:01:45:28 +0000
URI: /
Request ID: a6e292518446fdb38cdb842a16d57f48

example1.com에는 backend1, example2.com에는 backend2 가 각각 대응하여 연결된 것을 확인할 수 있습니다.

4. Path 기반 NGINX Ingress Controller 라우팅 설정

path 기반 라우팅 설정을 통해 특정 URL 경로와 해당하는 서비스를 연결할 수 있습니다.

path 기반 라우팅 설정을 위한 Ingress 파일을 작성합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
  name: ingress-path
spec:
  rules:
  - host: example.com
    http:
      paths:
        - path: /backend1
          pathType: Prefix
          backend:
            service:
              name: backend1-svc
              port:
                number: 80
        - path: /backend2
          pathType: Prefix
          backend:
            service:
              name: backend2-svc
              port:
                number: 80

example.com/backend1 연결 시 backend1-svc 서비스로, example.com/backend2 연결 시 backend2-svc 서비스로 연결됩니다.

작성한 Ingress 규칙을 배포하고, 작동을 확인합니다.

# kubectl apply -f path.yaml

# kubectl get ingress

NAME           CLASS    HOSTS         ADDRESS   PORTS   AGE
ingress-path   <none>   example.com             80      15s

도메인명과 IP 주소를 매핑하기 위해 /etc/hosts 파일을 수정합니다.

# vi /etc/hosts

192.168.200.208 example.com

설정한 도메인에 Ingress controller를 통해 확인한 포트로 요청을 보내 확인합니다.

# curl example.com:30348/backend1

Server address: 10.244.1.26:8080
Server name: backend1-584b5f78fb-bcc4f
Date: 08/Apr/2024:01:58:01 +0000
URI: /backend1
Request ID: ec239ac9258ef09f8acf21b604b1f64d

# curl example.com:30348/backend2

Server address: 10.244.1.24:8080
Server name: backend2-7464c479f8-rpg62
Date: 08/Apr/2024:01:59:32 +0000
URI: /backend2
Request ID: 7c81678c4d18b9a12e2ffd2e5b5e94cb

example.com/backend1에는 backend1 서비스, example.com/backend2에는 backend2 서비스가 각각 대응하여 연결된 것을 확인할 수 있습니다.

5. 와일드카드 라우팅 설정

와일드카드 라우팅 설정을 통해 여러 서브도메인에 대한 요청을 하나로 처리할 수 있습니다.

와일드카드 라우팅 설정을 위한 Ingress 파일을 작성합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
  name: ingress-wc
spec:
  rules:
  - host: "*.example.com"
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: backend1-svc
              port:
                number: 80

example.com의 모든 서브도메인에 대한 요청이 backend1-svc 서비스로 연결됩니다.

작성한 Ingress 규칙을 배포하고, 작동을 확인합니다.

# kubectl apply -f wc.yaml 

# kubectl get ingress

NAME         CLASS    HOSTS            ADDRESS   PORTS   AGE
ingress-wc   <none>   *.example1.com             80      66s

도메인명과 IP 주소를 매핑하기 위해 /etc/hosts 파일을 수정합니다.

# vi /etc/hosts

192.168.200.208 test.example.com

설정한 도메인에 Ingress controller를 통해 확인한 포트로 요청을 보내 확인합니다.

# curl test.example.com:30348

Server address: 10.244.1.25:8080
Server name: backend1-584b5f78fb-zrdtl
Date: 08/Apr/2024:02:21:41 +0000
URI: /
Request ID: 041dd79f19b87c6fa144cead9ab8cd78

Ingress 파일에 test.example.com 도메인에 대한 정의가 없음에도, 와일드카드 라우팅에 의해 test.example.com으로 요청 시 backend1 서비스로 연결됨을 확인할 수 있습니다.

Kubernetes 클러스터의 Ingress 규칙에 대한 더 자세한 내용은 여기를 참조하세요.

NGINX Ingress Controller의 프로덕션 및 엔터프라이즈급 제품인 NGINX Plus Ingress Controller를 사용해보고 싶으시면 아래 양식을 통해 Trial License를 신청해서 사용해보세요!

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required