NGINX Ingress Operator 활용 OpenShift에 Ingress Controller 배포

NGINX Ingress Operator 는 Kubernetes 환경에서 NGINX Ingress Controller의 배포와 운영을 자동화하기 위한 Operator 기반 솔루션입니다. 선언형 방식으로 NGINX Ingress Controller를 배포 및 관리할 수 있으며, 설정 변경이나 업그레이드 또한 Kubernetes 네이티브 방식으로 수행할 수 있다는 장점이 있습니다.

OpenShift 환경에서는 이러한 Operator 기반 관리 방식이 표준에 가깝게 사용되며, F5에서 제공하는 NGINX Ingress Operator를 통해 NGINX Plus Ingress Controller를 보다 안정적으로 배포하고 운영할 수 있습니다.

이번 포스트에서는 OpenShift 환경에서 NGINX Ingress Operator를 활용하여 NGINX Plus Ingress Controller를 배포하는 방법을 알아보겠습니다.

목차

1. NGINX Ingress Operator란?
 1-1. Operator 패턴이란?

 1-2. NGINX Ingress Operator의 주요 특징
2. 환경/버전 정보
3. Red Hat OpenShift 클러스터에 NGINX Ingress Operator 설치
4. NGINX Ingress Operator로 NGINX Plus Ingress Controller 배포
5. 결론

1. NGINX Ingress Operator 란?

NGINX Ingress Operator는 Kubernetes/OpenShift 환경에서 NGINX Ingress Controller의 배포와 생명주기 관리를 자동화하는 Operator 패턴 기반 솔루션입니다. F5/NGINX에서 공식 제공하며, Red Hat의 인증(Certified) Operator로 OperatorHub 및 OpenShift 소프트웨어 카탈로그를 통해 설치할 수 있습니다.

1-1. Operator 패턴이란?

Operator 패턴은 Kubernetes의 Custom Resource(CR)와 Controller를 기반으로, 애플리케이션의 배포 및 운영 과정을 자동화하는 방식입니다. 기존에 사람이 수행하던 배포, 설정 변경, 업그레이드 등의 작업을 코드로 정의하고, 이를 Kubernetes가 지속적으로 관리(reconcile)하도록 하는 것이 핵심입니다.

1-2. NGINX Ingress Operator 의 주요 특징

  • NGINX Plus 지원: 오픈소스 NGINX Ingress Controller뿐만 아니라 엔터프라이즈 기능이 포함된 NGINX Plus Ingress Controller의 배포도 지원합니다.
  • 선언형 관리: NginxIngress라는 Custom Resource를 정의하는 것만으로 NGINX Ingress Controller의 배포·설정·업그레이드가 자동으로 처리됩니다.
  • Helm 차트 기반 구성: NginxIngress 리소스의 spec 필드는 NGINX Ingress Controller의 공식 Helm 차트 파라미터와 동일하게 구성되어, 기존 Helm 사용 경험을 그대로 활용할 수 있습니다.
  • OpenShift 네이티브 통합: Red Hat 인증 Operator로, OpenShift 웹 콘솔의 OperatorHub를 통해 설치 및 관리가 가능합니다.

2. 환경/버전 정보

구성 요소버전
Red Hat Openshift Cluster4.21.6
NGINX Ingress Operator3.5.1
NGINX Plus Ingress Controller5.4.1

3. Red Hat OpenShift 클러스터에 NGINX Ingress Operator 설치

NGINX Ingress Operator는 Red Hat OpenShift 웹 콘솔에서 손쉽게 설치할 수 있습니다.

콘솔 좌측 메뉴의 에코시스템 하위의 소프트웨어 카탈로그 메뉴를 선택합니다.

“nginx ingress”를 검색하면 인증된 Operator를 확인할 수 있습니다.

NGINX Ingress Operator

버전을 선택하고 설치 버튼을 클릭하여 설치를 진행합니다.

NGINX Ingress Operator 설치1
NGINX Ingress Operator 설치2

잠시 기다리면 설치가 완료된 것을 확인할 수 있습니다.

