From 66e21a009a97a6a552e43ac465a060f3bc5857de Mon Sep 17 00:00:00 2001 From: LorcanMcVeigh Date: Wed, 16 Sep 2020 16:25:30 +0100 Subject: [PATCH 1/4] Add latency metrics support --- deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml | 5 +++++ docs/nginx-ingress-controller.md | 2 ++ pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go | 5 +++++ pkg/controller/nginxingresscontroller/utils.go | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml b/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml index 79746883..90be7b19 100644 --- a/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml +++ b/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml @@ -181,6 +181,11 @@ spec: required: - enable type: object + enableLatencyMetrics: + description: Bucketed response times from when NGINX establishes a + connection to an upstream server to when the last byte of the response body is received by NGINX. + nullable: true + type: boolean replicas: description: The number of replicas of the Ingress Controller pod. The default is 1. Only applies if the type is set to deployment. diff --git a/docs/nginx-ingress-controller.md b/docs/nginx-ingress-controller.md index 7d27ae47..f606103d 100644 --- a/docs/nginx-ingress-controller.md +++ b/docs/nginx-ingress-controller.md @@ -71,6 +71,7 @@ spec: nginxReloadTimeout: 5000 appProtect: enable: false + enableLatencyMetrics: false ``` | Field | Type | Description | Required | @@ -99,6 +100,7 @@ spec: | `enableTLSPassthrough` | `boolean` | Enable TLS Passthrough on port 443. Requires enableCRDs set to true. | No | | `appprotect` | [appprotect](#nginxingresscontrollerappprotect) | App Protect support configuration. Requires nginxPlus set to true. | No | | `nginxReloadTimeout` | `int`| Timeout in milliseconds which the Ingress Controller will wait for a successful NGINX reload after a change or at the initial start. (default is 4000. Default is 20000 instead if `enable-app-protect` is true) | No | +| `enableLatencyMetrics` | `boolean` | Bucketed response times from when NGINX establishes a connection to an upstream server to when the last byte of the response body is received by NGINX. **Note** The metric for the upstream isn't available until traffic is sent to the upstream | No | ## NginxIngressController.Image diff --git a/pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go b/pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go index 391a7e52..59d4cf20 100644 --- a/pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go +++ b/pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go @@ -98,6 +98,11 @@ type NginxIngressControllerSpec struct { // +nullable // +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true Prometheus *Prometheus `json:"prometheus,omitempty"` + // Enable collection of latency metrics for upstreams. + // +kubebuilder:validation:Optional + // +nullable + // +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true + EnableLatencyMetrics bool `json:"enableLatencyMetrics"` // Initial values of the Ingress Controller ConfigMap. // Check https://docs.nginx.com/nginx-ingress-controller/configuration/global-configuration/configmap-resource/ for // more information about possible values. diff --git a/pkg/controller/nginxingresscontroller/utils.go b/pkg/controller/nginxingresscontroller/utils.go index 1d542a6c..00bcfd36 100644 --- a/pkg/controller/nginxingresscontroller/utils.go +++ b/pkg/controller/nginxingresscontroller/utils.go @@ -103,6 +103,10 @@ func generatePodArgs(instance *k8sv1alpha1.NginxIngressController) []string { if instance.Spec.Prometheus.Port != nil { args = append(args, fmt.Sprintf("-prometheus-metrics-listen-port=%v", *instance.Spec.Prometheus.Port)) } + + if instance.Spec.EnableLatencyMetrics { + args = append(args, "enable-latency-metrics") + } } if instance.Spec.EnableCRDs { From c893489f2893cee32c6e3cd0be10735b3fc2698f Mon Sep 17 00:00:00 2001 From: LorcanMcVeigh Date: Mon, 21 Sep 2020 16:02:56 +0100 Subject: [PATCH 2/4] Add tests --- pkg/controller/nginxingresscontroller/utils.go | 2 +- pkg/controller/nginxingresscontroller/utils_test.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/controller/nginxingresscontroller/utils.go b/pkg/controller/nginxingresscontroller/utils.go index 00bcfd36..9550005f 100644 --- a/pkg/controller/nginxingresscontroller/utils.go +++ b/pkg/controller/nginxingresscontroller/utils.go @@ -105,7 +105,7 @@ func generatePodArgs(instance *k8sv1alpha1.NginxIngressController) []string { } if instance.Spec.EnableLatencyMetrics { - args = append(args, "enable-latency-metrics") + args = append(args, "-enable-latency-metrics") } } diff --git a/pkg/controller/nginxingresscontroller/utils_test.go b/pkg/controller/nginxingresscontroller/utils_test.go index a4c2b5ba..60a74355 100644 --- a/pkg/controller/nginxingresscontroller/utils_test.go +++ b/pkg/controller/nginxingresscontroller/utils_test.go @@ -178,6 +178,7 @@ func TestGeneratePodArgs(t *testing.T) { Enable: true, Port: &promPort, }, + EnableLatencyMetrics: true, GlobalConfiguration: "my-nginx-ingress/globalconfiguration", EnableSnippets: true, EnableTLSPassthrough: true, @@ -209,6 +210,7 @@ func TestGeneratePodArgs(t *testing.T) { "-wildcard-tls-secret=my-nginx-ingress/wildcard-secret", "-enable-prometheus-metrics", "-prometheus-metrics-listen-port=9114", + "-enable-latency-metrics", "-nginx-reload-timeout=5000", }, }, From e29e9445e604f145771d72d838581d4f09401bc4 Mon Sep 17 00:00:00 2001 From: LorcanMcVeigh Date: Thu, 24 Sep 2020 12:38:49 +0100 Subject: [PATCH 3/4] Address Feedback --- deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml | 5 ----- docs/nginx-ingress-controller.md | 4 ++-- pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go | 3 ++- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml b/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml index 90be7b19..79746883 100644 --- a/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml +++ b/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml @@ -181,11 +181,6 @@ spec: required: - enable type: object - enableLatencyMetrics: - description: Bucketed response times from when NGINX establishes a - connection to an upstream server to when the last byte of the response body is received by NGINX. - nullable: true - type: boolean replicas: description: The number of replicas of the Ingress Controller pod. The default is 1. Only applies if the type is set to deployment. diff --git a/docs/nginx-ingress-controller.md b/docs/nginx-ingress-controller.md index f606103d..9d4ec73d 100644 --- a/docs/nginx-ingress-controller.md +++ b/docs/nginx-ingress-controller.md @@ -64,6 +64,7 @@ spec: prometheus: enable: true port: 9114 + enableLatencyMetrics: false configMapData: error-log-level: debug enableTLSPassthrough: true @@ -71,7 +72,6 @@ spec: nginxReloadTimeout: 5000 appProtect: enable: false - enableLatencyMetrics: false ``` | Field | Type | Description | Required | @@ -100,7 +100,6 @@ spec: | `enableTLSPassthrough` | `boolean` | Enable TLS Passthrough on port 443. Requires enableCRDs set to true. | No | | `appprotect` | [appprotect](#nginxingresscontrollerappprotect) | App Protect support configuration. Requires nginxPlus set to true. | No | | `nginxReloadTimeout` | `int`| Timeout in milliseconds which the Ingress Controller will wait for a successful NGINX reload after a change or at the initial start. (default is 4000. Default is 20000 instead if `enable-app-protect` is true) | No | -| `enableLatencyMetrics` | `boolean` | Bucketed response times from when NGINX establishes a connection to an upstream server to when the last byte of the response body is received by NGINX. **Note** The metric for the upstream isn't available until traffic is sent to the upstream | No | ## NginxIngressController.Image @@ -138,6 +137,7 @@ spec: | --- | --- | --- | --- | | `enable` | `boolean` | Enable Prometheus metrics. | Yes | | `port` | `int` | Sets the port where the Prometheus metrics are exposed. Default is 9113. Format is `1023 - 65535`. | No | +| `enableLatencyMetrics` | `boolean` | Bucketed response times from when NGINX establishes a connection to an upstream server to when the last byte of the response body is received by NGINX. **Note** The metric for the upstream isn't available until traffic is sent to the upstream. Requires prometheus set to true | No | ## NginxIngressController.AppProtect diff --git a/pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go b/pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go index 59d4cf20..d8e08eb6 100644 --- a/pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go +++ b/pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go @@ -98,7 +98,8 @@ type NginxIngressControllerSpec struct { // +nullable // +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true Prometheus *Prometheus `json:"prometheus,omitempty"` - // Enable collection of latency metrics for upstreams. + // Bucketed response times from when NGINX establishes a connection to an upstream server to when the last byte of the response body is received by NGINX. + // **Note** The metric for the upstream isn't available until traffic is sent to the upstream. // +kubebuilder:validation:Optional // +nullable // +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true From b5682a55ee984cbcf4dbeb0ca4d3133ed1f4c70c Mon Sep 17 00:00:00 2001 From: LorcanMcVeigh Date: Thu, 24 Sep 2020 12:40:38 +0100 Subject: [PATCH 4/4] Add generate-crds --- ...nginx.org_nginxingresscontrollers_crd.yaml | 494 +++++++++--------- 1 file changed, 250 insertions(+), 244 deletions(-) diff --git a/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml b/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml index 79746883..a896840d 100644 --- a/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml +++ b/deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml @@ -1,4 +1,4 @@ -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: nginxingresscontrollers.k8s.nginx.org @@ -10,250 +10,256 @@ spec: plural: nginxingresscontrollers singular: nginxingresscontroller scope: Namespaced - subresources: - status: {} - validation: - openAPIV3Schema: - description: NginxIngressController is the Schema for the nginxingresscontrollers - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: NginxIngressControllerSpec defines the desired state of NginxIngressController - properties: - appProtect: - description: App Protect support configuration. Requires enableCRDs - set to true. - nullable: true - properties: - enable: - description: Enable App Protect. - type: boolean - required: - - enable - type: object - configMapData: - additionalProperties: - type: string - description: Initial values of the Ingress Controller ConfigMap. Check - https://docs.nginx.com/nginx-ingress-controller/configuration/global-configuration/configmap-resource/ - for more information about possible values. - nullable: true - type: object - defaultSecret: - description: The TLS Secret for TLS termination of the default server. - The format is namespace/name. If not specified, the operator will - generate and deploy a TLS Secret with a self-signed certificate and - key. - type: string - enableCRDs: - description: Enables the use of NGINX Ingress Resource Definitions (VirtualServer - and VirtualServerRoute). - type: boolean - enableLeaderElection: - description: Enables Leader election to avoid multiple replicas of the - controller reporting the status of Ingress resources – only one replica - will report status. - type: boolean - enableSnippets: - description: Enable custom NGINX configuration snippets in VirtualServer - and VirtualServerRoute resources. Requires enableCRDs set to true. - type: boolean - enableTLSPassthrough: - description: Enable TLS Passthrough on port 443. Requires enableCRDs - set to true. - type: boolean - globalConfiguration: - description: The GlobalConfiguration resource for global configuration - of the Ingress Controller. Format is namespace/name. Requires enableCRDs - set to true. - type: string - healthStatus: - description: Adds a new location to the default server. The location - responds with the 200 status code for any request. Useful for external - health-checking of the Ingress controller. - nullable: true - properties: - enable: - description: Enable the HealthStatus. - type: boolean - uri: - description: URI of the location. Default is `/nginx-health`. - type: string - required: - - enable - type: object - image: - description: The image of the Ingress Controller. - properties: - pullPolicy: - description: The ImagePullPolicy of the image. - enum: - - Never - - Always - - IfNotPresent - type: string - repository: - description: The repository of the image. - type: string - tag: - description: The tag (version) of the image. - type: string - required: - - pullPolicy - - repository - - tag - type: object - ingressClass: - description: A class of the Ingress controller. The Ingress controller - only processes Ingress resources that belong to its class (in other - words, have the annotation “kubernetes.io/ingress.class”). Additionally, - the Ingress controller processes Ingress resources that do not have - that annotation, which can be disabled by setting UseIngressClassOnly - to true. Default is `nginx`. - type: string - logLevel: - description: Log level for V logs. Format is 0 - 3 - maximum: 3 - minimum: 0 - type: integer - nginxDebug: - description: 'Enable debugging for NGINX. Uses the nginx-debug binary. - Requires ‘error-log-level: debug’ in the ConfigMapData.' - type: boolean - nginxPlus: - description: Deploys the Ingress Controller for NGINX Plus. The default - is false meaning the Ingress Controller will be deployed for NGINX - OSS. - type: boolean - nginxReloadTimeout: - description: Timeout in milliseconds which the Ingress Controller will - wait for a successful NGINX reload after a change or at the initial - start. - type: integer - nginxStatus: - description: NGINX stub_status, or the NGINX Plus API. - nullable: true - properties: - allowCidrs: - description: Whitelist IPv4 IP/CIDR blocks to allow access to NGINX - stub_status or the NGINX Plus API. Separate multiple IP/CIDR by - commas. (default “127.0.0.1”) - type: string - enable: - description: Enable the NginxStatus. - type: boolean - port: - description: Set the port where the NGINX stub_status or the NGINX - Plus API is exposed. Default is 8080. Format is 1023 - 65535 - maximum: 65535 - minimum: 1023 - nullable: true - type: integer - required: - - enable - type: object - prometheus: - description: NGINX or NGINX Plus metrics in the Prometheus format. - nullable: true - properties: - enable: - description: Enable Prometheus metrics. - type: boolean - port: - description: Sets the port where the Prometheus metrics are exposed. - Default is 9113. Format is 1023 - 65535 - maximum: 65535 - minimum: 1023 - nullable: true - type: integer - required: - - enable - type: object - replicas: - description: The number of replicas of the Ingress Controller pod. The - default is 1. Only applies if the type is set to deployment. - format: int32 - type: integer - reportIngressStatus: - description: Update the address field in the status of Ingresses resources. - nullable: true - properties: - enable: - description: Enable the ReportIngressStatus. - type: boolean - externalService: - description: 'Specifies the name of the service with the type LoadBalancer - through which the Ingress controller pods are exposed externally. - The external address of the service is used when reporting the - status of Ingress resources. Note: Only if ServiceType is different - than LoadBalancer.' - type: string - required: - - enable - type: object - serviceType: - description: 'The type of the Service for the Ingress Controller. Valid - Service types are: NodePort and LoadBalancer.' - enum: - - NodePort - - LoadBalancer - type: string - type: - description: The type of the Ingress Controller installation - deployment - or daemonset. - enum: - - deployment - - daemonset - type: string - useIngressClassOnly: - description: Ignore Ingress resources without the “kubernetes.io/ingress.class” - annotation. - type: boolean - watchNamespace: - description: Namespace to watch for Ingress resources. By default the - Ingress controller watches all namespaces. - type: string - wildcardTLS: - description: A Secret with a TLS certificate and key for TLS termination - of every Ingress host for which TLS termination is enabled but the - Secret is not specified. If the argument is not set, for such Ingress - hosts NGINX will break any attempt to establish a TLS connection. - If the argument is set, but the Ingress controller is not able to - fetch the Secret from Kubernetes API, the Ingress Controller will - fail to start. Format is namespace/name. - type: string - required: - - enableCRDs - - image - - serviceType - - type - type: object - status: - description: NginxIngressControllerStatus defines the observed state of - NginxIngressController - properties: - deployed: - description: Deployed is true if the Operator has finished the deployment - of the NginxIngressController. - type: boolean - required: - - deployed - type: object - type: object - version: v1alpha1 versions: - name: v1alpha1 + schema: + openAPIV3Schema: + description: NginxIngressController is the Schema for the nginxingresscontrollers + API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: NginxIngressControllerSpec defines the desired state of NginxIngressController + properties: + appProtect: + description: App Protect support configuration. Requires enableCRDs + set to true. + nullable: true + properties: + enable: + description: Enable App Protect. + type: boolean + required: + - enable + type: object + configMapData: + additionalProperties: + type: string + description: Initial values of the Ingress Controller ConfigMap. Check + https://docs.nginx.com/nginx-ingress-controller/configuration/global-configuration/configmap-resource/ + for more information about possible values. + nullable: true + type: object + defaultSecret: + description: The TLS Secret for TLS termination of the default server. + The format is namespace/name. If not specified, the operator will + generate and deploy a TLS Secret with a self-signed certificate + and key. + type: string + enableCRDs: + description: Enables the use of NGINX Ingress Resource Definitions + (VirtualServer and VirtualServerRoute). + type: boolean + enableLatencyMetrics: + description: Bucketed response times from when NGINX establishes a + connection to an upstream server to when the last byte of the response + body is received by NGINX. **Note** The metric for the upstream + isn't available until traffic is sent to the upstream. + nullable: true + type: boolean + enableLeaderElection: + description: Enables Leader election to avoid multiple replicas of + the controller reporting the status of Ingress resources – only + one replica will report status. + type: boolean + enableSnippets: + description: Enable custom NGINX configuration snippets in VirtualServer + and VirtualServerRoute resources. Requires enableCRDs set to true. + type: boolean + enableTLSPassthrough: + description: Enable TLS Passthrough on port 443. Requires enableCRDs + set to true. + type: boolean + globalConfiguration: + description: The GlobalConfiguration resource for global configuration + of the Ingress Controller. Format is namespace/name. Requires enableCRDs + set to true. + type: string + healthStatus: + description: Adds a new location to the default server. The location + responds with the 200 status code for any request. Useful for external + health-checking of the Ingress controller. + nullable: true + properties: + enable: + description: Enable the HealthStatus. + type: boolean + uri: + description: URI of the location. Default is `/nginx-health`. + type: string + required: + - enable + type: object + image: + description: The image of the Ingress Controller. + properties: + pullPolicy: + description: The ImagePullPolicy of the image. + enum: + - Never + - Always + - IfNotPresent + type: string + repository: + description: The repository of the image. + type: string + tag: + description: The tag (version) of the image. + type: string + required: + - pullPolicy + - repository + - tag + type: object + ingressClass: + description: A class of the Ingress controller. The Ingress controller + only processes Ingress resources that belong to its class (in other + words, have the annotation “kubernetes.io/ingress.class”). Additionally, + the Ingress controller processes Ingress resources that do not have + that annotation, which can be disabled by setting UseIngressClassOnly + to true. Default is `nginx`. + type: string + logLevel: + description: Log level for V logs. Format is 0 - 3 + maximum: 3 + minimum: 0 + type: integer + nginxDebug: + description: 'Enable debugging for NGINX. Uses the nginx-debug binary. + Requires ‘error-log-level: debug’ in the ConfigMapData.' + type: boolean + nginxPlus: + description: Deploys the Ingress Controller for NGINX Plus. The default + is false meaning the Ingress Controller will be deployed for NGINX + OSS. + type: boolean + nginxReloadTimeout: + description: Timeout in milliseconds which the Ingress Controller + will wait for a successful NGINX reload after a change or at the + initial start. + type: integer + nginxStatus: + description: NGINX stub_status, or the NGINX Plus API. + nullable: true + properties: + allowCidrs: + description: Whitelist IPv4 IP/CIDR blocks to allow access to + NGINX stub_status or the NGINX Plus API. Separate multiple IP/CIDR + by commas. (default “127.0.0.1”) + type: string + enable: + description: Enable the NginxStatus. + type: boolean + port: + description: Set the port where the NGINX stub_status or the NGINX + Plus API is exposed. Default is 8080. Format is 1023 - 65535 + maximum: 65535 + minimum: 1023 + nullable: true + type: integer + required: + - enable + type: object + prometheus: + description: NGINX or NGINX Plus metrics in the Prometheus format. + nullable: true + properties: + enable: + description: Enable Prometheus metrics. + type: boolean + port: + description: Sets the port where the Prometheus metrics are exposed. + Default is 9113. Format is 1023 - 65535 + maximum: 65535 + minimum: 1023 + nullable: true + type: integer + required: + - enable + type: object + replicas: + description: The number of replicas of the Ingress Controller pod. + The default is 1. Only applies if the type is set to deployment. + format: int32 + type: integer + reportIngressStatus: + description: Update the address field in the status of Ingresses resources. + nullable: true + properties: + enable: + description: Enable the ReportIngressStatus. + type: boolean + externalService: + description: 'Specifies the name of the service with the type + LoadBalancer through which the Ingress controller pods are exposed + externally. The external address of the service is used when + reporting the status of Ingress resources. Note: Only if ServiceType + is different than LoadBalancer.' + type: string + required: + - enable + type: object + serviceType: + description: 'The type of the Service for the Ingress Controller. + Valid Service types are: NodePort and LoadBalancer.' + enum: + - NodePort + - LoadBalancer + type: string + type: + description: The type of the Ingress Controller installation - deployment + or daemonset. + enum: + - deployment + - daemonset + type: string + useIngressClassOnly: + description: Ignore Ingress resources without the “kubernetes.io/ingress.class” + annotation. + type: boolean + watchNamespace: + description: Namespace to watch for Ingress resources. By default + the Ingress controller watches all namespaces. + type: string + wildcardTLS: + description: A Secret with a TLS certificate and key for TLS termination + of every Ingress host for which TLS termination is enabled but the + Secret is not specified. If the argument is not set, for such Ingress + hosts NGINX will break any attempt to establish a TLS connection. + If the argument is set, but the Ingress controller is not able to + fetch the Secret from Kubernetes API, the Ingress Controller will + fail to start. Format is namespace/name. + type: string + required: + - enableCRDs + - image + - serviceType + - type + type: object + status: + description: NginxIngressControllerStatus defines the observed state of + NginxIngressController + properties: + deployed: + description: Deployed is true if the Operator has finished the deployment + of the NginxIngressController. + type: boolean + required: + - deployed + type: object + type: object served: true storage: true + subresources: + status: {}