diff --git a/README.md b/README.md
index 1dfde24e450e96d7d7507743ce285ec1e0f79f02..b629b19ad3f599429f0c5e13f41af6c9962f51cd 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,51 @@
 # Umbrella
 
-Work in progress umbrella package
\ No newline at end of file
+Work in progress umbrella package
+
+## Directory Structure
+
+```bash
+├── base                                            # common non-env specific
+    ├── cert-manager
+        ├── kustomization.yaml
+        ├── ...
+    ├── flux-system
+        ├── kustomization.yaml
+        ├── ...
+    ├── gatekeeper
+        ├── kustomization.yaml
+        ├── ...
+    ├── istio
+        ├── kustomization.yaml
+        ├── ...
+    ├── logging
+        ├── kustomization.yaml
+        ├── ...
+    ├── monitoring
+        ├── kustomization.yaml
+        ├── ...
+├── aws                                             # assumes running on aws
+    ├── base
+        ├── bootstrap
+            ├── gitrepositories
+            ├── kustomizations
+        ├── cert-manager
+        ├── flux-system
+        ├── gatekeeper
+        ├── istio
+        ├── logging
+        ├── monitoring
+    ├── instance
+├── on-prem                                         # assumes running on-prem
+    ├── base
+        ├── bootstrap
+            ├── sources
+            ├── apps
+    ├── instance
+├── azure                                           # assumes running on azure
+    ├── base
+        ├── bootstrap
+            ├── sources
+            ├── apps
+    ├── instance
+```
\ No newline at end of file
diff --git a/stack/base/cert-manager/cert-manager.yaml b/base/cert-manager/helmrelease.yaml
similarity index 100%
rename from stack/base/cert-manager/cert-manager.yaml
rename to base/cert-manager/helmrelease.yaml
diff --git a/stack/base/gatekeeper/kustomization.yaml b/base/cert-manager/kustomization.yaml
similarity index 60%
rename from stack/base/gatekeeper/kustomization.yaml
rename to base/cert-manager/kustomization.yaml
index 995372751ab93cc8cc3d7e7ccc6c26bede832b82..546c618ad939bfe128be67a9c74cadfee52a8420 100644
--- a/stack/base/gatekeeper/kustomization.yaml
+++ b/base/cert-manager/kustomization.yaml
@@ -1,3 +1,3 @@
 resources:
   - namespace.yaml
-  - gatekeeper.yaml
\ No newline at end of file
+  - helmrelease.yaml
\ No newline at end of file
diff --git a/stack/base/cert-manager/namespace.yaml b/base/cert-manager/namespace.yaml
similarity index 100%
rename from stack/base/cert-manager/namespace.yaml
rename to base/cert-manager/namespace.yaml
diff --git a/stack/base/flux-system/chart-repositories/banzaicloud.yaml b/base/flux/chart-repositories/banzaicloud.yaml
similarity index 100%
rename from stack/base/flux-system/chart-repositories/banzaicloud.yaml
rename to base/flux/chart-repositories/banzaicloud.yaml
diff --git a/stack/base/flux-system/chart-repositories/gitlab.yaml b/base/flux/chart-repositories/gitlab.yaml
similarity index 100%
rename from stack/base/flux-system/chart-repositories/gitlab.yaml
rename to base/flux/chart-repositories/gitlab.yaml
diff --git a/stack/base/flux-system/chart-repositories/grafana-loki.yaml b/base/flux/chart-repositories/grafana-loki.yaml
similarity index 100%
rename from stack/base/flux-system/chart-repositories/grafana-loki.yaml
rename to base/flux/chart-repositories/grafana-loki.yaml
diff --git a/stack/base/flux-system/chart-repositories/jetstack.yaml b/base/flux/chart-repositories/jetstack.yaml
similarity index 100%
rename from stack/base/flux-system/chart-repositories/jetstack.yaml
rename to base/flux/chart-repositories/jetstack.yaml
diff --git a/stack/base/flux-system/chart-repositories/kustomization.yaml b/base/flux/chart-repositories/kustomization.yaml
similarity index 100%
rename from stack/base/flux-system/chart-repositories/kustomization.yaml
rename to base/flux/chart-repositories/kustomization.yaml
diff --git a/stack/base/flux-system/chart-repositories/podinfo.yaml b/base/flux/chart-repositories/podinfo.yaml
similarity index 100%
rename from stack/base/flux-system/chart-repositories/podinfo.yaml
rename to base/flux/chart-repositories/podinfo.yaml
diff --git a/stack/base/flux-system/chart-repositories/prometheus-community.yaml b/base/flux/chart-repositories/prometheus-community.yaml
similarity index 100%
rename from stack/base/flux-system/chart-repositories/prometheus-community.yaml
rename to base/flux/chart-repositories/prometheus-community.yaml
diff --git a/stack/base/flux-system/chart-repositories/rancher-latest.yaml b/base/flux/chart-repositories/rancher-latest.yaml
similarity index 100%
rename from stack/base/flux-system/chart-repositories/rancher-latest.yaml
rename to base/flux/chart-repositories/rancher-latest.yaml
diff --git a/stack/base/flux-system/kustomization.yaml b/base/flux/kustomization.yaml
similarity index 100%
rename from stack/base/flux-system/kustomization.yaml
rename to base/flux/kustomization.yaml
diff --git a/stack/base/flux-system/toolkit/all.yaml b/base/flux/toolkit/all.yaml
similarity index 100%
rename from stack/base/flux-system/toolkit/all.yaml
rename to base/flux/toolkit/all.yaml
diff --git a/base/flux/toolkit/kustomization.yaml b/base/flux/toolkit/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..34f7f9bda4f2824a5b07ef52376d740143fea09c
--- /dev/null
+++ b/base/flux/toolkit/kustomization.yaml
@@ -0,0 +1,2 @@
+resources:
+  - all.yaml
diff --git a/stack/base/gatekeeper/gatekeeper.yaml b/base/gatekeeper/gatekeeper.yaml
similarity index 100%
rename from stack/base/gatekeeper/gatekeeper.yaml
rename to base/gatekeeper/gatekeeper.yaml
diff --git a/base/gatekeeper/kustomization.yaml b/base/gatekeeper/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d0e5c9351251efc504126b634eb8c74b4f811d49
--- /dev/null
+++ b/base/gatekeeper/kustomization.yaml
@@ -0,0 +1,8 @@
+resources:
+  - namespace.yaml
+  - gatekeeper.yaml
+
+images:
+  - name: openpolicyagent/gatekeeper:v3.1.1
+    newName: registry1.dsop.io/ironbank/opensource/openpolicyagent/gatekeeper
+    newTag: v3.1.1
\ No newline at end of file
diff --git a/stack/base/gatekeeper/namespace.yaml b/base/gatekeeper/namespace.yaml
similarity index 100%
rename from stack/base/gatekeeper/namespace.yaml
rename to base/gatekeeper/namespace.yaml
diff --git a/base/istio/istio-operator/kustomization.yaml b/base/istio/istio-operator/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b33e90c1480de79918e718b6e2d3e6acbf7adf60
--- /dev/null
+++ b/base/istio/istio-operator/kustomization.yaml
@@ -0,0 +1,7 @@
+resources:
+  - operator.yaml
+
+images:
+  - name: docker.io/istio/operator:1.7.4-distroless
+    newName: registry1.dsop.io/ironbank/opensource/istio/operator
+    newTag: 1.7.3
\ No newline at end of file
diff --git a/stack/base/istio/istio-operator/operator.yaml b/base/istio/istio-operator/operator.yaml
similarity index 100%
rename from stack/base/istio/istio-operator/operator.yaml
rename to base/istio/istio-operator/operator.yaml
diff --git a/stack/base/istio/istio-system/istio.yaml b/base/istio/istio-system/istio.yaml
similarity index 62%
rename from stack/base/istio/istio-system/istio.yaml
rename to base/istio/istio-system/istio.yaml
index 1d3dfa14c16efd1c5f5cf50081abc50c65f0c017..d53f852fec7650c1a46b7d5bdb5c2f49df3f347f 100644
--- a/stack/base/istio/istio-system/istio.yaml
+++ b/base/istio/istio-system/istio.yaml
@@ -5,11 +5,11 @@ metadata:
   namespace: istio-system
 spec:
   profile: default
-  tag: 1.7.4-distroless
+  hub: registry1.dsop.io/ironbank/opensource/istio
+  tag: 1.7.3
   meshConfig:
     accessLogFile: /dev/stdout
   addonComponents:
-
     kiali:
       enabled: true
 
@@ -17,6 +17,11 @@ spec:
       enabled: true
 
   values:
+    global:
+      imagePullSecrets:
+        - private-registry
+
+
     sidecarInjectorWebhook:
       rewriteAppHTTPProbe: true
       neverInjectSelector:
@@ -26,6 +31,14 @@ spec:
               values: [fluentd-configcheck]
 
     kiali:
+      hub: registry1.dsop.io/ironbank/opensource/kiali
+      image: kiali
+      tag: v1.23.0
       dashboard:
         auth:
           strategy: anonymous
+    tracing:
+      jaeger:
+        hub: registry1.dsop.io/ironbank/opensource/jaegertracing
+        image: all-in-one
+        tag: 1.19.2
diff --git a/stack/base/observability/kustomization.yaml b/base/istio/istio-system/kustomization.yaml
similarity index 63%
rename from stack/base/observability/kustomization.yaml
rename to base/istio/istio-system/kustomization.yaml
index a98eee0edfdb803f79ae0d327dd39e6fb9ffd7e5..e94541a50f25197d6648b498119a3cf47e0d56c3 100644
--- a/stack/base/observability/kustomization.yaml
+++ b/base/istio/istio-system/kustomization.yaml
@@ -1,4 +1,3 @@
 resources:
   - namespace.yaml