웹 콘솔과 oc 명령어를 통해 nginx-ingress 네임스페이스에 설치된 NGINX Ingress Operator 를 확인할 수 있습니다.

설치된 NGINX Ingress Operator
$ oc get all -n nginx-ingress
NAME READY STATUS RESTARTS AGE
pod/nginx-ingress-operator-controller-manager-56dc48d7b5-xt2sb 2/2 Running 0 2m31s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-ingress-operator-controller-manager-metrics-service ClusterIP 172.30.239.154 <none> 8443/TCP 2m33s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-ingress-operator-controller-manager 1/1 1 1 2m31s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-ingress-operator-controller-manager-56dc48d7b5 1 1 1 2m31s

4. NGINX Ingress Operator로 NGINX Plus Ingress Controller 배포

NGINX Ingress Operator 가 설치되면, 이제 NginxIngress 리소스를 배포하여 NGINX Ingress Controller를 생성해야 합니다.

NginxIngress를 구성하기 전에 필요한 사전 작업을 진행합니다.

1. SCC 생성

OpenShift 클러스터에 NGINX Ingress Controller Pod를 정상적으로 배포하기 위해 먼저 SCC를 생성합니다.

$ oc apply -f https://raw.githubusercontent.com/nginx/nginx-ingress-helm-operator/main/resources/scc.yaml

users의 값을 확인하면 system:serviceaccount:*:nginx-ingress와 같이 모든 네임스페이스의 nginx-ingress Service Account 대상으로 적용됩니다.
별도의 Service Account를 사용하거나, 다른 권한 구성이 필요하면 SCC를 수정하여 생성합니다.

scc.yaml
YAML
# Create SCC for IC resources
kind: SecurityContextConstraints
apiVersion: security.openshift.io/v1
metadata:
name: nginx-ingress-admin
allowPrivilegedContainer: false
runAsUser:
type: MustRunAs
uid: 101
seLinuxContext:
type: MustRunAs
fsGroup:
type: MustRunAs
supplementalGroups:
type: MustRunAs
allowHostNetwork: false
allowHostPID: false
allowHostPorts: false
allowHostDirVolumePlugin: false
allowHostIPC: false
readOnlyRootFilesystem: false
seccompProfiles:
- runtime/default
volumes:
- secret
requiredDropCapabilities:
- ALL
users:
- 'system:serviceaccount:*:nginx-ingress'
allowedCapabilities:
- NET_BIND_SERVICE

2. license secret 생성

NGINX Plus Ingress Controller에 적용할 라이선스를 Secret으로 생성합니다.

$ oc create secret generic license-token --from-file=license.jwt=<path-to-your-jwt> --type=nginx.com/license -n nginx-ingress

<path-to-your-jwt>에 다운받은 license.jwt 파일의 경로를 입력하고, -n 뒤에 NGINX Plus Ingress Controller가 배포될 네임스페이스를 지정합니다. 이 포스트에서는 nginx-ingress 네임스페이스를 지정했습니다.

3. docker config secret 생성

NGINX Plus Ingress Controller 이미지를 레지스트리에서 pull 하기 위해 Secret을 생성합니다.
NGINX 공식 레지스트의 경우 아래와 같이 구성합니다.

별도 private 레지스트리에서 이미지를 pull 하는 경우 해당 레지스트리에 맞는 imagePullSecret으로 구성합니다.

$ kubectl create secret \
docker-registry regcred \
--docker-server=private-registry.nginx.com \
--docker-username=$(cat license.jwt) \
--docker-password=none

사전 준비가 완료되면, NGINX Ingress Operator 에서 사용하는 NginxIngress 리소스를 구성합니다.
웹 콘솔에서 구성할 수 있으며, 해당 리소스의 yaml 파일을 사용하여 kubectl/oc 명령어로 직접 배포할 수도 있습니다.

하단의 다운로드 버튼을 통해 예시 yaml 구성을 다운로드할 수 있습니다.

NginxIngress 리소스의 구성 옵션은 Helm 기반으로, Helm 차트 매개변수 값과 동일하게 설정이 가능합니다.
전체 매개변수의 리스트는 링크를 참고하세요.

