Multiple Ingress Controller 배포하는 방법(For K8s)
Kubernetes 클러스터에서 여러 Ingress Controller 를 배포하는 것은 다양한 트래픽 관리 요구를 충족시키기 위해 중요합니다. 여러 Ingress Controller를 사용하면 내부와 외부 트래픽을 분리하거나 특정 애플리케이션의 트래픽을 별도로 관리할 수 있습니다. 이를 통해 보안 강화, 성능 최적화, 다양한 서비스 요구 사항을 충족할 수 있습니다.
NGINX Ingress Controller는 kubernetes.io 에서 관리하는 ingress-nginx Controller와 nginx.org 에서 관리하는 nginx-ingress Controller가 존재합니다.
nginx.org에서 관리하는 NGINX Ingress Controller의 설치 방법은 NGINX STORE의 NGINX Ingress Controlloer Docs를 참고하세요.
NGINX Ingress Controller는 Bare Metal Cluster에서 Multiple Ingress Controller로 배포할 수 있습니다.
해당 블로그 포스트는 Bare Metal Cluster에서 kubernetes.io 에서 관리하는 NGINX Ingress Controller를 Multiple Ingress Controller 로 구성하는 방법에 대해 가이드합니다.
목차
1. NGINX Ingress Controller – 운영 환경
2. NGINX Ingress Controller – yaml 작성하기
3. Multiple Ingress Controller로 배포하기
1. NGINX Ingress Controller – 운영 환경
공식 Kubernetes 문서를 참고하여 Bare Metal Cluster 환경에 맞는 YAML 파일을 받아옵니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml
deploy.yaml을 배포할 Ingress Controller 의 수 만큼 복사하고, 구분이 잘 되도록 이름을 변경합니다.
deploy-main.yaml
deploy-second.yaml
deploy-third.yaml
2. NGINX Ingress Controller – yaml 작성하기
NGINX Ingress Controller를 Multiple Ingress Controller로 구성하기 위해 Ingress Class를 각각 다르게 설정하여 하나의 네임스페이스 안에 독립된 세 가지 Ingress Controller를 구성합니다.
세 개의 Ingress Controller를 독립된 Ingress Controller로 배포하기 위해서 각 NGINX Ingress Controller의 yaml 파일을 수정합니다.
deploy-main.yaml
apiVersion: v1
kind: Namespace
metadata:
labels:
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
name: ingress-nginx
---
apiVersion: v1
automountServiceAccountToken: true
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.8.1
name: ingress-nginx
namespace: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
...
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.8.1
name: nginx
spec:
controller: k8s.io/ingress-nginx
---
위 코드는 NGINX Ingress Controller 를 배포할 때 쓰는 yaml 파일의 구성 내용입니다.
Service Account, Ingress Class, Namespace 등 Ingress Controller를 구성하기 위한 Ingress 리소스들이 집합되어 있습니다.
해당 블로그 가이드는 NGINX Ingress Controller를 하나의 Namespace 안에 각자 다른 Ingress Class로 세 개를 배포할 것이기 때문에 기타 yaml (deploy-second.yaml, deploy-third.yaml)에서 동일한 Ingress Class (ingress-nginx)를 사용하는 컴포넌트를 수정합니다.
deploy-second.yaml
apiVersion: v1
kind: Namespace
metadata:
labels:
app.kubernetes.io/instance: ingress-nginx-second
app.kubernetes.io/name: ingress-nginx-second
name: ingress-nginx-second
---
apiVersion: v1
automountServiceAccountToken: true
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx-second
app.kubernetes.io/name: ingress-nginx-second
app.kubernetes.io/part-of: ingress-nginx-second
app.kubernetes.io/version: 1.8.1
name: ingress-nginx-second
namespace: ingress-nginx-second
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx-second
...
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx-second
app.kubernetes.io/name: ingress-nginx-second
app.kubernetes.io/part-of: ingress-nginx-second
app.kubernetes.io/version: 1.8.1
name: nginx-second
spec:
controller: k8s.io/ingress-nginx-second
---
deploy-third.yaml
apiVersion: v1
kind: Namespace
metadata:
labels:
app.kubernetes.io/instance: ingress-nginx-third
app.kubernetes.io/name: ingress-nginx-third
name: ingress-nginx-third
---
apiVersion: v1
automountServiceAccountToken: true
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx-third
app.kubernetes.io/name: ingress-nginx-third
app.kubernetes.io/part-of: ingress-nginx-third
app.kubernetes.io/version: 1.8.1
name: ingress-nginx-third
namespace: ingress-nginx-third
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx-third
...
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx-third
app.kubernetes.io/name: ingress-nginx-third
app.kubernetes.io/part-of: ingress-nginx-third
app.kubernetes.io/version: 1.8.1
name: nginx-third
spec:
controller: k8s.io/ingress-nginx-third
---
3. Multiple Ingress Controller로 배포하기
수정한 yaml 파일을 kubectl 명령어를 통해 Bare Metal Cluster에 배포합니다.
kubectl apply -f deploy-main.yaml
kubectl apply -f deploy-second.yaml
kubectl apply -f deploy-third.yaml
kubectl get service -n ingress-nginx
NAME TYPE CLUSTER-IP
ingress-nginx-controller NodePort 10.110.32.66
ingress-nginx-controller-admission ClusterIP 10.131.197.105
ingress-nginx-second-controller NodePort 10.103.161.38
ingress-nginx-second-controller-admission ClusterIP 10.109.49.144
ingress-nginx-third-controller NodePort 10.100.236.193
ingress-nginx-third-controller-admission ClusterIP 10.99.143.200
kubectl get ingressclasses -n ingress-nginx
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 19h
nginx-second k8s.io/ingress-nginx-second <none> 19h
nginx-third k8s.io/ingress-nginx-third <none> 19h
NGINX Ingress Controller와 Ingress Class가 각각 세 개씩 성공적으로 배포된 것을 확인할 수 있습니다.
Kubernetes 클러스터에서 여러 Ingress Controller를 성공적으로 배포하면 트래픽 관리의 유연성과 효율성을 크게 향상시킬 수 있습니다. 이를 통해 다양한 서비스 요구를 효과적으로 처리하고 클러스터의 보안과 성능을 최적화할 수 있습니다. 올바른 설정과 관리로 안정적이고 효율적인 트래픽 처리를 구현할 수 있습니다.
NGINX Plus의 기능을 NGINX Ingress Controller에서도 사용하고 싶으신가요?
지금 NGINX STORE에 문의하여 NGINX Plus Ingress Controller에 대해 알아볼 수 있습니다.
댓글을 달려면 로그인해야 합니다.