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은 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를 신청해서 사용해보세요!
댓글을 달려면 로그인해야 합니다.