-
-  - monitoring/
+  - istio.yaml
\ No newline at end of file
diff --git a/stack/base/istio/istio-system/namespace.yaml b/base/istio/istio-system/namespace.yaml
similarity index 100%
rename from stack/base/istio/istio-system/namespace.yaml
rename to base/istio/istio-system/namespace.yaml
diff --git a/base/istio/kustomization.yaml b/base/istio/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7a61b389db4207fc7e58ed91ce1027a25aebc925
--- /dev/null
+++ b/base/istio/kustomization.yaml
@@ -0,0 +1,3 @@
+resources:
+  - istio-operator
+  - istio-system
\ No newline at end of file
diff --git a/base/logging/eck-operator/all-in-one.yaml b/base/logging/eck-operator/all-in-one.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e2a15744abb51f6979e845280a068403683a8082
--- /dev/null
+++ b/base/logging/eck-operator/all-in-one.yaml
@@ -0,0 +1,3008 @@
+---
+# Source: crds/all-crds.yaml
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.2.5
+  creationTimestamp: null
+  name: apmservers.apm.k8s.elastic.co
+spec:
+  additionalPrinterColumns:
+  - JSONPath: .status.health
+    name: health
+    type: string
+  - JSONPath: .status.availableNodes
+    description: Available nodes
+    name: nodes
+    type: integer
+  - JSONPath: .spec.version
+    description: APM version
+    name: version
+    type: string
+  - JSONPath: .metadata.creationTimestamp
+    name: age
+    type: date
+  group: apm.k8s.elastic.co
+  names:
+    categories:
+    - elastic
+    kind: ApmServer
+    listKind: ApmServerList
+    plural: apmservers
+    shortNames:
+    - apm
+    singular: apmserver
+  scope: Namespaced
+  subresources:
+    status: {}
+  validation:
+    openAPIV3Schema:
+      description: ApmServer represents an APM Server resource in a Kubernetes cluster.
+      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: ApmServerSpec holds the specification of an APM Server.
+          properties:
+            config:
+              description: 'Config holds the APM Server configuration. See: https://www.elastic.co/guide/en/apm/server/current/configuring-howto-apm-server.html'
+              type: object
+            count:
+              description: Count of APM Server instances to deploy.
+              format: int32
+              type: integer
+            elasticsearchRef:
+              description: ElasticsearchRef is a reference to the output Elasticsearch
+                cluster running in the same Kubernetes cluster.
+              properties:
+                name:
+                  description: Name of the Kubernetes object.
+                  type: string
+                namespace:
+                  description: Namespace of the Kubernetes object. If empty, defaults
+                    to the current namespace.
+                  type: string
+              required:
+              - name
+              type: object
+            http:
+              description: HTTP holds the HTTP layer configuration for the APM Server
+                resource.
+              properties:
+                service:
+                  description: Service defines the template for the associated Kubernetes
+                    Service object.
+                  properties:
+                    metadata:
+                      description: ObjectMeta is the metadata of the service. The
+                        name and namespace provided here are managed by ECK and will
+                        be ignored.
+                      type: object
+                    spec:
+                      description: Spec is the specification of the service.
+                      properties:
+                        clusterIP:
+                          description: 'clusterIP is the IP address of the service
+                            and is usually assigned randomly by the master. If an
+                            address is specified manually and is not in use by others,
+                            it will be allocated to the service; otherwise, creation
+                            of the service will fail. This field can not be changed
+                            through updates. Valid values are "None", empty string
+                            (""), or a valid IP address. "None" can be specified for
+                            headless services when proxying is not required. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        externalIPs:
+                          description: externalIPs is a list of IP addresses for which
+                            nodes in the cluster will also accept traffic for this
+                            service.  These IPs are not managed by Kubernetes.  The
+                            user is responsible for ensuring that traffic arrives
+                            at a node with this IP.  A common example is external
+                            load-balancers that are not part of the Kubernetes system.
+                          items:
+                            type: string
+                          type: array
+                        externalName:
+                          description: externalName is the external reference that
+                            kubedns or equivalent will return as a CNAME record for
+                            this service. No proxying will be involved. Must be a
+                            valid RFC-1123 hostname (https://tools.ietf.org/html/rfc1123)
+                            and requires Type to be ExternalName.
+                          type: string
+                        externalTrafficPolicy:
+                          description: externalTrafficPolicy denotes if this Service
+                            desires to route external traffic to node-local or cluster-wide
+                            endpoints. "Local" preserves the client source IP and
+                            avoids a second hop for LoadBalancer and Nodeport type
+                            services, but risks potentially imbalanced traffic spreading.
+                            "Cluster" obscures the client source IP and may cause
+                            a second hop to another node, but should have good overall
+                            load-spreading.
+                          type: string
+                        healthCheckNodePort:
+                          description: healthCheckNodePort specifies the healthcheck
+                            nodePort for the service. If not specified, HealthCheckNodePort
+                            is created by the service api backend with the allocated
+                            nodePort. Will use user-specified nodePort value if specified
+                            by the client. Only effects when Type is set to LoadBalancer
+                            and ExternalTrafficPolicy is set to Local.
+                          format: int32
+                          type: integer
+                        ipFamily:
+                          description: ipFamily specifies whether this Service has
+                            a preference for a particular IP family (e.g. IPv4 vs.
+                            IPv6).  If a specific IP family is requested, the clusterIP
+                            field will be allocated from that family, if it is available
+                            in the cluster.  If no IP family is requested, the cluster's
+                            primary IP family will be used. Other IP fields (loadBalancerIP,
+                            loadBalancerSourceRanges, externalIPs) and controllers
+                            which allocate external load-balancers should use the
+                            same IP family.  Endpoints for this Service will be of
+                            this family.  This field is immutable after creation.
+                            Assigning a ServiceIPFamily not available in the cluster
+                            (e.g. IPv6 in IPv4 only cluster) is an error condition
+                            and will fail during clusterIP assignment.
+                          type: string
+                        loadBalancerIP:
+                          description: 'Only applies to Service Type: LoadBalancer
+                            LoadBalancer will get created with the IP specified in
+                            this field. This feature depends on whether the underlying
+                            cloud-provider supports specifying the loadBalancerIP
+                            when a load balancer is created. This field will be ignored
+                            if the cloud-provider does not support the feature.'
+                          type: string
+                        loadBalancerSourceRanges:
+                          description: 'If specified and supported by the platform,
+                            this will restrict traffic through the cloud-provider
+                            load-balancer will be restricted to the specified client
+                            IPs. This field will be ignored if the cloud-provider
+                            does not support the feature." More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/'
+                          items:
+                            type: string
+                          type: array
+                        ports:
+                          description: 'The list of ports that are exposed by this
+                            service. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          items:
+                            description: ServicePort contains information on service's
+                              port.
+                            properties:
+                              name:
+                                description: The name of this port within the service.
+                                  This must be a DNS_LABEL. All ports within a ServiceSpec
+                                  must have unique names. When considering the endpoints
+                                  for a Service, this must match the 'name' field
+                                  in the EndpointPort. Optional if only one ServicePort
+                                  is defined on this service.
+                                type: string
+                              nodePort:
+                                description: 'The port on each node on which this
+                                  service is exposed when type=NodePort or LoadBalancer.
+                                  Usually assigned by the system. If specified, it
+                                  will be allocated to the service if unused or else
+                                  creation of the service will fail. Default is to
+                                  auto-allocate a port if the ServiceType of this
+                                  Service requires one. More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport'
+                                format: int32
+                                type: integer
+                              port:
+                                description: The port that will be exposed by this
+                                  service.
+                                format: int32
+                                type: integer
+                              protocol:
+                                description: The IP protocol for this port. Supports
+                                  "TCP", "UDP", and "SCTP". Default is TCP.
+                                type: string
+                              targetPort:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                description: 'Number or name of the port to access
+                                  on the pods targeted by the service. Number must
+                                  be in the range 1 to 65535. Name must be an IANA_SVC_NAME.
+                                  If this is a string, it will be looked up as a named
+                                  port in the target Pod''s container ports. If this
+                                  is not specified, the value of the ''port'' field
+                                  is used (an identity map). This field is ignored
+                                  for services with clusterIP=None, and should be
+                                  omitted or set equal to the ''port'' field. More
+                                  info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service'
+                            required:
+                            - port
+                            type: object
+                          type: array
+                        publishNotReadyAddresses:
+                          description: publishNotReadyAddresses, when set to true,
+                            indicates that DNS implementations must publish the notReadyAddresses
+                            of subsets for the Endpoints associated with the Service.
+                            The default value is false. The primary use case for setting
+                            this field is to use a StatefulSet's Headless Service
+                            to propagate SRV records for its Pods without respect
+                            to their readiness for purpose of peer discovery.
+                          type: boolean
+                        selector:
+                          additionalProperties:
+                            type: string
+                          description: 'Route service traffic to pods with label keys
+                            and values matching this selector. If empty or not present,
+                            the service is assumed to have an external process managing
+                            its endpoints, which Kubernetes will not modify. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/'
+                          type: object
+                        sessionAffinity:
+                          description: 'Supports "ClientIP" and "None". Used to maintain
+                            session affinity. Enable client IP based session affinity.
+                            Must be ClientIP or None. Defaults to None. More info:
+                            https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        sessionAffinityConfig:
+                          description: sessionAffinityConfig contains the configurations
+                            of session affinity.
+                          properties:
+                            clientIP:
+                              description: clientIP contains the configurations of
+                                Client IP based session affinity.
+                              properties:
+                                timeoutSeconds:
+                                  description: timeoutSeconds specifies the seconds
+                                    of ClientIP type session sticky time. The value
+                                    must be >0 && <=86400(for 1 day) if ServiceAffinity
+                                    == "ClientIP". Default value is 10800(for 3 hours).
+                                  format: int32
+                                  type: integer
+                              type: object
+                          type: object
+                        topologyKeys:
+                          description: topologyKeys is a preference-order list of
+                            topology keys which implementations of services should
+                            use to preferentially sort endpoints when accessing this
+                            Service, it can not be used at the same time as externalTrafficPolicy=Local.
+                            Topology keys must be valid label keys and at most 16
+                            keys may be specified. Endpoints are chosen based on the
+                            first topology key with available backends. If this field
+                            is specified and all entries have no backends that match
+                            the topology of the client, the service has no backends
+                            for that client and connections should fail. The special
+                            value "*" may be used to mean "any topology". This catch-all
+                            value, if used, only makes sense as the last value in
+                            the list. If this is not specified or empty, no topology
+                            constraints will be applied.
+                          items:
+                            type: string
+                          type: array
+                        type:
+                          description: 'type determines how the Service is exposed.
+                            Defaults to ClusterIP. Valid options are ExternalName,
+                            ClusterIP, NodePort, and LoadBalancer. "ExternalName"
+                            maps to the specified externalName. "ClusterIP" allocates
+                            a cluster-internal IP address for load-balancing to endpoints.
+                            Endpoints are determined by the selector or if that is
+                            not specified, by manual construction of an Endpoints
+                            object. If clusterIP is "None", no virtual IP is allocated
+                            and the endpoints are published as a set of endpoints
+                            rather than a stable IP. "NodePort" builds on ClusterIP
+                            and allocates a port on every node which routes to the
+                            clusterIP. "LoadBalancer" builds on NodePort and creates
+                            an external load-balancer (if supported in the current
+                            cloud) which routes to the clusterIP. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types'
+                          type: string
+                      type: object
+                  type: object
+                tls:
+                  description: TLS defines options for configuring TLS for HTTP.
+                  properties:
+                    certificate:
+                      description: "Certificate is a reference to a Kubernetes secret
+                        that contains the certificate and private key for enabling
+                        TLS. The referenced secret should contain the following: \n
+                        - `ca.crt`: The certificate authority (optional). - `tls.crt`:
+                        The certificate (or a chain). - `tls.key`: The private key
+                        to the first certificate in the certificate chain."
+                      properties:
+                        secretName:
+                          description: SecretName is the name of the secret.
+                          type: string
+                      type: object
+                    selfSignedCertificate:
+                      description: SelfSignedCertificate allows configuring the self-signed
+                        certificate generated by the operator.
+                      properties:
+                        disabled:
+                          description: Disabled indicates that the provisioning of
+                            the self-signed certifcate should be disabled.
+                          type: boolean
+                        subjectAltNames:
+                          description: SubjectAlternativeNames is a list of SANs to
+                            include in the generated HTTP TLS certificate.
+                          items:
+                            description: SubjectAlternativeName represents a SAN entry
+                              in a x509 certificate.
+                            properties:
+                              dns:
+                                description: DNS is the DNS name of the subject.
+                                type: string
+                              ip:
+                                description: IP is the IP address of the subject.
+                                type: string
+                            type: object
+                          type: array
+                      type: object
+                  type: object
+              type: object
+            image:
+              description: Image is the APM Server Docker image to deploy.
+              type: string
+            kibanaRef:
+              description: KibanaRef is a reference to a Kibana instance running in
+                the same Kubernetes cluster. It allows APM agent central configuration
+                management in Kibana.
+              properties:
+                name:
+                  description: Name of the Kubernetes object.
+                  type: string
+                namespace:
+                  description: Namespace of the Kubernetes object. If empty, defaults
+                    to the current namespace.
+                  type: string
+              required:
+              - name
+              type: object
+            podTemplate:
+              description: PodTemplate provides customisation options (labels, annotations,
+                affinity rules, resource requests, and so on) for the APM Server pods.
+              type: object
+            secureSettings:
+              description: SecureSettings is a list of references to Kubernetes secrets
+                containing sensitive configuration options for APM Server.
+              items:
+                description: SecretSource defines a data source based on a Kubernetes
+                  Secret.
+                properties:
+                  entries:
+                    description: Entries define how to project each key-value pair
+                      in the secret to filesystem paths. If not defined, all keys
+                      will be projected to similarly named paths in the filesystem.
+                      If defined, only the specified keys will be projected to the
+                      corresponding paths.
+                    items:
+                      description: KeyToPath defines how to map a key in a Secret
+                        object to a filesystem path.
+                      properties:
+                        key:
+                          description: Key is the key contained in the secret.
+                          type: string
+                        path:
+                          description: Path is the relative file path to map the key
+                            to. Path must not be an absolute file path and must not
+                            contain any ".." components.
+                          type: string
+                      required:
+                      - key
+                      type: object
+                    type: array
+                  secretName:
+                    description: SecretName is the name of the secret.
+                    type: string
+                required:
+                - secretName
+                type: object
+              type: array
+            serviceAccountName:
+              description: ServiceAccountName is used to check access from the current
+                resource to a resource (eg. Elasticsearch) in a different namespace.
+                Can only be used if ECK is enforcing RBAC on references.
+              type: string
+            version:
+              description: Version of the APM Server.
+              type: string
+          required:
+          - version
+          type: object
+        status:
+          description: ApmServerStatus defines the observed state of ApmServer
+          properties:
+            availableNodes:
+              format: int32
+              type: integer
+            elasticsearchAssociationStatus:
+              description: ElasticsearchAssociationStatus is the status of any auto-linking
+                to Elasticsearch clusters.
+              type: string
+            health:
+              description: ApmServerHealth expresses the status of the Apm Server
+                instances.
+              type: string
+            kibanaAssociationStatus:
+              description: KibanaAssociationStatus is the status of any auto-linking
+                to Kibana.
+              type: string
+            secretTokenSecret:
+              description: SecretTokenSecretName is the name of the Secret that contains
+                the secret token
+              type: string
+            service:
+              description: ExternalService is the name of the service the agents should
+                connect to.
+              type: string
+          type: object
+  version: v1
+  versions:
+  - name: v1
+    served: true
+    storage: true
+  - name: v1beta1
+    served: true
+    storage: false
+  - name: v1alpha1
+    served: false
+    storage: false
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.2.5
+  creationTimestamp: null
+  name: beats.beat.k8s.elastic.co
+spec:
+  additionalPrinterColumns:
+  - JSONPath: .status.health
+    name: health
+    type: string
+  - JSONPath: .status.availableNodes
+    description: Available nodes
+    name: available
+    type: integer
+  - JSONPath: .status.expectedNodes
+    description: Expected nodes
+    name: expected
+    type: integer
+  - JSONPath: .spec.type
+    description: Beat type
+    name: type
+    type: string
+  - JSONPath: .spec.version
+    description: Beat version
+    name: version
+    type: string
+  - JSONPath: .metadata.creationTimestamp
+    name: age
+    type: date
+  group: beat.k8s.elastic.co
+  names:
+    categories:
+    - elastic
+    kind: Beat
+    listKind: BeatList
+    plural: beats
+    shortNames:
+    - beat
+    singular: beat
+  scope: Namespaced
+  subresources:
+    status: {}
+  validation:
+    openAPIV3Schema:
+      description: Beat is the Schema for the Beats 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: BeatSpec defines the desired state of a Beat.
+          properties:
+            config:
+              description: Config holds the Beat configuration. At most one of [`Config`,
+                `ConfigRef`] can be specified.
+              type: object
+            configRef:
+              description: ConfigRef contains a reference to an existing Kubernetes
+                Secret holding the Beat configuration. Beat settings must be specified
+                as yaml, under a single "beat.yml" entry. At most one of [`Config`,
+                `ConfigRef`] can be specified.
+              properties:
+                secretName:
+                  description: SecretName is the name of the secret.
+                  type: string
+              type: object
+            daemonSet:
+              description: DaemonSet specifies the Beat should be deployed as a DaemonSet,
+                and allows providing its spec. Cannot be used along with `deployment`.
+                If both are absent a default for the Type is used.
+              properties: {}
+              type: object
+            deployment:
+              description: Deployment specifies the Beat should be deployed as a Deployment,
+                and allows providing its spec. Cannot be used along with `daemonSet`.
+                If both are absent a default for the Type is used.
+              properties:
+                replicas:
+                  format: int32
+                  type: integer
+              type: object
+            elasticsearchRef:
+              description: ElasticsearchRef is a reference to an Elasticsearch cluster
+                running in the same Kubernetes cluster.
+              properties:
+                name:
+                  description: Name of the Kubernetes object.
+                  type: string
+                namespace:
+                  description: Namespace of the Kubernetes object. If empty, defaults
+                    to the current namespace.
+                  type: string
+              required:
+              - name
+              type: object
+            image:
+              description: Image is the Beat Docker image to deploy. Version and Type
+                have to match the Beat in the image.
+              type: string
+            kibanaRef:
+              description: KibanaRef is a reference to a Kibana instance running in
+                the same Kubernetes cluster. It allows automatic setup of dashboards
+                and visualizations.
+              properties:
+                name:
+                  description: Name of the Kubernetes object.
+                  type: string
+                namespace:
+                  description: Namespace of the Kubernetes object. If empty, defaults
+                    to the current namespace.
+                  type: string
+              required:
+              - name
+              type: object
+            secureSettings:
+              description: SecureSettings is a list of references to Kubernetes Secrets
+                containing sensitive configuration options for the Beat. Secrets data
+                can be then referenced in the Beat config using the Secret's keys
+                or as specified in `Entries` field of each SecureSetting.
+              items:
+                description: SecretSource defines a data source based on a Kubernetes
+                  Secret.
+                properties:
+                  entries:
+                    description: Entries define how to project each key-value pair
+                      in the secret to filesystem paths. If not defined, all keys
+                      will be projected to similarly named paths in the filesystem.
+                      If defined, only the specified keys will be projected to the
+                      corresponding paths.
+                    items:
+                      description: KeyToPath defines how to map a key in a Secret
+                        object to a filesystem path.
+                      properties:
+                        key:
+                          description: Key is the key contained in the secret.
+                          type: string
+                        path:
+                          description: Path is the relative file path to map the key
+                            to. Path must not be an absolute file path and must not
+                            contain any ".." components.
+                          type: string
+                      required:
+                      - key
+                      type: object
+                    type: array
+                  secretName:
+                    description: SecretName is the name of the secret.
+                    type: string
+                required:
+                - secretName
+                type: object
+              type: array
+            serviceAccountName:
+              description: ServiceAccountName is used to check access from the current
+                resource to Elasticsearch resource in a different namespace. Can only
+                be used if ECK is enforcing RBAC on references.
+              type: string
+            type:
+              description: Type is the type of the Beat to deploy (filebeat, metricbeat,
+                heartbeat, auditbeat, journalbeat, packetbeat, etc.). Any string can
+                be used, but well-known types will have the image field defaulted
+                and have the appropriate Elasticsearch roles created automatically.
+                It also allows for dashboard setup when combined with a `KibanaRef`.
+              maxLength: 20
+              pattern: '[a-zA-Z0-9-]+'
+              type: string
+            version:
+              description: Version of the Beat.
+              type: string
+          required:
+          - type
+          - version
+          type: object
+        status:
+          description: BeatStatus defines the observed state of a Beat.
+          properties:
+            availableNodes:
+              format: int32
+              type: integer
+            elasticsearchAssociationStatus:
+              description: AssociationStatus is the status of an association resource.
+              type: string
+            expectedNodes:
+              format: int32
+              type: integer
+            health:
+              type: string
+            kibanaAssociationStatus:
+              description: AssociationStatus is the status of an association resource.
+              type: string
+          type: object
+  version: v1beta1
+  versions:
+  - name: v1beta1
+    served: true
+    storage: true
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.2.5
+  creationTimestamp: null
+  name: elasticsearches.elasticsearch.k8s.elastic.co
+spec:
+  additionalPrinterColumns:
+  - JSONPath: .status.health
+    name: health
+    type: string
+  - JSONPath: .status.availableNodes
+    description: Available nodes
+    name: nodes
+    type: integer
+  - JSONPath: .spec.version
+    description: Elasticsearch version
+    name: version
+    type: string
+  - JSONPath: .status.phase
+    name: phase
+    type: string
+  - JSONPath: .metadata.creationTimestamp
+    name: age
+    type: date
+  group: elasticsearch.k8s.elastic.co
+  names:
+    categories:
+    - elastic
+    kind: Elasticsearch
+    listKind: ElasticsearchList
+    plural: elasticsearches
+    shortNames:
+    - es
+    singular: elasticsearch
+  scope: Namespaced
+  subresources:
+    status: {}
+  validation:
+    openAPIV3Schema:
+      description: Elasticsearch represents an Elasticsearch resource in a Kubernetes
+        cluster.
+      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: ElasticsearchSpec holds the specification of an Elasticsearch
+            cluster.
+          properties:
+            auth:
+              description: Auth contains user authentication and authorization security
+                settings for Elasticsearch.
+              properties:
+                fileRealm:
+                  description: FileRealm to propagate to the Elasticsearch cluster.
+                  items:
+                    description: FileRealmSource references users to create in the
+                      Elasticsearch cluster.
+                    properties:
+                      secretName:
+                        description: SecretName is the name of the secret.
+                        type: string
+                    type: object
+                  type: array
+                roles:
+                  description: Roles to propagate to the Elasticsearch cluster.
+                  items:
+                    description: RoleSource references roles to create in the Elasticsearch
+                      cluster.
+                    properties:
+                      secretName:
+                        description: SecretName is the name of the secret.
+                        type: string
+                    type: object
+                  type: array
+              type: object
+            http:
+              description: HTTP holds HTTP layer settings for Elasticsearch.
+              properties:
+                service:
+                  description: Service defines the template for the associated Kubernetes
+                    Service object.
+                  properties:
+                    metadata:
+                      description: ObjectMeta is the metadata of the service. The
+                        name and namespace provided here are managed by ECK and will
+                        be ignored.
+                      type: object
+                    spec:
+                      description: Spec is the specification of the service.
+                      properties:
+                        clusterIP:
+                          description: 'clusterIP is the IP address of the service
+                            and is usually assigned randomly by the master. If an
+                            address is specified manually and is not in use by others,
+                            it will be allocated to the service; otherwise, creation
+                            of the service will fail. This field can not be changed
+                            through updates. Valid values are "None", empty string
+                            (""), or a valid IP address. "None" can be specified for
+                            headless services when proxying is not required. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        externalIPs:
+                          description: externalIPs is a list of IP addresses for which
+                            nodes in the cluster will also accept traffic for this
+                            service.  These IPs are not managed by Kubernetes.  The
+                            user is responsible for ensuring that traffic arrives
+                            at a node with this IP.  A common example is external
+                            load-balancers that are not part of the Kubernetes system.
+                          items:
+                            type: string
+                          type: array
+                        externalName:
+                          description: externalName is the external reference that
+                            kubedns or equivalent will return as a CNAME record for
+                            this service. No proxying will be involved. Must be a
+                            valid RFC-1123 hostname (https://tools.ietf.org/html/rfc1123)
+                            and requires Type to be ExternalName.
+                          type: string
+                        externalTrafficPolicy:
+                          description: externalTrafficPolicy denotes if this Service
+                            desires to route external traffic to node-local or cluster-wide
+                            endpoints. "Local" preserves the client source IP and
+                            avoids a second hop for LoadBalancer and Nodeport type
+                            services, but risks potentially imbalanced traffic spreading.
+                            "Cluster" obscures the client source IP and may cause
+                            a second hop to another node, but should have good overall
+                            load-spreading.
+                          type: string
+                        healthCheckNodePort:
+                          description: healthCheckNodePort specifies the healthcheck
+                            nodePort for the service. If not specified, HealthCheckNodePort
+                            is created by the service api backend with the allocated
+                            nodePort. Will use user-specified nodePort value if specified
+                            by the client. Only effects when Type is set to LoadBalancer
+                            and ExternalTrafficPolicy is set to Local.
+                          format: int32
+                          type: integer
+                        ipFamily:
+                          description: ipFamily specifies whether this Service has
+                            a preference for a particular IP family (e.g. IPv4 vs.
+                            IPv6).  If a specific IP family is requested, the clusterIP
+                            field will be allocated from that family, if it is available
+                            in the cluster.  If no IP family is requested, the cluster's
+                            primary IP family will be used. Other IP fields (loadBalancerIP,
+                            loadBalancerSourceRanges, externalIPs) and controllers
+                            which allocate external load-balancers should use the
+                            same IP family.  Endpoints for this Service will be of
+                            this family.  This field is immutable after creation.
+                            Assigning a ServiceIPFamily not available in the cluster
+                            (e.g. IPv6 in IPv4 only cluster) is an error condition
+                            and will fail during clusterIP assignment.
+                          type: string
+                        loadBalancerIP:
+                          description: 'Only applies to Service Type: LoadBalancer
+                            LoadBalancer will get created with the IP specified in
+                            this field. This feature depends on whether the underlying
+                            cloud-provider supports specifying the loadBalancerIP
+                            when a load balancer is created. This field will be ignored
+                            if the cloud-provider does not support the feature.'
+                          type: string
+                        loadBalancerSourceRanges:
+                          description: 'If specified and supported by the platform,
+                            this will restrict traffic through the cloud-provider
+                            load-balancer will be restricted to the specified client
+                            IPs. This field will be ignored if the cloud-provider
+                            does not support the feature." More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/'
+                          items:
+                            type: string
+                          type: array
+                        ports:
+                          description: 'The list of ports that are exposed by this
+                            service. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          items:
+                            description: ServicePort contains information on service's
+                              port.
+                            properties:
+                              name:
+                                description: The name of this port within the service.
+                                  This must be a DNS_LABEL. All ports within a ServiceSpec
+                                  must have unique names. When considering the endpoints
+                                  for a Service, this must match the 'name' field
+                                  in the EndpointPort. Optional if only one ServicePort
+                                  is defined on this service.
+                                type: string
+                              nodePort:
+                                description: 'The port on each node on which this
+                                  service is exposed when type=NodePort or LoadBalancer.
+                                  Usually assigned by the system. If specified, it
+                                  will be allocated to the service if unused or else
+                                  creation of the service will fail. Default is to
+                                  auto-allocate a port if the ServiceType of this
+                                  Service requires one. More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport'
+                                format: int32
+                                type: integer
+                              port:
+                                description: The port that will be exposed by this
+                                  service.
+                                format: int32
+                                type: integer
+                              protocol:
+                                description: The IP protocol for this port. Supports
+                                  "TCP", "UDP", and "SCTP". Default is TCP.
+                                type: string
+                              targetPort:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                description: 'Number or name of the port to access
+                                  on the pods targeted by the service. Number must
+                                  be in the range 1 to 65535. Name must be an IANA_SVC_NAME.
+                                  If this is a string, it will be looked up as a named
+                                  port in the target Pod''s container ports. If this
+                                  is not specified, the value of the ''port'' field
+                                  is used (an identity map). This field is ignored
+                                  for services with clusterIP=None, and should be
+                                  omitted or set equal to the ''port'' field. More
+                                  info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service'
+                            required:
+                            - port
+                            type: object
+                          type: array
+                        publishNotReadyAddresses:
+                          description: publishNotReadyAddresses, when set to true,
+                            indicates that DNS implementations must publish the notReadyAddresses
+                            of subsets for the Endpoints associated with the Service.
+                            The default value is false. The primary use case for setting
+                            this field is to use a StatefulSet's Headless Service
+                            to propagate SRV records for its Pods without respect
+                            to their readiness for purpose of peer discovery.
+                          type: boolean
+                        selector:
+                          additionalProperties:
+                            type: string
+                          description: 'Route service traffic to pods with label keys
+                            and values matching this selector. If empty or not present,
+                            the service is assumed to have an external process managing
+                            its endpoints, which Kubernetes will not modify. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/'
+                          type: object
+                        sessionAffinity:
+                          description: 'Supports "ClientIP" and "None". Used to maintain
+                            session affinity. Enable client IP based session affinity.
+                            Must be ClientIP or None. Defaults to None. More info:
+                            https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        sessionAffinityConfig:
+                          description: sessionAffinityConfig contains the configurations
+                            of session affinity.
+                          properties:
+                            clientIP:
+                              description: clientIP contains the configurations of
+                                Client IP based session affinity.
+                              properties:
+                                timeoutSeconds:
+                                  description: timeoutSeconds specifies the seconds
+                                    of ClientIP type session sticky time. The value
+                                    must be >0 && <=86400(for 1 day) if ServiceAffinity
+                                    == "ClientIP". Default value is 10800(for 3 hours).
+                                  format: int32
+                                  type: integer
+                              type: object
+                          type: object
+                        topologyKeys:
+                          description: topologyKeys is a preference-order list of
+                            topology keys which implementations of services should
+                            use to preferentially sort endpoints when accessing this
+                            Service, it can not be used at the same time as externalTrafficPolicy=Local.
+                            Topology keys must be valid label keys and at most 16
+                            keys may be specified. Endpoints are chosen based on the
+                            first topology key with available backends. If this field
+                            is specified and all entries have no backends that match
+                            the topology of the client, the service has no backends
+                            for that client and connections should fail. The special
+                            value "*" may be used to mean "any topology". This catch-all
+                            value, if used, only makes sense as the last value in
+                            the list. If this is not specified or empty, no topology
+                            constraints will be applied.
+                          items:
+                            type: string
+                          type: array
+                        type:
+                          description: 'type determines how the Service is exposed.
+                            Defaults to ClusterIP. Valid options are ExternalName,
+                            ClusterIP, NodePort, and LoadBalancer. "ExternalName"
+                            maps to the specified externalName. "ClusterIP" allocates
+                            a cluster-internal IP address for load-balancing to endpoints.
+                            Endpoints are determined by the selector or if that is
+                            not specified, by manual construction of an Endpoints
+                            object. If clusterIP is "None", no virtual IP is allocated
+                            and the endpoints are published as a set of endpoints
+                            rather than a stable IP. "NodePort" builds on ClusterIP
+                            and allocates a port on every node which routes to the
+                            clusterIP. "LoadBalancer" builds on NodePort and creates
+                            an external load-balancer (if supported in the current
+                            cloud) which routes to the clusterIP. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types'
+                          type: string
+                      type: object
+                  type: object
+                tls:
+                  description: TLS defines options for configuring TLS for HTTP.
+                  properties:
+                    certificate:
+                      description: "Certificate is a reference to a Kubernetes secret
+                        that contains the certificate and private key for enabling
+                        TLS. The referenced secret should contain the following: \n
+                        - `ca.crt`: The certificate authority (optional). - `tls.crt`:
+                        The certificate (or a chain). - `tls.key`: The private key
+                        to the first certificate in the certificate chain."
+                      properties:
+                        secretName:
+                          description: SecretName is the name of the secret.
+                          type: string
+                      type: object
+                    selfSignedCertificate:
+                      description: SelfSignedCertificate allows configuring the self-signed
+                        certificate generated by the operator.
+                      properties:
+                        disabled:
+                          description: Disabled indicates that the provisioning of
+                            the self-signed certifcate should be disabled.
+                          type: boolean
+                        subjectAltNames:
+                          description: SubjectAlternativeNames is a list of SANs to
+                            include in the generated HTTP TLS certificate.
+                          items:
+                            description: SubjectAlternativeName represents a SAN entry
+                              in a x509 certificate.
+                            properties:
+                              dns:
+                                description: DNS is the DNS name of the subject.
+                                type: string
+                              ip:
+                                description: IP is the IP address of the subject.
+                                type: string
+                            type: object
+                          type: array
+                      type: object
+                  type: object
+              type: object
+            image:
+              description: Image is the Elasticsearch Docker image to deploy.
+              type: string
+            nodeSets:
+              description: NodeSets allow specifying groups of Elasticsearch nodes
+                sharing the same configuration and Pod templates.
+              items:
+                description: NodeSet is the specification for a group of Elasticsearch
+                  nodes sharing the same configuration and a Pod template.
+                properties:
+                  config:
+                    description: Config holds the Elasticsearch configuration.
+                    type: object
+                  count:
+                    description: Count of Elasticsearch nodes to deploy.
+                    format: int32
+                    minimum: 1
+                    type: integer
+                  name:
+                    description: Name of this set of nodes. Becomes a part of the
+                      Elasticsearch node.name setting.
+                    maxLength: 23
+                    pattern: '[a-zA-Z0-9-]+'
+                    type: string
+                  podTemplate:
+                    description: PodTemplate provides customisation options (labels,
+                      annotations, affinity rules, resource requests, and so on) for
+                      the Pods belonging to this NodeSet.
+                    type: object
+                  volumeClaimTemplates:
+                    description: VolumeClaimTemplates is a list of persistent volume
+                      claims to be used by each Pod in this NodeSet. Every claim in
+                      this list must have a matching volumeMount in one of the containers
+                      defined in the PodTemplate. Items defined here take precedence
+                      over any default claims added by the operator with the same
+                      name.
+                    items:
+                      description: PersistentVolumeClaim is a user's request for and
+                        claim to a persistent volume
+                      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:
+                          description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata'
+                          type: object
+                        spec:
+                          description: 'Spec defines the desired characteristics of
+                            a volume requested by a pod author. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims'
+                          properties:
+                            accessModes:
+                              description: 'AccessModes contains the desired access
+                                modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1'
+                              items:
+                                type: string
+                              type: array
+                            dataSource:
+                              description: This field requires the VolumeSnapshotDataSource
+                                alpha feature gate to be enabled and currently VolumeSnapshot
+                                is the only supported data source. If the provisioner
+                                can support VolumeSnapshot data source, it will create
+                                a new volume and data will be restored to the volume
+                                at the same time. If the provisioner does not support
+                                VolumeSnapshot data source, volume will not be created
+                                and the failure will be reported as an event. In the
+                                future, we plan to support more data source types
+                                and the behavior of the provisioner may change.
+                              properties:
+                                apiGroup:
+                                  description: APIGroup is the group for the resource
+                                    being referenced. If APIGroup is not specified,
+                                    the specified Kind must be in the core API group.
+                                    For any other third-party types, APIGroup is required.
+                                  type: string
+                                kind:
+                                  description: Kind is the type of resource being
+                                    referenced
+                                  type: string
+                                name:
+                                  description: Name is the name of resource being
+                                    referenced
+                                  type: string
+                              required:
+                              - kind
+                              - name
+                              type: object
+                            resources:
+                              description: 'Resources represents the minimum resources
+                                the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
+                              properties:
+                                limits:
+                                  additionalProperties:
+                                    anyOf:
+                                    - type: integer
+                                    - type: string
+                                    pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                  description: 'Limits describes the maximum amount
+                                    of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
+                                  type: object
+                                requests:
+                                  additionalProperties:
+                                    anyOf:
+                                    - type: integer
+                                    - type: string
+                                    pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                  description: 'Requests describes the minimum amount
+                                    of compute resources required. If Requests is
+                                    omitted for a container, it defaults to Limits
+                                    if that is explicitly specified, otherwise to
+                                    an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
+                                  type: object
+                              type: object
+                            selector:
+                              description: A label query over volumes to consider
+                                for binding.
+                              properties:
+                                matchExpressions:
+                                  description: matchExpressions is a list of label
+                                    selector requirements. The requirements are ANDed.
+                                  items:
+                                    description: A label selector requirement is a
+                                      selector that contains values, a key, and an
+                                      operator that relates the key and values.
+                                    properties:
+                                      key:
+                                        description: key is the label key that the
+                                          selector applies to.
+                                        type: string
+                                      operator:
+                                        description: operator represents a key's relationship
+                                          to a set of values. Valid operators are
+                                          In, NotIn, Exists and DoesNotExist.
+                                        type: string
+                                      values:
+                                        description: values is an array of string
+                                          values. If the operator is In or NotIn,
+                                          the values array must be non-empty. If the
+                                          operator is Exists or DoesNotExist, the
+                                          values array must be empty. This array is
+                                          replaced during a strategic merge patch.
+                                        items:
+                                          type: string
+                                        type: array
+                                    required:
+                                    - key
+                                    - operator
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  description: matchLabels is a map of {key,value}
+                                    pairs. A single {key,value} in the matchLabels
+                                    map is equivalent to an element of matchExpressions,
+                                    whose key field is "key", the operator is "In",
+                                    and the values array contains only "value". The
+                                    requirements are ANDed.
+                                  type: object
+                              type: object
+                            storageClassName:
+                              description: 'Name of the StorageClass required by the
+                                claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
+                              type: string
+                            volumeMode:
+                              description: volumeMode defines what type of volume
+                                is required by the claim. Value of Filesystem is implied
+                                when not included in claim spec. This is a beta feature.
+                              type: string
+                            volumeName:
+                              description: VolumeName is the binding reference to
+                                the PersistentVolume backing this claim.
+                              type: string
+                          type: object
+                        status:
+                          description: 'Status represents the current information/status
+                            of a persistent volume claim. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims'
+                          properties:
+                            accessModes:
+                              description: 'AccessModes contains the actual access
+                                modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1'
+                              items:
+                                type: string
+                              type: array
+                            capacity:
+                              additionalProperties:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                              description: Represents the actual resources of the
+                                underlying volume.
+                              type: object
+                            conditions:
+                              description: Current Condition of persistent volume
+                                claim. If underlying persistent volume is being resized
+                                then the Condition will be set to 'ResizeStarted'.
+                              items:
+                                description: PersistentVolumeClaimCondition contails
+                                  details about state of pvc
+                                properties:
+                                  lastProbeTime:
+                                    description: Last time we probed the condition.
+                                    format: date-time
+                                    type: string
+                                  lastTransitionTime:
+                                    description: Last time the condition transitioned
+                                      from one status to another.
+                                    format: date-time
+                                    type: string
+                                  message:
+                                    description: Human-readable message indicating
+                                      details about last transition.
+                                    type: string
+                                  reason:
+                                    description: Unique, this should be a short, machine
+                                      understandable string that gives the reason
+                                      for condition's last transition. If it reports
+                                      "ResizeStarted" that means the underlying persistent
+                                      volume is being resized.
+                                    type: string
+                                  status:
+                                    type: string
+                                  type:
+                                    description: PersistentVolumeClaimConditionType
+                                      is a valid value of PersistentVolumeClaimCondition.Type
+                                    type: string
+                                required:
+                                - status
+                                - type
+                                type: object
+                              type: array
+                            phase:
+                              description: Phase represents the current phase of PersistentVolumeClaim.
+                              type: string
+                          type: object
+                      type: object
+                    type: array
+                required:
+                - count
+                - name
+                type: object
+              minItems: 1
+              type: array
+            podDisruptionBudget:
+              description: PodDisruptionBudget provides access to the default pod
+                disruption budget for the Elasticsearch cluster. The default budget
+                selects all cluster pods and sets `maxUnavailable` to 1. To disable,
+                set `PodDisruptionBudget` to the empty value (`{}` in YAML).
+              properties:
+                metadata:
+                  description: ObjectMeta is the metadata of the PDB. The name and
+                    namespace provided here are managed by ECK and will be ignored.
+                  type: object
+                spec:
+                  description: Spec is the specification of the PDB.
+                  properties:
+                    maxUnavailable:
+                      anyOf:
+                      - type: integer
+                      - type: string
+                      description: An eviction is allowed if at most "maxUnavailable"
+                        pods selected by "selector" are unavailable after the eviction,
+                        i.e. even in absence of the evicted pod. For example, one
+                        can prevent all voluntary evictions by specifying 0. This
+                        is a mutually exclusive setting with "minAvailable".
+                    minAvailable:
+                      anyOf:
+                      - type: integer
+                      - type: string
+                      description: An eviction is allowed if at least "minAvailable"
+                        pods selected by "selector" will still be available after
+                        the eviction, i.e. even in the absence of the evicted pod.  So
+                        for example you can prevent all voluntary evictions by specifying
+                        "100%".
+                    selector:
+                      description: Label query over pods whose evictions are managed
+                        by the disruption budget.
+                      properties:
+                        matchExpressions:
+                          description: matchExpressions is a list of label selector
+                            requirements. The requirements are ANDed.
+                          items:
+                            description: A label selector requirement is a selector
+                              that contains values, a key, and an operator that relates
+                              the key and values.
+                            properties:
+                              key:
+                                description: key is the label key that the selector
+                                  applies to.
+                                type: string
+                              operator:
+                                description: operator represents a key's relationship
+                                  to a set of values. Valid operators are In, NotIn,
+                                  Exists and DoesNotExist.
+                                type: string
+                              values:
+                                description: values is an array of string values.
+                                  If the operator is In or NotIn, the values array
+                                  must be non-empty. If the operator is Exists or
+                                  DoesNotExist, the values array must be empty. This
+                                  array is replaced during a strategic merge patch.
+                                items:
+                                  type: string
+                                type: array
+                            required:
+                            - key
+                            - operator
+                            type: object
+                          type: array
+                        matchLabels:
+                          additionalProperties:
+                            type: string
+                          description: matchLabels is a map of {key,value} pairs.
+                            A single {key,value} in the matchLabels map is equivalent
+                            to an element of matchExpressions, whose key field is
+                            "key", the operator is "In", and the values array contains
+                            only "value". The requirements are ANDed.
+                          type: object
+                      type: object
+                  type: object
+              type: object
+            remoteClusters:
+              description: RemoteClusters enables you to establish uni-directional
+                connections to a remote Elasticsearch cluster.
+              items:
+                description: RemoteCluster declares a remote Elasticsearch cluster
+                  connection.
+                properties:
+                  elasticsearchRef:
+                    description: ElasticsearchRef is a reference to an Elasticsearch
+                      cluster running within the same k8s cluster.
+                    properties:
+                      name:
+                        description: Name of the Kubernetes object.
+                        type: string
+                      namespace:
+                        description: Namespace of the Kubernetes object. If empty,
+                          defaults to the current namespace.
+                        type: string
+                    required:
+                    - name
+                    type: object
+                  name:
+                    description: Name is the name of the remote cluster as it is set
+                      in the Elasticsearch settings. The name is expected to be unique
+                      for each remote clusters.
+                    minLength: 1
+                    type: string
+                required:
+                - name
+                type: object
+              type: array
+            secureSettings:
+              description: SecureSettings is a list of references to Kubernetes secrets
+                containing sensitive configuration options for Elasticsearch.
+              items:
+                description: SecretSource defines a data source based on a Kubernetes
+                  Secret.
+                properties:
+                  entries:
+                    description: Entries define how to project each key-value pair
+                      in the secret to filesystem paths. If not defined, all keys
+                      will be projected to similarly named paths in the filesystem.
+                      If defined, only the specified keys will be projected to the
+                      corresponding paths.
+                    items:
+                      description: KeyToPath defines how to map a key in a Secret
+                        object to a filesystem path.
+                      properties:
+                        key:
+                          description: Key is the key contained in the secret.
+                          type: string
+                        path:
+                          description: Path is the relative file path to map the key
+                            to. Path must not be an absolute file path and must not
+                            contain any ".." components.
+                          type: string
+                      required:
+                      - key
+                      type: object
+                    type: array
+                  secretName:
+                    description: SecretName is the name of the secret.
+                    type: string
+                required:
+                - secretName
+                type: object
+              type: array
+            serviceAccountName:
+              description: ServiceAccountName is used to check access from the current
+                resource to a resource (eg. a remote Elasticsearch cluster) in a different
+                namespace. Can only be used if ECK is enforcing RBAC on references.
+              type: string
+            transport:
+              description: Transport holds transport layer settings for Elasticsearch.
+              properties:
+                service:
+                  description: Service defines the template for the associated Kubernetes
+                    Service object.
+                  properties:
+                    metadata:
+                      description: ObjectMeta is the metadata of the service. The
+                        name and namespace provided here are managed by ECK and will
+                        be ignored.
+                      type: object
+                    spec:
+                      description: Spec is the specification of the service.
+                      properties:
+                        clusterIP:
+                          description: 'clusterIP is the IP address of the service
+                            and is usually assigned randomly by the master. If an
+                            address is specified manually and is not in use by others,
+                            it will be allocated to the service; otherwise, creation
+                            of the service will fail. This field can not be changed
+                            through updates. Valid values are "None", empty string
+                            (""), or a valid IP address. "None" can be specified for
+                            headless services when proxying is not required. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        externalIPs:
+                          description: externalIPs is a list of IP addresses for which
+                            nodes in the cluster will also accept traffic for this
+                            service.  These IPs are not managed by Kubernetes.  The
+                            user is responsible for ensuring that traffic arrives
+                            at a node with this IP.  A common example is external
+                            load-balancers that are not part of the Kubernetes system.
+                          items:
+                            type: string
+                          type: array
+                        externalName:
+                          description: externalName is the external reference that
+                            kubedns or equivalent will return as a CNAME record for
+                            this service. No proxying will be involved. Must be a
+                            valid RFC-1123 hostname (https://tools.ietf.org/html/rfc1123)
+                            and requires Type to be ExternalName.
+                          type: string
+                        externalTrafficPolicy:
+                          description: externalTrafficPolicy denotes if this Service
+                            desires to route external traffic to node-local or cluster-wide
+                            endpoints. "Local" preserves the client source IP and
+                            avoids a second hop for LoadBalancer and Nodeport type
+                            services, but risks potentially imbalanced traffic spreading.
+                            "Cluster" obscures the client source IP and may cause
+                            a second hop to another node, but should have good overall
+                            load-spreading.
+                          type: string
+                        healthCheckNodePort:
+                          description: healthCheckNodePort specifies the healthcheck
+                            nodePort for the service. If not specified, HealthCheckNodePort
+                            is created by the service api backend with the allocated
+                            nodePort. Will use user-specified nodePort value if specified
+                            by the client. Only effects when Type is set to LoadBalancer
+                            and ExternalTrafficPolicy is set to Local.
+                          format: int32
+                          type: integer
+                        ipFamily:
+                          description: ipFamily specifies whether this Service has
+                            a preference for a particular IP family (e.g. IPv4 vs.
+                            IPv6).  If a specific IP family is requested, the clusterIP
+                            field will be allocated from that family, if it is available
+                            in the cluster.  If no IP family is requested, the cluster's
+                            primary IP family will be used. Other IP fields (loadBalancerIP,
+                            loadBalancerSourceRanges, externalIPs) and controllers
+                            which allocate external load-balancers should use the
+                            same IP family.  Endpoints for this Service will be of
+                            this family.  This field is immutable after creation.
+                            Assigning a ServiceIPFamily not available in the cluster
+                            (e.g. IPv6 in IPv4 only cluster) is an error condition
+                            and will fail during clusterIP assignment.
+                          type: string
+                        loadBalancerIP:
+                          description: 'Only applies to Service Type: LoadBalancer
+                            LoadBalancer will get created with the IP specified in
+                            this field. This feature depends on whether the underlying
+                            cloud-provider supports specifying the loadBalancerIP
+                            when a load balancer is created. This field will be ignored
+                            if the cloud-provider does not support the feature.'
+                          type: string
+                        loadBalancerSourceRanges:
+                          description: 'If specified and supported by the platform,
+                            this will restrict traffic through the cloud-provider
+                            load-balancer will be restricted to the specified client
+                            IPs. This field will be ignored if the cloud-provider
+                            does not support the feature." More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/'
+                          items:
+                            type: string
+                          type: array
+                        ports:
+                          description: 'The list of ports that are exposed by this
+                            service. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          items:
+                            description: ServicePort contains information on service's
+                              port.
+                            properties:
+                              name:
+                                description: The name of this port within the service.
+                                  This must be a DNS_LABEL. All ports within a ServiceSpec
+                                  must have unique names. When considering the endpoints
+                                  for a Service, this must match the 'name' field
+                                  in the EndpointPort. Optional if only one ServicePort
+                                  is defined on this service.
+                                type: string
+                              nodePort:
+                                description: 'The port on each node on which this
+                                  service is exposed when type=NodePort or LoadBalancer.
+                                  Usually assigned by the system. If specified, it
+                                  will be allocated to the service if unused or else
+                                  creation of the service will fail. Default is to
+                                  auto-allocate a port if the ServiceType of this
+                                  Service requires one. More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport'
+                                format: int32
+                                type: integer
+                              port:
+                                description: The port that will be exposed by this
+                                  service.
+                                format: int32
+                                type: integer
+                              protocol:
+                                description: The IP protocol for this port. Supports
+                                  "TCP", "UDP", and "SCTP". Default is TCP.
+                                type: string
+                              targetPort:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                description: 'Number or name of the port to access
+                                  on the pods targeted by the service. Number must
+                                  be in the range 1 to 65535. Name must be an IANA_SVC_NAME.
+                                  If this is a string, it will be looked up as a named
+                                  port in the target Pod''s container ports. If this
+                                  is not specified, the value of the ''port'' field
+                                  is used (an identity map). This field is ignored
+                                  for services with clusterIP=None, and should be
+                                  omitted or set equal to the ''port'' field. More
+                                  info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service'
+                            required:
+                            - port
+                            type: object
+                          type: array
+                        publishNotReadyAddresses:
+                          description: publishNotReadyAddresses, when set to true,
+                            indicates that DNS implementations must publish the notReadyAddresses
+                            of subsets for the Endpoints associated with the Service.
+                            The default value is false. The primary use case for setting
+                            this field is to use a StatefulSet's Headless Service
+                            to propagate SRV records for its Pods without respect
+                            to their readiness for purpose of peer discovery.
+                          type: boolean
+                        selector:
+                          additionalProperties:
+                            type: string
+                          description: 'Route service traffic to pods with label keys
+                            and values matching this selector. If empty or not present,
+                            the service is assumed to have an external process managing
+                            its endpoints, which Kubernetes will not modify. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/'
+                          type: object
+                        sessionAffinity:
+                          description: 'Supports "ClientIP" and "None". Used to maintain
+                            session affinity. Enable client IP based session affinity.
+                            Must be ClientIP or None. Defaults to None. More info:
+                            https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        sessionAffinityConfig:
+                          description: sessionAffinityConfig contains the configurations
+                            of session affinity.
+                          properties:
+                            clientIP:
+                              description: clientIP contains the configurations of
+                                Client IP based session affinity.
+                              properties:
+                                timeoutSeconds:
+                                  description: timeoutSeconds specifies the seconds
+                                    of ClientIP type session sticky time. The value
+                                    must be >0 && <=86400(for 1 day) if ServiceAffinity
+                                    == "ClientIP". Default value is 10800(for 3 hours).
+                                  format: int32
+                                  type: integer
+                              type: object
+                          type: object
+                        topologyKeys:
+                          description: topologyKeys is a preference-order list of
+                            topology keys which implementations of services should
+                            use to preferentially sort endpoints when accessing this
+                            Service, it can not be used at the same time as externalTrafficPolicy=Local.
+                            Topology keys must be valid label keys and at most 16
+                            keys may be specified. Endpoints are chosen based on the
+                            first topology key with available backends. If this field
+                            is specified and all entries have no backends that match
+                            the topology of the client, the service has no backends
+                            for that client and connections should fail. The special
+                            value "*" may be used to mean "any topology". This catch-all
+                            value, if used, only makes sense as the last value in
+                            the list. If this is not specified or empty, no topology
+                            constraints will be applied.
+                          items:
+                            type: string
+                          type: array
+                        type:
+                          description: 'type determines how the Service is exposed.
+                            Defaults to ClusterIP. Valid options are ExternalName,
+                            ClusterIP, NodePort, and LoadBalancer. "ExternalName"
+                            maps to the specified externalName. "ClusterIP" allocates
+                            a cluster-internal IP address for load-balancing to endpoints.
+                            Endpoints are determined by the selector or if that is
+                            not specified, by manual construction of an Endpoints
+                            object. If clusterIP is "None", no virtual IP is allocated
+                            and the endpoints are published as a set of endpoints
+                            rather than a stable IP. "NodePort" builds on ClusterIP
+                            and allocates a port on every node which routes to the
+                            clusterIP. "LoadBalancer" builds on NodePort and creates
+                            an external load-balancer (if supported in the current
+                            cloud) which routes to the clusterIP. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types'
+                          type: string
+                      type: object
+                  type: object
+              type: object
+            updateStrategy:
+              description: UpdateStrategy specifies how updates to the cluster should
+                be performed.
+              properties:
+                changeBudget:
+                  description: ChangeBudget defines the constraints to consider when
+                    applying changes to the Elasticsearch cluster.
+                  properties:
+                    maxSurge:
+                      description: MaxSurge is the maximum number of new pods that
+                        can be created exceeding the original number of pods defined
+                        in the specification. MaxSurge is only taken into consideration
+                        when scaling up. Setting a negative value will disable the
+                        restriction. Defaults to unbounded if not specified.
+                      format: int32
+                      type: integer
+                    maxUnavailable:
+                      description: MaxUnavailable is the maximum number of pods that
+                        can be unavailable (not ready) during the update due to circumstances
+                        under the control of the operator. Setting a negative value
+                        will disable this restriction. Defaults to 1 if not specified.
+                      format: int32
+                      type: integer
+                  type: object
+              type: object
+            version:
+              description: Version of Elasticsearch.
+              type: string
+          required:
+          - nodeSets
+          - version
+          type: object
+        status:
+          description: ElasticsearchStatus defines the observed state of Elasticsearch
+          properties:
+            availableNodes:
+              format: int32
+              type: integer
+            health:
+              description: ElasticsearchHealth is the health of the cluster as returned
+                by the health API.
+              type: string
+            phase:
+              description: ElasticsearchOrchestrationPhase is the phase Elasticsearch
+                is in from the controller point of view.
+              type: string
+          type: object
+  version: v1
+  versions:
+  - name: v1
+    served: true
+    storage: true
+  - name: v1beta1
+    served: true
+    storage: false
+  - name: v1alpha1
+    served: false
+    storage: false
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.2.5
+  creationTimestamp: null
+  name: enterprisesearches.enterprisesearch.k8s.elastic.co
+spec:
+  additionalPrinterColumns:
+  - JSONPath: .status.health
+    name: health
+    type: string
+  - JSONPath: .status.availableNodes
+    description: Available nodes
+    name: nodes
+    type: integer
+  - JSONPath: .spec.version
+    description: Enterprise Search version
+    name: version
+    type: string
+  - JSONPath: .metadata.creationTimestamp
+    name: age
+    type: date
+  group: enterprisesearch.k8s.elastic.co
+  names:
+    categories:
+    - elastic
+    kind: EnterpriseSearch
+    listKind: EnterpriseSearchList
+    plural: enterprisesearches
+    shortNames:
+    - ent
+    singular: enterprisesearch
+  scope: Namespaced
+  subresources:
+    status: {}
+  validation:
+    openAPIV3Schema:
+      description: EnterpriseSearch is a Kubernetes CRD to represent Enterprise Search.
+      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: EnterpriseSearchSpec holds the specification of an Enterprise
+            Search resource.
+          properties:
+            config:
+              description: Config holds the Enterprise Search configuration.
+              type: object
+            configRef:
+              description: ConfigRef contains a reference to an existing Kubernetes
+                Secret holding the Enterprise Search configuration. Configuration
+                settings are merged and have precedence over settings specified in
+                `config`.
+              properties:
+                secretName:
+                  description: SecretName is the name of the secret.
+                  type: string
+              type: object
+            count:
+              description: Count of Enterprise Search instances to deploy.
+              format: int32
+              type: integer
+            elasticsearchRef:
+              description: ElasticsearchRef is a reference to the Elasticsearch cluster
+                running in the same Kubernetes cluster.
+              properties:
+                name:
+                  description: Name of the Kubernetes object.
+                  type: string
+                namespace:
+                  description: Namespace of the Kubernetes object. If empty, defaults
+                    to the current namespace.
+                  type: string
+              required:
+              - name
+              type: object
+            http:
+              description: HTTP holds the HTTP layer configuration for Enterprise
+                Search resource.
+              properties:
+                service:
+                  description: Service defines the template for the associated Kubernetes
+                    Service object.
+                  properties:
+                    metadata:
+                      description: ObjectMeta is the metadata of the service. The
+                        name and namespace provided here are managed by ECK and will
+                        be ignored.
+                      type: object
+                    spec:
+                      description: Spec is the specification of the service.
+                      properties:
+                        clusterIP:
+                          description: 'clusterIP is the IP address of the service
+                            and is usually assigned randomly by the master. If an
+                            address is specified manually and is not in use by others,
+                            it will be allocated to the service; otherwise, creation
+                            of the service will fail. This field can not be changed
+                            through updates. Valid values are "None", empty string
+                            (""), or a valid IP address. "None" can be specified for
+                            headless services when proxying is not required. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        externalIPs:
+                          description: externalIPs is a list of IP addresses for which
+                            nodes in the cluster will also accept traffic for this
+                            service.  These IPs are not managed by Kubernetes.  The
+                            user is responsible for ensuring that traffic arrives
+                            at a node with this IP.  A common example is external
+                            load-balancers that are not part of the Kubernetes system.
+                          items:
+                            type: string
+                          type: array
+                        externalName:
+                          description: externalName is the external reference that
+                            kubedns or equivalent will return as a CNAME record for
+                            this service. No proxying will be involved. Must be a
+                            valid RFC-1123 hostname (https://tools.ietf.org/html/rfc1123)
+                            and requires Type to be ExternalName.
+                          type: string
+                        externalTrafficPolicy:
+                          description: externalTrafficPolicy denotes if this Service
+                            desires to route external traffic to node-local or cluster-wide
+                            endpoints. "Local" preserves the client source IP and
+                            avoids a second hop for LoadBalancer and Nodeport type
+                            services, but risks potentially imbalanced traffic spreading.
+                            "Cluster" obscures the client source IP and may cause
+                            a second hop to another node, but should have good overall
+                            load-spreading.
+                          type: string
+                        healthCheckNodePort:
+                          description: healthCheckNodePort specifies the healthcheck
+                            nodePort for the service. If not specified, HealthCheckNodePort
+                            is created by the service api backend with the allocated
+                            nodePort. Will use user-specified nodePort value if specified
+                            by the client. Only effects when Type is set to LoadBalancer
+                            and ExternalTrafficPolicy is set to Local.
+                          format: int32
+                          type: integer
+                        ipFamily:
+                          description: ipFamily specifies whether this Service has
+                            a preference for a particular IP family (e.g. IPv4 vs.
+                            IPv6).  If a specific IP family is requested, the clusterIP
+                            field will be allocated from that family, if it is available
+                            in the cluster.  If no IP family is requested, the cluster's
+                            primary IP family will be used. Other IP fields (loadBalancerIP,
+                            loadBalancerSourceRanges, externalIPs) and controllers
+                            which allocate external load-balancers should use the
+                            same IP family.  Endpoints for this Service will be of
+                            this family.  This field is immutable after creation.
+                            Assigning a ServiceIPFamily not available in the cluster
+                            (e.g. IPv6 in IPv4 only cluster) is an error condition
+                            and will fail during clusterIP assignment.
+                          type: string
+                        loadBalancerIP:
+                          description: 'Only applies to Service Type: LoadBalancer
+                            LoadBalancer will get created with the IP specified in
+                            this field. This feature depends on whether the underlying
+                            cloud-provider supports specifying the loadBalancerIP
+                            when a load balancer is created. This field will be ignored
+                            if the cloud-provider does not support the feature.'
+                          type: string
+                        loadBalancerSourceRanges:
+                          description: 'If specified and supported by the platform,
+                            this will restrict traffic through the cloud-provider
+                            load-balancer will be restricted to the specified client
+                            IPs. This field will be ignored if the cloud-provider
+                            does not support the feature." More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/'
+                          items:
+                            type: string
+                          type: array
+                        ports:
+                          description: 'The list of ports that are exposed by this
+                            service. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          items:
+                            description: ServicePort contains information on service's
+                              port.
+                            properties:
+                              name:
+                                description: The name of this port within the service.
+                                  This must be a DNS_LABEL. All ports within a ServiceSpec
+                                  must have unique names. When considering the endpoints
+                                  for a Service, this must match the 'name' field
+                                  in the EndpointPort. Optional if only one ServicePort
+                                  is defined on this service.
+                                type: string
+                              nodePort:
+                                description: 'The port on each node on which this
+                                  service is exposed when type=NodePort or LoadBalancer.
+                                  Usually assigned by the system. If specified, it
+                                  will be allocated to the service if unused or else
+                                  creation of the service will fail. Default is to
+                                  auto-allocate a port if the ServiceType of this
+                                  Service requires one. More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport'
+                                format: int32
+                                type: integer
+                              port:
+                                description: The port that will be exposed by this
+                                  service.
+                                format: int32
+                                type: integer
+                              protocol:
+                                description: The IP protocol for this port. Supports
+                                  "TCP", "UDP", and "SCTP". Default is TCP.
+                                type: string
+                              targetPort:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                description: 'Number or name of the port to access
+                                  on the pods targeted by the service. Number must
+                                  be in the range 1 to 65535. Name must be an IANA_SVC_NAME.
+                                  If this is a string, it will be looked up as a named
+                                  port in the target Pod''s container ports. If this
+                                  is not specified, the value of the ''port'' field
+                                  is used (an identity map). This field is ignored
+                                  for services with clusterIP=None, and should be
+                                  omitted or set equal to the ''port'' field. More
+                                  info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service'
+                            required:
+                            - port
+                            type: object
+                          type: array
+                        publishNotReadyAddresses:
+                          description: publishNotReadyAddresses, when set to true,
+                            indicates that DNS implementations must publish the notReadyAddresses
+                            of subsets for the Endpoints associated with the Service.
+                            The default value is false. The primary use case for setting
+                            this field is to use a StatefulSet's Headless Service
+                            to propagate SRV records for its Pods without respect
+                            to their readiness for purpose of peer discovery.
+                          type: boolean
+                        selector:
+                          additionalProperties:
+                            type: string
+                          description: 'Route service traffic to pods with label keys
+                            and values matching this selector. If empty or not present,
+                            the service is assumed to have an external process managing
+                            its endpoints, which Kubernetes will not modify. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/'
+                          type: object
+                        sessionAffinity:
+                          description: 'Supports "ClientIP" and "None". Used to maintain
+                            session affinity. Enable client IP based session affinity.
+                            Must be ClientIP or None. Defaults to None. More info:
+                            https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        sessionAffinityConfig:
+                          description: sessionAffinityConfig contains the configurations
+                            of session affinity.
+                          properties:
+                            clientIP:
+                              description: clientIP contains the configurations of
+                                Client IP based session affinity.
+                              properties:
+                                timeoutSeconds:
+                                  description: timeoutSeconds specifies the seconds
+                                    of ClientIP type session sticky time. The value
+                                    must be >0 && <=86400(for 1 day) if ServiceAffinity
+                                    == "ClientIP". Default value is 10800(for 3 hours).
+                                  format: int32
+                                  type: integer
+                              type: object
+                          type: object
+                        topologyKeys:
+                          description: topologyKeys is a preference-order list of
+                            topology keys which implementations of services should
+                            use to preferentially sort endpoints when accessing this
+                            Service, it can not be used at the same time as externalTrafficPolicy=Local.
+                            Topology keys must be valid label keys and at most 16
+                            keys may be specified. Endpoints are chosen based on the
+                            first topology key with available backends. If this field
+                            is specified and all entries have no backends that match
+                            the topology of the client, the service has no backends
+                            for that client and connections should fail. The special
+                            value "*" may be used to mean "any topology". This catch-all
+                            value, if used, only makes sense as the last value in
+                            the list. If this is not specified or empty, no topology
+                            constraints will be applied.
+                          items:
+                            type: string
+                          type: array
+                        type:
+                          description: 'type determines how the Service is exposed.
+                            Defaults to ClusterIP. Valid options are ExternalName,
+                            ClusterIP, NodePort, and LoadBalancer. "ExternalName"
+                            maps to the specified externalName. "ClusterIP" allocates
+                            a cluster-internal IP address for load-balancing to endpoints.
+                            Endpoints are determined by the selector or if that is
+                            not specified, by manual construction of an Endpoints
+                            object. If clusterIP is "None", no virtual IP is allocated
+                            and the endpoints are published as a set of endpoints
+                            rather than a stable IP. "NodePort" builds on ClusterIP
+                            and allocates a port on every node which routes to the
+                            clusterIP. "LoadBalancer" builds on NodePort and creates
+                            an external load-balancer (if supported in the current
+                            cloud) which routes to the clusterIP. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types'
+                          type: string
+                      type: object
+                  type: object
+                tls:
+                  description: TLS defines options for configuring TLS for HTTP.
+                  properties:
+                    certificate:
+                      description: "Certificate is a reference to a Kubernetes secret
+                        that contains the certificate and private key for enabling
+                        TLS. The referenced secret should contain the following: \n
+                        - `ca.crt`: The certificate authority (optional). - `tls.crt`:
+                        The certificate (or a chain). - `tls.key`: The private key
+                        to the first certificate in the certificate chain."
+                      properties:
+                        secretName:
+                          description: SecretName is the name of the secret.
+                          type: string
+                      type: object
+                    selfSignedCertificate:
+                      description: SelfSignedCertificate allows configuring the self-signed
+                        certificate generated by the operator.
+                      properties:
+                        disabled:
+                          description: Disabled indicates that the provisioning of
+                            the self-signed certifcate should be disabled.
+                          type: boolean
+                        subjectAltNames:
+                          description: SubjectAlternativeNames is a list of SANs to
+                            include in the generated HTTP TLS certificate.
+                          items:
+                            description: SubjectAlternativeName represents a SAN entry
+                              in a x509 certificate.
+                            properties:
+                              dns:
+                                description: DNS is the DNS name of the subject.
+                                type: string
+                              ip:
+                                description: IP is the IP address of the subject.
+                                type: string
+                            type: object
+                          type: array
+                      type: object
+                  type: object
+              type: object
+            image:
+              description: Image is the Enterprise Search Docker image to deploy.
+              type: string
+            podTemplate:
+              description: PodTemplate provides customisation options (labels, annotations,
+                affinity rules, resource requests, and so on) for the Enterprise Search
+                pods.
+              type: object
+            serviceAccountName:
+              description: ServiceAccountName is used to check access from the current
+                resource to a resource (eg. Elasticsearch) in a different namespace.
+                Can only be used if ECK is enforcing RBAC on references.
+              type: string
+            version:
+              description: Version of Enterprise Search.
+              type: string
+          type: object
+        status:
+          description: EnterpriseSearchStatus defines the observed state of EnterpriseSearch
+          properties:
+            associationStatus:
+              description: Association is the status of any auto-linking to Elasticsearch
+                clusters.
+              type: string
+            availableNodes:
+              format: int32
+              type: integer
+            health:
+              description: EnterpriseSearchHealth expresses the health of the Enterprise
+                Search instances.
+              type: string
+            service:
+              description: ExternalService is the name of the service associated to
+                the Enterprise Search Pods.
+              type: string
+          type: object
+  version: v1beta1
+  versions:
+  - name: v1beta1
+    served: true
+    storage: true
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.2.5
+  creationTimestamp: null
+  name: kibanas.kibana.k8s.elastic.co
+spec:
+  additionalPrinterColumns:
+  - JSONPath: .status.health
+    name: health
+    type: string
+  - JSONPath: .status.availableNodes
+    description: Available nodes
+    name: nodes
+    type: integer
+  - JSONPath: .spec.version
+    description: Kibana version
+    name: version
+    type: string
+  - JSONPath: .metadata.creationTimestamp
+    name: age
+    type: date
+  group: kibana.k8s.elastic.co
+  names:
+    categories:
+    - elastic
+    kind: Kibana
+    listKind: KibanaList
+    plural: kibanas
+    shortNames:
+    - kb
+    singular: kibana
+  scope: Namespaced
+  subresources:
+    status: {}
+  validation:
+    openAPIV3Schema:
+      description: Kibana represents a Kibana resource in a Kubernetes cluster.
+      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: KibanaSpec holds the specification of a Kibana instance.
+          properties:
+            config:
+              description: 'Config holds the Kibana configuration. See: https://www.elastic.co/guide/en/kibana/current/settings.html'
+              type: object
+            count:
+              description: Count of Kibana instances to deploy.
+              format: int32
+              type: integer
+            elasticsearchRef:
+              description: ElasticsearchRef is a reference to an Elasticsearch cluster
+                running in the same Kubernetes cluster.
+              properties:
+                name:
+                  description: Name of the Kubernetes object.
+                  type: string
+                namespace:
+                  description: Namespace of the Kubernetes object. If empty, defaults
+                    to the current namespace.
+                  type: string
+              required:
+              - name
+              type: object
+            http:
+              description: HTTP holds the HTTP layer configuration for Kibana.
+              properties:
+                service:
+                  description: Service defines the template for the associated Kubernetes
+                    Service object.
+                  properties:
+                    metadata:
+                      description: ObjectMeta is the metadata of the service. The
+                        name and namespace provided here are managed by ECK and will
+                        be ignored.
+                      type: object
+                    spec:
+                      description: Spec is the specification of the service.
+                      properties:
+                        clusterIP:
+                          description: 'clusterIP is the IP address of the service
+                            and is usually assigned randomly by the master. If an
+                            address is specified manually and is not in use by others,
+                            it will be allocated to the service; otherwise, creation
+                            of the service will fail. This field can not be changed
+                            through updates. Valid values are "None", empty string
+                            (""), or a valid IP address. "None" can be specified for
+                            headless services when proxying is not required. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        externalIPs:
+                          description: externalIPs is a list of IP addresses for which
+                            nodes in the cluster will also accept traffic for this
+                            service.  These IPs are not managed by Kubernetes.  The
+                            user is responsible for ensuring that traffic arrives
+                            at a node with this IP.  A common example is external
+                            load-balancers that are not part of the Kubernetes system.
+                          items:
+                            type: string
+                          type: array
+                        externalName:
+                          description: externalName is the external reference that
+                            kubedns or equivalent will return as a CNAME record for
+                            this service. No proxying will be involved. Must be a
+                            valid RFC-1123 hostname (https://tools.ietf.org/html/rfc1123)
+                            and requires Type to be ExternalName.
+                          type: string
+                        externalTrafficPolicy:
+                          description: externalTrafficPolicy denotes if this Service
+                            desires to route external traffic to node-local or cluster-wide
+                            endpoints. "Local" preserves the client source IP and
+                            avoids a second hop for LoadBalancer and Nodeport type
+                            services, but risks potentially imbalanced traffic spreading.
+                            "Cluster" obscures the client source IP and may cause
+                            a second hop to another node, but should have good overall
+                            load-spreading.
+                          type: string
+                        healthCheckNodePort:
+                          description: healthCheckNodePort specifies the healthcheck
+                            nodePort for the service. If not specified, HealthCheckNodePort
+                            is created by the service api backend with the allocated
+                            nodePort. Will use user-specified nodePort value if specified
+                            by the client. Only effects when Type is set to LoadBalancer
+                            and ExternalTrafficPolicy is set to Local.
+                          format: int32
+                          type: integer
+                        ipFamily:
+                          description: ipFamily specifies whether this Service has
+                            a preference for a particular IP family (e.g. IPv4 vs.
+                            IPv6).  If a specific IP family is requested, the clusterIP
+                            field will be allocated from that family, if it is available
+                            in the cluster.  If no IP family is requested, the cluster's
+                            primary IP family will be used. Other IP fields (loadBalancerIP,
+                            loadBalancerSourceRanges, externalIPs) and controllers
+                            which allocate external load-balancers should use the
+                            same IP family.  Endpoints for this Service will be of
+                            this family.  This field is immutable after creation.
+                            Assigning a ServiceIPFamily not available in the cluster
+                            (e.g. IPv6 in IPv4 only cluster) is an error condition
+                            and will fail during clusterIP assignment.
+                          type: string
+                        loadBalancerIP:
+                          description: 'Only applies to Service Type: LoadBalancer
+                            LoadBalancer will get created with the IP specified in
+                            this field. This feature depends on whether the underlying
+                            cloud-provider supports specifying the loadBalancerIP
+                            when a load balancer is created. This field will be ignored
+                            if the cloud-provider does not support the feature.'
+                          type: string
+                        loadBalancerSourceRanges:
+                          description: 'If specified and supported by the platform,
+                            this will restrict traffic through the cloud-provider
+                            load-balancer will be restricted to the specified client
+                            IPs. This field will be ignored if the cloud-provider
+                            does not support the feature." More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/'
+                          items:
+                            type: string
+                          type: array
+                        ports:
+                          description: 'The list of ports that are exposed by this
+                            service. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          items:
+                            description: ServicePort contains information on service's
+                              port.
+                            properties:
+                              name:
+                                description: The name of this port within the service.
+                                  This must be a DNS_LABEL. All ports within a ServiceSpec
+                                  must have unique names. When considering the endpoints
+                                  for a Service, this must match the 'name' field
+                                  in the EndpointPort. Optional if only one ServicePort
+                                  is defined on this service.
+                                type: string
+                              nodePort:
+                                description: 'The port on each node on which this
+                                  service is exposed when type=NodePort or LoadBalancer.
+                                  Usually assigned by the system. If specified, it
+                                  will be allocated to the service if unused or else
+                                  creation of the service will fail. Default is to
+                                  auto-allocate a port if the ServiceType of this
+                                  Service requires one. More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport'
+                                format: int32
+                                type: integer
+                              port:
+                                description: The port that will be exposed by this
+                                  service.
+                                format: int32
+                                type: integer
+                              protocol:
+                                description: The IP protocol for this port. Supports
+                                  "TCP", "UDP", and "SCTP". Default is TCP.
+                                type: string
+                              targetPort:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                description: 'Number or name of the port to access
+                                  on the pods targeted by the service. Number must
+                                  be in the range 1 to 65535. Name must be an IANA_SVC_NAME.
+                                  If this is a string, it will be looked up as a named
+                                  port in the target Pod''s container ports. If this
+                                  is not specified, the value of the ''port'' field
+                                  is used (an identity map). This field is ignored
+                                  for services with clusterIP=None, and should be
+                                  omitted or set equal to the ''port'' field. More
+                                  info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service'
+                            required:
+                            - port
+                            type: object
+                          type: array
+                        publishNotReadyAddresses:
+                          description: publishNotReadyAddresses, when set to true,
+                            indicates that DNS implementations must publish the notReadyAddresses
+                            of subsets for the Endpoints associated with the Service.
+                            The default value is false. The primary use case for setting
+                            this field is to use a StatefulSet's Headless Service
+                            to propagate SRV records for its Pods without respect
+                            to their readiness for purpose of peer discovery.
+                          type: boolean
+                        selector:
+                          additionalProperties:
+                            type: string
+                          description: 'Route service traffic to pods with label keys
+                            and values matching this selector. If empty or not present,
+                            the service is assumed to have an external process managing
+                            its endpoints, which Kubernetes will not modify. Only
+                            applies to types ClusterIP, NodePort, and LoadBalancer.
+                            Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/'
+                          type: object
+                        sessionAffinity:
+                          description: 'Supports "ClientIP" and "None". Used to maintain
+                            session affinity. Enable client IP based session affinity.
+                            Must be ClientIP or None. Defaults to None. More info:
+                            https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
+                          type: string
+                        sessionAffinityConfig:
+                          description: sessionAffinityConfig contains the configurations
+                            of session affinity.
+                          properties:
+                            clientIP:
+                              description: clientIP contains the configurations of
+                                Client IP based session affinity.
+                              properties:
+                                timeoutSeconds:
+                                  description: timeoutSeconds specifies the seconds
+                                    of ClientIP type session sticky time. The value
+                                    must be >0 && <=86400(for 1 day) if ServiceAffinity
+                                    == "ClientIP". Default value is 10800(for 3 hours).
+                                  format: int32
+                                  type: integer
+                              type: object
+                          type: object
+                        topologyKeys:
+                          description: topologyKeys is a preference-order list of
+                            topology keys which implementations of services should
+                            use to preferentially sort endpoints when accessing this
+                            Service, it can not be used at the same time as externalTrafficPolicy=Local.
+                            Topology keys must be valid label keys and at most 16
+                            keys may be specified. Endpoints are chosen based on the
+                            first topology key with available backends. If this field
+                            is specified and all entries have no backends that match
+                            the topology of the client, the service has no backends
+                            for that client and connections should fail. The special
+                            value "*" may be used to mean "any topology". This catch-all
+                            value, if used, only makes sense as the last value in
+                            the list. If this is not specified or empty, no topology
+                            constraints will be applied.
+                          items:
+                            type: string
+                          type: array
+                        type:
+                          description: 'type determines how the Service is exposed.
+                            Defaults to ClusterIP. Valid options are ExternalName,
+                            ClusterIP, NodePort, and LoadBalancer. "ExternalName"
+                            maps to the specified externalName. "ClusterIP" allocates
+                            a cluster-internal IP address for load-balancing to endpoints.
+                            Endpoints are determined by the selector or if that is
+                            not specified, by manual construction of an Endpoints
+                            object. If clusterIP is "None", no virtual IP is allocated
+                            and the endpoints are published as a set of endpoints
+                            rather than a stable IP. "NodePort" builds on ClusterIP
+                            and allocates a port on every node which routes to the
+                            clusterIP. "LoadBalancer" builds on NodePort and creates
+                            an external load-balancer (if supported in the current
+                            cloud) which routes to the clusterIP. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types'
+                          type: string
+                      type: object
+                  type: object
+                tls:
+                  description: TLS defines options for configuring TLS for HTTP.
+                  properties:
+                    certificate:
+                      description: "Certificate is a reference to a Kubernetes secret
+                        that contains the certificate and private key for enabling
+                        TLS. The referenced secret should contain the following: \n
+                        - `ca.crt`: The certificate authority (optional). - `tls.crt`:
+                        The certificate (or a chain). - `tls.key`: The private key
+                        to the first certificate in the certificate chain."
+                      properties:
+                        secretName:
+                          description: SecretName is the name of the secret.
+                          type: string
+                      type: object
+                    selfSignedCertificate:
+                      description: SelfSignedCertificate allows configuring the self-signed
+                        certificate generated by the operator.
+                      properties:
+                        disabled:
+                          description: Disabled indicates that the provisioning of
+                            the self-signed certifcate should be disabled.
+                          type: boolean
+                        subjectAltNames:
+                          description: SubjectAlternativeNames is a list of SANs to
+                            include in the generated HTTP TLS certificate.
+                          items:
+                            description: SubjectAlternativeName represents a SAN entry
+                              in a x509 certificate.
+                            properties:
+                              dns:
+                                description: DNS is the DNS name of the subject.
+                                type: string
+                              ip:
+                                description: IP is the IP address of the subject.
+                                type: string
+                            type: object
+                          type: array
+                      type: object
+                  type: object
+              type: object
+            image:
+              description: Image is the Kibana Docker image to deploy.
+              type: string
+            podTemplate:
+              description: PodTemplate provides customisation options (labels, annotations,
+                affinity rules, resource requests, and so on) for the Kibana pods
+              type: object
+            secureSettings:
+              description: SecureSettings is a list of references to Kubernetes secrets
+                containing sensitive configuration options for Kibana.
+              items:
+                description: SecretSource defines a data source based on a Kubernetes
+                  Secret.
+                properties:
+                  entries:
+                    description: Entries define how to project each key-value pair
+                      in the secret to filesystem paths. If not defined, all keys
+                      will be projected to similarly named paths in the filesystem.
+                      If defined, only the specified keys will be projected to the
+                      corresponding paths.
+                    items:
+                      description: KeyToPath defines how to map a key in a Secret
+                        object to a filesystem path.
+                      properties:
+                        key:
+                          description: Key is the key contained in the secret.
+                          type: string
+                        path:
+                          description: Path is the relative file path to map the key
+                            to. Path must not be an absolute file path and must not
+                            contain any ".." components.
+                          type: string
+                      required:
+                      - key
+                      type: object
+                    type: array
+                  secretName:
+                    description: SecretName is the name of the secret.
+                    type: string
+                required:
+                - secretName
+                type: object
+              type: array
+            serviceAccountName:
+              description: ServiceAccountName is used to check access from the current
+                resource to a resource (eg. Elasticsearch) in a different namespace.
+                Can only be used if ECK is enforcing RBAC on references.
+              type: string
+            version:
+              description: Version of Kibana.
+              type: string
+          required:
+          - version
+          type: object
+        status:
+          description: KibanaStatus defines the observed state of Kibana
+          properties:
+            associationStatus:
+              description: AssociationStatus is the status of an association resource.
+              type: string
+            availableNodes:
+              format: int32
+              type: integer
+            health:
+              description: KibanaHealth expresses the status of the Kibana instances.
+              type: string
+          type: object
+  version: v1
+  versions:
+  - name: v1
+    served: true
+    storage: true
+  - name: v1beta1
+    served: true
+    storage: false
+  - name: v1alpha1
+    served: false
+    storage: false
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
+
+---
+# Source: eck/templates/namespace.yaml
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: elastic-system
+---
+# Source: eck/templates/service-account.yaml
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: elastic-operator
+  namespace: elastic-system
+---
+# Source: eck/templates/webhook.yaml
+apiVersion: v1
+kind: Secret
+metadata:
+  name: "elastic-webhook-server-cert"
+  namespace: elastic-system
+---
+# Source: eck/templates/cluster-role.yaml
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: elastic-operator
+rules:
+- apiGroups:
+  - "authorization.k8s.io"
+  resources:
+  - subjectaccessreviews
+  verbs:
+  - create
+- apiGroups:
+  - ""
+  resources:
+  - pods
+  - endpoints
+  - events
+  - persistentvolumeclaims
+  - secrets
+  - services
+  - configmaps
+  - serviceaccounts
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
+- apiGroups:
+  - apps
+  resources:
+  - deployments
+  - statefulsets
+  - daemonsets
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
+- apiGroups:
+  - policy
+  resources:
+  - poddisruptionbudgets
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
+- apiGroups:
+  - elasticsearch.k8s.elastic.co
+  resources:
+  - elasticsearches
+  - elasticsearches/status
+  - elasticsearches/finalizers
+  - enterpriselicenses
+  - enterpriselicenses/status
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
+- apiGroups:
+  - kibana.k8s.elastic.co
+  resources:
+  - kibanas
+  - kibanas/status
+  - kibanas/finalizers
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
+- apiGroups:
+  - apm.k8s.elastic.co
+  resources:
+  - apmservers
+  - apmservers/status
+  - apmservers/finalizers
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
+- apiGroups:
+  - enterprisesearch.k8s.elastic.co
+  resources:
+  - enterprisesearches
+  - enterprisesearches/status
+  - enterprisesearches/finalizers
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
+- apiGroups:
+  - admissionregistration.k8s.io
+  resources:
+  - mutatingwebhookconfigurations
+  - validatingwebhookconfigurations
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
+- apiGroups:
+  - beat.k8s.elastic.co
+  resources:
+  - beats
+  - beats/status
+  - beats/finalizers
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
+---
+# Source: eck/templates/cluster-role.yaml
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: "elastic-operator-view"
+  labels:
+    rbac.authorization.k8s.io/aggregate-to-view: "true"
+    rbac.authorization.k8s.io/aggregate-to-edit: "true"
+    rbac.authorization.k8s.io/aggregate-to-admin: "true"
+rules:
+  - apiGroups: ["elasticsearch.k8s.elastic.co"]
+    resources: ["elasticsearches"]
+    verbs: ["get", "list", "watch"]
+  - apiGroups: ["apm.k8s.elastic.co"]
+    resources: ["apmservers"]
+    verbs: ["get", "list", "watch"]
+  - apiGroups: ["kibana.k8s.elastic.co"]
+    resources: ["kibanas"]
+    verbs: ["get", "list", "watch"]
+  - apiGroups: ["enterprisesearch.k8s.elastic.co"]
+    resources: ["enterprisesearches"]
+    verbs: ["get", "list", "watch"]
+  - apiGroups: ["beat.k8s.elastic.co"]
+    resources: ["beats"]
+    verbs: ["get", "list", "watch"]
+---
+# Source: eck/templates/cluster-role.yaml
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: "elastic-operator-edit"
+  labels:
+    rbac.authorization.k8s.io/aggregate-to-edit: "true"
+    rbac.authorization.k8s.io/aggregate-to-admin: "true"
+rules:
+  - apiGroups: ["elasticsearch.k8s.elastic.co"]
+    resources: ["elasticsearches"]
+    verbs: ["create", "delete", "deletecollection", "patch", "update"]
+  - apiGroups: ["apm.k8s.elastic.co"]
+    resources: ["apmservers"]
+    verbs: ["create", "delete", "deletecollection", "patch", "update"]
+  - apiGroups: ["kibana.k8s.elastic.co"]
+    resources: ["kibanas"]
+    verbs: ["create", "delete", "deletecollection", "patch", "update"]
+  - apiGroups: ["enterprisesearch.k8s.elastic.co"]
+    resources: ["enterprisesearches"]
+    verbs: ["create", "delete", "deletecollection", "patch", "update"]
+  - apiGroups: ["beat.k8s.elastic.co"]
+    resources: ["beats"]
+    verbs: ["create", "delete", "deletecollection", "patch", "update"]
+---
+# Source: eck/templates/managed-ns-role-bindings.yaml
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: elastic-operator
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: elastic-operator
+subjects:
+- kind: ServiceAccount
+  name: elastic-operator
+  namespace: elastic-system
+---
+# Source: eck/templates/operator-role-binding.yaml
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: elastic-operator
+  namespace: elastic-system
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: elastic-operator
+subjects:
+- kind: ServiceAccount
+  name: elastic-operator
+  namespace: elastic-system
+---
+# Source: eck/templates/webhook.yaml
+apiVersion: v1
+kind: Service
+metadata:
+  name: elastic-webhook-server
+  namespace: elastic-system
+spec:
+  ports:
+    - name: https
+      port: 443
+      targetPort: 9443
+  selector:
+    control-plane: elastic-operator
+---
+# Source: eck/templates/statefulset.yaml
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: elastic-operator
+  namespace: elastic-system
+  labels:
+    control-plane: elastic-operator
+spec:
+  selector:
+    matchLabels:
+      control-plane: elastic-operator
+  serviceName: elastic-operator
+  template:
+    metadata:
+      annotations:
+        # Rename the fields "error" to "error.message" and "source" to "event.source"
+        # This is to avoid a conflict with the ECS "error" and "source" documents.
+        "co.elastic.logs/raw": "[{\"type\":\"container\",\"json.keys_under_root\":true,\"paths\":[\"/var/log/containers/*${data.kubernetes.container.id}.log\"],\"processors\":[{\"convert\":{\"mode\":\"rename\",\"ignore_missing\":true,\"fields\":[{\"from\":\"error\",\"to\":\"_error\"}]}},{\"convert\":{\"mode\":\"rename\",\"ignore_missing\":true,\"fields\":[{\"from\":\"_error\",\"to\":\"error.message\"}]}},{\"convert\":{\"mode\":\"rename\",\"ignore_missing\":true,\"fields\":[{\"from\":\"source\",\"to\":\"_source\"}]}},{\"convert\":{\"mode\":\"rename\",\"ignore_missing\":true,\"fields\":[{\"from\":\"_source\",\"to\":\"event.source\"}]}}]}]"
+      labels:
+        control-plane: elastic-operator
+    spec:
+      terminationGracePeriodSeconds: 10
+      serviceAccountName: elastic-operator
+      containers:
+      - image: "docker.elastic.co/eck/eck-operator:1.2.1"
+        imagePullPolicy: IfNotPresent
+        name: manager
+        args:
+          - "manager"
+          - "--log-verbosity=0"
+          - "--metrics-port=0"
+          - "--container-registry=docker.elastic.co"
+          - "--max-concurrent-reconciles=3"
+          - "--ca-cert-validity=8760h"
+          - "--ca-cert-rotate-before=24h"
+          - "--cert-validity=8760h"
+          - "--cert-rotate-before=24h"
+          - "--enable-webhook"
+        env:
+          - name: OPERATOR_NAMESPACE
+            valueFrom:
+              fieldRef:
+                fieldPath: metadata.namespace
+          - name: OPERATOR_IMAGE
+            value: "docker.elastic.co/eck/eck-operator:1.2.1"
+          - name: WEBHOOK_SECRET
+            value: "elastic-webhook-server-cert"
+        resources:
+            limits:
+              cpu: 1
+              memory: 512Mi
+            requests:
+              cpu: 100m
+              memory: 150Mi
+        ports:
+        - containerPort: 9443
+          name: https-webhook
+          protocol: TCP
+        volumeMounts:
+          - mountPath: /tmp/k8s-webhook-server/serving-certs
+            name: cert
+            readOnly: true
+      volumes:
+        - name: cert
+          secret:
+            defaultMode: 420
+            secretName: "elastic-webhook-server-cert"
+---
+# Source: eck/templates/webhook.yaml
+apiVersion: admissionregistration.k8s.io/v1beta1
+kind: ValidatingWebhookConfiguration
+metadata:
+  name: elastic-webhook.k8s.elastic.co
+webhooks:
+- clientConfig:
+    caBundle: Cg==
+    service:
+      name: elastic-webhook-server
+      namespace: elastic-system
+      path: /validate-apm-k8s-elastic-co-v1-apmserver
+  failurePolicy: Ignore
+  name: elastic-apm-validation-v1.k8s.elastic.co
+  rules:
+  - apiGroups:
+    - apm.k8s.elastic.co
+    apiVersions:
+    - v1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - apmservers
+- clientConfig:
+    caBundle: Cg==
+    service:
+      name: elastic-webhook-server
+      namespace: elastic-system
+      path: /validate-apm-k8s-elastic-co-v1beta1-apmserver
+  failurePolicy: Ignore
+  name: elastic-apm-validation-v1beta1.k8s.elastic.co
+  rules:
+  - apiGroups:
+    - apm.k8s.elastic.co
+    apiVersions:
+    - v1beta1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - apmservers
+- clientConfig:
+    caBundle: Cg==
+    service:
+      name: elastic-webhook-server
+      namespace: elastic-system
+      path: /validate-beat-k8s-elastic-co-v1beta1-beat
+  failurePolicy: Ignore
+  name: elastic-beat-validation-v1beta1.k8s.elastic.co
+  rules:
+  - apiGroups:
+    - beat.k8s.elastic.co
+    apiVersions:
+    - v1beta1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - beats
+- clientConfig:
+    caBundle: Cg==
+    service:
+      name: elastic-webhook-server
+      namespace: elastic-system
+      path: /validate-elasticsearch-k8s-elastic-co-v1-elasticsearch
+  failurePolicy: Ignore
+  name: elastic-es-validation-v1.k8s.elastic.co
+  rules:
+  - apiGroups:
+    - elasticsearch.k8s.elastic.co
+    apiVersions:
+    - v1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - elasticsearches
+- clientConfig:
+    caBundle: Cg==
+    service:
+      name: elastic-webhook-server
+      namespace: elastic-system
+      path: /validate-elasticsearch-k8s-elastic-co-v1beta1-elasticsearch
+  failurePolicy: Ignore
+  name: elastic-es-validation-v1beta1.k8s.elastic.co
+  rules:
+  - apiGroups:
+    - elasticsearch.k8s.elastic.co
+    apiVersions:
+    - v1beta1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - elasticsearches
+- clientConfig:
+    caBundle: Cg==
+    service:
+      name: elastic-webhook-server
+      namespace: elastic-system
+      path: /validate-kibana-k8s-elastic-co-v1-kibana
+  failurePolicy: Ignore
+  name: elastic-kb-validation-v1.k8s.elastic.co
+  rules:
+  - apiGroups:
+    - kibana.k8s.elastic.co
+    apiVersions:
+    - v1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - kibanas
+- clientConfig:
+    caBundle: Cg==
+    service:
+      name: elastic-webhook-server
+      namespace: elastic-system
+      path: /validate-kibana-k8s-elastic-co-v1beta1-kibana
+  failurePolicy: Ignore
+  name: elastic-kb-validation-v1beta1.k8s.elastic.co
+  rules:
+  - apiGroups:
+    - kibana.k8s.elastic.co
+    apiVersions:
+    - v1beta1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - kibanas
+
diff --git a/base/logging/eck-operator/kustomization.yaml b/base/logging/eck-operator/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..6729459466ccc2c785d2176a6f5ad9cec226888d
--- /dev/null
+++ b/base/logging/eck-operator/kustomization.yaml
@@ -0,0 +1,8 @@
+resources:
+  - all-in-one.yaml
+
+#images:
+#  # TODO: This image doesnt't work yet
+#  - name: docker.elastic.co/eck/eck-operator:1.2.1
+#    newName: registry1.dsop.io/ironbank/elastic/eck-operator/eck-operator
+#    newTag: 1.2.1
diff --git a/base/logging/efk/elasticsearch.yaml b/base/logging/efk/elasticsearch.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..93605ce628705710f527b038b7a65ae052f94fbb
--- /dev/null
+++ b/base/logging/efk/elasticsearch.yaml
@@ -0,0 +1,81 @@
+apiVersion: elasticsearch.k8s.elastic.co/v1
+kind: Elasticsearch
+metadata:
+  name: elasticsearch
+spec:
+  version: 7.9.2
+  image: registry1.dsop.io/ironbank/elastic/elasticsearch/elasticsearch:7.9.2
+  nodeSets:
+    - name: master
+      count: 1
+      config:
+        node.master: true
+        node.data: false
+        node.ingest: false
+        node.store.allow_mmap: true
+        index.store.type: mmapfs
+        node.ml: false
+        xpack.ml.enabled: false
+        xpack.security.authc.token.enabled: true
+      podTemplate:
+        metadata:
+          annotations:
+            traffic.sidecar.istio.io/excludeOutboundPorts: "9300"
+            traffic.sidecar.istio.io/excludeInboundPorts: "9300"
+            fluentbit.io/exclude-istio-proxy: "true"
+            prometheus.istio.io/merge-metrics: "false"
+#        spec:
+#          automountServiceAccountToken: true
+#          containers:
+#            - name: elasticsearch
+#              env:
+#                - name: ES_JAVA_OPTS
+#                  value: "-Xms1g -Xmx1g"
+#              resources:
+#                requests:
+#                  memory: 2Gi
+#                  cpu: 0.5
+#                limits:
+#                  memory: 3Gi
+#                  cpu: 2
+    - name: data
+      count: 1
+      config:
+        node.master: false
+        node.data: true
+        node.ingest: true
+        node.store.allow_mmap: true
+        index.store.type: mmapfs
+        node.ml: false
+        xpack.ml.enabled: false
+        xpack.security.authc.token.enabled: true
+      podTemplate:
+        metadata:
+          annotations:
+            traffic.sidecar.istio.io/excludeOutboundPorts: "9300"
+            traffic.sidecar.istio.io/excludeInboundPorts: "9300"
+            fluentbit.io/exclude-istio-proxy: "true"
+            prometheus.istio.io/merge-metrics: "false"
+        spec:
+          automountServiceAccountToken: true
+#          containers:
+#            - name: elasticsearch
+#              env:
+#                - name: ES_JAVA_OPTS
+#                  value: "-Xms1g -Xmx1g"
+#              resources:
+#                requests:
+#                  memory: 2Gi
+#                  cpu: 0.5
+#                limits:
+#                  memory: 3Gi
+#                  cpu: 2
+      volumeClaimTemplates:
+        - metadata:
+            name: elasticsearch-data
+          spec:
+            accessModes:
+              - ReadWriteOnce
+            resources:
+              requests:
+                storage: 10Gi
diff --git a/base/logging/efk/kibana.yaml b/base/logging/efk/kibana.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f8cd7c04ca83f100514d5b602543719069fae91a
--- /dev/null
+++ b/base/logging/efk/kibana.yaml
@@ -0,0 +1,19 @@
+apiVersion: kibana.k8s.elastic.co/v1
+kind: Kibana
+metadata:
+  name: kibana
+spec:
+  version: 7.8.1
+  count: 1
+  elasticsearchRef:
+    name: elasticsearch
+  http:
+    tls:
+      selfSignedCertificate:
+        disabled: true
+  podTemplate:
+    metadata:
+      annotations:
+        sidecar.istio.io/rewriteAppHTTPProbers: "true"
+    spec:
+      automountServiceAccountToken: true
diff --git a/base/logging/efk/kustomization.yaml b/base/logging/efk/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..207920e533adbc4d2ce2aa56ef8efa06f41d3672
--- /dev/null
+++ b/base/logging/efk/kustomization.yaml
@@ -0,0 +1,4 @@
+resources:
+  - namespace.yaml
+  - elasticsearch.yaml
+  - kibana.yaml
\ No newline at end of file
diff --git a/base/logging/efk/namespace.yaml b/base/logging/efk/namespace.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..577de9a400e4c498422f7f7a7a351e3e54db1da4
--- /dev/null
+++ b/base/logging/efk/namespace.yaml
@@ -0,0 +1,7 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: logging
+  labels:
+    istio-injection: enabled
\ No newline at end of file
diff --git a/stack/base/observability/monitoring/kube-prometheus-stack.yaml b/base/monitoring/helmrelease.yaml
similarity index 57%
rename from stack/base/observability/monitoring/kube-prometheus-stack.yaml
rename to base/monitoring/helmrelease.yaml
index f421cd510bd8ed89623d6c554585643d5f2cf3a5..9e192b11f90b738f4a3287e01c1b6c0d13d54bde 100644
--- a/stack/base/observability/monitoring/kube-prometheus-stack.yaml
+++ b/base/monitoring/helmrelease.yaml
@@ -3,7 +3,7 @@ apiVersion: helm.toolkit.fluxcd.io/v2beta1
 kind: HelmRelease
 metadata:
   name: monitoring
-  namespace: observability
+  namespace: monitoring
 spec:
   interval: 2m
   chart:
@@ -27,16 +27,26 @@ spec:
   values:
     fullnameOverride: monitoring
 
+    global:
+      imagePullSecrets:
+        - name: private-registry
+
     prometheusOperator:
       enabled: true
       manageCrds: true
       createCustomResource: true
+      image:
+        repository: registry1.dsop.io/ironbank/opensource/coreos/prometheus-operator
+        tag: v0.42.1
+      configmapReloadImage:
+        repository: registry1.dsop.io/ironbank/opensource/jimmidyson/configmap-reload
+        tag: v0.4.0
 
     grafana:
       enabled: true
       image:
-        repository: grafana/grafana
-        tag: 7.2.2
+        repository: registry1.dsop.io/ironbank/opensource/grafana/grafana
+        tag: 7.1.3-1
 
     prometheus:
       enabled: true
@@ -45,4 +55,8 @@ spec:
         portName: http-web
 
     alertmanager:
-      enabled: true
\ No newline at end of file
+      enabled: true
+      alertmanagerSpec:
+        image:
+          repository: registry1.dsop.io/ironbank/opensource/prometheus/alertmanager
+          tag: v0.21.0
\ No newline at end of file
diff --git a/stack/base/cert-manager/kustomization.yaml b/base/monitoring/kustomization.yaml
similarity index 58%
rename from stack/base/cert-manager/kustomization.yaml
rename to base/monitoring/kustomization.yaml
index d0cc5c6bfbca4c66812e9687a02b9a3de67186a1..dfc3bfed1a97d186f9b811de49887c6f1ba95353 100644
--- a/stack/base/cert-manager/kustomization.yaml
+++ b/base/monitoring/kustomization.yaml
@@ -1,3 +1,3 @@
 resources:
   - namespace.yaml
-  - cert-manager.yaml
\ No newline at end of file
+  - helmrelease.yaml
diff --git a/stack/base/observability/namespace.yaml b/base/monitoring/namespace.yaml
similarity index 67%
rename from stack/base/observability/namespace.yaml
rename to base/monitoring/namespace.yaml
index d0e0723edc286bfe4a32f629a462f7029021e6fc..ff7ae1b933828d6ab231cd1bc5576f808c09b5d7 100644
--- a/stack/base/observability/namespace.yaml
+++ b/base/monitoring/namespace.yaml
@@ -2,4 +2,4 @@
 apiVersion: v1
 kind: Namespace
 metadata:
-  name: observability
+  name: monitoring
diff --git a/bootstrap/gitrepositories/kustomization.yaml b/bootstrap/gitrepositories/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..30ad477d4c91e64511f018f27ec7773b38b6b164
--- /dev/null
+++ b/bootstrap/gitrepositories/kustomization.yaml
@@ -0,0 +1,2 @@
+resources:
+  - this.yaml
\ No newline at end of file
diff --git a/bootstrap/gitrepositories/this.yaml b/bootstrap/gitrepositories/this.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e92940c221138da5dc6c70a37aad29763e2359d4
--- /dev/null
+++ b/bootstrap/gitrepositories/this.yaml
@@ -0,0 +1,17 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1beta1
+kind: GitRepository
+metadata:
+  name: this
+  namespace: flux-system
+spec:
+  interval: 1m
+  ref:
+    branch: $branch
+  url: $repo
+  ignore: |
+    # exclude all
+    /*
+    # include deploy dirs
+    !/base/
+    !/instance/
diff --git a/stack/bootstrap/init.sh b/bootstrap/init.sh
similarity index 75%
rename from stack/bootstrap/init.sh
rename to bootstrap/init.sh
index 03d985c7620ec3dfa77288bea80470da98ebfd91..0acbdade0338b60e9d1f69a743a5f6261d5c7173 100755
--- a/stack/bootstrap/init.sh
+++ b/bootstrap/init.sh
@@ -25,14 +25,10 @@ need() {
 deploy_flux() {
   info "Installing flux components"
   # Apply flux components
-  kustomize build stack/base/flux-system/toolkit | kubectl apply -f -
+  kustomize build base/flux/toolkit | kubectl apply -f -
 
   info "Waiting for flux components to initialize"
   kubectl wait --for=condition=available --timeout=60s --all deployments -n flux-system
-
-  info "Registering required HelmRepositories"
-  # apply helmrepositories
-  kustomize build stack/base/flux-system/chart-repositories | kubectl apply -f -
 }
 
 deploy_umbrella() {
@@ -43,10 +39,16 @@ deploy_umbrella() {
   export repo=$(git config --get remote.origin.url)
   export env="dev"
 
-  envsubst < stack/bootstrap/bootstrap.yaml | kubectl apply -f -
+  kustomize build bootstrap/gitrepositories | envsubst | kubectl apply -f -
+  kustomize build instance/flux-system | kubectl apply -f -
 }
 
 {
+  need "kustomize"
+  need "kubectl"
+  need "envsubst"
+  need "git"
+
   deploy_flux
   deploy_umbrella
 }
\ No newline at end of file
diff --git a/instance/cert-manager/helmrelease.yaml b/instance/cert-manager/helmrelease.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..cab8c6ed13cb9fb4af54b0b49a8fa0436a547945
--- /dev/null
+++ b/instance/cert-manager/helmrelease.yaml
@@ -0,0 +1,6 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2beta1
+kind: HelmRelease
+metadata:
+  name: cert-manager
+  namespace: cert-manager
diff --git a/instance/cert-manager/kustomization.yaml b/instance/cert-manager/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e2c98d20f5fa36255b2ce2dbce01c53989a8d808
--- /dev/null
+++ b/instance/cert-manager/kustomization.yaml
@@ -0,0 +1,7 @@
+namespace: cert-manager
+
+resources:
+  - ../../base/cert-manager
+
+patchesStrategicMerge:
+  - helmrelease.yaml
\ No newline at end of file
diff --git a/instance/elastic-system/kustomization.yaml b/instance/elastic-system/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e4f861da140570574d116581a8e8c823c8b2cbf7
--- /dev/null
+++ b/instance/elastic-system/kustomization.yaml
@@ -0,0 +1,4 @@
+namespace: elastic-system
+
+resources:
+- ../../base/logging/eck-operator
diff --git a/instance/flux-system/kustomization.yaml b/instance/flux-system/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..868402cf2f012702e5f7e502732a73ce07d37f86
--- /dev/null
+++ b/instance/flux-system/kustomization.yaml
@@ -0,0 +1,7 @@
+namespace: flux-system
+
+resources:
+  - ../../base/flux
+
+  # Bootstrapping components
+  - kustomizations
\ No newline at end of file
diff --git a/instance/flux-system/kustomizations/cert-manager.yaml b/instance/flux-system/kustomizations/cert-manager.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..91b32bf307e160d32c56bf6ffb047a5ef9e19886
--- /dev/null
+++ b/instance/flux-system/kustomizations/cert-manager.yaml
@@ -0,0 +1,11 @@
+apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
+kind: Kustomization
+metadata:
+  name: bigbang-cert-manager
+spec:
+  path: './instance/cert-manager'
+  healthChecks:
+    - kind: HelmRelease
+      apiVersion: helm.toolkit.fluxcd.io/v2beta1
+      name: cert-manager
+      namespace: cert-manager
\ No newline at end of file
diff --git a/instance/flux-system/kustomizations/flux.yaml b/instance/flux-system/kustomizations/flux.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ca7a2c560a88389a2ec90e0fbd838ed283d0f27d
--- /dev/null
+++ b/instance/flux-system/kustomizations/flux.yaml
@@ -0,0 +1,6 @@
+apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
+kind: Kustomization
+metadata:
+  name: bigbang-flux
+spec:
+  path: './instance/flux-system'
\ No newline at end of file
diff --git a/instance/flux-system/kustomizations/gatekeeper.yaml b/instance/flux-system/kustomizations/gatekeeper.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..302bbac6d2f75923830a4b89ba33fc2912137c99
--- /dev/null
+++ b/instance/flux-system/kustomizations/gatekeeper.yaml
@@ -0,0 +1,6 @@
+apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
+kind: Kustomization
+metadata:
+  name: bigbang-gatekeeper
+spec:
+  path: './instance/gatekeeper-system'
diff --git a/instance/flux-system/kustomizations/istio.yaml b/instance/flux-system/kustomizations/istio.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d1a5ae8030fc1ec4ca97f9fab80c43ffcaeb0d29
--- /dev/null
+++ b/instance/flux-system/kustomizations/istio.yaml
@@ -0,0 +1,23 @@
+---
+apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
+kind: Kustomization
+metadata:
+  name: bigbang-istio-operator
+spec:
+  path: './instance/istio-operator'
+
+---
+apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
+kind: Kustomization
+metadata:
+  name: bigbang-istio-system
+spec:
+  path: './instance/istio-system'
+  dependsOn:
+    - name: bigbang-istio-operator
+      namespace: flux-system
+  healthChecks:
+    - kind: Deployment
+      apiVersion: apps/v1
+      name: istiod
+      namespace: istio-system
diff --git a/instance/flux-system/kustomizations/kustomization.yaml b/instance/flux-system/kustomizations/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..af6d4d2ad19a46778e5b1eef85dd75834c364726
--- /dev/null
+++ b/instance/flux-system/kustomizations/kustomization.yaml
@@ -0,0 +1,26 @@
+namespace: flux-system
+
+resources:
+  - istio.yaml
+  - flux.yaml
+  - cert-manager.yaml
+  - logging.yaml
+  - monitoring.yaml
+  - gatekeeper.yaml
+
+patches:
+  - target:
+      kind: Kustomization
+      group: kustomize.toolkit.fluxcd.io
+    patch: |
+      apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
+      kind: Kustomization
+      metadata:
+        name: bigbang-apps
+      spec:
+        interval: 2m
+        sourceRef:
+          kind: GitRepository
+          name: this
+        prune: true
+        timeout: 2m
\ No newline at end of file
diff --git a/instance/flux-system/kustomizations/logging.yaml b/instance/flux-system/kustomizations/logging.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7f1f5aceac67872830204afbe9f0b78cd4fe8e2a
--- /dev/null
+++ b/instance/flux-system/kustomizations/logging.yaml
@@ -0,0 +1,18 @@
+---
+apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
+kind: Kustomization
+metadata:
+  name: bigbang-eck-operator
+spec:
+  path: './instance/elastic-system'
+
+---
+apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
+kind: Kustomization
+metadata:
+  name: bigbang-logging
+spec:
+  path: './instance/logging'
+  dependsOn:
+    - name: bigbang-istio-system
+      namespace: flux-system
\ No newline at end of file
diff --git a/instance/flux-system/kustomizations/monitoring.yaml b/instance/flux-system/kustomizations/monitoring.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..5c5b8a29e9d5e5561c4ad79d3e34b96a0ef453b9
--- /dev/null
+++ b/instance/flux-system/kustomizations/monitoring.yaml
@@ -0,0 +1,12 @@
+---
+apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
+kind: Kustomization
+metadata:
+  name: bigbang-monitoring
+spec:
+  path: './instance/monitoring'
+  healthChecks:
+    - kind: HelmRelease
+      apiVersion: helm.toolkit.fluxcd.io/v2beta1
+      name: monitoring
+      namespace: monitoring
\ No newline at end of file
diff --git a/instance/gatekeeper-system/kustomization.yaml b/instance/gatekeeper-system/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2ae266cb3aea47983d249e2e3b605f485938765f
--- /dev/null
+++ b/instance/gatekeeper-system/kustomization.yaml
@@ -0,0 +1,4 @@
+namespace: gatekeeper-system
+
+resources:
+  - ../../base/gatekeeper
\ No newline at end of file
diff --git a/instance/istio-operator/kustomization.yaml b/instance/istio-operator/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..8e6cc7b5edb3723afd8c7ce08a7eec195928184e
--- /dev/null
+++ b/instance/istio-operator/kustomization.yaml
@@ -0,0 +1,4 @@
+namespace: istio-operator
+
+resources:
+- ../../base/istio/istio-operator
diff --git a/instance/istio-system/Kptfile b/instance/istio-system/Kptfile
new file mode 100644
index 0000000000000000000000000000000000000000..923817bd5c5351d57d42b0d029d9a00ee5f914d2
--- /dev/null
+++ b/instance/istio-system/Kptfile
@@ -0,0 +1,27 @@
+apiVersion: kpt.dev/v1alpha1
+kind: Kptfile
+metadata:
+  name: istio
+packageMetadata:
+  shortDescription: sample description
+openAPI:
+  definitions:
+    io.k8s.cli.setters.hostname:
+      x-k8s-cli:
+        setter:
+          name: hostname
+          value: hostname
+          required: true
+    io.k8s.cli.substitutions.gateway-hostname:
+      x-k8s-cli:
+        substitution:
+          name: gateway-hostname
+          pattern: '*.${hostname}'
+          values:
+          - marker: ${hostname}
+            ref: '#/definitions/io.k8s.cli.setters.hostname'
+    io.k8s.cli.setters.gateway-tls-secret:
+      x-k8s-cli:
+        setter:
+          name: gateway-tls-secret
+          value: wildcard-cert
diff --git a/instance/istio-system/gateway.yaml b/instance/istio-system/gateway.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c9d6b2a505401fc42d360b5a86ec6cdfb0f4e501
--- /dev/null
+++ b/instance/istio-system/gateway.yaml
@@ -0,0 +1,26 @@
+apiVersion: networking.istio.io/v1alpha3
+kind: Gateway
+metadata:
+  name: main
+  namespace: istio-system
+spec:
+  selector:
+    istio: ingressgateway
+  servers:
+  - port:
+      number: 80
+      name: http
+      protocol: HTTP
+    hosts:
+    - '*'
+    # tls:
+    #   httpsRedirect: true
+  - port:
+      number: 443
+      name: https
+      protocol: HTTPS
+    hosts:
+    - '*.hostname' # {"$kpt-set":"gateway-hostname"}
+    tls:
+      mode: SIMPLE
+      credentialName: wildcard-cert # {"$kpt-set":"gateway-tls-secret"}
diff --git a/instance/istio-system/kustomization.yaml b/instance/istio-system/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..852ede0f98448d1f38d3719fa73b05f8debbc80d
--- /dev/null
+++ b/instance/istio-system/kustomization.yaml
@@ -0,0 +1,6 @@
+namespace: istio-system
+
+resources:
+- ../../base/istio/istio-system
+
+- gateway.yaml
diff --git a/instance/logging/Kptfile b/instance/logging/Kptfile
new file mode 100644
index 0000000000000000000000000000000000000000..1b02ae7e47b99ab947b3445cf2bb4a7d13e19f0c
--- /dev/null
+++ b/instance/logging/Kptfile
@@ -0,0 +1,21 @@
+apiVersion: kpt.dev/v1alpha1
+kind: Kptfile
+metadata:
+  name: logging
+packageMetadata:
+  shortDescription: sample description
+openAPI:
+  definitions:
+    io.k8s.cli.setters.hostname:
+      x-k8s-cli:
+        setter:
+          name: hostname
+          value: kibana.hostname
+    io.k8s.cli.substitutions.kibana-hostname:
+      x-k8s-cli:
+        substitution:
+          name: kibana-hostname
+          pattern: kibana.${hostname}
+          values:
+          - marker: ${hostname}
+            ref: '#/definitions/io.k8s.cli.setters.hostname'
diff --git a/instance/logging/README.md b/instance/logging/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..5322de510da864fe46db5dd8844aad606cec2b09
--- /dev/null
+++ b/instance/logging/README.md
@@ -0,0 +1,29 @@
+# logging
+
+## Description
+sample description
+
+## Usage
+
+### Fetch the package
+`kpt pkg get REPO_URI[.git]/PKG_PATH[@VERSION] logging`
+Details: https://googlecontainertools.github.io/kpt/reference/pkg/get/
+
+### View package content
+`kpt cfg tree logging`
+Details: https://googlecontainertools.github.io/kpt/reference/cfg/tree/
+
+### List setters
+`kpt cfg list-setters logging`
+Details: https://googlecontainertools.github.io/kpt/reference/cfg/list-setters/
+
+### Set a value
+`kpt cfg set logging NAME VALUE`
+Details: https://googlecontainertools.github.io/kpt/reference/cfg/set/
+
+### Apply the package
+```
+kpt live init logging
+kpt live apply logging --reconcile-timeout=2m --output=table
+```
+Details: https://googlecontainertools.github.io/kpt/reference/live/
diff --git a/instance/logging/ingress/kibana-vs.yaml b/instance/logging/ingress/kibana-vs.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..08e7e0def04b108bd8e0c28f35bf809595e18e90
--- /dev/null
+++ b/instance/logging/ingress/kibana-vs.yaml
@@ -0,0 +1,15 @@
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: kibana
+spec:
+  hosts:
+  - "kibana.hostname" # {"$kpt-set":"kibana-hostname"}
+  gateways:
+  - main.istio-system.svc.cluster.local
+  http:
+  - route:
+    - destination:
+        port:
+          number: 5601
+        host: kibana-kb-http
diff --git a/instance/logging/ingress/kustomization.yaml b/instance/logging/ingress/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..91a14c276656a1c8e18011606d80949bcfdc70e3
--- /dev/null
+++ b/instance/logging/ingress/kustomization.yaml
@@ -0,0 +1,2 @@
+resources:
+- kibana-vs.yaml
diff --git a/instance/logging/kustomization.yaml b/instance/logging/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..73fdf28edd5beef7b93e9c4906fcf3109f4f18fb
--- /dev/null
+++ b/instance/logging/kustomization.yaml
@@ -0,0 +1,6 @@
+namespace: logging
+
+resources:
+- ../../base/logging/efk
+
+- ingress
diff --git a/instance/monitoring/Kptfile b/instance/monitoring/Kptfile
new file mode 100644
index 0000000000000000000000000000000000000000..33ee594cf77ce013a1dac38ee8590f52a88c624a
--- /dev/null
+++ b/instance/monitoring/Kptfile
@@ -0,0 +1,37 @@
+apiVersion: kpt.dev/v1alpha1
+kind: Kptfile
+metadata:
+  name: monitoring
+packageMetadata:
+  shortDescription: sample description
+openAPI:
+  definitions:
+    io.k8s.cli.setters.hostname:
+      x-k8s-cli:
+        setter:
+          name: hostname
+          value: hostname
+    io.k8s.cli.substitutions.alertmanager-hostname:
+      x-k8s-cli:
+        substitution:
+          name: alertmanager-hostname
+          pattern: alerts.${hostname}
+          values:
+          - marker: ${hostname}
+            ref: '#/definitions/io.k8s.cli.setters.hostname'
+    io.k8s.cli.substitutions.prometheus-hostname:
+      x-k8s-cli:
+        substitution:
+          name: prometheus-hostname
+          pattern: prometheus.${hostname}
+          values:
+          - marker: ${hostname}
+            ref: '#/definitions/io.k8s.cli.setters.hostname'
+    io.k8s.cli.substitutions.grafana-hostname:
+      x-k8s-cli:
+        substitution:
+          name: grafana-hostname
+          pattern: grafana.${hostname}
+          values:
+          - marker: ${hostname}
+            ref: '#/definitions/io.k8s.cli.setters.hostname'
diff --git a/instance/monitoring/helmrelease.yaml b/instance/monitoring/helmrelease.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d58d4f4da8be8cb296059aee950a900e01de8efe
--- /dev/null
+++ b/instance/monitoring/helmrelease.yaml
@@ -0,0 +1,6 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2beta1
+kind: HelmRelease
+metadata:
+  name: monitoring
+  namespace: monitoring
diff --git a/instance/monitoring/ingress/alertmanager-vs.yaml b/instance/monitoring/ingress/alertmanager-vs.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..15578a434ffa3526a98b86faf847a3e510a15355
--- /dev/null
+++ b/instance/monitoring/ingress/alertmanager-vs.yaml
@@ -0,0 +1,15 @@
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: alert-manager
+spec:
+  hosts:
+  - "alerts.hostname" # {"$kpt-set":"alertmanager-hostname"}
+  gateways:
+  - main.istio-system.svc.cluster.local
+  http:
+  - route:
+    - destination:
+        port:
+          number: 9093
+        host: monitoring-alertmanager
diff --git a/instance/monitoring/ingress/grafana-vs.yaml b/instance/monitoring/ingress/grafana-vs.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..89fb4b83965771574fc34289dab59ae2e7bfbafb
--- /dev/null
+++ b/instance/monitoring/ingress/grafana-vs.yaml
@@ -0,0 +1,15 @@
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: grafana
+spec:
+  hosts:
+  - "grafana.hostname" # {"$kpt-set":"grafana-hostname"}
+  gateways:
+  - main.istio-system.svc.cluster.local
+  http:
+  - route:
+    - destination:
+        port:
+          number: 80
+        host: monitoring-grafana
diff --git a/instance/monitoring/ingress/kustomization.yaml b/instance/monitoring/ingress/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b48335caebeb16947509c55869248e273f0089b5
--- /dev/null
+++ b/instance/monitoring/ingress/kustomization.yaml
@@ -0,0 +1,6 @@
+namespace: monitoring
+
+resources:
+- alertmanager-vs.yaml
+- grafana-vs.yaml
+- prometheus-vs.yaml
diff --git a/instance/monitoring/ingress/prometheus-vs.yaml b/instance/monitoring/ingress/prometheus-vs.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..eb14e8b72f64f862a173ff6bc1e7548b9dd5bb67
--- /dev/null
+++ b/instance/monitoring/ingress/prometheus-vs.yaml
@@ -0,0 +1,15 @@
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: prometheus
+spec:
+  hosts:
+  - "prometheus.hostname" # {"$kpt-set":"prometheus-hostname"}
+  gateways:
+  - main.istio-system.svc.cluster.local
+  http:
+  - route:
+    - destination:
+        port:
+          number: 9090
+        host: monitoring-prometheus
diff --git a/instance/monitoring/kustomization.yaml b/instance/monitoring/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a292718b71c60e620e4fc262baaec5b10287e3fa
--- /dev/null
+++ b/instance/monitoring/kustomization.yaml
@@ -0,0 +1,10 @@
+namespace: monitoring
+
+resources:
+- ../../base/monitoring
+
+# Environment specific values
+- ingress
+
+patchesStrategicMerge:
+  - helmrelease.yaml
\ No newline at end of file
diff --git a/stack/base/config.yaml b/stack/base/config.yaml
deleted file mode 100644
index 42474d6df7961db0837a68110ee18f511fcfbaac..0000000000000000000000000000000000000000
--- a/stack/base/config.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-varReference:
-  - kind: HelmRelease
-    path: spec/values/hostname
-  - kind: VirtualService
-    path: spec/hosts
-  - kind: Gateway
-    path: spec/servers/hosts
-  - kind: Certificate
-    path: spec/dnsNames
\ No newline at end of file
diff --git a/stack/base/flux-system/toolkit/kustomization.yaml b/stack/base/flux-system/toolkit/kustomization.yaml
deleted file mode 100644
index 0ff1acf3687c98e28622386ed74a76cc89b21726..0000000000000000000000000000000000000000
--- a/stack/base/flux-system/toolkit/kustomization.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-commonLabels:
-  owner: p1
-
-resources:
-  - all.yaml
diff --git a/stack/base/istio/istio-operator/kustomization.yaml b/stack/base/istio/istio-operator/kustomization.yaml
deleted file mode 100644
index adc1d18d87029f75c77036c9edd9ab6c53ab49ad..0000000000000000000000000000000000000000
--- a/stack/base/istio/istio-operator/kustomization.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-resources:
-  - operator.yaml
\ No newline at end of file
diff --git a/stack/base/istio/istio-system/gateway.yaml b/stack/base/istio/istio-system/gateway.yaml
deleted file mode 100644
index 4b5cbe5d7c7277fd66a7e45fb675b747fa7a4b93..0000000000000000000000000000000000000000
--- a/stack/base/istio/istio-system/gateway.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
----
-apiVersion: networking.istio.io/v1alpha3
-kind: Gateway
-metadata:
-  name: main
-  namespace: istio-system
-spec:
-  selector:
-    istio: ingressgateway
-  servers:
-    - port:
-        number: 80
-        name: http
-        protocol: HTTP
-      hosts:
-        - '*'
-      # tls:
-      #   httpsRedirect: true
-    - port:
-        number: 443
-        name: https
-        protocol: HTTPS
-      hosts:
-        - '*.$(hostname)'
-      tls:
-        mode: SIMPLE
-        credentialName: wildcard-cert
diff --git a/stack/base/istio/istio-system/kustomization.yaml b/stack/base/istio/istio-system/kustomization.yaml
deleted file mode 100644
index 98a3d80a276f81cc4c1bfa9fd5f2cdfc3f78be7c..0000000000000000000000000000000000000000
--- a/stack/base/istio/istio-system/kustomization.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-resources:
-  - namespace.yaml
-  - istio.yaml
-  - gateway.yaml
\ No newline at end of file
diff --git a/stack/base/istio/kustomization.yaml b/stack/base/istio/kustomization.yaml
deleted file mode 100644
index d9dacd06c9b53f73d0ce798e9956ee46f4177bab..0000000000000000000000000000000000000000
--- a/stack/base/istio/kustomization.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-resources:
-  - istio-operator/
-  - istio-system/
\ No newline at end of file
diff --git a/stack/base/kustomization.yaml b/stack/base/kustomization.yaml
deleted file mode 100644
index a1361229f8484bce829b524b2efeebe446b81e32..0000000000000000000000000000000000000000
--- a/stack/base/kustomization.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-resources:
-  - flux-system
-  - istio
-  - observability
-  - cert-manager
-  - gatekeeper
-
-patches:
-    # Add common parameters to all HelmReleases
-  - target:
-      kind: HelmRelease
-      group: helm.toolkit.fluxcd.io
-    patch: |
-      apiVersion: helm.toolkit.fluxcd.io/v2beta1
-      kind: HelmRelease
-      metadata:
-        name: common
-      spec:
-        test:
-          enable: false
-        install:
-          remediation:
-            retries: 5
-        upgrade:
-          remediation:
-            retries: 3
-            remediateLastFailure: true
-          cleanupOnFail: true
-        rollback:
-          timeout: 1m
-          cleanupOnFail: true
-
-configMapGenerator:
-  - name: globals
-    namespace: flux-system
-
-vars:
-  - name: hostname
-    objref: { kind: ConfigMap, name: globals, apiVersion: v1 }
-    fieldref:
-      fieldpath: data.hostname
-
-configurations:
-  - config.yaml
\ No newline at end of file
diff --git a/stack/base/observability/monitoring/alertmanager-vs.yaml b/stack/base/observability/monitoring/alertmanager-vs.yaml
deleted file mode 100644
index 7963c9de8fb623cfb3f27c8050892160399cf154..0000000000000000000000000000000000000000
--- a/stack/base/observability/monitoring/alertmanager-vs.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-apiVersion: networking.istio.io/v1alpha3
-kind: VirtualService
-metadata:
-  name: alert-manager
-  namespace: observability
-spec:
-  hosts:
-    - "alerts.$(hostname)"
-  gateways:
-    - main.istio-system.svc.cluster.local
-  http:
-    - route:
-        - destination:
-            port:
-              number: 9093
-            host: monitoring-alertmanager.observability.svc.cluster.local
diff --git a/stack/base/observability/monitoring/grafana-vs.yaml b/stack/base/observability/monitoring/grafana-vs.yaml
deleted file mode 100644
index 81deb3796e34548413a3a3c5d5c79d15640d4fe9..0000000000000000000000000000000000000000
--- a/stack/base/observability/monitoring/grafana-vs.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-apiVersion: networking.istio.io/v1alpha3
-kind: VirtualService
-metadata:
-  name: grafana
-  namespace: observability
-spec:
-  hosts:
-    - "grafana.$(hostname)"
-  gateways:
-    - main.istio-system.svc.cluster.local
-  http:
-    - route:
-        - destination:
-            port:
-              number: 80
-            host: monitoring-grafana.observability.svc.cluster.local
diff --git a/stack/base/observability/monitoring/kustomization.yaml b/stack/base/observability/monitoring/kustomization.yaml
deleted file mode 100644
index dd6f2ef7ff7d6b41de767538ed020ec833a73cfa..0000000000000000000000000000000000000000
--- a/stack/base/observability/monitoring/kustomization.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-resources:
-  - kube-prometheus-stack.yaml
-
-  # Virtual Services
-  - alertmanager-vs.yaml
-  - grafana-vs.yaml
-  - prometheus-vs.yaml
diff --git a/stack/base/observability/monitoring/prometheus-vs.yaml b/stack/base/observability/monitoring/prometheus-vs.yaml
deleted file mode 100644
index 0eb1ae850edf89f25846fa6ab1fdfe4eb1d4c7e8..0000000000000000000000000000000000000000
--- a/stack/base/observability/monitoring/prometheus-vs.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-apiVersion: networking.istio.io/v1alpha3
-kind: VirtualService
-metadata:
-  name: prometheus
-  namespace: observability
-spec:
-  hosts:
-    - "prometheus.$(hostname)"
-  gateways:
-    - main.istio-system.svc.cluster.local
-  http:
-    - route:
-        - destination:
-            port:
-              number: 9090
-            host: monitoring-prometheus.observability.svc.cluster.local
diff --git a/stack/bootstrap/bootstrap.yaml b/stack/bootstrap/bootstrap.yaml
deleted file mode 100644
index 5b37cdcb100064897c3a9861beb5758b96755fa3..0000000000000000000000000000000000000000
--- a/stack/bootstrap/bootstrap.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
----
-apiVersion: source.toolkit.fluxcd.io/v1beta1
-kind: GitRepository
-metadata:
-  name: this
-  namespace: flux-system
-spec:
-  interval: 1m
-  ref:
-    branch: $branch
-  url: $repo
-  ignore: |
-    # exclude all
-    /*
-    # include deploy dirs
-    !/stack/
-
----
-apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
-kind: Kustomization
-metadata:
-  name: bigbang-umbrella
-  namespace: flux-system
-spec:
-  interval: 1m
-  path: './stack/env/$env'
-  sourceRef:
-    kind: GitRepository
-    name: this
-  prune: true
\ No newline at end of file
diff --git a/stack/env/dev/globals.env b/stack/env/dev/globals.env
deleted file mode 100644
index baed74fd12ef64d4fe105e81c21e90efdda5d4fa..0000000000000000000000000000000000000000
--- a/stack/env/dev/globals.env
+++ /dev/null
@@ -1 +0,0 @@
-hostname=bigbang.dev
\ No newline at end of file
diff --git a/stack/env/dev/kustomization.yaml b/stack/env/dev/kustomization.yaml
deleted file mode 100644
index 4b00b766c08c6550f8eb8fe07264da97e59edfdf..0000000000000000000000000000000000000000
--- a/stack/env/dev/kustomization.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-apiVersion: kustomize.config.k8s.io/v1beta1
-kind: Kustomization
-
-resources:
-  - ../../base
-
-configMapGenerator:
-  - name: globals
-    namespace: flux-system
-    behavior: merge
-    envs:
-      - globals.env
\ No newline at end of file