nginxingress-nginxingress-sample.yaml
YAML
apiVersion: charts.nginx.org/v1alpha1
kind: NginxIngress
metadata:
name: nginxingress-sample
namespace: nginx-ingress
spec:
controller:
affinity: {}
annotations: {}
appprotect:
enable: false
appprotectdos:
debug: false
enable: false
maxDaemons: 0
maxWorkers: 0
memory: 0
autoscaling:
annotations: {}
behavior: {}
enabled: false
maxReplicas: 3
minReplicas: 1
targetCPUUtilizationPercentage: 50
targetMemoryUtilizationPercentage: 50
config:
annotations: {}
entries: {}
containerPort:
http: 80
https: 443
customConfigMap: ""
customPorts: []
defaultHTTPListenerPort: 80
defaultHTTPSListenerPort: 443
defaultTLS:
cert: ""
key: ""
secret: ""
disableIPV6: false
dnsPolicy: ClusterFirst
enableCertManager: false
enableCustomResources: true
enableExternalDNS: false
enableLatencyMetrics: false
enableOIDC: false
enableSSLDynamicReload: true
enableSnippets: false
enableTLSPassthrough: false
env: []
extraContainers: []
globalConfiguration:
create: false
spec: {}
healthStatus: false
healthStatusURI: /nginx-health
hostNetwork: false
hostPort:
enable: false
http: 80
https: 443
image:
pullPolicy: IfNotPresent
repository: nginx/nginx-ingress
tag: 5.4.1-ubi
ingressClass:
create: true
name: nginx
setAsDefaultIngress: false
initContainerResources:
requests:
cpu: 100m
memory: 128Mi
initContainers: []
lifecycle: {}
logFormat: glog
logLevel: info
mgmt:
licenseTokenSecretName: license-token
minReadySeconds: 0
name: controller
nginxDebug: false
nginxReloadTimeout: 60000
nginxStatus:
allowCidrs: 127.0.0.1
enable: true
port: 8080
nginxplus: false
pod:
annotations: {}
extraLabels: {}
podDisruptionBudget:
annotations: {}
enabled: false
readOnlyRootFilesystem: false
readyStatus:
enable: true
initialDelaySeconds: 0
port: 8081
replicaCount: 1
reportIngressStatus:
annotations: {}
enable: true
enableLeaderElection: true
ingressLink: ""
leaderElectionLockName: nginx-ingress-leader
resources:
requests:
cpu: 100m
memory: 128Mi
selectorLabels: {}
service:
annotations: {}
clusterIP: ""
create: true
customPorts: []
externalIPs: []
externalTrafficPolicy: Local
extraLabels: {}
httpPort:
enable: true
port: 80
targetPort: 80
httpsPort:
enable: true
port: 443
targetPort: 443
loadBalancerIP: ""
loadBalancerSourceRanges: []
type: LoadBalancer
serviceAccount:
annotations: {}
imagePullSecretName: ""
imagePullSecretsNames: []
shareProcessNamespace: false
strategy: {}
terminationGracePeriodSeconds: 30
tlsPassthroughPort: 443
tolerations: []
volumeMounts: []
volumes: []
watchNamespace: ""
watchNamespaceLabel: ""
watchSecretNamespace: ""
wildcardTLS:
cert: ""
key: ""
secret: ""
kind: deployment
nginxServiceMesh:
enable: false
enableEgress: false
prometheus:
create: true
port: 9113
scheme: http
secret: ""
service:
create: false
labels:
service: nginx-ingress-prometheus-service
serviceMonitor:
create: false
endpoints:
- port: prometheus
labels: {}
selectorMatchLabels:
service: nginx-ingress-prometheus-service
rbac:
create: true
serviceInsight:
create: false
port: 9114
scheme: http
secret: ""

NGINX Plus Ingress Controller를 배포하기 위해 다음 값들을 확인/변경합니다.

