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 Cluster | 4.21.6 |
| NGINX Ingress Operator | 3.5.1 |
| NGINX Plus Ingress Controller | 5.4.1 |
3. Red Hat OpenShift 클러스터에 NGINX Ingress Operator 설치
NGINX Ingress Operator는 Red Hat OpenShift 웹 콘솔에서 손쉽게 설치할 수 있습니다.
콘솔 좌측 메뉴의 에코시스템 하위의 소프트웨어 카탈로그 메뉴를 선택합니다.

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

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


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


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

$ oc get all -n nginx-ingress NAME READY STATUS RESTARTS AGEpod/nginx-ingress-operator-controller-manager-56dc48d7b5-xt2sb 2/2 Running 0 2m31sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/nginx-ingress-operator-controller-manager-metrics-service ClusterIP 172.30.239.154 <none> 8443/TCP 2m33sNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/nginx-ingress-operator-controller-manager 1/1 1 1 2m31sNAME DESIRED CURRENT READY AGEreplicaset.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를 수정하여 생성합니다.
# Create SCC for IC resourceskind: SecurityContextConstraintsapiVersion: security.openshift.io/v1metadata: name: nginx-ingress-adminallowPrivilegedContainer: falserunAsUser: type: MustRunAs uid: 101seLinuxContext: type: MustRunAsfsGroup: type: MustRunAssupplementalGroups: type: MustRunAsallowHostNetwork: falseallowHostPID: falseallowHostPorts: falseallowHostDirVolumePlugin: falseallowHostIPC: falsereadOnlyRootFilesystem: falseseccompProfiles: - runtime/defaultvolumes: - secretrequiredDropCapabilities: - ALLusers: - '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 차트 매개변수 값과 동일하게 설정이 가능합니다.
전체 매개변수의 리스트는 링크를 참고하세요.
apiVersion: charts.nginx.org/v1alpha1kind: NginxIngressmetadata: name: nginxingress-sample namespace: nginx-ingressspec: 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/v1alpha1kind: NginxIngressmetadata: 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로 각 리소스가 생성된 것을 확인할 수 있습니다.


$ oc get all -n nginx-ingress NAME READY STATUS RESTARTS AGEpod/nginx-ingress-operator-controller-manager-56dc48d7b5-xt2sb 2/2 Running 0 3d17hpod/npic-nginx-ingress-controller-name-5d7f7cf85-4n6sp 1/1 Running 0 2m20sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/nginx-ingress-operator-controller-manager-metrics-service ClusterIP 172.30.239.154 <none> 8443/TCP 3d17hservice/npic-nginx-ingress-controller-name LoadBalancer 172.30.221.107 <pending> 80:31018/TCP,443:31288/TCP 2m20sNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/nginx-ingress-operator-controller-manager 1/1 1 1 3d17hdeployment.apps/npic-nginx-ingress-controller-name 1/1 1 1 2m20sNAME DESIRED CURRENT READY AGEreplicaset.apps/nginx-ingress-operator-controller-manager-56dc48d7b5 1 1 1 3d17hreplicaset.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를 체험해 보세요.
댓글을 달려면 로그인해야 합니다.