# line 62 : NGINX Plus Ingress Controller 이미지 repository로 변경
image:
pullPolicy: IfNotPresent
repository: private-registry.nginx.com/nginx-ic/nginx-plus-ingress
tag: 5.4.1
# line 78 : 앞서 생성한 license secret 이름과 일치 여부 확인
mgmt:
licenseTokenSecretName: license-token
# line 88 : NGINX Plus Ingress Controller 배포
nginxplus: true
# line 131 : 이미지를 pull 하기 위해 앞서 생성한 docker config secret 지정
serviceAccount:
annotations: {}
imagePullSecretName: ""
imagePullSecretsNames:
- regcred

배포 전 name 설정에 따른 리소스 이름을 확인하기 위해 아래와 같이 변경했습니다.

apiVersion: charts.nginx.org/v1alpha1
kind: NginxIngress
metadata:
name: npic
namespace: nginx-ingress
......
# line 81
name: controller-name

웹 콘솔에서 작성한 설정을 사용하여 NGINX Plus Ingress Controller를 배포합니다.
해당 리소스의 yaml 파일을 사용하여 kubectl/oc 명령어로 직접 배포할 수도 있습니다.

NginxIngress를 통해 NGINX Ingress Operator가 생성한 NGINX Plus Ingress Controller 관련 리소스들을 확인할 수 있습니다.
<metadata.name>-nginx-ingress-<spec.controller.name>와 같은 형식으로 리소스의 이름이 구성되어, npic-nginx-ingress-controller-name로 각 리소스가 생성된 것을 확인할 수 있습니다.

NGINX Ingress Operator, NGINX Plus Ingress Controller
NGINX Ingress Operator, NGINX Plus Ingress Controller
$ oc get all -n nginx-ingress
NAME READY STATUS RESTARTS AGE
pod/nginx-ingress-operator-controller-manager-56dc48d7b5-xt2sb 2/2 Running 0 3d17h
pod/npic-nginx-ingress-controller-name-5d7f7cf85-4n6sp 1/1 Running 0 2m20s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-ingress-operator-controller-manager-metrics-service ClusterIP 172.30.239.154 <none> 8443/TCP 3d17h
service/npic-nginx-ingress-controller-name LoadBalancer 172.30.221.107 <pending> 80:31018/TCP,443:31288/TCP 2m20s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-ingress-operator-controller-manager 1/1 1 1 3d17h
deployment.apps/npic-nginx-ingress-controller-name 1/1 1 1 2m20s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-ingress-operator-controller-manager-56dc48d7b5 1 1 1 3d17h
replicaset.apps/npic-nginx-ingress-controller-name-5d7f7cf85 1 1 1 2m20

5. 결론

이번 포스트에서는 OpenShift 환경에서 NGINX Ingress Operator를 활용하여 NGINX Plus Ingress Controller를 배포하는 과정을 살펴보았습니다.

NGINX Ingress Operator를 사용하면 복잡한 Helm 명령어나 수동 매니페스트 관리 없이, NginxIngress Custom Resource 하나로 NGINX Plus Ingress Controller의 전체 배포 과정을 선언적으로 관리할 수 있습니다. SCC, 라이선스 Secret, 이미지 Pull Secret 등 사전 작업만 완료한다면, Operator가 나머지 리소스(Deployment, Service, RBAC 등)를 자동으로 생성하고 관리합니다.

특히 OpenShift와 같은 엔터프라이즈 Kubernetes 환경에서는 Operator 기반의 관리 방식이 운영 일관성과 자동화 측면에서 큰 이점을 제공합니다. 향후 설정 변경이나 버전 업그레이드 역시 NginxIngress 리소스의 수정만으로 Kubernetes 네이티브하게 처리할 수 있어, 운영 부담을 크게 줄일 수 있습니다.

현재 운영 중이신 OpenShift 클러스터 환경에 기본 라우터 대신 NGINX Plus Ingress Controller를 사용해 보고 싶으신가요? NGINX STORE를 통해 문의하여 무료로 NGINX One trial로 NGINX Plus Ingress Controller를 체험해 보세요.

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

* indicates required