parent
af91a1515f
commit
590a95281d
Binary file not shown.
|
@ -0,0 +1,22 @@
|
|||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
|
@ -0,0 +1,39 @@
|
|||
dependencies:
|
||||
- name: newrelic-infrastructure
|
||||
repository: https://newrelic.github.io/nri-kubernetes
|
||||
version: 3.37.1
|
||||
- name: nri-prometheus
|
||||
repository: https://newrelic.github.io/nri-prometheus
|
||||
version: 2.1.19
|
||||
- name: newrelic-prometheus-agent
|
||||
repository: https://newrelic.github.io/newrelic-prometheus-configurator
|
||||
version: 1.15.4
|
||||
- name: nri-metadata-injection
|
||||
repository: https://newrelic.github.io/k8s-metadata-injection
|
||||
version: 4.22.3
|
||||
- name: newrelic-k8s-metrics-adapter
|
||||
repository: https://newrelic.github.io/newrelic-k8s-metrics-adapter
|
||||
version: 1.13.3
|
||||
- name: kube-state-metrics
|
||||
repository: https://prometheus-community.github.io/helm-charts
|
||||
version: 5.26.0
|
||||
- name: nri-kube-events
|
||||
repository: https://newrelic.github.io/nri-kube-events
|
||||
version: 3.11.3
|
||||
- name: newrelic-logging
|
||||
repository: https://newrelic.github.io/helm-charts
|
||||
version: 1.23.5
|
||||
- name: newrelic-pixie
|
||||
repository: https://newrelic.github.io/helm-charts
|
||||
version: 2.1.6
|
||||
- name: k8s-agents-operator
|
||||
repository: https://newrelic.github.io/k8s-agents-operator
|
||||
version: 0.19.0
|
||||
- name: pixie-operator-chart
|
||||
repository: https://pixie-operator-charts.storage.googleapis.com
|
||||
version: 0.1.6
|
||||
- name: newrelic-infra-operator
|
||||
repository: https://newrelic.github.io/newrelic-infra-operator
|
||||
version: 2.13.2
|
||||
digest: sha256:da605e3cbcb07bdb850eb3a15f5d92b2f5b01de5b19b93adebdae1f03b80f5ae
|
||||
generated: "2024-12-10T08:54:30.3259226Z"
|
|
@ -0,0 +1,85 @@
|
|||
annotations:
|
||||
catalog.cattle.io/certified: partner
|
||||
catalog.cattle.io/display-name: New Relic
|
||||
catalog.cattle.io/release-name: nri-bundle
|
||||
apiVersion: v2
|
||||
dependencies:
|
||||
- condition: infrastructure.enabled,newrelic-infrastructure.enabled
|
||||
name: newrelic-infrastructure
|
||||
repository: https://newrelic.github.io/nri-kubernetes
|
||||
version: 3.37.1
|
||||
- condition: prometheus.enabled,nri-prometheus.enabled
|
||||
name: nri-prometheus
|
||||
repository: https://newrelic.github.io/nri-prometheus
|
||||
version: 2.1.19
|
||||
- condition: newrelic-prometheus-agent.enabled
|
||||
name: newrelic-prometheus-agent
|
||||
repository: https://newrelic.github.io/newrelic-prometheus-configurator
|
||||
version: 1.15.4
|
||||
- condition: webhook.enabled,nri-metadata-injection.enabled
|
||||
name: nri-metadata-injection
|
||||
repository: https://newrelic.github.io/k8s-metadata-injection
|
||||
version: 4.22.3
|
||||
- condition: metrics-adapter.enabled,newrelic-k8s-metrics-adapter.enabled
|
||||
name: newrelic-k8s-metrics-adapter
|
||||
repository: https://newrelic.github.io/newrelic-k8s-metrics-adapter
|
||||
version: 1.13.3
|
||||
- condition: ksm.enabled,kube-state-metrics.enabled
|
||||
name: kube-state-metrics
|
||||
repository: https://prometheus-community.github.io/helm-charts
|
||||
version: 5.26.0
|
||||
- condition: kubeEvents.enabled,nri-kube-events.enabled
|
||||
name: nri-kube-events
|
||||
repository: https://newrelic.github.io/nri-kube-events
|
||||
version: 3.11.3
|
||||
- condition: logging.enabled,newrelic-logging.enabled
|
||||
name: newrelic-logging
|
||||
repository: https://newrelic.github.io/helm-charts
|
||||
version: 1.23.5
|
||||
- condition: newrelic-pixie.enabled
|
||||
name: newrelic-pixie
|
||||
repository: https://newrelic.github.io/helm-charts
|
||||
version: 2.1.6
|
||||
- condition: k8s-agents-operator.enabled
|
||||
name: k8s-agents-operator
|
||||
repository: https://newrelic.github.io/k8s-agents-operator
|
||||
version: 0.19.0
|
||||
- alias: pixie-chart
|
||||
condition: pixie-chart.enabled
|
||||
name: pixie-operator-chart
|
||||
repository: https://pixie-operator-charts.storage.googleapis.com
|
||||
version: 0.1.6
|
||||
- condition: newrelic-infra-operator.enabled
|
||||
name: newrelic-infra-operator
|
||||
repository: https://newrelic.github.io/newrelic-infra-operator
|
||||
version: 2.13.2
|
||||
description: Groups together the individual charts for the New Relic Kubernetes solution
|
||||
for a more comfortable deployment.
|
||||
home: https://github.com/newrelic/helm-charts
|
||||
icon: file://assets/icons/nri-bundle.svg
|
||||
keywords:
|
||||
- infrastructure
|
||||
- newrelic
|
||||
- monitoring
|
||||
maintainers:
|
||||
- name: juanjjaramillo
|
||||
url: https://github.com/juanjjaramillo
|
||||
- name: csongnr
|
||||
url: https://github.com/csongnr
|
||||
- name: dbudziwojskiNR
|
||||
url: https://github.com/dbudziwojskiNR
|
||||
name: nri-bundle
|
||||
sources:
|
||||
- https://github.com/newrelic/nri-bundle/
|
||||
- https://github.com/newrelic/nri-bundle/tree/master/charts/nri-bundle
|
||||
- https://github.com/newrelic/nri-kubernetes/tree/master/charts/newrelic-infrastructure
|
||||
- https://github.com/newrelic/nri-prometheus/tree/master/charts/nri-prometheus
|
||||
- https://github.com/newrelic/newrelic-prometheus-configurator/tree/master/charts/newrelic-prometheus-agent
|
||||
- https://github.com/newrelic/k8s-metadata-injection/tree/master/charts/nri-metadata-injection
|
||||
- https://github.com/newrelic/newrelic-k8s-metrics-adapter/tree/master/charts/newrelic-k8s-metrics-adapter
|
||||
- https://github.com/newrelic/nri-kube-events/tree/master/charts/nri-kube-events
|
||||
- https://github.com/newrelic/helm-charts/tree/master/charts/newrelic-logging
|
||||
- https://github.com/newrelic/helm-charts/tree/master/charts/newrelic-pixie
|
||||
- https://github.com/newrelic/newrelic-infra-operator/tree/master/charts/newrelic-infra-operator
|
||||
- https://github.com/newrelic/k8s-agents-operator/tree/master/charts/k8s-agents-operator
|
||||
version: 5.0.104
|
|
@ -0,0 +1,200 @@
|
|||
# nri-bundle
|
||||
|
||||
Groups together the individual charts for the New Relic Kubernetes solution for a more comfortable deployment.
|
||||
|
||||
**Homepage:** <https://github.com/newrelic/helm-charts>
|
||||
|
||||
## Bundled charts
|
||||
|
||||
This chart does not deploy anything by itself but has many charts as dependencies. This allows you to easily install and upgrade the New Relic
|
||||
Kubernetes Integration using only one chart.
|
||||
|
||||
In case you need more information about each component this chart installs, or you are an advanced user that want to install each component separately,
|
||||
here is a list of components that this chart installs and where you can find more information about them:
|
||||
|
||||
| Component | Installed by default? | Description |
|
||||
|------------------------------|-----------------------|-------------|
|
||||
| [newrelic-infrastructure](https://github.com/newrelic/nri-kubernetes/tree/main/charts/newrelic-infrastructure) | Yes | Sends metrics about nodes, cluster objects (e.g. Deployments, Pods), and the control plane to New Relic. |
|
||||
| [nri-metadata-injection](https://github.com/newrelic/k8s-metadata-injection/tree/main/charts/nri-metadata-injection) | Yes | Enriches New Relic-instrumented applications (APM) with Kubernetes information. |
|
||||
| [kube-state-metrics](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-state-metrics) | | Required for `newrelic-infrastructure` to gather cluster-level metrics. |
|
||||
| [nri-kube-events](https://github.com/newrelic/nri-kube-events/tree/main/charts/nri-kube-events) | | Reports Kubernetes events to New Relic. |
|
||||
| [newrelic-infra-operator](https://github.com/newrelic/newrelic-infra-operator/tree/main/charts/newrelic-infra-operator) | | (Beta) Used with Fargate or serverless environments to inject `newrelic-infrastructure` as a sidecar instead of the usual DaemonSet. |
|
||||
| [newrelic-k8s-metrics-adapter](https://github.com/newrelic/newrelic-k8s-metrics-adapter/tree/main/charts/newrelic-k8s-metrics-adapter) | | (Beta) Provides a source of data for Horizontal Pod Autoscalers (HPA) based on a NRQL query from New Relic. |
|
||||
| [newrelic-logging](https://github.com/newrelic/helm-charts/tree/master/charts/newrelic-logging) | | Sends logs for Kubernetes components and workloads running on the cluster to New Relic. |
|
||||
| [nri-prometheus](https://github.com/newrelic/nri-prometheus/tree/main/charts/nri-prometheus) | | Sends metrics from applications exposing Prometheus metrics to New Relic. |
|
||||
| [newrelic-prometheus-configurator](https://github.com/newrelic/newrelic-prometheus-configurator/tree/master/charts/newrelic-prometheus-agent) | | Configures instances of Prometheus in Agent mode to send metrics to the New Relic Prometheus endpoint. |
|
||||
| [newrelic-pixie](https://github.com/newrelic/helm-charts/tree/master/charts/newrelic-pixie) | | Connects to the Pixie API and enables the New Relic plugin in Pixie. The plugin allows you to export data from Pixie to New Relic for long-term data retention. |
|
||||
| [Pixie](https://docs.pixielabs.ai/installing-pixie/install-schemes/helm/#3.-deploy) | | Is an open source observability tool for Kubernetes applications that uses eBPF to automatically capture telemetry data without the need for manual instrumentation. |
|
||||
| [k8s-agents-operator](https://github.com/newrelic/k8s-agents-operator/tree/main/charts/k8s-agents-operator) | | (Preview) Streamlines full-stack observability for Kubernetes environments by automating APM instrumentation alongside Kubernetes agent deployment. |
|
||||
|
||||
## Configure components
|
||||
|
||||
It is possible to configure settings for the individual charts this chart groups by specifying values for them under a key using the name of the chart,
|
||||
as specified in [helm documentation](https://helm.sh/docs/chart_template_guide/subcharts_and_globals).
|
||||
|
||||
For example, by adding the following to the `values.yml` file:
|
||||
|
||||
```yaml
|
||||
# Configuration settings for the newrelic-infrastructure chart
|
||||
newrelic-infrastructure:
|
||||
# Any key defined in the values.yml file for the newrelic-infrastructure chart can be configured here:
|
||||
# https://github.com/newrelic/nri-kubernetes/blob/main/charts/newrelic-infrastructure/values.yaml
|
||||
|
||||
verboseLog: false
|
||||
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
```
|
||||
|
||||
It is possible to override any entry of the [`newrelic-infrastructure`](https://github.com/newrelic/nri-kubernetes/tree/main/charts/newrelic-infrastructure)
|
||||
chart, as defined in their [`values.yml` file](https://github.com/newrelic/nri-kubernetes/blob/main/charts/newrelic-infrastructure/values.yaml).
|
||||
|
||||
The same approach can be followed to update any of the subcharts.
|
||||
|
||||
After making these changes to the `values.yml` file, or a custom values file, make sure to apply them using:
|
||||
|
||||
```
|
||||
$ helm upgrade --reuse-values -f values.yaml [RELEASE] newrelic/nri-bundle
|
||||
```
|
||||
|
||||
Where `[RELEASE]` is the name of the helm release, e.g. `newrelic-bundle`.
|
||||
|
||||
## Monitor on host integrations
|
||||
|
||||
If you wish to monitor services running on Kubernetes you can provide integrations
|
||||
configuration under `integrations_config` that it will passed down to the `newrelic-infrastructure` chart.
|
||||
|
||||
You just need to create a new entry where the "name" is the filename of the configuration file and the data is the content of
|
||||
the integration configuration. The name must end in ".yaml" as this will be the
|
||||
filename generated and the Infrastructure agent only looks for YAML files.
|
||||
|
||||
The data part is the actual integration configuration as described in the spec here:
|
||||
https://docs.newrelic.com/docs/integrations/integrations-sdk/file-specifications/integration-configuration-file-specifications-agent-v180
|
||||
|
||||
In the following example you can see how to monitor a Redis integration with autodiscovery
|
||||
|
||||
```yaml
|
||||
newrelic-infrastructure:
|
||||
integrations:
|
||||
nri-redis-sampleapp:
|
||||
discovery:
|
||||
command:
|
||||
exec: /var/db/newrelic-infra/nri-discovery-kubernetes --tls --port 10250
|
||||
match:
|
||||
label.app: sampleapp
|
||||
integrations:
|
||||
- name: nri-redis
|
||||
env:
|
||||
# using the discovered IP as the hostname address
|
||||
HOSTNAME: ${discovery.ip}
|
||||
PORT: 6379
|
||||
labels:
|
||||
env: test
|
||||
```
|
||||
|
||||
## Bring your own KSM
|
||||
|
||||
New Relic Kubernetes Integration requires an instance of kube-state-metrics (KSM) to be running in the cluster, which this chart pulls as a dependency. If you are already running or want to run your own KSM instance, you will need to make some small adjustments as described below.
|
||||
|
||||
### Bring your own KSM
|
||||
|
||||
If you already have one KSM instance running, you can point `nri-kubernetes` to your instance:
|
||||
|
||||
```yaml
|
||||
kube-state-metrics:
|
||||
# Disable bundled KSM.
|
||||
enabled: false
|
||||
newrelic-infrastructure:
|
||||
ksm:
|
||||
config:
|
||||
# Selector for your pre-installed KSM Service. You may need to adjust this to fit your existing installation.
|
||||
selector: "app.kubernetes.io/name=kube-state-metrics"
|
||||
# Alternatively, you can specify a fixed URL where KSM is available. Doing so will bypass autodiscovery.
|
||||
#staticUrl: http://ksm.ksm.svc.cluster.local:8080/metrics
|
||||
```
|
||||
|
||||
### <span id="ksm-different-version">Run KSM alongside a different version</span>
|
||||
|
||||
If you need to run a different instance of KSM in your cluster, you can still run a separate instance for the Kubernetes Integration to work as intended:
|
||||
|
||||
```yaml
|
||||
kube-state-metrics:
|
||||
# Enable bundled KSM.
|
||||
enabled: true
|
||||
prometheusScrape: false
|
||||
customLabels:
|
||||
# Label unique to this KSM instance.
|
||||
newrelic.com/custom-ksm: "true"
|
||||
newrelic-infrastructure:
|
||||
ksm:
|
||||
config:
|
||||
# Use label above as a selector.
|
||||
selector: "newrelic.com/custom-ksm=true"
|
||||
```
|
||||
|
||||
For more information on supported KSM version visit the [requirements documentation](https://docs.newrelic.com/docs/kubernetes-pixie/kubernetes-integration/get-started/kubernetes-integration-compatibility-requirements#reqs)
|
||||
|
||||
## Values managed globally
|
||||
|
||||
Some of the subchart implement the [New Relic's common Helm library](https://github.com/newrelic/helm-charts/tree/master/library/common-library) which
|
||||
means that it honors a wide range of defaults and globals common to most New Relic Helm charts.
|
||||
|
||||
Options that can be defined globally include `affinity`, `nodeSelector`, `tolerations`, `proxy` and others. The full list can be found at
|
||||
[user's guide of the common library](https://github.com/newrelic/helm-charts/blob/master/library/common-library/README.md).
|
||||
|
||||
At the time of writing this document, all the charts from `nri-bundle` except `newrelic-logging` and `synthetics-minion` implements this library and
|
||||
honors global options as described below.
|
||||
|
||||
Note, the value table below is automatically generated from `values.yaml` by `helm-docs`. If you need to add new fields or update existing fields, please update the `values.yaml` and then run `helm-docs` to update this value table.
|
||||
|
||||
## Values
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| global | object | See [`values.yaml`](values.yaml) | change the behaviour globally to all the supported helm charts. See [user's guide of the common library](https://github.com/newrelic/helm-charts/blob/master/library/common-library/README.md) for further information. |
|
||||
| global.affinity | object | `{}` | Sets pod/node affinities |
|
||||
| global.cluster | string | `""` | The cluster name for the Kubernetes cluster. |
|
||||
| global.containerSecurityContext | object | `{}` | Sets security context (at container level) |
|
||||
| global.customAttributes | object | `{}` | Adds extra attributes to the cluster and all the metrics emitted to the backend |
|
||||
| global.customSecretLicenseKey | string | `""` | Key in the Secret object where the license key is stored |
|
||||
| global.customSecretName | string | `""` | Name of the Secret object where the license key is stored |
|
||||
| global.dnsConfig | object | `{}` | Sets pod's dnsConfig |
|
||||
| global.fargate | bool | false | Must be set to `true` when deploying in an EKS Fargate environment |
|
||||
| global.hostNetwork | bool | false | Sets pod's hostNetwork |
|
||||
| global.images.pullSecrets | list | `[]` | Set secrets to be able to fetch images |
|
||||
| global.images.registry | string | `""` | Changes the registry where to get the images. Useful when there is an internal image cache/proxy |
|
||||
| global.insightsKey | string | `""` | The license key for your New Relic Account. This will be preferred configuration option if both `insightsKey` and `customSecret` are specified. |
|
||||
| global.labels | object | `{}` | Additional labels for chart objects |
|
||||
| global.licenseKey | string | `""` | The license key for your New Relic Account. This will be preferred configuration option if both `licenseKey` and `customSecret` are specified. |
|
||||
| global.lowDataMode | bool | false | Reduces number of metrics sent in order to reduce costs |
|
||||
| global.nodeSelector | object | `{}` | Sets pod's node selector |
|
||||
| global.nrStaging | bool | false | Send the metrics to the staging backend. Requires a valid staging license key |
|
||||
| global.podLabels | object | `{}` | Additional labels for chart pods |
|
||||
| global.podSecurityContext | object | `{}` | Sets security context (at pod level) |
|
||||
| global.priorityClassName | string | `""` | Sets pod's priorityClassName |
|
||||
| global.privileged | bool | false | In each integration it has different behavior. See [Further information](#values-managed-globally-3) but all aims to send less metrics to the backend to try to save costs | |
|
||||
| global.proxy | string | `""` | Configures the integration to send all HTTP/HTTPS request through the proxy in that URL. The URL should have a standard format like `https://user:password@hostname:port` |
|
||||
| global.serviceAccount.annotations | object | `{}` | Add these annotations to the service account we create |
|
||||
| global.serviceAccount.create | string | `nil` | Configures if the service account should be created or not |
|
||||
| global.serviceAccount.name | string | `nil` | Change the name of the service account. This is honored if you disable on this chart the creation of the service account so you can use your own |
|
||||
| global.tolerations | list | `[]` | Sets pod's tolerations to node taints |
|
||||
| global.verboseLog | bool | false | Sets the debug logs to this integration or all integrations if it is set globally |
|
||||
| k8s-agents-operator.enabled | bool | `false` | Install the [`k8s-agents-operator` chart](https://github.com/newrelic/k8s-agents-operator/tree/main/charts/k8s-agents-operator) |
|
||||
| kube-state-metrics.enabled | bool | `false` | Install the [`kube-state-metrics` chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-state-metrics) from the stable helm charts repository. This is mandatory if `infrastructure.enabled` is set to `true` and the user does not provide its own instance of KSM version >=1.8 and <=2.0. Note, kube-state-metrics v2+ disables labels/annotations metrics by default. You can enable the target labels/annotations metrics to be monitored by using the metricLabelsAllowlist/metricAnnotationsAllowList options described [here](https://github.com/prometheus-community/helm-charts/blob/159cd8e4fb89b8b107dcc100287504bb91bf30e0/charts/kube-state-metrics/values.yaml#L274) in your Kubernetes clusters. |
|
||||
| newrelic-infra-operator.enabled | bool | `false` | Install the [`newrelic-infra-operator` chart](https://github.com/newrelic/newrelic-infra-operator/tree/main/charts/newrelic-infra-operator) (Beta) |
|
||||
| newrelic-infrastructure.enabled | bool | `true` | Install the [`newrelic-infrastructure` chart](https://github.com/newrelic/nri-kubernetes/tree/main/charts/newrelic-infrastructure) |
|
||||
| newrelic-k8s-metrics-adapter.enabled | bool | `false` | Install the [`newrelic-k8s-metrics-adapter.` chart](https://github.com/newrelic/newrelic-k8s-metrics-adapter/tree/main/charts/newrelic-k8s-metrics-adapter) (Beta) |
|
||||
| newrelic-logging.enabled | bool | `false` | Install the [`newrelic-logging` chart](https://github.com/newrelic/helm-charts/tree/master/charts/newrelic-logging) |
|
||||
| newrelic-pixie.enabled | bool | `false` | Install the [`newrelic-pixie`](https://github.com/newrelic/helm-charts/tree/master/charts/newrelic-pixie) |
|
||||
| newrelic-prometheus-agent.enabled | bool | `false` | Install the [`newrelic-prometheus-agent` chart](https://github.com/newrelic/newrelic-prometheus-configurator/tree/main/charts/newrelic-prometheus-agent) |
|
||||
| nri-kube-events.enabled | bool | `false` | Install the [`nri-kube-events` chart](https://github.com/newrelic/nri-kube-events/tree/main/charts/nri-kube-events) |
|
||||
| nri-metadata-injection.enabled | bool | `true` | Install the [`nri-metadata-injection` chart](https://github.com/newrelic/k8s-metadata-injection/tree/main/charts/nri-metadata-injection) |
|
||||
| nri-prometheus.enabled | bool | `false` | Install the [`nri-prometheus` chart](https://github.com/newrelic/nri-prometheus/tree/main/charts/nri-prometheus) |
|
||||
| pixie-chart.enabled | bool | `false` | Install the [`pixie-chart` chart](https://docs.pixielabs.ai/installing-pixie/install-schemes/helm/#3.-deploy) |
|
||||
|
||||
## Maintainers
|
||||
|
||||
* [juanjjaramillo](https://github.com/juanjjaramillo)
|
||||
* [csongnr](https://github.com/csongnr)
|
||||
* [dbudziwojskiNR](https://github.com/dbudziwojskiNR)
|
|
@ -0,0 +1,166 @@
|
|||
{{ template "chart.header" . }}
|
||||
{{ template "chart.deprecationWarning" . }}
|
||||
|
||||
{{ template "chart.description" . }}
|
||||
|
||||
{{ template "chart.homepageLine" . }}
|
||||
|
||||
## Bundled charts
|
||||
|
||||
This chart does not deploy anything by itself but has many charts as dependencies. This allows you to easily install and upgrade the New Relic
|
||||
Kubernetes Integration using only one chart.
|
||||
|
||||
In case you need more information about each component this chart installs, or you are an advanced user that want to install each component separately,
|
||||
here is a list of components that this chart installs and where you can find more information about them:
|
||||
|
||||
| Component | Installed by default? | Description |
|
||||
|------------------------------|-----------------------|-------------|
|
||||
| [newrelic-infrastructure](https://github.com/newrelic/nri-kubernetes/tree/main/charts/newrelic-infrastructure) | Yes | Sends metrics about nodes, cluster objects (e.g. Deployments, Pods), and the control plane to New Relic. |
|
||||
| [nri-metadata-injection](https://github.com/newrelic/k8s-metadata-injection/tree/main/charts/nri-metadata-injection) | Yes | Enriches New Relic-instrumented applications (APM) with Kubernetes information. |
|
||||
| [kube-state-metrics](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-state-metrics) | | Required for `newrelic-infrastructure` to gather cluster-level metrics. |
|
||||
| [nri-kube-events](https://github.com/newrelic/nri-kube-events/tree/main/charts/nri-kube-events) | | Reports Kubernetes events to New Relic. |
|
||||
| [newrelic-infra-operator](https://github.com/newrelic/newrelic-infra-operator/tree/main/charts/newrelic-infra-operator) | | (Beta) Used with Fargate or serverless environments to inject `newrelic-infrastructure` as a sidecar instead of the usual DaemonSet. |
|
||||
| [newrelic-k8s-metrics-adapter](https://github.com/newrelic/newrelic-k8s-metrics-adapter/tree/main/charts/newrelic-k8s-metrics-adapter) | | (Beta) Provides a source of data for Horizontal Pod Autoscalers (HPA) based on a NRQL query from New Relic. |
|
||||
| [newrelic-logging](https://github.com/newrelic/helm-charts/tree/master/charts/newrelic-logging) | | Sends logs for Kubernetes components and workloads running on the cluster to New Relic. |
|
||||
| [nri-prometheus](https://github.com/newrelic/nri-prometheus/tree/main/charts/nri-prometheus) | | Sends metrics from applications exposing Prometheus metrics to New Relic. |
|
||||
| [newrelic-prometheus-configurator](https://github.com/newrelic/newrelic-prometheus-configurator/tree/master/charts/newrelic-prometheus-agent) | | Configures instances of Prometheus in Agent mode to send metrics to the New Relic Prometheus endpoint. |
|
||||
| [newrelic-pixie](https://github.com/newrelic/helm-charts/tree/master/charts/newrelic-pixie) | | Connects to the Pixie API and enables the New Relic plugin in Pixie. The plugin allows you to export data from Pixie to New Relic for long-term data retention. |
|
||||
| [Pixie](https://docs.pixielabs.ai/installing-pixie/install-schemes/helm/#3.-deploy) | | Is an open source observability tool for Kubernetes applications that uses eBPF to automatically capture telemetry data without the need for manual instrumentation. |
|
||||
| [k8s-agents-operator](https://github.com/newrelic/k8s-agents-operator/tree/main/charts/k8s-agents-operator) | | (Preview) Streamlines full-stack observability for Kubernetes environments by automating APM instrumentation alongside Kubernetes agent deployment. |
|
||||
|
||||
## Configure components
|
||||
|
||||
It is possible to configure settings for the individual charts this chart groups by specifying values for them under a key using the name of the chart,
|
||||
as specified in [helm documentation](https://helm.sh/docs/chart_template_guide/subcharts_and_globals).
|
||||
|
||||
For example, by adding the following to the `values.yml` file:
|
||||
|
||||
```yaml
|
||||
# Configuration settings for the newrelic-infrastructure chart
|
||||
newrelic-infrastructure:
|
||||
# Any key defined in the values.yml file for the newrelic-infrastructure chart can be configured here:
|
||||
# https://github.com/newrelic/nri-kubernetes/blob/main/charts/newrelic-infrastructure/values.yaml
|
||||
|
||||
verboseLog: false
|
||||
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
```
|
||||
|
||||
It is possible to override any entry of the [`newrelic-infrastructure`](https://github.com/newrelic/nri-kubernetes/tree/main/charts/newrelic-infrastructure)
|
||||
chart, as defined in their [`values.yml` file](https://github.com/newrelic/nri-kubernetes/blob/main/charts/newrelic-infrastructure/values.yaml).
|
||||
|
||||
The same approach can be followed to update any of the subcharts.
|
||||
|
||||
After making these changes to the `values.yml` file, or a custom values file, make sure to apply them using:
|
||||
|
||||
```
|
||||
$ helm upgrade --reuse-values -f values.yaml [RELEASE] newrelic/nri-bundle
|
||||
```
|
||||
|
||||
Where `[RELEASE]` is the name of the helm release, e.g. `newrelic-bundle`.
|
||||
|
||||
|
||||
## Monitor on host integrations
|
||||
|
||||
If you wish to monitor services running on Kubernetes you can provide integrations
|
||||
configuration under `integrations_config` that it will passed down to the `newrelic-infrastructure` chart.
|
||||
|
||||
You just need to create a new entry where the "name" is the filename of the configuration file and the data is the content of
|
||||
the integration configuration. The name must end in ".yaml" as this will be the
|
||||
filename generated and the Infrastructure agent only looks for YAML files.
|
||||
|
||||
The data part is the actual integration configuration as described in the spec here:
|
||||
https://docs.newrelic.com/docs/integrations/integrations-sdk/file-specifications/integration-configuration-file-specifications-agent-v180
|
||||
|
||||
In the following example you can see how to monitor a Redis integration with autodiscovery
|
||||
|
||||
```yaml
|
||||
newrelic-infrastructure:
|
||||
integrations:
|
||||
nri-redis-sampleapp:
|
||||
discovery:
|
||||
command:
|
||||
exec: /var/db/newrelic-infra/nri-discovery-kubernetes --tls --port 10250
|
||||
match:
|
||||
label.app: sampleapp
|
||||
integrations:
|
||||
- name: nri-redis
|
||||
env:
|
||||
# using the discovered IP as the hostname address
|
||||
HOSTNAME: ${discovery.ip}
|
||||
PORT: 6379
|
||||
labels:
|
||||
env: test
|
||||
```
|
||||
|
||||
## Bring your own KSM
|
||||
|
||||
New Relic Kubernetes Integration requires an instance of kube-state-metrics (KSM) to be running in the cluster, which this chart pulls as a dependency. If you are already running or want to run your own KSM instance, you will need to make some small adjustments as described below.
|
||||
|
||||
### Bring your own KSM
|
||||
|
||||
If you already have one KSM instance running, you can point `nri-kubernetes` to your instance:
|
||||
|
||||
```yaml
|
||||
kube-state-metrics:
|
||||
# Disable bundled KSM.
|
||||
enabled: false
|
||||
newrelic-infrastructure:
|
||||
ksm:
|
||||
config:
|
||||
# Selector for your pre-installed KSM Service. You may need to adjust this to fit your existing installation.
|
||||
selector: "app.kubernetes.io/name=kube-state-metrics"
|
||||
# Alternatively, you can specify a fixed URL where KSM is available. Doing so will bypass autodiscovery.
|
||||
#staticUrl: http://ksm.ksm.svc.cluster.local:8080/metrics
|
||||
```
|
||||
|
||||
### <span id="ksm-different-version">Run KSM alongside a different version</span>
|
||||
|
||||
If you need to run a different instance of KSM in your cluster, you can still run a separate instance for the Kubernetes Integration to work as intended:
|
||||
|
||||
```yaml
|
||||
kube-state-metrics:
|
||||
# Enable bundled KSM.
|
||||
enabled: true
|
||||
prometheusScrape: false
|
||||
customLabels:
|
||||
# Label unique to this KSM instance.
|
||||
newrelic.com/custom-ksm: "true"
|
||||
newrelic-infrastructure:
|
||||
ksm:
|
||||
config:
|
||||
# Use label above as a selector.
|
||||
selector: "newrelic.com/custom-ksm=true"
|
||||
```
|
||||
|
||||
For more information on supported KSM version visit the [requirements documentation](https://docs.newrelic.com/docs/kubernetes-pixie/kubernetes-integration/get-started/kubernetes-integration-compatibility-requirements#reqs)
|
||||
|
||||
## Values managed globally
|
||||
|
||||
Some of the subchart implement the [New Relic's common Helm library](https://github.com/newrelic/helm-charts/tree/master/library/common-library) which
|
||||
means that it honors a wide range of defaults and globals common to most New Relic Helm charts.
|
||||
|
||||
Options that can be defined globally include `affinity`, `nodeSelector`, `tolerations`, `proxy` and others. The full list can be found at
|
||||
[user's guide of the common library](https://github.com/newrelic/helm-charts/blob/master/library/common-library/README.md).
|
||||
|
||||
At the time of writing this document, all the charts from `nri-bundle` except `newrelic-logging` and `synthetics-minion` implements this library and
|
||||
honors global options as described below.
|
||||
|
||||
Note, the value table below is automatically generated from `values.yaml` by `helm-docs`. If you need to add new fields or update existing fields, please update the `values.yaml` and then run `helm-docs` to update this value table.
|
||||
|
||||
{{ template "chart.valuesSection" . }}
|
||||
|
||||
{{ if .Maintainers }}
|
||||
## Maintainers
|
||||
{{ range .Maintainers }}
|
||||
{{- if .Name }}
|
||||
{{- if .Url }}
|
||||
* [{{ .Name }}]({{ .Url }})
|
||||
{{- else }}
|
||||
* {{ .Name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,5 @@
|
|||
# New Relic Kubernetes Integration
|
||||
|
||||
New Relic's Kubernetes integration gives you full observability into the health and performance of your environment, no matter whether you run Kubernetes on-premises or in the cloud. With our [cluster explorer](https://docs.newrelic.com/docs/integrations/kubernetes-integration/cluster-explorer/kubernetes-cluster-explorer), you can cut through layers of complexity to see how your cluster is performing, from the heights of the control plane down to applications running on a single pod.
|
||||
|
||||
You can see the power of the Kubernetes integration in the [cluster explorer](https://docs.newrelic.com/docs/integrations/kubernetes-integration/cluster-explorer/kubernetes-cluster-explorer), where the full picture of a cluster is made available on a single screen: nodes and pods are visualized according to their health and performance, with pending and alerting nodes in the innermost circles. [Predefined alert conditions](https://docs.newrelic.com/docs/integrations/kubernetes-integration/kubernetes-events/kubernetes-integration-predefined-alert-policy) help you troubleshoot issues right from the start. Clicking each node reveals its status and how each app is performing.
|
|
@ -0,0 +1,23 @@
|
|||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
|
@ -0,0 +1,6 @@
|
|||
dependencies:
|
||||
- name: common-library
|
||||
repository: https://helm-charts.newrelic.com
|
||||
version: 1.3.0
|
||||
digest: sha256:2e1da613fd8a52706bde45af077779c5d69e9e1641bdf5c982eaf6d1ac67a443
|
||||
generated: "2024-10-25T18:35:38.878351812Z"
|
|
@ -0,0 +1,20 @@
|
|||
apiVersion: v2
|
||||
appVersion: 0.19.0
|
||||
dependencies:
|
||||
- name: common-library
|
||||
repository: https://helm-charts.newrelic.com
|
||||
version: 1.3.0
|
||||
description: A Helm chart for the Kubernetes Agents Operator
|
||||
home: https://github.com/newrelic/k8s-agents-operator/blob/main/charts/k8s-agents-operator/README.md
|
||||
maintainers:
|
||||
- name: csongnr
|
||||
url: https://github.com/csongnr
|
||||
- name: dbudziwojskiNR
|
||||
url: https://github.com/dbudziwojskiNR
|
||||
- name: danielstokes
|
||||
url: https://github.com/danielstokes
|
||||
name: k8s-agents-operator
|
||||
sources:
|
||||
- https://github.com/newrelic/k8s-agents-operator
|
||||
type: application
|
||||
version: 0.19.0
|
|
@ -0,0 +1,294 @@
|
|||
# k8s-agents-operator
|
||||
|
||||
![Version: 0.19.0](https://img.shields.io/badge/Version-0.19.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.19.0](https://img.shields.io/badge/AppVersion-0.19.0-informational?style=flat-square)
|
||||
|
||||
A Helm chart for the Kubernetes Agents Operator
|
||||
|
||||
**Homepage:** <https://github.com/newrelic/k8s-agents-operator/blob/main/charts/k8s-agents-operator/README.md>
|
||||
|
||||
## Prerequisites
|
||||
|
||||
[Helm](https://helm.sh) must be installed to use the charts. Please refer to Helm's [documentation](https://helm.sh/docs) to get started.
|
||||
|
||||
## Installation
|
||||
|
||||
### Requirements
|
||||
|
||||
Add the `k8s-agents-operator` Helm chart repository:
|
||||
```shell
|
||||
helm repo add k8s-agents-operator https://newrelic.github.io/k8s-agents-operator
|
||||
```
|
||||
|
||||
### Instrumentation
|
||||
|
||||
Install the [`k8s-agents-operator`](https://github.com/newrelic/k8s-agents-operator) Helm chart:
|
||||
```shell
|
||||
helm upgrade --install k8s-agents-operator k8s-agents-operator/k8s-agents-operator \
|
||||
--namespace newrelic \
|
||||
--create-namespace \
|
||||
--values your-custom-values.yaml
|
||||
```
|
||||
|
||||
### Monitored namespaces
|
||||
|
||||
For each namespace you want the operator to be instrumented, a secret will be replicated from the newrelic operator namespace.
|
||||
|
||||
For each `Instrumentation` custom resource created, specifying which APM agent you want to instrument for each language. All available APM
|
||||
agent docker images and corresponding tags are listed on DockerHub:
|
||||
|
||||
* [.NET](https://hub.docker.com/repository/docker/newrelic/newrelic-dotnet-init/general)
|
||||
* [Java](https://hub.docker.com/repository/docker/newrelic/newrelic-java-init/general)
|
||||
* [Node](https://hub.docker.com/repository/docker/newrelic/newrelic-node-init/general)
|
||||
* [Python](https://hub.docker.com/repository/docker/newrelic/newrelic-python-init/general)
|
||||
* [Ruby](https://hub.docker.com/repository/docker/newrelic/newrelic-ruby-init/general)
|
||||
|
||||
For .NET
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-dotnet
|
||||
spec:
|
||||
agent:
|
||||
language: dotnet
|
||||
image: newrelic/newrelic-dotnet-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For Java
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-java
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
language: java
|
||||
image: newrelic/newrelic-java-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For NodeJS
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-nodejs
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
language: nodejs
|
||||
image: newrelic/newrelic-node-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For Python
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-python
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
language: python
|
||||
image: newrelic/newrelic-python-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For Ruby
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-ruby
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
language: ruby
|
||||
image: newrelic/newrelic-ruby-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For environment specific configurations
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-lang
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
env:
|
||||
# Example New Relic agent supported environment variables
|
||||
- name: NEW_RELIC_LABELS
|
||||
value: "environment:auto-injection"
|
||||
# Example setting the pod name based on the metadata
|
||||
- name: NEW_RELIC_POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
# Example overriding the appName configuration
|
||||
- name: NEW_RELIC_APP_NAME
|
||||
value: "$(NEW_RELIC_LABELS)-$(NEW_RELIC_POD_NAME)"
|
||||
```
|
||||
|
||||
Targeting everything in a specific namespace with a label
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-lang
|
||||
namespace: newrelic
|
||||
spec:
|
||||
#agent: ...
|
||||
namespaceLabelSelector:
|
||||
matchExpressions:
|
||||
- key: "app.newrelic.instrumentation"
|
||||
operator: "In"
|
||||
values: ["java"]
|
||||
```
|
||||
|
||||
Targeting a pod with a specific label
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-lang
|
||||
namespace: newrelic
|
||||
spec:
|
||||
# agent: ...
|
||||
podLabelSelector:
|
||||
matchExpressions:
|
||||
- key: "app.newrelic.instrumentation"
|
||||
operator: "In"
|
||||
values: ["dotnet"]
|
||||
```
|
||||
|
||||
Using a secret with a non-default name
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-lang
|
||||
namespace: newrelic
|
||||
spec:
|
||||
# agent: ...
|
||||
licenseKeySecret: the-name-of-the-custom-secret
|
||||
```
|
||||
|
||||
In the example above, we show how you can configure the agent settings globally using environment variables. See each agent's configuration documentation for available configuration options:
|
||||
* [Java](https://docs.newrelic.com/docs/apm/agents/java-agent/configuration/java-agent-configuration-config-file/)
|
||||
* [Node](https://docs.newrelic.com/docs/apm/agents/nodejs-agent/installation-configuration/nodejs-agent-configuration/)
|
||||
* [Python](https://docs.newrelic.com/docs/apm/agents/python-agent/configuration/python-agent-configuration/)
|
||||
* [.NET](https://docs.newrelic.com/docs/apm/agents/net-agent/configuration/net-agent-configuration/)
|
||||
* [Ruby](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/)
|
||||
|
||||
### cert-manager
|
||||
|
||||
The K8s Agents Operator supports the use of [`cert-manager`](https://github.com/cert-manager/cert-manager) if preferred.
|
||||
|
||||
Install the [`cert-manager`](https://github.com/cert-manager/cert-manager) Helm chart:
|
||||
```shell
|
||||
helm install cert-manager jetstack/cert-manager \
|
||||
--namespace cert-manager \
|
||||
--create-namespace \
|
||||
--set crds.enabled=true
|
||||
```
|
||||
|
||||
In your `values.yaml` file, set `admissionWebhooks.autoGenerateCert.enabled: false` and `admissionWebhooks.certManager.enabled: true`. Then install the chart as normal.
|
||||
|
||||
## Security
|
||||
|
||||
This operator requires a privileged environment to run correctly. As with all components that run in a privileged environment, please exercise caution when granting access to the namespace (and other resources) that the K8s Agent Operator is deployed on.
|
||||
|
||||
## Available Chart Releases
|
||||
|
||||
To see the available charts:
|
||||
```shell
|
||||
helm search repo k8s-agents-operator
|
||||
```
|
||||
|
||||
If you want to see a list of all available charts and releases, check [index.yaml](https://newrelic.github.io/k8s-agents-operator/index.yaml).
|
||||
|
||||
## Source Code
|
||||
|
||||
* <https://github.com/newrelic/k8s-agents-operator>
|
||||
|
||||
## Requirements
|
||||
|
||||
| Repository | Name | Version |
|
||||
|------------|------|---------|
|
||||
| https://helm-charts.newrelic.com | common-library | 1.3.0 |
|
||||
|
||||
## Values
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| admissionWebhooks | object | `{"autoGenerateCert":{"certPeriodDays":365,"enabled":true,"recreate":true},"caFile":"","certFile":"","certManager":{"enabled":false},"create":true,"keyFile":""}` | Admission webhooks make sure only requests with correctly formatted rules will get into the Operator |
|
||||
| admissionWebhooks.autoGenerateCert.certPeriodDays | int | `365` | Cert validity period time in days. |
|
||||
| admissionWebhooks.autoGenerateCert.enabled | bool | `true` | If true and certManager.enabled is false, Helm will automatically create a self-signed cert and secret for you. |
|
||||
| admissionWebhooks.autoGenerateCert.recreate | bool | `true` | If set to true, new webhook key/certificate is generated on helm upgrade. |
|
||||
| admissionWebhooks.caFile | string | `""` | Path to the CA cert. |
|
||||
| admissionWebhooks.certFile | string | `""` | Path to your own PEM-encoded certificate. |
|
||||
| admissionWebhooks.certManager.enabled | bool | `false` | If true and autoGenerateCert.enabled is false, cert-manager will create a self-signed cert and secret for you. |
|
||||
| admissionWebhooks.keyFile | string | `""` | Path to your own PEM-encoded private key. |
|
||||
| affinity | object | `{}` | Sets all pods' affinities. Can be configured also with `global.affinity` |
|
||||
| containerSecurityContext | object | `{}` | Sets all security context (at container level). Can be configured also with `global.securityContext.container` |
|
||||
| controllerManager.kubeRbacProxy.containerSecurityContext | object | `{}` | Sets security context (at container level) for kubeRbacProxy. Overrides `containerSecurityContext` and `global.containerSecurityContext` |
|
||||
| controllerManager.kubeRbacProxy.image.repository | string | `"gcr.io/kubebuilder/kube-rbac-proxy"` | Sets the repository and image to use for kube-rbac-proxy. Please ensure you're using a trusted image. |
|
||||
| controllerManager.kubeRbacProxy.image.version | string | `"sha256:771a9a173e033a3ad8b46f5c00a7036eaa88c8d8d1fbd89217325168998113ea"` | Sets the kube-rbac-proxy image version to retrieve. Could be a tag i.e. "v0.16.0" or a SHA digest i.e. "sha256:771a9a173e033a3ad8b46f5c00a7036eaa88c8d8d1fbd89217325168998113ea" |
|
||||
| controllerManager.kubeRbacProxy.resources.limits.cpu | string | `"500m"` | |
|
||||
| controllerManager.kubeRbacProxy.resources.limits.memory | string | `"128Mi"` | |
|
||||
| controllerManager.kubeRbacProxy.resources.requests.cpu | string | `"5m"` | |
|
||||
| controllerManager.kubeRbacProxy.resources.requests.memory | string | `"64Mi"` | |
|
||||
| controllerManager.manager.containerSecurityContext | object | `{}` | Sets security context (at container level) for the manager. Overrides `containerSecurityContext` and `global.containerSecurityContext` |
|
||||
| controllerManager.manager.image.pullPolicy | string | `nil` | |
|
||||
| controllerManager.manager.image.repository | string | `"newrelic/k8s-agents-operator"` | Sets the repository and image to use for the manager. Please ensure you're using trusted New Relic images. |
|
||||
| controllerManager.manager.image.version | string | `nil` | Sets the manager image version to retrieve. Could be a tag i.e. "v0.17.0" or a SHA digest i.e. "sha256:e2399e70e99ac370ca6a3c7e5affa9655da3b246d0ada77c40ed155b3726ee2e" |
|
||||
| controllerManager.manager.leaderElection | object | `{"enabled":true}` | Enable leader election mechanism for protecting against split brain if multiple operator pods/replicas are started |
|
||||
| controllerManager.manager.resources.requests.cpu | string | `"100m"` | |
|
||||
| controllerManager.manager.resources.requests.memory | string | `"64Mi"` | |
|
||||
| controllerManager.replicas | int | `1` | |
|
||||
| dnsConfig | object | `{}` | Sets pod's dnsConfig. Can be configured also with `global.dnsConfig` |
|
||||
| kubernetesClusterDomain | string | `"cluster.local"` | |
|
||||
| labels | object | `{}` | Additional labels for chart objects |
|
||||
| licenseKey | string | `""` | This set this license key to use. Can be configured also with `global.licenseKey` |
|
||||
| metricsService.ports[0].name | string | `"https"` | |
|
||||
| metricsService.ports[0].port | int | `8443` | |
|
||||
| metricsService.ports[0].protocol | string | `"TCP"` | |
|
||||
| metricsService.ports[0].targetPort | string | `"https"` | |
|
||||
| metricsService.type | string | `"ClusterIP"` | |
|
||||
| nodeSelector | object | `{}` | Sets all pods' node selector. Can be configured also with `global.nodeSelector` |
|
||||
| podAnnotations | object | `{}` | Annotations to be added to the deployment. |
|
||||
| podLabels | object | `{}` | Additional labels for chart pods |
|
||||
| podSecurityContext | object | `{"fsGroup":65532,"runAsGroup":65532,"runAsNonRoot":true,"runAsUser":65532}` | SecurityContext holds pod-level security attributes and common container settings |
|
||||
| priorityClassName | string | `""` | Sets pod's priorityClassName. Can be configured also with `global.priorityClassName` |
|
||||
| serviceAccount | object | See `values.yaml` | Settings controlling ServiceAccount creation |
|
||||
| serviceAccount.create | bool | `true` | Specifies whether a ServiceAccount should be created |
|
||||
| tolerations | list | `[]` | Sets all pods' tolerations to node taints. Can be configured also with `global.tolerations` |
|
||||
| webhookService.ports[0].port | int | `443` | |
|
||||
| webhookService.ports[0].protocol | string | `"TCP"` | |
|
||||
| webhookService.ports[0].targetPort | int | `9443` | |
|
||||
| webhookService.type | string | `"ClusterIP"` | |
|
||||
|
||||
## Maintainers
|
||||
|
||||
| Name | Email | Url |
|
||||
| ---- | ------ | --- |
|
||||
| csongnr | | <https://github.com/csongnr> |
|
||||
| dbudziwojskiNR | | <https://github.com/dbudziwojskiNR> |
|
||||
| danielstokes | | <https://github.com/danielstokes> |
|
||||
|
||||
----------------------------------------------
|
||||
Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2)
|
|
@ -0,0 +1,234 @@
|
|||
{{ template "chart.header" . }}
|
||||
|
||||
{{ template "chart.deprecationWarning" . }}
|
||||
|
||||
{{ template "chart.badgesSection" . }}
|
||||
|
||||
{{ template "chart.description" . }}
|
||||
|
||||
{{ template "chart.homepageLine" . }}
|
||||
|
||||
## Prerequisites
|
||||
|
||||
[Helm](https://helm.sh) must be installed to use the charts. Please refer to Helm's [documentation](https://helm.sh/docs) to get started.
|
||||
|
||||
## Installation
|
||||
|
||||
### Requirements
|
||||
|
||||
Add the `k8s-agents-operator` Helm chart repository:
|
||||
```shell
|
||||
helm repo add k8s-agents-operator https://newrelic.github.io/k8s-agents-operator
|
||||
```
|
||||
|
||||
### Instrumentation
|
||||
|
||||
Install the [`k8s-agents-operator`](https://github.com/newrelic/k8s-agents-operator) Helm chart:
|
||||
```shell
|
||||
helm upgrade --install k8s-agents-operator k8s-agents-operator/k8s-agents-operator \
|
||||
--namespace newrelic \
|
||||
--create-namespace \
|
||||
--values your-custom-values.yaml
|
||||
```
|
||||
|
||||
### Monitored namespaces
|
||||
|
||||
For each namespace you want the operator to be instrumented, a secret will be replicated from the newrelic operator namespace.
|
||||
|
||||
For each `Instrumentation` custom resource created, specifying which APM agent you want to instrument for each language. All available APM
|
||||
agent docker images and corresponding tags are listed on DockerHub:
|
||||
|
||||
* [.NET](https://hub.docker.com/repository/docker/newrelic/newrelic-dotnet-init/general)
|
||||
* [Java](https://hub.docker.com/repository/docker/newrelic/newrelic-java-init/general)
|
||||
* [Node](https://hub.docker.com/repository/docker/newrelic/newrelic-node-init/general)
|
||||
* [Python](https://hub.docker.com/repository/docker/newrelic/newrelic-python-init/general)
|
||||
* [Ruby](https://hub.docker.com/repository/docker/newrelic/newrelic-ruby-init/general)
|
||||
|
||||
For .NET
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-dotnet
|
||||
spec:
|
||||
agent:
|
||||
language: dotnet
|
||||
image: newrelic/newrelic-dotnet-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For Java
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-java
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
language: java
|
||||
image: newrelic/newrelic-java-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For NodeJS
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-nodejs
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
language: nodejs
|
||||
image: newrelic/newrelic-node-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For Python
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-python
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
language: python
|
||||
image: newrelic/newrelic-python-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For Ruby
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-ruby
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
language: ruby
|
||||
image: newrelic/newrelic-ruby-init:latest # Please ensure you're using a trusted New Relic image
|
||||
# env: ...
|
||||
```
|
||||
|
||||
For environment specific configurations
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-lang
|
||||
namespace: newrelic
|
||||
spec:
|
||||
agent:
|
||||
env:
|
||||
# Example New Relic agent supported environment variables
|
||||
- name: NEW_RELIC_LABELS
|
||||
value: "environment:auto-injection"
|
||||
# Example setting the pod name based on the metadata
|
||||
- name: NEW_RELIC_POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
# Example overriding the appName configuration
|
||||
- name: NEW_RELIC_APP_NAME
|
||||
value: "$(NEW_RELIC_LABELS)-$(NEW_RELIC_POD_NAME)"
|
||||
```
|
||||
|
||||
Targeting everything in a specific namespace with a label
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-lang
|
||||
namespace: newrelic
|
||||
spec:
|
||||
#agent: ...
|
||||
namespaceLabelSelector:
|
||||
matchExpressions:
|
||||
- key: "app.newrelic.instrumentation"
|
||||
operator: "In"
|
||||
values: ["java"]
|
||||
```
|
||||
|
||||
Targeting a pod with a specific label
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-lang
|
||||
namespace: newrelic
|
||||
spec:
|
||||
# agent: ...
|
||||
podLabelSelector:
|
||||
matchExpressions:
|
||||
- key: "app.newrelic.instrumentation"
|
||||
operator: "In"
|
||||
values: ["dotnet"]
|
||||
```
|
||||
|
||||
Using a secret with a non-default name
|
||||
|
||||
```yaml
|
||||
apiVersion: newrelic.com/v1alpha2
|
||||
kind: Instrumentation
|
||||
metadata:
|
||||
name: newrelic-instrumentation-lang
|
||||
namespace: newrelic
|
||||
spec:
|
||||
# agent: ...
|
||||
licenseKeySecret: the-name-of-the-custom-secret
|
||||
```
|
||||
|
||||
In the example above, we show how you can configure the agent settings globally using environment variables. See each agent's configuration documentation for available configuration options:
|
||||
* [Java](https://docs.newrelic.com/docs/apm/agents/java-agent/configuration/java-agent-configuration-config-file/)
|
||||
* [Node](https://docs.newrelic.com/docs/apm/agents/nodejs-agent/installation-configuration/nodejs-agent-configuration/)
|
||||
* [Python](https://docs.newrelic.com/docs/apm/agents/python-agent/configuration/python-agent-configuration/)
|
||||
* [.NET](https://docs.newrelic.com/docs/apm/agents/net-agent/configuration/net-agent-configuration/)
|
||||
* [Ruby](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/)
|
||||
|
||||
### cert-manager
|
||||
|
||||
The K8s Agents Operator supports the use of [`cert-manager`](https://github.com/cert-manager/cert-manager) if preferred.
|
||||
|
||||
Install the [`cert-manager`](https://github.com/cert-manager/cert-manager) Helm chart:
|
||||
```shell
|
||||
helm install cert-manager jetstack/cert-manager \
|
||||
--namespace cert-manager \
|
||||
--create-namespace \
|
||||
--set crds.enabled=true
|
||||
```
|
||||
|
||||
In your `values.yaml` file, set `admissionWebhooks.autoGenerateCert.enabled: false` and `admissionWebhooks.certManager.enabled: true`. Then install the chart as normal.
|
||||
|
||||
## Security
|
||||
|
||||
This operator requires a privileged environment to run correctly. As with all components that run in a privileged environment, please exercise caution when granting access to the namespace (and other resources) that the K8s Agent Operator is deployed on.
|
||||
|
||||
## Available Chart Releases
|
||||
|
||||
To see the available charts:
|
||||
```shell
|
||||
helm search repo k8s-agents-operator
|
||||
```
|
||||
|
||||
If you want to see a list of all available charts and releases, check [index.yaml](https://newrelic.github.io/k8s-agents-operator/index.yaml).
|
||||
|
||||
{{ template "chart.sourcesSection" . }}
|
||||
|
||||
{{ template "chart.requirementsSection" . }}
|
||||
|
||||
{{ template "chart.valuesSection" . }}
|
||||
|
||||
{{ template "chart.maintainersSection" . }}
|
||||
|
||||
{{ template "helm-docs.versionFooter" . }}
|
|
@ -0,0 +1,23 @@
|
|||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
|
@ -0,0 +1,17 @@
|
|||
apiVersion: v2
|
||||
description: Provides helpers to provide consistency on all the charts
|
||||
keywords:
|
||||
- newrelic
|
||||
- chart-library
|
||||
maintainers:
|
||||
- name: juanjjaramillo
|
||||
url: https://github.com/juanjjaramillo
|
||||
- name: csongnr
|
||||
url: https://github.com/csongnr
|
||||
- name: dbudziwojskiNR
|
||||
url: https://github.com/dbudziwojskiNR
|
||||
- name: kang-makes
|
||||
url: https://github.com/kang-makes
|
||||
name: common-library
|
||||
type: library
|
||||
version: 1.3.0
|
|
@ -0,0 +1,747 @@
|
|||
# Functions/templates documented for chart writers
|
||||
Here is some rough documentation separated by the file that contains the function, the function
|
||||
name and how to use it. We are not covering functions that start with `_` (e.g.
|
||||
`newrelic.common.license._licenseKey`) because they are used internally by this library for
|
||||
other helpers. Helm does not have the concept of "public" or "private" functions/templates so
|
||||
this is a convention of ours.
|
||||
|
||||
## _naming.tpl
|
||||
These functions are used to name objects.
|
||||
|
||||
### `newrelic.common.naming.name`
|
||||
This is the same as the idiomatic `CHART-NAME.name` that is created when you use `helm create`.
|
||||
|
||||
It honors `.Values.nameOverride`.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.naming.name" . }}
|
||||
```
|
||||
|
||||
### `newrelic.common.naming.fullname`
|
||||
This is the same as the idiomatic `CHART-NAME.fullname` that is created when you use `helm create`
|
||||
|
||||
It honors `.Values.fullnameOverride`.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.naming.fullname" . }}
|
||||
```
|
||||
|
||||
### `newrelic.common.naming.chart`
|
||||
This is the same as the idiomatic `CHART-NAME.chart` that is created when you use `helm create`.
|
||||
|
||||
It is mostly useless for chart writers. It is used internally for templating the labels but there
|
||||
is no reason to keep it "private".
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.naming.chart" . }}
|
||||
```
|
||||
|
||||
### `newrelic.common.naming.truncateToDNS`
|
||||
This is a useful template that could be used to trim a string to 63 chars and does not end with a dash (`-`).
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ $nameToTruncate := "a-really-really-really-really-REALLY-long-string-that-should-be-truncated-because-it-is-enought-long-to-brak-something"
|
||||
{{- $truncatedName := include "newrelic.common.naming.truncateToDNS" $nameToTruncate }}
|
||||
{{- $truncatedName }}
|
||||
{{- /* This should print: a-really-really-really-really-REALLY-long-string-that-should-be */ -}}
|
||||
```
|
||||
|
||||
### `newrelic.common.naming.truncateToDNSWithSuffix`
|
||||
This template function is the same as the above but instead of receiving a string you should give a `dict`
|
||||
with a `name` and a `suffix`. This function will join them with a dash (`-`) and trim the `name` so the
|
||||
result of `name-suffix` is no more than 63 chars
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ $nameToTruncate := "a-really-really-really-really-REALLY-long-string-that-should-be-truncated-because-it-is-enought-long-to-brak-something"
|
||||
{{- $suffix := "A-NOT-SO-LONG-SUFFIX" }}
|
||||
{{- $truncatedName := include "truncateToDNSWithSuffix" (dict "name" $nameToTruncate "suffix" $suffix) }}
|
||||
{{- $truncatedName }}
|
||||
{{- /* This should print: a-really-really-really-really-REALLY-long-A-NOT-SO-LONG-SUFFIX */ -}}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _labels.tpl
|
||||
### `newrelic.common.labels`, `newrelic.common.labels.selectorLabels` and `newrelic.common.labels.podLabels`
|
||||
These are functions that are used to label objects. They are configured by this `values.yaml`
|
||||
```yaml
|
||||
global:
|
||||
podLabels: {} # included in all the pods of all the charts that implement this library
|
||||
labels: {} # included in all the objects of all the charts that implement this library
|
||||
podLabels: {} # included in all the pods of this chart
|
||||
labels: {} # included in all the objects of this chart
|
||||
```
|
||||
|
||||
label maps are merged from global to local values.
|
||||
|
||||
And chart writer should use them like this:
|
||||
```mustache
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "newrelic.common.labels.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "newrelic.common.labels.podLabels" . | nindent 8 }}
|
||||
```
|
||||
|
||||
`newrelic.common.labels.podLabels` includes `newrelic.common.labels.selectorLabels` automatically.
|
||||
|
||||
|
||||
|
||||
## _priority-class-name.tpl
|
||||
### `newrelic.common.priorityClassName`
|
||||
Like almost everything in this library, it reads global and local variables:
|
||||
```yaml
|
||||
global:
|
||||
priorityClassName: ""
|
||||
priorityClassName: ""
|
||||
```
|
||||
|
||||
Be careful: chart writers should put an empty string (or any kind of Helm falsiness) for this
|
||||
library to work properly. If in your values a non-falsy `priorityClassName` is found, the global
|
||||
one is going to be always ignored.
|
||||
|
||||
Usage (example in a pod spec):
|
||||
```mustache
|
||||
spec:
|
||||
{{- with include "newrelic.common.priorityClassName" . }}
|
||||
priorityClassName: {{ . }}
|
||||
{{- end }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _hostnetwork.tpl
|
||||
### `newrelic.common.hostNetwork`
|
||||
Like almost everything in this library, it reads global and local variables:
|
||||
```yaml
|
||||
global:
|
||||
hostNetwork: # Note that this is empty (nil)
|
||||
hostNetwork: # Note that this is empty (nil)
|
||||
```
|
||||
|
||||
Be careful: chart writers should NOT PUT ANY VALUE for this library to work properly. If in you
|
||||
values a `hostNetwork` is defined, the global one is going to be always ignored.
|
||||
|
||||
This function returns "true" of "" (empty string) so it can be used for evaluating conditionals.
|
||||
|
||||
Usage (example in a pod spec):
|
||||
```mustache
|
||||
spec:
|
||||
{{- with include "newrelic.common.hostNetwork" . }}
|
||||
hostNetwork: {{ . }}
|
||||
{{- end }}
|
||||
```
|
||||
|
||||
### `newrelic.common.hostNetwork.value`
|
||||
This function is an abstraction of the function above but this returns directly "true" or "false".
|
||||
|
||||
Be careful with using this with an `if` as Helm does evaluate "false" (string) as `true`.
|
||||
|
||||
Usage (example in a pod spec):
|
||||
```mustache
|
||||
spec:
|
||||
hostNetwork: {{ include "newrelic.common.hostNetwork.value" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _dnsconfig.tpl
|
||||
### `newrelic.common.dnsConfig`
|
||||
Like almost everything in this library, it reads global and local variables:
|
||||
```yaml
|
||||
global:
|
||||
dnsConfig: {}
|
||||
dnsConfig: {}
|
||||
```
|
||||
|
||||
Be careful: chart writers should put an empty string (or any kind of Helm falsiness) for this
|
||||
library to work properly. If in your values a non-falsy `dnsConfig` is found, the global
|
||||
one is going to be always ignored.
|
||||
|
||||
Usage (example in a pod spec):
|
||||
```mustache
|
||||
spec:
|
||||
{{- with include "newrelic.common.dnsConfig" . }}
|
||||
dnsConfig:
|
||||
{{- . | nindent 4 }}
|
||||
{{- end }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _images.tpl
|
||||
These functions help us to deal with how images are templated. This allows setting `registries`
|
||||
where to fetch images globally while being flexible enough to fit in different maps of images
|
||||
and deployments with one or more images. This is the example of a complex `values.yaml` that
|
||||
we are going to use during the documentation of these functions:
|
||||
|
||||
```yaml
|
||||
global:
|
||||
images:
|
||||
registry: nexus-3-instance.internal.clients-domain.tld
|
||||
jobImage:
|
||||
registry: # defaults to "example.tld" when empty in these examples
|
||||
repository: ingress-nginx/kube-webhook-certgen
|
||||
tag: v1.1.1
|
||||
pullPolicy: IfNotPresent
|
||||
pullSecrets: []
|
||||
images:
|
||||
integration:
|
||||
registry:
|
||||
repository: newrelic/nri-kube-events
|
||||
tag: 1.8.0
|
||||
pullPolicy: IfNotPresent
|
||||
agent:
|
||||
registry:
|
||||
repository: newrelic/k8s-events-forwarder
|
||||
tag: 1.22.0
|
||||
pullPolicy: IfNotPresent
|
||||
pullSecrets: []
|
||||
```
|
||||
|
||||
### `newrelic.common.images.image`
|
||||
This will return a string with the image ready to be downloaded that includes the registry, the image and the tag.
|
||||
`defaultRegistry` is used to keep `registry` field empty in `values.yaml` so you can override the image using
|
||||
`global.images.registry`, your local `jobImage.registry` and be able to fallback to a registry that is not `docker.io`
|
||||
(Or the default repository that the client could have set in the CRI).
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{- /* For the integration */}}
|
||||
{{ include "newrelic.common.images.image" ( dict "imageRoot" .Values.images.integration "context" .) }}
|
||||
{{- /* For the agent */}}
|
||||
{{ include "newrelic.common.images.image" ( dict "imageRoot" .Values.images.agent "context" .) }}
|
||||
{{- /* For jobImage */}}
|
||||
{{ include "newrelic.common.images.image" ( dict "defaultRegistry" "example.tld" "imageRoot" .Values.jobImage "context" .) }}
|
||||
```
|
||||
|
||||
### `newrelic.common.images.registry`
|
||||
It returns the registry from the global or local values. You should avoid using this helper to create your image
|
||||
URL and use `newrelic.common.images.image` instead, but it is there to be used in case it is needed.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{- /* For the integration */}}
|
||||
{{ include "newrelic.common.images.registry" ( dict "imageRoot" .Values.images.integration "context" .) }}
|
||||
{{- /* For the agent */}}
|
||||
{{ include "newrelic.common.images.registry" ( dict "imageRoot" .Values.images.agent "context" .) }}
|
||||
{{- /* For jobImage */}}
|
||||
{{ include "newrelic.common.images.registry" ( dict "defaultRegistry" "example.tld" "imageRoot" .Values.jobImage "context" .) }}
|
||||
```
|
||||
|
||||
### `newrelic.common.images.repository`
|
||||
It returns the image from the values. You should avoid using this helper to create your image
|
||||
URL and use `newrelic.common.images.image` instead, but it is there to be used in case it is needed.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{- /* For jobImage */}}
|
||||
{{ include "newrelic.common.images.repository" ( dict "imageRoot" .Values.jobImage "context" .) }}
|
||||
{{- /* For the integration */}}
|
||||
{{ include "newrelic.common.images.repository" ( dict "imageRoot" .Values.images.integration "context" .) }}
|
||||
{{- /* For the agent */}}
|
||||
{{ include "newrelic.common.images.repository" ( dict "imageRoot" .Values.images.agent "context" .) }}
|
||||
```
|
||||
|
||||
### `newrelic.common.images.tag`
|
||||
It returns the image's tag from the values. You should avoid using this helper to create your image
|
||||
URL and use `newrelic.common.images.image` instead, but it is there to be used in case it is needed.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{- /* For jobImage */}}
|
||||
{{ include "newrelic.common.images.tag" ( dict "imageRoot" .Values.jobImage "context" .) }}
|
||||
{{- /* For the integration */}}
|
||||
{{ include "newrelic.common.images.tag" ( dict "imageRoot" .Values.images.integration "context" .) }}
|
||||
{{- /* For the agent */}}
|
||||
{{ include "newrelic.common.images.tag" ( dict "imageRoot" .Values.images.agent "context" .) }}
|
||||
```
|
||||
|
||||
### `newrelic.common.images.renderPullSecrets`
|
||||
If returns a merged map that contains the pull secrets from the global configuration and the local one.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{- /* For jobImage */}}
|
||||
{{ include "newrelic.common.images.renderPullSecrets" ( dict "pullSecrets" .Values.jobImage.pullSecrets "context" .) }}
|
||||
{{- /* For the integration */}}
|
||||
{{ include "newrelic.common.images.renderPullSecrets" ( dict "pullSecrets" .Values.images.pullSecrets "context" .) }}
|
||||
{{- /* For the agent */}}
|
||||
{{ include "newrelic.common.images.renderPullSecrets" ( dict "pullSecrets" .Values.images.pullSecrets "context" .) }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _serviceaccount.tpl
|
||||
These functions are used to evaluate if the service account should be created, with which name and add annotations to it.
|
||||
|
||||
The functions that the common library has implemented for service accounts are:
|
||||
* `newrelic.common.serviceAccount.create`
|
||||
* `newrelic.common.serviceAccount.name`
|
||||
* `newrelic.common.serviceAccount.annotations`
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{- if include "newrelic.common.serviceAccount.create" . -}}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
{{- with (include "newrelic.common.serviceAccount.annotations" .) }}
|
||||
annotations:
|
||||
{{- . | nindent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
name: {{ include "newrelic.common.serviceAccount.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
{{- end }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _affinity.tpl, _nodeselector.tpl and _tolerations.tpl
|
||||
These three files are almost the same and they follow the idiomatic way of `helm create`.
|
||||
|
||||
Each function also looks if there is a global value like the other helpers.
|
||||
```yaml
|
||||
global:
|
||||
affinity: {}
|
||||
nodeSelector: {}
|
||||
tolerations: []
|
||||
affinity: {}
|
||||
nodeSelector: {}
|
||||
tolerations: []
|
||||
```
|
||||
|
||||
The values here are replaced instead of be merged. If a value at root level is found, the global one is ignored.
|
||||
|
||||
Usage (example in a pod spec):
|
||||
```mustache
|
||||
spec:
|
||||
{{- with include "newrelic.common.nodeSelector" . }}
|
||||
nodeSelector:
|
||||
{{- . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with include "newrelic.common.affinity" . }}
|
||||
affinity:
|
||||
{{- . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with include "newrelic.common.tolerations" . }}
|
||||
tolerations:
|
||||
{{- . | nindent 4 }}
|
||||
{{- end }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _agent-config.tpl
|
||||
### `newrelic.common.agentConfig.defaults`
|
||||
This returns a YAML that the agent can use directly as a config that includes other options from the values file like verbose mode,
|
||||
custom attributes, FedRAMP and such.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
name: {{ include newrelic.common.naming.truncateToDNSWithSuffix (dict "name" (include "newrelic.common.naming.fullname" .) suffix "agent-config") }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
data:
|
||||
newrelic-infra.yml: |-
|
||||
# This is the configuration file for the infrastructure agent. See:
|
||||
# https://docs.newrelic.com/docs/infrastructure/install-infrastructure-agent/configuration/infrastructure-agent-configuration-settings/
|
||||
{{- include "newrelic.common.agentConfig.defaults" . | nindent 4 }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _cluster.tpl
|
||||
### `newrelic.common.cluster`
|
||||
Returns the cluster name
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.cluster" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _custom-attributes.tpl
|
||||
### `newrelic.common.customAttributes`
|
||||
Return custom attributes in YAML format.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: example
|
||||
data:
|
||||
custom-attributes.yaml: |
|
||||
{{- include "newrelic.common.customAttributes" . | nindent 4 }}
|
||||
custom-attributes.json: |
|
||||
{{- include "newrelic.common.customAttributes" . | fromYaml | toJson | nindent 4 }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _fedramp.tpl
|
||||
### `newrelic.common.fedramp.enabled`
|
||||
Returns true if FedRAMP is enabled or an empty string if not. It can be safely used in conditionals as an empty string is a Helm falsiness.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.fedramp.enabled" . }}
|
||||
```
|
||||
|
||||
### `newrelic.common.fedramp.enabled.value`
|
||||
Returns true if FedRAMP is enabled or false if not. This is to have the value of FedRAMP ready to be templated.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.fedramp.enabled.value" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _license.tpl
|
||||
### `newrelic.common.license.secretName` and ### `newrelic.common.license.secretKeyName`
|
||||
Returns the secret and key inside the secret where to read the license key.
|
||||
|
||||
The common library will take care of using a user-provided custom secret or creating a secret that contains the license key.
|
||||
|
||||
To create the secret use `newrelic.common.license.secret`.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{- if and (.Values.controlPlane.enabled) (not (include "newrelic.fargate" .)) }}
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: example
|
||||
spec:
|
||||
containers:
|
||||
- name: agent
|
||||
env:
|
||||
- name: "NRIA_LICENSE_KEY"
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "newrelic.common.license.secretName" . }}
|
||||
key: {{ include "newrelic.common.license.secretKeyName" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _license_secret.tpl
|
||||
### `newrelic.common.license.secret`
|
||||
This function templates the secret that is used by agents and integrations with the license Key provided by the user. It will
|
||||
template nothing (empty string) if the user provides a custom pair of secret name and key.
|
||||
|
||||
This template also fails in case the user has not provided any license key or custom secret so no safety checks have to be done
|
||||
by chart writers.
|
||||
|
||||
You just must have a template with these two lines:
|
||||
```mustache
|
||||
{{- /* Common library will take care of creating the secret or not. */ -}}
|
||||
{{- include "newrelic.common.license.secret" . -}}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _insights.tpl
|
||||
### `newrelic.common.insightsKey.secretName` and ### `newrelic.common.insightsKey.secretKeyName`
|
||||
Returns the secret and key inside the secret where to read the insights key.
|
||||
|
||||
The common library will take care of using a user-provided custom secret or creating a secret that contains the insights key.
|
||||
|
||||
To create the secret use `newrelic.common.insightsKey.secret`.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: statsd
|
||||
spec:
|
||||
containers:
|
||||
- name: statsd
|
||||
env:
|
||||
- name: "INSIGHTS_KEY"
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "newrelic.common.insightsKey.secretName" . }}
|
||||
key: {{ include "newrelic.common.insightsKey.secretKeyName" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _insights_secret.tpl
|
||||
### `newrelic.common.insightsKey.secret`
|
||||
This function templates the secret that is used by agents and integrations with the insights key provided by the user. It will
|
||||
template nothing (empty string) if the user provides a custom pair of secret name and key.
|
||||
|
||||
This template also fails in case the user has not provided any insights key or custom secret so no safety checks have to be done
|
||||
by chart writers.
|
||||
|
||||
You just must have a template with these two lines:
|
||||
```mustache
|
||||
{{- /* Common library will take care of creating the secret or not. */ -}}
|
||||
{{- include "newrelic.common.insightsKey.secret" . -}}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _userkey.tpl
|
||||
### `newrelic.common.userKey.secretName` and ### `newrelic.common.userKey.secretKeyName`
|
||||
Returns the secret and key inside the secret where to read a user key.
|
||||
|
||||
The common library will take care of using a user-provided custom secret or creating a secret that contains the insights key.
|
||||
|
||||
To create the secret use `newrelic.common.userKey.secret`.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: statsd
|
||||
spec:
|
||||
containers:
|
||||
- name: statsd
|
||||
env:
|
||||
- name: "API_KEY"
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "newrelic.common.userKey.secretName" . }}
|
||||
key: {{ include "newrelic.common.userKey.secretKeyName" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _userkey_secret.tpl
|
||||
### `newrelic.common.userKey.secret`
|
||||
This function templates the secret that is used by agents and integrations with a user key provided by the user. It will
|
||||
template nothing (empty string) if the user provides a custom pair of secret name and key.
|
||||
|
||||
This template also fails in case the user has not provided any API key or custom secret so no safety checks have to be done
|
||||
by chart writers.
|
||||
|
||||
You just must have a template with these two lines:
|
||||
```mustache
|
||||
{{- /* Common library will take care of creating the secret or not. */ -}}
|
||||
{{- include "newrelic.common.userKey.secret" . -}}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _region.tpl
|
||||
### `newrelic.common.region.validate`
|
||||
Given a string, return a normalized name for the region if valid.
|
||||
|
||||
This function does not need the context of the chart, only the value to be validated. The region returned
|
||||
honors the region [definition of the newrelic-client-go implementation](https://github.com/newrelic/newrelic-client-go/blob/cbe3e4cf2b95fd37095bf2ffdc5d61cffaec17e2/pkg/region/region_constants.go#L8-L21)
|
||||
so (as of 2024/09/14) it returns the region as "US", "EU", "Staging", or "Local".
|
||||
|
||||
In case the region provided does not match these 4, the helper calls `fail` and abort the templating.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.region.validate" "us" }}
|
||||
```
|
||||
|
||||
### `newrelic.common.region`
|
||||
It reads global and local variables for `region`:
|
||||
```yaml
|
||||
global:
|
||||
region: # Note that this can be empty (nil) or "" (empty string)
|
||||
region: # Note that this can be empty (nil) or "" (empty string)
|
||||
```
|
||||
|
||||
Be careful: chart writers should NOT PUT ANY VALUE for this library to work properly. If in your
|
||||
values a `region` is defined, the global one is going to be always ignored.
|
||||
|
||||
This function gives protection so it enforces users to give the license key as a value in their
|
||||
`values.yaml` or specify a global or local `region` value. To understand how the `region` value
|
||||
works, read the documentation of `newrelic.common.region.validate`.
|
||||
|
||||
The function will change the region from US, EU or Staging based of the license key and the
|
||||
`nrStaging` toggle. Whichever region is computed from the license/toggle can be overridden by
|
||||
the `region` value.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.region" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _low-data-mode.tpl
|
||||
### `newrelic.common.lowDataMode`
|
||||
Like almost everything in this library, it reads global and local variables:
|
||||
```yaml
|
||||
global:
|
||||
lowDataMode: # Note that this is empty (nil)
|
||||
lowDataMode: # Note that this is empty (nil)
|
||||
```
|
||||
|
||||
Be careful: chart writers should NOT PUT ANY VALUE for this library to work properly. If in you
|
||||
values a `lowdataMode` is defined, the global one is going to be always ignored.
|
||||
|
||||
This function returns "true" of "" (empty string) so it can be used for evaluating conditionals.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.lowDataMode" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _privileged.tpl
|
||||
### `newrelic.common.privileged`
|
||||
Like almost everything in this library, it reads global and local variables:
|
||||
```yaml
|
||||
global:
|
||||
privileged: # Note that this is empty (nil)
|
||||
privileged: # Note that this is empty (nil)
|
||||
```
|
||||
|
||||
Be careful: chart writers should NOT PUT ANY VALUE for this library to work properly. If in you
|
||||
values a `privileged` is defined, the global one is going to be always ignored.
|
||||
|
||||
Chart writers could override this and put directly a `true` in the `values.yaml` to override the
|
||||
default of the common library.
|
||||
|
||||
This function returns "true" of "" (empty string) so it can be used for evaluating conditionals.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.privileged" . }}
|
||||
```
|
||||
|
||||
### `newrelic.common.privileged.value`
|
||||
Returns true if privileged mode is enabled or false if not. This is to have the value of privileged ready to be templated.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.privileged.value" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _proxy.tpl
|
||||
### `newrelic.common.proxy`
|
||||
Returns the proxy URL configured by the user.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.proxy" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _security-context.tpl
|
||||
Use these functions to share the security context among all charts. Useful in clusters that have security enforcing not to
|
||||
use the root user (like OpenShift) or users that have an admission webhooks.
|
||||
|
||||
The functions are:
|
||||
* `newrelic.common.securityContext.container`
|
||||
* `newrelic.common.securityContext.pod`
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: example
|
||||
spec:
|
||||
spec:
|
||||
{{- with include "newrelic.common.securityContext.pod" . }}
|
||||
securityContext:
|
||||
{{- . | nindent 8 }}
|
||||
{{- end }}
|
||||
|
||||
containers:
|
||||
- name: example
|
||||
{{- with include "nriKubernetes.securityContext.container" . }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _staging.tpl
|
||||
### `newrelic.common.nrStaging`
|
||||
Like almost everything in this library, it reads global and local variables:
|
||||
```yaml
|
||||
global:
|
||||
nrStaging: # Note that this is empty (nil)
|
||||
nrStaging: # Note that this is empty (nil)
|
||||
```
|
||||
|
||||
Be careful: chart writers should NOT PUT ANY VALUE for this library to work properly. If in you
|
||||
values a `nrStaging` is defined, the global one is going to be always ignored.
|
||||
|
||||
This function returns "true" of "" (empty string) so it can be used for evaluating conditionals.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.nrStaging" . }}
|
||||
```
|
||||
|
||||
### `newrelic.common.nrStaging.value`
|
||||
Returns true if staging is enabled or false if not. This is to have the staging value ready to be templated.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.nrStaging.value" . }}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## _verbose-log.tpl
|
||||
### `newrelic.common.verboseLog`
|
||||
Like almost everything in this library, it reads global and local variables:
|
||||
```yaml
|
||||
global:
|
||||
verboseLog: # Note that this is empty (nil)
|
||||
verboseLog: # Note that this is empty (nil)
|
||||
```
|
||||
|
||||
Be careful: chart writers should NOT PUT ANY VALUE for this library to work properly. If in you
|
||||
values a `verboseLog` is defined, the global one is going to be always ignored.
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.verboseLog" . }}
|
||||
```
|
||||
|
||||
### `newrelic.common.verboseLog.valueAsBoolean`
|
||||
Returns true if verbose is enabled or false if not. This is to have the verbose value ready to be templated as a boolean
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.verboseLog.valueAsBoolean" . }}
|
||||
```
|
||||
|
||||
### `newrelic.common.verboseLog.valueAsInt`
|
||||
Returns 1 if verbose is enabled or 0 if not. This is to have the verbose value ready to be templated as an integer
|
||||
|
||||
Usage:
|
||||
```mustache
|
||||
{{ include "newrelic.common.verboseLog.valueAsInt" . }}
|
||||
```
|
|
@ -0,0 +1,106 @@
|
|||
# Helm Common library
|
||||
|
||||
The common library is a way to unify the UX through all the Helm charts that implement it.
|
||||
|
||||
The tooling suite that New Relic is huge and growing and this allows to set things globally
|
||||
and locally for a single chart.
|
||||
|
||||
## Documentation for chart writers
|
||||
|
||||
If you are writing a chart that is going to use this library you can check the [developers guide](/library/common-library/DEVELOPERS.md) to see all
|
||||
the functions/templates that we have implemented, what they do and how to use them.
|
||||
|
||||
## Values managed globally
|
||||
|
||||
We want to have a seamless experience through all the charts so we created this library that tries to standardize the behaviour
|
||||
of all the charts. Sadly, because of the complexity of all these integrations, not all the charts behave exactly as expected.
|
||||
|
||||
An example is `newrelic-infrastructure` that ignores `hostNetwork` in the control plane scraper because most of the users has the
|
||||
control plane listening in the node to `localhost`.
|
||||
|
||||
For each chart that has a special behavior (or further information of the behavior) there is a "chart particularities" section
|
||||
in its README.md that explains which is the expected behavior.
|
||||
|
||||
At the time of writing this, all the charts from `nri-bundle` except `newrelic-logging` and `synthetics-minion` implements this
|
||||
library and honors global options as described in this document.
|
||||
|
||||
Here is a list of global options:
|
||||
|
||||
| Global keys | Local keys | Default | Merged[<sup>1</sup>](#values-managed-globally-1) | Description |
|
||||
|-------------|------------|---------|--------------------------------------------------|-------------|
|
||||
| global.cluster | cluster | `""` | | Name of the Kubernetes cluster monitored |
|
||||
| global.licenseKey | licenseKey | `""` | | This set this license key to use |
|
||||
| global.customSecretName | customSecretName | `""` | | In case you don't want to have the license key in you values, this allows you to point to a user created secret to get the key from there |
|
||||
| global.customSecretLicenseKey | customSecretLicenseKey | `""` | | In case you don't want to have the license key in you values, this allows you to point to which secret key is the license key located |
|
||||
| global.podLabels | podLabels | `{}` | yes | Additional labels for chart pods |
|
||||
| global.labels | labels | `{}` | yes | Additional labels for chart objects |
|
||||
| global.priorityClassName | priorityClassName | `""` | | Sets pod's priorityClassName |
|
||||
| global.hostNetwork | hostNetwork | `false` | | Sets pod's hostNetwork |
|
||||
| global.dnsConfig | dnsConfig | `{}` | | Sets pod's dnsConfig |
|
||||
| global.images.registry | See [Further information](#values-managed-globally-2) | `""` | | Changes the registry where to get the images. Useful when there is an internal image cache/proxy |
|
||||
| global.images.pullSecrets | See [Further information](#values-managed-globally-2) | `[]` | yes | Set secrets to be able to fetch images |
|
||||
| global.podSecurityContext | podSecurityContext | `{}` | | Sets security context (at pod level) |
|
||||
| global.containerSecurityContext | containerSecurityContext | `{}` | | Sets security context (at container level) |
|
||||
| global.affinity | affinity | `{}` | | Sets pod/node affinities |
|
||||
| global.nodeSelector | nodeSelector | `{}` | | Sets pod's node selector |
|
||||
| global.tolerations | tolerations | `[]` | | Sets pod's tolerations to node taints |
|
||||
| global.serviceAccount.create | serviceAccount.create | `true` | | Configures if the service account should be created or not |
|
||||
| global.serviceAccount.name | serviceAccount.name | name of the release | | Change the name of the service account. This is honored if you disable on this cahrt the creation of the service account so you can use your own. |
|
||||
| global.serviceAccount.annotations | serviceAccount.annotations | `{}` | yes | Add these annotations to the service account we create |
|
||||
| global.customAttributes | customAttributes | `{}` | | Adds extra attributes to the cluster and all the metrics emitted to the backend |
|
||||
| global.fedramp | fedramp | `false` | | Enables FedRAMP |
|
||||
| global.lowDataMode | lowDataMode | `false` | | Reduces number of metrics sent in order to reduce costs |
|
||||
| global.privileged | privileged | Depends on the chart | | In each integration it has different behavior. See [Further information](#values-managed-globally-3) but all aims to send less metrics to the backend to try to save costs |
|
||||
| global.proxy | proxy | `""` | | Configures the integration to send all HTTP/HTTPS request through the proxy in that URL. The URL should have a standard format like `https://user:password@hostname:port` |
|
||||
| global.nrStaging | nrStaging | `false` | | Send the metrics to the staging backend. Requires a valid staging license key |
|
||||
| global.verboseLog | verboseLog | `false` | | Sets the debug/trace logs to this integration or all integrations if it is set globally |
|
||||
|
||||
### Further information
|
||||
<a name="values-managed-globally-1"></a>
|
||||
#### 1. Merged
|
||||
|
||||
Merged means that the values from global are not replaced by the local ones. Think in this example:
|
||||
```yaml
|
||||
global:
|
||||
labels:
|
||||
global: global
|
||||
hostNetwork: true
|
||||
nodeSelector:
|
||||
global: global
|
||||
|
||||
labels:
|
||||
local: local
|
||||
nodeSelector:
|
||||
local: local
|
||||
hostNetwork: false
|
||||
```
|
||||
|
||||
This values will template `hostNetwork` to `false`, a map of labels `{ "global": "global", "local": "local" }` and a `nodeSelector` with
|
||||
`{ "local": "local" }`.
|
||||
|
||||
As Helm by default merges all the maps it could be confusing that we have two behaviors (merging `labels` and replacing `nodeSelector`)
|
||||
the `values` from global to local. This is the rationale behind this:
|
||||
* `hostNetwork` is templated to `false` because is overriding the value defined globally.
|
||||
* `labels` are merged because the user may want to label all the New Relic pods at once and label other solution pods differently for
|
||||
clarity' sake.
|
||||
* `nodeSelector` does not merge as `labels` because could make it harder to overwrite/delete a selector that comes from global because
|
||||
of the logic that Helm follows merging maps.
|
||||
|
||||
<a name="values-managed-globally-2"></a>
|
||||
#### 2. Fine grain registries
|
||||
|
||||
Some charts only have 1 image while others that can have 2 or more images. The local path for the registry can change depending
|
||||
on the chart itself.
|
||||
|
||||
As this is mostly unique per helm chart, you should take a look to the chart's values table (or directly to the `values.yaml` file to see all the
|
||||
images that you can change.
|
||||
|
||||
This should only be needed if you have an advanced setup that forces you to have granularity enough to force a proxy/cache registry per integration.
|
||||
|
||||
|
||||
<a name="values-managed-globally-3"></a>
|
||||
#### 3. Privileged mode
|
||||
|
||||
By default, from the common library, the privileged mode is set to false. But most of the helm charts require this to be true to fetch more
|
||||
metrics so could see a true in some charts. The consequences of the privileged mode differ from one chart to another so for each chart that
|
||||
honors the privileged mode toggle should be a section in the README explaining which is the behavior with it enabled or disabled.
|
|
@ -0,0 +1,10 @@
|
|||
{{- /* Defines the Pod affinity */ -}}
|
||||
{{- define "newrelic.common.affinity" -}}
|
||||
{{- if .Values.affinity -}}
|
||||
{{- toYaml .Values.affinity -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.affinity -}}
|
||||
{{- toYaml .Values.global.affinity -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,26 @@
|
|||
{{/*
|
||||
This helper should return the defaults that all agents should have
|
||||
*/}}
|
||||
{{- define "newrelic.common.agentConfig.defaults" -}}
|
||||
{{- if include "newrelic.common.verboseLog" . }}
|
||||
log:
|
||||
level: trace
|
||||
{{- end }}
|
||||
|
||||
{{- if (include "newrelic.common.nrStaging" . ) }}
|
||||
staging: true
|
||||
{{- end }}
|
||||
|
||||
{{- with include "newrelic.common.proxy" . }}
|
||||
proxy: {{ . | quote }}
|
||||
{{- end }}
|
||||
|
||||
{{- with include "newrelic.common.fedramp.enabled" . }}
|
||||
fedramp: {{ . }}
|
||||
{{- end }}
|
||||
|
||||
{{- with fromYaml ( include "newrelic.common.customAttributes" . ) }}
|
||||
custom_attributes:
|
||||
{{- toYaml . | nindent 2 }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
|
@ -0,0 +1,15 @@
|
|||
{{/*
|
||||
Return the cluster
|
||||
*/}}
|
||||
{{- define "newrelic.common.cluster" -}}
|
||||
{{- /* This allows us to use `$global` as an empty dict directly in case `Values.global` does not exists */ -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
|
||||
{{- if .Values.cluster -}}
|
||||
{{- .Values.cluster -}}
|
||||
{{- else if $global.cluster -}}
|
||||
{{- $global.cluster -}}
|
||||
{{- else -}}
|
||||
{{ fail "There is not cluster name definition set neither in `.global.cluster' nor `.cluster' in your values.yaml. Cluster name is required." }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,17 @@
|
|||
{{/*
|
||||
This will render custom attributes as a YAML ready to be templated or be used with `fromYaml`.
|
||||
*/}}
|
||||
{{- define "newrelic.common.customAttributes" -}}
|
||||
{{- $customAttributes := dict -}}
|
||||
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
{{- if $global.customAttributes -}}
|
||||
{{- $customAttributes = mergeOverwrite $customAttributes $global.customAttributes -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if .Values.customAttributes -}}
|
||||
{{- $customAttributes = mergeOverwrite $customAttributes .Values.customAttributes -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- toYaml $customAttributes -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,10 @@
|
|||
{{- /* Defines the Pod dnsConfig */ -}}
|
||||
{{- define "newrelic.common.dnsConfig" -}}
|
||||
{{- if .Values.dnsConfig -}}
|
||||
{{- toYaml .Values.dnsConfig -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.dnsConfig -}}
|
||||
{{- toYaml .Values.global.dnsConfig -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,25 @@
|
|||
{{- /* Defines the fedRAMP flag */ -}}
|
||||
{{- define "newrelic.common.fedramp.enabled" -}}
|
||||
{{- if .Values.fedramp -}}
|
||||
{{- if .Values.fedramp.enabled -}}
|
||||
{{- .Values.fedramp.enabled -}}
|
||||
{{- end -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.fedramp -}}
|
||||
{{- if .Values.global.fedramp.enabled -}}
|
||||
{{- .Values.global.fedramp.enabled -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /* Return FedRAMP value directly ready to be templated */ -}}
|
||||
{{- define "newrelic.common.fedramp.enabled.value" -}}
|
||||
{{- if include "newrelic.common.fedramp.enabled" . -}}
|
||||
true
|
||||
{{- else -}}
|
||||
false
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,39 @@
|
|||
{{- /*
|
||||
Abstraction of the hostNetwork toggle.
|
||||
This helper allows to override the global `.global.hostNetwork` with the value of `.hostNetwork`.
|
||||
Returns "true" if `hostNetwork` is enabled, otherwise "" (empty string)
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.hostNetwork" -}}
|
||||
{{- /* This allows us to use `$global` as an empty dict directly in case `Values.global` does not exists */ -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
|
||||
{{- /*
|
||||
`get` will return "" (empty string) if value is not found, and the value otherwise, so we can type-assert with kindIs
|
||||
|
||||
We also want only to return when this is true, returning `false` here will template "false" (string) when doing
|
||||
an `(include "newrelic.common.hostNetwork" .)`, which is not an "empty string" so it is `true` if it is used
|
||||
as an evaluation somewhere else.
|
||||
*/ -}}
|
||||
{{- if get .Values "hostNetwork" | kindIs "bool" -}}
|
||||
{{- if .Values.hostNetwork -}}
|
||||
{{- .Values.hostNetwork -}}
|
||||
{{- end -}}
|
||||
{{- else if get $global "hostNetwork" | kindIs "bool" -}}
|
||||
{{- if $global.hostNetwork -}}
|
||||
{{- $global.hostNetwork -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
{{- /*
|
||||
Abstraction of the hostNetwork toggle.
|
||||
This helper abstracts the function "newrelic.common.hostNetwork" to return true or false directly.
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.hostNetwork.value" -}}
|
||||
{{- if include "newrelic.common.hostNetwork" . -}}
|
||||
true
|
||||
{{- else -}}
|
||||
false
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,94 @@
|
|||
{{- /*
|
||||
Return the proper image name
|
||||
{{ include "newrelic.common.images.image" ( dict "imageRoot" .Values.path.to.the.image "defaultRegistry" "your.private.registry.tld" "context" .) }}
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.images.image" -}}
|
||||
{{- $registryName := include "newrelic.common.images.registry" ( dict "imageRoot" .imageRoot "defaultRegistry" .defaultRegistry "context" .context ) -}}
|
||||
{{- $repositoryName := include "newrelic.common.images.repository" .imageRoot -}}
|
||||
{{- $tag := include "newrelic.common.images.tag" ( dict "imageRoot" .imageRoot "context" .context) -}}
|
||||
|
||||
{{- if $registryName -}}
|
||||
{{- printf "%s/%s:%s" $registryName $repositoryName $tag | quote -}}
|
||||
{{- else -}}
|
||||
{{- printf "%s:%s" $repositoryName $tag | quote -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /*
|
||||
Return the proper image registry
|
||||
{{ include "newrelic.common.images.registry" ( dict "imageRoot" .Values.path.to.the.image "defaultRegistry" "your.private.registry.tld" "context" .) }}
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.images.registry" -}}
|
||||
{{- $globalRegistry := "" -}}
|
||||
{{- if .context.Values.global -}}
|
||||
{{- if .context.Values.global.images -}}
|
||||
{{- with .context.Values.global.images.registry -}}
|
||||
{{- $globalRegistry = . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $localRegistry := "" -}}
|
||||
{{- if .imageRoot.registry -}}
|
||||
{{- $localRegistry = .imageRoot.registry -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $registry := $localRegistry | default $globalRegistry | default .defaultRegistry -}}
|
||||
{{- if $registry -}}
|
||||
{{- $registry -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /*
|
||||
Return the proper image repository
|
||||
{{ include "newrelic.common.images.repository" .Values.path.to.the.image }}
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.images.repository" -}}
|
||||
{{- .repository -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /*
|
||||
Return the proper image tag
|
||||
{{ include "newrelic.common.images.tag" ( dict "imageRoot" .Values.path.to.the.image "context" .) }}
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.images.tag" -}}
|
||||
{{- .imageRoot.tag | default .context.Chart.AppVersion | toString -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /*
|
||||
Return the proper Image Pull Registry Secret Names evaluating values as templates
|
||||
{{ include "newrelic.common.images.renderPullSecrets" ( dict "pullSecrets" (list .Values.path.to.the.images.pullSecrets1, .Values.path.to.the.images.pullSecrets2) "context" .) }}
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.images.renderPullSecrets" -}}
|
||||
{{- $flatlist := list }}
|
||||
|
||||
{{- if .context.Values.global -}}
|
||||
{{- if .context.Values.global.images -}}
|
||||
{{- if .context.Values.global.images.pullSecrets -}}
|
||||
{{- range .context.Values.global.images.pullSecrets -}}
|
||||
{{- $flatlist = append $flatlist . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- range .pullSecrets -}}
|
||||
{{- if not (empty .) -}}
|
||||
{{- range . -}}
|
||||
{{- $flatlist = append $flatlist . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if $flatlist -}}
|
||||
{{- toYaml $flatlist -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,56 @@
|
|||
{{/*
|
||||
Return the name of the secret holding the Insights Key.
|
||||
*/}}
|
||||
{{- define "newrelic.common.insightsKey.secretName" -}}
|
||||
{{- $default := include "newrelic.common.naming.truncateToDNSWithSuffix" ( dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "insightskey" ) -}}
|
||||
{{- include "newrelic.common.insightsKey._customSecretName" . | default $default -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the name key for the Insights Key inside the secret.
|
||||
*/}}
|
||||
{{- define "newrelic.common.insightsKey.secretKeyName" -}}
|
||||
{{- include "newrelic.common.insightsKey._customSecretKey" . | default "insightsKey" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return local insightsKey if set, global otherwise.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.insightsKey._licenseKey" -}}
|
||||
{{- if .Values.insightsKey -}}
|
||||
{{- .Values.insightsKey -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.insightsKey -}}
|
||||
{{- .Values.global.insightsKey -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the name of the secret holding the Insights Key.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.insightsKey._customSecretName" -}}
|
||||
{{- if .Values.customInsightsKeySecretName -}}
|
||||
{{- .Values.customInsightsKeySecretName -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.customInsightsKeySecretName -}}
|
||||
{{- .Values.global.customInsightsKeySecretName -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the name key for the Insights Key inside the secret.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.insightsKey._customSecretKey" -}}
|
||||
{{- if .Values.customInsightsKeySecretKey -}}
|
||||
{{- .Values.customInsightsKeySecretKey -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.customInsightsKeySecretKey }}
|
||||
{{- .Values.global.customInsightsKeySecretKey -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,21 @@
|
|||
{{/*
|
||||
Renders the insights key secret if user has not specified a custom secret.
|
||||
*/}}
|
||||
{{- define "newrelic.common.insightsKey.secret" }}
|
||||
{{- if not (include "newrelic.common.insightsKey._customSecretName" .) }}
|
||||
{{- /* Fail if licenseKey is empty and required: */ -}}
|
||||
{{- if not (include "newrelic.common.insightsKey._licenseKey" .) }}
|
||||
{{- fail "You must specify a insightsKey or a customInsightsSecretName containing it" }}
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ include "newrelic.common.insightsKey.secretName" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{ include "newrelic.common.insightsKey.secretKeyName" . }}: {{ include "newrelic.common.insightsKey._licenseKey" . | b64enc }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,54 @@
|
|||
{{/*
|
||||
This will render the labels that should be used in all the manifests used by the helm chart.
|
||||
*/}}
|
||||
{{- define "newrelic.common.labels" -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
|
||||
{{- $chart := dict "helm.sh/chart" (include "newrelic.common.naming.chart" . ) -}}
|
||||
{{- $managedBy := dict "app.kubernetes.io/managed-by" .Release.Service -}}
|
||||
{{- $selectorLabels := fromYaml (include "newrelic.common.labels.selectorLabels" . ) -}}
|
||||
|
||||
{{- $labels := mustMergeOverwrite $chart $managedBy $selectorLabels -}}
|
||||
{{- if .Chart.AppVersion -}}
|
||||
{{- $labels = mustMergeOverwrite $labels (dict "app.kubernetes.io/version" .Chart.AppVersion) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $globalUserLabels := $global.labels | default dict -}}
|
||||
{{- $localUserLabels := .Values.labels | default dict -}}
|
||||
|
||||
{{- $labels = mustMergeOverwrite $labels $globalUserLabels $localUserLabels -}}
|
||||
|
||||
{{- toYaml $labels -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{/*
|
||||
This will render the labels that should be used in deployments/daemonsets template pods as a selector.
|
||||
*/}}
|
||||
{{- define "newrelic.common.labels.selectorLabels" -}}
|
||||
{{- $name := dict "app.kubernetes.io/name" ( include "newrelic.common.naming.name" . ) -}}
|
||||
{{- $instance := dict "app.kubernetes.io/instance" .Release.Name -}}
|
||||
|
||||
{{- $selectorLabels := mustMergeOverwrite $name $instance -}}
|
||||
|
||||
{{- toYaml $selectorLabels -}}
|
||||
{{- end }}
|
||||
|
||||
|
||||
|
||||
{{/*
|
||||
Pod labels
|
||||
*/}}
|
||||
{{- define "newrelic.common.labels.podLabels" -}}
|
||||
{{- $selectorLabels := fromYaml (include "newrelic.common.labels.selectorLabels" . ) -}}
|
||||
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
{{- $globalPodLabels := $global.podLabels | default dict }}
|
||||
|
||||
{{- $localPodLabels := .Values.podLabels | default dict }}
|
||||
|
||||
{{- $podLabels := mustMergeOverwrite $selectorLabels $globalPodLabels $localPodLabels -}}
|
||||
|
||||
{{- toYaml $podLabels -}}
|
||||
{{- end }}
|
|
@ -0,0 +1,68 @@
|
|||
{{/*
|
||||
Return the name of the secret holding the License Key.
|
||||
*/}}
|
||||
{{- define "newrelic.common.license.secretName" -}}
|
||||
{{- $default := include "newrelic.common.naming.truncateToDNSWithSuffix" ( dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "license" ) -}}
|
||||
{{- include "newrelic.common.license._customSecretName" . | default $default -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the name key for the License Key inside the secret.
|
||||
*/}}
|
||||
{{- define "newrelic.common.license.secretKeyName" -}}
|
||||
{{- include "newrelic.common.license._customSecretKey" . | default "licenseKey" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return local licenseKey if set, global otherwise.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.license._licenseKey" -}}
|
||||
{{- if .Values.licenseKey -}}
|
||||
{{- .Values.licenseKey -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.licenseKey -}}
|
||||
{{- .Values.global.licenseKey -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the name of the secret holding the License Key.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.license._customSecretName" -}}
|
||||
{{- if .Values.customSecretName -}}
|
||||
{{- .Values.customSecretName -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.customSecretName -}}
|
||||
{{- .Values.global.customSecretName -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the name key for the License Key inside the secret.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.license._customSecretKey" -}}
|
||||
{{- if .Values.customSecretLicenseKey -}}
|
||||
{{- .Values.customSecretLicenseKey -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.customSecretLicenseKey }}
|
||||
{{- .Values.global.customSecretLicenseKey -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{/*
|
||||
Return empty string (falsehood) or "true" if the user set a custom secret for the license.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.license._usesCustomSecret" -}}
|
||||
{{- if or (include "newrelic.common.license._customSecretName" .) (include "newrelic.common.license._customSecretKey" .) -}}
|
||||
true
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,21 @@
|
|||
{{/*
|
||||
Renders the license key secret if user has not specified a custom secret.
|
||||
*/}}
|
||||
{{- define "newrelic.common.license.secret" }}
|
||||
{{- if not (include "newrelic.common.license._customSecretName" .) }}
|
||||
{{- /* Fail if licenseKey is empty and required: */ -}}
|
||||
{{- if not (include "newrelic.common.license._licenseKey" .) }}
|
||||
{{- fail "You must specify a licenseKey or a customSecretName containing it" }}
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ include "newrelic.common.license.secretName" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{ include "newrelic.common.license.secretKeyName" . }}: {{ include "newrelic.common.license._licenseKey" . | b64enc }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,26 @@
|
|||
{{- /*
|
||||
Abstraction of the lowDataMode toggle.
|
||||
This helper allows to override the global `.global.lowDataMode` with the value of `.lowDataMode`.
|
||||
Returns "true" if `lowDataMode` is enabled, otherwise "" (empty string)
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.lowDataMode" -}}
|
||||
{{- /* `get` will return "" (empty string) if value is not found, and the value otherwise, so we can type-assert with kindIs */ -}}
|
||||
{{- if (get .Values "lowDataMode" | kindIs "bool") -}}
|
||||
{{- if .Values.lowDataMode -}}
|
||||
{{- /*
|
||||
We want only to return when this is true, returning `false` here will template "false" (string) when doing
|
||||
an `(include "newrelic.common.lowDataMode" .)`, which is not an "empty string" so it is `true` if it is used
|
||||
as an evaluation somewhere else.
|
||||
*/ -}}
|
||||
{{- .Values.lowDataMode -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- /* This allows us to use `$global` as an empty dict directly in case `Values.global` does not exists */ -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
{{- if get $global "lowDataMode" | kindIs "bool" -}}
|
||||
{{- if $global.lowDataMode -}}
|
||||
{{- $global.lowDataMode -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,73 @@
|
|||
{{/*
|
||||
This is an function to be called directly with a string just to truncate strings to
|
||||
63 chars because some Kubernetes name fields are limited to that.
|
||||
*/}}
|
||||
{{- define "newrelic.common.naming.truncateToDNS" -}}
|
||||
{{- . | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
|
||||
|
||||
{{- /*
|
||||
Given a name and a suffix returns a 'DNS Valid' which always include the suffix, truncating the name if needed.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If suffix is too long it gets truncated but it always takes precedence over name, so a 63 chars suffix would suppress the name.
|
||||
Usage:
|
||||
{{ include "newrelic.common.naming.truncateToDNSWithSuffix" ( dict "name" "<my-name>" "suffix" "my-suffix" ) }}
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.naming.truncateToDNSWithSuffix" -}}
|
||||
{{- $suffix := (include "newrelic.common.naming.truncateToDNS" .suffix) -}}
|
||||
{{- $maxLen := (max (sub 63 (add1 (len $suffix))) 0) -}} {{- /* We prepend "-" to the suffix so an additional character is needed */ -}}
|
||||
|
||||
{{- $newName := .name | trunc ($maxLen | int) | trimSuffix "-" -}}
|
||||
{{- if $newName -}}
|
||||
{{- printf "%s-%s" $newName $suffix -}}
|
||||
{{- else -}}
|
||||
{{ $suffix }}
|
||||
{{- end -}}
|
||||
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
Uses the Chart name by default if nameOverride is not set.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
*/}}
|
||||
{{- define "newrelic.common.naming.name" -}}
|
||||
{{- $name := .Values.nameOverride | default .Chart.Name -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNS" $name -}}
|
||||
{{- end }}
|
||||
|
||||
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
By default the full name will be "<release_name>" just in if it has the chart name included in that, if not
|
||||
it will be concatenated like "<release_name>-<chart_chart>". This could change if fullnameOverride or
|
||||
nameOverride are set.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
*/}}
|
||||
{{- define "newrelic.common.naming.fullname" -}}
|
||||
{{- $name := include "newrelic.common.naming.name" . -}}
|
||||
|
||||
{{- if .Values.fullnameOverride -}}
|
||||
{{- $name = .Values.fullnameOverride -}}
|
||||
{{- else if not (contains $name .Release.Name) -}}
|
||||
{{- $name = printf "%s-%s" .Release.Name $name -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- include "newrelic.common.naming.truncateToDNS" $name -}}
|
||||
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
This function should not be used for naming objects. Use "common.naming.{name,fullname}" instead.
|
||||
*/}}
|
||||
{{- define "newrelic.common.naming.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end }}
|
|
@ -0,0 +1,10 @@
|
|||
{{- /* Defines the Pod nodeSelector */ -}}
|
||||
{{- define "newrelic.common.nodeSelector" -}}
|
||||
{{- if .Values.nodeSelector -}}
|
||||
{{- toYaml .Values.nodeSelector -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.nodeSelector -}}
|
||||
{{- toYaml .Values.global.nodeSelector -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,10 @@
|
|||
{{- /* Defines the pod priorityClassName */ -}}
|
||||
{{- define "newrelic.common.priorityClassName" -}}
|
||||
{{- if .Values.priorityClassName -}}
|
||||
{{- .Values.priorityClassName -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.priorityClassName -}}
|
||||
{{- .Values.global.priorityClassName -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,28 @@
|
|||
{{- /*
|
||||
This is a helper that returns whether the chart should assume the user is fine deploying privileged pods.
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.privileged" -}}
|
||||
{{- /* This allows us to use `$global` as an empty dict directly in case `Values.global` does not exists. */ -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
{{- /* `get` will return "" (empty string) if value is not found, and the value otherwise, so we can type-assert with kindIs */ -}}
|
||||
{{- if get .Values "privileged" | kindIs "bool" -}}
|
||||
{{- if .Values.privileged -}}
|
||||
{{- .Values.privileged -}}
|
||||
{{- end -}}
|
||||
{{- else if get $global "privileged" | kindIs "bool" -}}
|
||||
{{- if $global.privileged -}}
|
||||
{{- $global.privileged -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /* Return directly "true" or "false" based in the exist of "newrelic.common.privileged" */ -}}
|
||||
{{- define "newrelic.common.privileged.value" -}}
|
||||
{{- if include "newrelic.common.privileged" . -}}
|
||||
true
|
||||
{{- else -}}
|
||||
false
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,10 @@
|
|||
{{- /* Defines the proxy */ -}}
|
||||
{{- define "newrelic.common.proxy" -}}
|
||||
{{- if .Values.proxy -}}
|
||||
{{- .Values.proxy -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.proxy -}}
|
||||
{{- .Values.global.proxy -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,74 @@
|
|||
{{/*
|
||||
Return the region that is being used by the user
|
||||
*/}}
|
||||
{{- define "newrelic.common.region" -}}
|
||||
{{- if and (include "newrelic.common.license._usesCustomSecret" .) (not (include "newrelic.common.region._fromValues" .)) -}}
|
||||
{{- fail "This Helm Chart is not able to compute the region. You must specify a .global.region or .region if the license is set using a custom secret." -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- /* Defaults */ -}}
|
||||
{{- $region := "us" -}}
|
||||
{{- if include "newrelic.common.nrStaging" . -}}
|
||||
{{- $region = "staging" -}}
|
||||
{{- else if include "newrelic.common.region._isEULicenseKey" . -}}
|
||||
{{- $region = "eu" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- include "newrelic.common.region.validate" (include "newrelic.common.region._fromValues" . | default $region ) -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{/*
|
||||
Returns the region from the values if valid. This only return the value from the `values.yaml`.
|
||||
More intelligence should be used to compute the region.
|
||||
|
||||
Usage: `include "newrelic.common.region.validate" "us"`
|
||||
*/}}
|
||||
{{- define "newrelic.common.region.validate" -}}
|
||||
{{- /* Ref: https://github.com/newrelic/newrelic-client-go/blob/cbe3e4cf2b95fd37095bf2ffdc5d61cffaec17e2/pkg/region/region_constants.go#L8-L21 */ -}}
|
||||
{{- $region := . | lower -}}
|
||||
{{- if eq $region "us" -}}
|
||||
US
|
||||
{{- else if eq $region "eu" -}}
|
||||
EU
|
||||
{{- else if eq $region "staging" -}}
|
||||
Staging
|
||||
{{- else if eq $region "local" -}}
|
||||
Local
|
||||
{{- else -}}
|
||||
{{- fail (printf "the region provided is not valid: %s not in \"US\" \"EU\" \"Staging\" \"Local\"" .) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{/*
|
||||
Returns the region from the values. This only return the value from the `values.yaml`.
|
||||
More intelligence should be used to compute the region.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.region._fromValues" -}}
|
||||
{{- if .Values.region -}}
|
||||
{{- .Values.region -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.region -}}
|
||||
{{- .Values.global.region -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{/*
|
||||
Return empty string (falsehood) or "true" if the license is for EU region.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.region._isEULicenseKey" -}}
|
||||
{{- if not (include "newrelic.common.license._usesCustomSecret" .) -}}
|
||||
{{- $license := include "newrelic.common.license._licenseKey" . -}}
|
||||
{{- if hasPrefix "eu" $license -}}
|
||||
true
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,23 @@
|
|||
{{- /* Defines the container securityContext context */ -}}
|
||||
{{- define "newrelic.common.securityContext.container" -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
|
||||
{{- if .Values.containerSecurityContext -}}
|
||||
{{- toYaml .Values.containerSecurityContext -}}
|
||||
{{- else if $global.containerSecurityContext -}}
|
||||
{{- toYaml $global.containerSecurityContext -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /* Defines the pod securityContext context */ -}}
|
||||
{{- define "newrelic.common.securityContext.pod" -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
|
||||
{{- if .Values.podSecurityContext -}}
|
||||
{{- toYaml .Values.podSecurityContext -}}
|
||||
{{- else if $global.podSecurityContext -}}
|
||||
{{- toYaml $global.podSecurityContext -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,90 @@
|
|||
{{- /* Defines if the service account has to be created or not */ -}}
|
||||
{{- define "newrelic.common.serviceAccount.create" -}}
|
||||
{{- $valueFound := false -}}
|
||||
|
||||
{{- /* Look for a global creation of a service account */ -}}
|
||||
{{- if get .Values "serviceAccount" | kindIs "map" -}}
|
||||
{{- if (get .Values.serviceAccount "create" | kindIs "bool") -}}
|
||||
{{- $valueFound = true -}}
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
{{- /*
|
||||
We want only to return when this is true, returning `false` here will template "false" (string) when doing
|
||||
an `(include "newrelic.common.serviceAccount.name" .)`, which is not an "empty string" so it is `true` if it is used
|
||||
as an evaluation somewhere else.
|
||||
*/ -}}
|
||||
{{- .Values.serviceAccount.create -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- /* Look for a local creation of a service account */ -}}
|
||||
{{- if not $valueFound -}}
|
||||
{{- /* This allows us to use `$global` as an empty dict directly in case `Values.global` does not exists */ -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
{{- if get $global "serviceAccount" | kindIs "map" -}}
|
||||
{{- if get $global.serviceAccount "create" | kindIs "bool" -}}
|
||||
{{- $valueFound = true -}}
|
||||
{{- if $global.serviceAccount.create -}}
|
||||
{{- $global.serviceAccount.create -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- /* In case no serviceAccount value has been found, default to "true" */ -}}
|
||||
{{- if not $valueFound -}}
|
||||
true
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /* Defines the name of the service account */ -}}
|
||||
{{- define "newrelic.common.serviceAccount.name" -}}
|
||||
{{- $localServiceAccount := "" -}}
|
||||
{{- if get .Values "serviceAccount" | kindIs "map" -}}
|
||||
{{- if (get .Values.serviceAccount "name" | kindIs "string") -}}
|
||||
{{- $localServiceAccount = .Values.serviceAccount.name -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $globalServiceAccount := "" -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
{{- if get $global "serviceAccount" | kindIs "map" -}}
|
||||
{{- if get $global.serviceAccount "name" | kindIs "string" -}}
|
||||
{{- $globalServiceAccount = $global.serviceAccount.name -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if (include "newrelic.common.serviceAccount.create" .) -}}
|
||||
{{- $localServiceAccount | default $globalServiceAccount | default (include "newrelic.common.naming.fullname" .) -}}
|
||||
{{- else -}}
|
||||
{{- $localServiceAccount | default $globalServiceAccount | default "default" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /* Merge the global and local annotations for the service account */ -}}
|
||||
{{- define "newrelic.common.serviceAccount.annotations" -}}
|
||||
{{- $localServiceAccount := dict -}}
|
||||
{{- if get .Values "serviceAccount" | kindIs "map" -}}
|
||||
{{- if get .Values.serviceAccount "annotations" -}}
|
||||
{{- $localServiceAccount = .Values.serviceAccount.annotations -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $globalServiceAccount := dict -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
{{- if get $global "serviceAccount" | kindIs "map" -}}
|
||||
{{- if get $global.serviceAccount "annotations" -}}
|
||||
{{- $globalServiceAccount = $global.serviceAccount.annotations -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $merged := mustMergeOverwrite $globalServiceAccount $localServiceAccount -}}
|
||||
|
||||
{{- if $merged -}}
|
||||
{{- toYaml $merged -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,39 @@
|
|||
{{- /*
|
||||
Abstraction of the nrStaging toggle.
|
||||
This helper allows to override the global `.global.nrStaging` with the value of `.nrStaging`.
|
||||
Returns "true" if `nrStaging` is enabled, otherwise "" (empty string)
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.nrStaging" -}}
|
||||
{{- /* `get` will return "" (empty string) if value is not found, and the value otherwise, so we can type-assert with kindIs */ -}}
|
||||
{{- if (get .Values "nrStaging" | kindIs "bool") -}}
|
||||
{{- if .Values.nrStaging -}}
|
||||
{{- /*
|
||||
We want only to return when this is true, returning `false` here will template "false" (string) when doing
|
||||
an `(include "newrelic.common.nrStaging" .)`, which is not an "empty string" so it is `true` if it is used
|
||||
as an evaluation somewhere else.
|
||||
*/ -}}
|
||||
{{- .Values.nrStaging -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- /* This allows us to use `$global` as an empty dict directly in case `Values.global` does not exists */ -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
{{- if get $global "nrStaging" | kindIs "bool" -}}
|
||||
{{- if $global.nrStaging -}}
|
||||
{{- $global.nrStaging -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /*
|
||||
Returns "true" of "false" directly instead of empty string (Helm falsiness) based on the exit of "newrelic.common.nrStaging"
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.nrStaging.value" -}}
|
||||
{{- if include "newrelic.common.nrStaging" . -}}
|
||||
true
|
||||
{{- else -}}
|
||||
false
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,10 @@
|
|||
{{- /* Defines the Pod tolerations */ -}}
|
||||
{{- define "newrelic.common.tolerations" -}}
|
||||
{{- if .Values.tolerations -}}
|
||||
{{- toYaml .Values.tolerations -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.tolerations -}}
|
||||
{{- toYaml .Values.global.tolerations -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,56 @@
|
|||
{{/*
|
||||
Return the name of the secret holding the API Key.
|
||||
*/}}
|
||||
{{- define "newrelic.common.userKey.secretName" -}}
|
||||
{{- $default := include "newrelic.common.naming.truncateToDNSWithSuffix" ( dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "userkey" ) -}}
|
||||
{{- include "newrelic.common.userKey._customSecretName" . | default $default -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the name key for the API Key inside the secret.
|
||||
*/}}
|
||||
{{- define "newrelic.common.userKey.secretKeyName" -}}
|
||||
{{- include "newrelic.common.userKey._customSecretKey" . | default "userKey" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return local API Key if set, global otherwise.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.userKey._userKey" -}}
|
||||
{{- if .Values.userKey -}}
|
||||
{{- .Values.userKey -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.userKey -}}
|
||||
{{- .Values.global.userKey -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the name of the secret holding the API Key.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.userKey._customSecretName" -}}
|
||||
{{- if .Values.customUserKeySecretName -}}
|
||||
{{- .Values.customUserKeySecretName -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.customUserKeySecretName -}}
|
||||
{{- .Values.global.customUserKeySecretName -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the name key for the API Key inside the secret.
|
||||
This helper is for internal use.
|
||||
*/}}
|
||||
{{- define "newrelic.common.userKey._customSecretKey" -}}
|
||||
{{- if .Values.customUserKeySecretKey -}}
|
||||
{{- .Values.customUserKeySecretKey -}}
|
||||
{{- else if .Values.global -}}
|
||||
{{- if .Values.global.customUserKeySecretKey }}
|
||||
{{- .Values.global.customUserKeySecretKey -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,21 @@
|
|||
{{/*
|
||||
Renders the user key secret if user has not specified a custom secret.
|
||||
*/}}
|
||||
{{- define "newrelic.common.userKey.secret" }}
|
||||
{{- if not (include "newrelic.common.userKey._customSecretName" .) }}
|
||||
{{- /* Fail if user key is empty and required: */ -}}
|
||||
{{- if not (include "newrelic.common.userKey._userKey" .) }}
|
||||
{{- fail "You must specify a userKey or a customUserKeySecretName containing it" }}
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ include "newrelic.common.userKey.secretName" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{ include "newrelic.common.userKey.secretKeyName" . }}: {{ include "newrelic.common.userKey._userKey" . | b64enc }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,54 @@
|
|||
{{- /*
|
||||
Abstraction of the verbose toggle.
|
||||
This helper allows to override the global `.global.verboseLog` with the value of `.verboseLog`.
|
||||
Returns "true" if `verbose` is enabled, otherwise "" (empty string)
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.verboseLog" -}}
|
||||
{{- /* `get` will return "" (empty string) if value is not found, and the value otherwise, so we can type-assert with kindIs */ -}}
|
||||
{{- if (get .Values "verboseLog" | kindIs "bool") -}}
|
||||
{{- if .Values.verboseLog -}}
|
||||
{{- /*
|
||||
We want only to return when this is true, returning `false` here will template "false" (string) when doing
|
||||
an `(include "newrelic.common.verboseLog" .)`, which is not an "empty string" so it is `true` if it is used
|
||||
as an evaluation somewhere else.
|
||||
*/ -}}
|
||||
{{- .Values.verboseLog -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- /* This allows us to use `$global` as an empty dict directly in case `Values.global` does not exists */ -}}
|
||||
{{- $global := index .Values "global" | default dict -}}
|
||||
{{- if get $global "verboseLog" | kindIs "bool" -}}
|
||||
{{- if $global.verboseLog -}}
|
||||
{{- $global.verboseLog -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /*
|
||||
Abstraction of the verbose toggle.
|
||||
This helper abstracts the function "newrelic.common.verboseLog" to return true or false directly.
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.verboseLog.valueAsBoolean" -}}
|
||||
{{- if include "newrelic.common.verboseLog" . -}}
|
||||
true
|
||||
{{- else -}}
|
||||
false
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
{{- /*
|
||||
Abstraction of the verbose toggle.
|
||||
This helper abstracts the function "newrelic.common.verboseLog" to return 1 or 0 directly.
|
||||
*/ -}}
|
||||
{{- define "newrelic.common.verboseLog.valueAsInt" -}}
|
||||
{{- if include "newrelic.common.verboseLog" . -}}
|
||||
1
|
||||
{{- else -}}
|
||||
0
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1 @@
|
|||
# values are not needed for the library chart, however this file is still needed for helm lint to work.
|
|
@ -0,0 +1,36 @@
|
|||
This project is currently in preview.
|
||||
Issues and contributions should be reported to the project's GitHub.
|
||||
{{- if (include "k8s-agents-operator.areValuesValid" .) }}
|
||||
=====================================
|
||||
|
||||
********
|
||||
****************
|
||||
********** **********,
|
||||
&&&**** ****/(((
|
||||
&&&&&&& ((((((
|
||||
&&&&&&&&&& ((((((
|
||||
&&&&&&&& ((((((
|
||||
&&&&& ((((((
|
||||
&&&&& ((((((((
|
||||
&&&&& .((((((((((
|
||||
&&&&&((((((((
|
||||
&&&(((,
|
||||
|
||||
Your deployment of the New Relic Agent Operator is complete.
|
||||
You can check on the progress of this by running the following command:
|
||||
|
||||
kubectl get deployments -o wide -w --namespace {{ .Release.Namespace }} {{ include "newrelic.common.naming.fullname" . }}
|
||||
|
||||
WARNING: This deployment will be incomplete until you configure your Instrumentation custom resource definition.
|
||||
=====================================
|
||||
|
||||
Please visit https://github.com/newrelic/k8s-agents-operator for instructions on how to create & configure the
|
||||
Instrumentation custom resource definition required by the Operator.
|
||||
{{- else }}
|
||||
|
||||
##############################################################################
|
||||
#### ERROR: You did not set a license key. ####
|
||||
##############################################################################
|
||||
|
||||
This deployment will be incomplete until you get your ingest license key from New Relic.
|
||||
{{- end -}}
|
|
@ -0,0 +1,25 @@
|
|||
{{/*
|
||||
Returns if the template should render, it checks if the required values are set.
|
||||
*/}}
|
||||
{{- define "k8s-agents-operator.areValuesValid" -}}
|
||||
{{- $licenseKey := include "newrelic.common.license._licenseKey" . -}}
|
||||
{{- and (or $licenseKey)}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.manager.image" -}}
|
||||
{{- $managerVersion := .Values.controllerManager.manager.image.version | default .Chart.AppVersion -}}
|
||||
{{- if eq (substr 0 7 $managerVersion) "sha256:" -}}
|
||||
{{- printf "%s@%s" .Values.controllerManager.manager.image.repository $managerVersion -}}
|
||||
{{- else -}}
|
||||
{{- printf "%s:%s" .Values.controllerManager.manager.image.repository $managerVersion -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.kubeRbacProxy.image" -}}
|
||||
{{- $kubeRbacProxyVersion := .Values.controllerManager.kubeRbacProxy.image.version | default .Chart.AppVersion -}}
|
||||
{{- if eq (substr 0 7 $kubeRbacProxyVersion) "sha256:" -}}
|
||||
{{- printf "%s@%s" .Values.controllerManager.kubeRbacProxy.image.repository $kubeRbacProxyVersion -}}
|
||||
{{- else -}}
|
||||
{{- printf "%s:%s" .Values.controllerManager.kubeRbacProxy.image.repository $kubeRbacProxyVersion -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,52 @@
|
|||
{{/* Controller manager service certificate's secret. */}}
|
||||
{{- define "k8s-agents-operator.certificateSecret.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "controller-manager-service-cert") -}}
|
||||
{{- end }}
|
||||
|
||||
{{- define "k8s-agents-operator.webhook.service.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "webhook-service") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.webhook.mutating.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "mutation") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.webhook.validating.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "validation") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.cert-manager.issuer.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "selfsigned-issuer") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.cert-manager.certificate.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "serving-cert") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.rbac.proxy.role.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "proxy-role") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.rbac.proxy.roleBinding.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "proxy-rolebinding") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.rbac.manager.role.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "manager-role") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.rbac.manager.roleBinding.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "manager-rolebinding") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.rbac.leaderElection.role.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "leader-election-role") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.rbac.leaderElection.roleBinding.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "leader-election-rolebinding") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- define "k8s-agents-operator.rbac.metricsReader.role.name" -}}
|
||||
{{- include "newrelic.common.naming.truncateToDNSWithSuffix" (dict "name" (include "newrelic.common.naming.fullname" .) "suffix" "metrics-reader") -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,21 @@
|
|||
{{- /*
|
||||
A helper to return the container security context to apply to kubeRbacProxy.
|
||||
*/ -}}
|
||||
{{- define "k8s-agents-operator.kubeRbacProxy.securityContext.container" -}}
|
||||
{{- if .Values.controllerManager.kubeRbacProxy.containerSecurityContext -}}
|
||||
{{- toYaml .Values.controllerManager.kubeRbacProxy.containerSecurityContext -}}
|
||||
{{- else if include "newrelic.common.securityContext.container" . -}}
|
||||
{{- include "newrelic.common.securityContext.container" . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- /*
|
||||
A helper to return the container security context to apply to the manager.
|
||||
*/ -}}
|
||||
{{- define "k8s-agents-operator.manager.securityContext.container" -}}
|
||||
{{- if .Values.controllerManager.manager.containerSecurityContext -}}
|
||||
{{- toYaml .Values.controllerManager.manager.containerSecurityContext -}}
|
||||
{{- else if include "newrelic.common.securityContext.container" . -}}
|
||||
{{- include "newrelic.common.securityContext.container" . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,40 @@
|
|||
{{/*
|
||||
Return certificate and CA for Webhooks.
|
||||
It handles variants when a cert has to be generated by Helm,
|
||||
a cert is loaded from an existing secret or is provided via `.Values`
|
||||
*/}}
|
||||
{{- define "k8s-agents-operator.webhookCert" -}}
|
||||
{{- $caCert := "" }}
|
||||
{{- $clientCert := "" }}
|
||||
{{- $clientKey := "" }}
|
||||
{{- if .Values.admissionWebhooks.autoGenerateCert.enabled }}
|
||||
{{- $prevSecret := (lookup "v1" "Secret" .Release.Namespace (include "k8s-agents-operator.certificateSecret.name" . )) }}
|
||||
{{- if and (not .Values.admissionWebhooks.autoGenerateCert.recreate) $prevSecret }}
|
||||
{{- $clientCert = index $prevSecret "data" "tls.crt" }}
|
||||
{{- $clientKey = index $prevSecret "data" "tls.key" }}
|
||||
{{- $caCert = index $prevSecret "data" "ca.crt" }}
|
||||
{{- if not $caCert }}
|
||||
{{- $prevHook := (lookup "admissionregistration.k8s.io/v1" "MutatingWebhookConfiguration" .Release.Namespace (print (include "newrelic.common.naming.fullname" . ) "-mutation")) }}
|
||||
{{- if not (eq (toString $prevHook) "<nil>") }}
|
||||
{{- $caCert = (first $prevHook.webhooks).clientConfig.caBundle }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- $certValidity := int .Values.admissionWebhooks.autoGenerateCert.certPeriodDays | default 365 }}
|
||||
{{- $ca := genCA "k8s-agents-operator-operator-ca" $certValidity }}
|
||||
{{- $domain1 := printf "%s.%s.svc" (include "k8s-agents-operator.webhook.service.name" .) $.Release.Namespace }}
|
||||
{{- $domain2 := printf "%s.%s.svc.%s" (include "k8s-agents-operator.webhook.service.name" .) $.Release.Namespace $.Values.kubernetesClusterDomain }}
|
||||
{{- $domains := list $domain1 $domain2 }}
|
||||
{{- $cert := genSignedCert (include "newrelic.common.naming.fullname" .) nil $domains $certValidity $ca }}
|
||||
{{- $clientCert = b64enc $cert.Cert }}
|
||||
{{- $clientKey = b64enc $cert.Key }}
|
||||
{{- $caCert = b64enc $ca.Cert }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- $clientCert = .Files.Get .Values.admissionWebhooks.certFile | b64enc }}
|
||||
{{- $clientKey = .Files.Get .Values.admissionWebhooks.keyFile | b64enc }}
|
||||
{{- $caCert = .Files.Get .Values.admissionWebhooks.caFile | b64enc }}
|
||||
{{- end }}
|
||||
{{- $result := dict "clientCert" $clientCert "clientKey" $clientKey "caCert" $caCert }}
|
||||
{{- $result | toYaml }}
|
||||
{{- end }}
|
|
@ -0,0 +1,122 @@
|
|||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "newrelic.common.naming.fullname" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
control-plane: controller-manager
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
spec:
|
||||
replicas: {{ .Values.controllerManager.replicas }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "newrelic.common.labels.selectorLabels" . | nindent 6 }}
|
||||
control-plane: controller-manager
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
control-plane: controller-manager
|
||||
{{- include "newrelic.common.labels.podLabels" . | nindent 8 }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
serviceAccountName: {{ include "newrelic.common.serviceAccount.name" . }}
|
||||
{{- with include "newrelic.common.securityContext.pod" . }}
|
||||
securityContext:
|
||||
{{- . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with include "newrelic.common.priorityClassName" . }}
|
||||
priorityClassName: {{ . }}
|
||||
{{- end }}
|
||||
{{- with include "newrelic.common.dnsConfig" . }}
|
||||
dnsConfig:
|
||||
{{- . | nindent 8 }}
|
||||
{{- end }}
|
||||
terminationGracePeriodSeconds: 10
|
||||
containers:
|
||||
- name: manager
|
||||
{{- with include "k8s-agents-operator.manager.securityContext.container" . }}
|
||||
securityContext:
|
||||
{{- . | nindent 10 }}
|
||||
{{- end }}
|
||||
args:
|
||||
- --metrics-addr=127.0.0.1:8080
|
||||
{{- if .Values.controllerManager.manager.leaderElection.enabled }}
|
||||
- --enable-leader-election
|
||||
{{- end }}
|
||||
- --zap-log-level=info
|
||||
- --zap-time-encoding=rfc3339nano
|
||||
env:
|
||||
- name: OPERATOR_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
- name: KUBERNETES_CLUSTER_DOMAIN
|
||||
value: {{ quote .Values.kubernetesClusterDomain }}
|
||||
- name: ENABLE_WEBHOOKS
|
||||
value: "true"
|
||||
image: {{ include "k8s-agents-operator.manager.image" . }}
|
||||
imagePullPolicy: {{ .Values.controllerManager.manager.image.pullPolicy | default "Always" }}
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8081
|
||||
initialDelaySeconds: 15
|
||||
periodSeconds: 20
|
||||
ports:
|
||||
- containerPort: 9443
|
||||
name: webhook-server
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /readyz
|
||||
port: 8081
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
resources:
|
||||
{{- toYaml .Values.controllerManager.manager.resources | nindent 10 }}
|
||||
volumeMounts:
|
||||
- mountPath: /tmp/k8s-webhook-server/serving-certs
|
||||
name: cert
|
||||
readOnly: true
|
||||
- name: kube-rbac-proxy
|
||||
{{- with include "k8s-agents-operator.kubeRbacProxy.securityContext.container" . }}
|
||||
securityContext:
|
||||
{{- . | nindent 10 }}
|
||||
{{- end }}
|
||||
args:
|
||||
- --secure-listen-address=0.0.0.0:8443
|
||||
- --upstream=http://127.0.0.1:8080/
|
||||
- --logtostderr=true
|
||||
- --v=0
|
||||
env:
|
||||
- name: KUBERNETES_CLUSTER_DOMAIN
|
||||
value: {{ quote .Values.kubernetesClusterDomain }}
|
||||
image: {{ include "k8s-agents-operator.kubeRbacProxy.image" . }}
|
||||
ports:
|
||||
- containerPort: 8443
|
||||
name: https
|
||||
protocol: TCP
|
||||
resources:
|
||||
{{- toYaml .Values.controllerManager.kubeRbacProxy.resources | nindent 10 }}
|
||||
{{- if or .Values.admissionWebhooks.create (include "k8s-agents-operator.certificateSecret.name" . ) }}
|
||||
volumes:
|
||||
- name: cert
|
||||
secret:
|
||||
defaultMode: 420
|
||||
secretName: {{ include "k8s-agents-operator.certificateSecret.name" . }}
|
||||
{{- end }}
|
||||
{{- with include "newrelic.common.nodeSelector" . }}
|
||||
nodeSelector:
|
||||
{{- . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with include "newrelic.common.affinity" . }}
|
||||
affinity:
|
||||
{{- . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with include "newrelic.common.tolerations" . }}
|
||||
tolerations:
|
||||
{{- . | nindent 8 }}
|
||||
{{- end }}
|
|
@ -0,0 +1,407 @@
|
|||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
name: instrumentations.newrelic.com
|
||||
annotations:
|
||||
controller-gen.kubebuilder.io/version: v0.14.0
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
spec:
|
||||
group: newrelic.com
|
||||
names:
|
||||
kind: Instrumentation
|
||||
listKind: InstrumentationList
|
||||
plural: instrumentations
|
||||
shortNames:
|
||||
- nragent
|
||||
- nragents
|
||||
singular: instrumentation
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- additionalPrinterColumns:
|
||||
- jsonPath: .metadata.creationTimestamp
|
||||
name: Age
|
||||
type: date
|
||||
name: v1alpha2
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: Instrumentation is the Schema for the instrumentations 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: InstrumentationSpec defines the desired state of Instrumentation
|
||||
properties:
|
||||
agent:
|
||||
description: Agent defines configuration for agent instrumentation.
|
||||
properties:
|
||||
env:
|
||||
description: |-
|
||||
Env defines Go specific env vars. There are four layers for env vars' definitions and
|
||||
the precedence order is: `original container env vars` > `language specific env vars` > `common env vars` > `instrument spec configs' vars`.
|
||||
If the former var had been defined, then the other vars would be ignored.
|
||||
items:
|
||||
description: EnvVar represents an environment variable present
|
||||
in a Container.
|
||||
properties:
|
||||
name:
|
||||
description: Name of the environment variable. Must be a C_IDENTIFIER.
|
||||
type: string
|
||||
value:
|
||||
description: |-
|
||||
Variable references $(VAR_NAME) are expanded
|
||||
using the previously defined environment variables in the container and
|
||||
any service environment variables. If a variable cannot be resolved,
|
||||
the reference in the input string will be unchanged. Double $$ are reduced
|
||||
to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.
|
||||
"$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)".
|
||||
Escaped references will never be expanded, regardless of whether the variable
|
||||
exists or not.
|
||||
Defaults to "".
|
||||
type: string
|
||||
valueFrom:
|
||||
description: Source for the environment variable's value.
|
||||
Cannot be used if value is not empty.
|
||||
properties:
|
||||
configMapKeyRef:
|
||||
description: Selects a key of a ConfigMap.
|
||||
properties:
|
||||
key:
|
||||
description: The key to select.
|
||||
type: string
|
||||
name:
|
||||
description: |-
|
||||
Name of the referent.
|
||||
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||
TODO: Add other useful fields. apiVersion, kind, uid?
|
||||
type: string
|
||||
optional:
|
||||
description: Specify whether the ConfigMap or its
|
||||
key must be defined
|
||||
type: boolean
|
||||
required:
|
||||
- key
|
||||
type: object
|
||||
x-kubernetes-map-type: atomic
|
||||
fieldRef:
|
||||
description: |-
|
||||
Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,
|
||||
spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.
|
||||
properties:
|
||||
apiVersion:
|
||||
description: Version of the schema the FieldPath is
|
||||
written in terms of, defaults to "v1".
|
||||
type: string
|
||||
fieldPath:
|
||||
description: Path of the field to select in the specified
|
||||
API version.
|
||||
type: string
|
||||
required:
|
||||
- fieldPath
|
||||
type: object
|
||||
x-kubernetes-map-type: atomic
|
||||
resourceFieldRef:
|
||||
description: |-
|
||||
Selects a resource of the container: only resources limits and requests
|
||||
(limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.
|
||||
properties:
|
||||
containerName:
|
||||
description: 'Container name: required for volumes,
|
||||
optional for env vars'
|
||||
type: string
|
||||
divisor:
|
||||
anyOf:
|
||||
- type: integer
|
||||
- type: string
|
||||
description: Specifies the output format of the exposed
|
||||
resources, defaults to "1"
|
||||
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
|
||||
x-kubernetes-int-or-string: true
|
||||
resource:
|
||||
description: 'Required: resource to select'
|
||||
type: string
|
||||
required:
|
||||
- resource
|
||||
type: object
|
||||
x-kubernetes-map-type: atomic
|
||||
secretKeyRef:
|
||||
description: Selects a key of a secret in the pod's namespace
|
||||
properties:
|
||||
key:
|
||||
description: The key of the secret to select from. Must
|
||||
be a valid secret key.
|
||||
type: string
|
||||
name:
|
||||
description: |-
|
||||
Name of the referent.
|
||||
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||
TODO: Add other useful fields. apiVersion, kind, uid?
|
||||
type: string
|
||||
optional:
|
||||
description: Specify whether the Secret or its key
|
||||
must be defined
|
||||
type: boolean
|
||||
required:
|
||||
- key
|
||||
type: object
|
||||
x-kubernetes-map-type: atomic
|
||||
type: object
|
||||
required:
|
||||
- name
|
||||
type: object
|
||||
type: array
|
||||
image:
|
||||
description: Image is a container image with Go SDK and auto-instrumentation.
|
||||
type: string
|
||||
language:
|
||||
description: Language is the language that will be instrumented.
|
||||
type: string
|
||||
resourceRequirements:
|
||||
description: Resources describes the compute resource requirements.
|
||||
properties:
|
||||
claims:
|
||||
description: |-
|
||||
Claims lists the names of resources, defined in spec.resourceClaims,
|
||||
that are used by this container.
|
||||
|
||||
|
||||
This is an alpha field and requires enabling the
|
||||
DynamicResourceAllocation feature gate.
|
||||
|
||||
|
||||
This field is immutable. It can only be set for containers.
|
||||
items:
|
||||
description: ResourceClaim references one entry in PodSpec.ResourceClaims.
|
||||
properties:
|
||||
name:
|
||||
description: |-
|
||||
Name must match the name of one entry in pod.spec.resourceClaims of
|
||||
the Pod where this field is used. It makes that resource available
|
||||
inside a container.
|
||||
type: string
|
||||
required:
|
||||
- name
|
||||
type: object
|
||||
type: array
|
||||
x-kubernetes-list-map-keys:
|
||||
- name
|
||||
x-kubernetes-list-type: map
|
||||
limits:
|
||||
additionalProperties:
|
||||
anyOf:
|
||||
- type: integer
|
||||
- type: string
|
||||
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
|
||||
x-kubernetes-int-or-string: true
|
||||
description: |-
|
||||
Limits describes the maximum amount of compute resources allowed.
|
||||
More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
|
||||
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]+))))?$
|
||||
x-kubernetes-int-or-string: true
|
||||
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-resources-containers/
|
||||
type: object
|
||||
type: object
|
||||
volumeLimitSize:
|
||||
anyOf:
|
||||
- type: integer
|
||||
- type: string
|
||||
description: |-
|
||||
VolumeSizeLimit defines size limit for volume used for auto-instrumentation.
|
||||
The default size is 200Mi.
|
||||
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
|
||||
x-kubernetes-int-or-string: true
|
||||
type: object
|
||||
exporter:
|
||||
description: Exporter defines exporter configuration.
|
||||
properties:
|
||||
endpoint:
|
||||
description: Endpoint is address of the collector with OTLP endpoint.
|
||||
type: string
|
||||
type: object
|
||||
licenseKeySecret:
|
||||
description: |-
|
||||
LicenseKeySecret defines where to take the licenseKeySecret.
|
||||
it should be present in the operator namespace.
|
||||
type: string
|
||||
namespaceLabelSelector:
|
||||
description: PodLabelSelector defines to which pods the config should
|
||||
be applied.
|
||||
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
|
||||
x-kubernetes-map-type: atomic
|
||||
podLabelSelector:
|
||||
description: PodLabelSelector defines to which pods the config should
|
||||
be applied.
|
||||
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
|
||||
x-kubernetes-map-type: atomic
|
||||
propagators:
|
||||
description: |-
|
||||
Propagators defines inter-process context propagation configuration.
|
||||
Values in this list will be set in the OTEL_PROPAGATORS env var.
|
||||
Enum=tracecontext;none
|
||||
items:
|
||||
description: Propagator represents the propagation type.
|
||||
enum:
|
||||
- tracecontext
|
||||
- none
|
||||
type: string
|
||||
type: array
|
||||
resource:
|
||||
description: Resource defines the configuration for the resource attributes,
|
||||
as defined by the OpenTelemetry specification.
|
||||
properties:
|
||||
addK8sUIDAttributes:
|
||||
description: AddK8sUIDAttributes defines whether K8s UID attributes
|
||||
should be collected (e.g. k8s.deployment.uid).
|
||||
type: boolean
|
||||
resourceAttributes:
|
||||
additionalProperties:
|
||||
type: string
|
||||
description: |-
|
||||
Attributes defines attributes that are added to the resource.
|
||||
For example environment: dev
|
||||
type: object
|
||||
type: object
|
||||
sampler:
|
||||
description: Sampler defines sampling configuration.
|
||||
properties:
|
||||
argument:
|
||||
description: |-
|
||||
Argument defines sampler argument.
|
||||
The value depends on the sampler type.
|
||||
For instance for parentbased_traceidratio sampler type it is a number in range [0..1] e.g. 0.25.
|
||||
The value will be set in the OTEL_TRACES_SAMPLER_ARG env var.
|
||||
type: string
|
||||
type:
|
||||
description: |-
|
||||
Type defines sampler type.
|
||||
The value will be set in the OTEL_TRACES_SAMPLER env var.
|
||||
The value can be for instance parentbased_always_on, parentbased_always_off, parentbased_traceidratio...
|
||||
enum:
|
||||
- always_on
|
||||
- always_off
|
||||
- traceidratio
|
||||
- parentbased_always_on
|
||||
- parentbased_always_off
|
||||
- parentbased_traceidratio
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
status:
|
||||
description: InstrumentationStatus defines the observed state of Instrumentation
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
||||
status:
|
||||
acceptedNames:
|
||||
kind: ""
|
||||
plural: ""
|
||||
conditions: []
|
||||
storedVersions: []
|
|
@ -0,0 +1,51 @@
|
|||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: Role
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.rbac.leaderElection.role.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- configmaps
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- create
|
||||
- update
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- configmaps/status
|
||||
verbs:
|
||||
- get
|
||||
- update
|
||||
- patch
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- events
|
||||
verbs:
|
||||
- create
|
||||
- patch
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.rbac.leaderElection.roleBinding.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
name: {{ include "k8s-agents-operator.rbac.leaderElection.role.name" . }}
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ include "newrelic.common.serviceAccount.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
|
@ -0,0 +1,88 @@
|
|||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.rbac.manager.role.name" . }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- events
|
||||
verbs:
|
||||
- create
|
||||
- patch
|
||||
- apiGroups: [ "" ]
|
||||
resources: ["secrets"]
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- create
|
||||
- delete
|
||||
- deletecollection
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- namespaces
|
||||
verbs:
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- apps
|
||||
resources:
|
||||
- replicasets
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- coordination.k8s.io
|
||||
resources:
|
||||
- leases
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- apiGroups:
|
||||
- newrelic.com
|
||||
resources:
|
||||
- instrumentations
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- route.openshift.io
|
||||
resources:
|
||||
- routes
|
||||
- routes/custom-host
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.rbac.manager.roleBinding.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: {{ include "k8s-agents-operator.rbac.manager.role.name" . }}
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ include "newrelic.common.serviceAccount.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
|
@ -0,0 +1,11 @@
|
|||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.rbac.metricsReader.role.name" . }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
rules:
|
||||
- nonResourceURLs:
|
||||
- /metrics
|
||||
verbs:
|
||||
- get
|
|
@ -0,0 +1,15 @@
|
|||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "newrelic.common.naming.fullname" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
control-plane: controller-manager
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.metricsService.type }}
|
||||
selector:
|
||||
{{- include "newrelic.common.labels.selectorLabels" . | nindent 4 }}
|
||||
control-plane: controller-manager
|
||||
ports:
|
||||
{{- .Values.metricsService.ports | toYaml | nindent 2 -}}
|
|
@ -0,0 +1,35 @@
|
|||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.rbac.proxy.role.name" . }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- authentication.k8s.io
|
||||
resources:
|
||||
- tokenreviews
|
||||
verbs:
|
||||
- create
|
||||
- apiGroups:
|
||||
- authorization.k8s.io
|
||||
resources:
|
||||
- subjectaccessreviews
|
||||
verbs:
|
||||
- create
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.rbac.proxy.roleBinding.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: {{ include "k8s-agents-operator.rbac.proxy.role.name" . }}
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ include "newrelic.common.serviceAccount.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
|
@ -0,0 +1,19 @@
|
|||
{{/*
|
||||
Renders the license key secret if user has not specified a custom secret.
|
||||
*/}}
|
||||
{{- if not (include "newrelic.common.license._customSecretName" .) }}
|
||||
{{- /* Fail if licenseKey is empty and required: */ -}}
|
||||
{{- if not (include "newrelic.common.license._licenseKey" .) }}
|
||||
{{- fail "You must specify a licenseKey" }}
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: newrelic-key-secret
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
data:
|
||||
new_relic_license_key: {{ include "newrelic.common.license._licenseKey" . | b64enc }}
|
||||
{{- end }}
|
|
@ -0,0 +1,11 @@
|
|||
{{- if and .Values.admissionWebhooks.create .Values.admissionWebhooks.certManager.enabled }}
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Issuer
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.cert-manager.issuer.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
spec:
|
||||
selfSigned: {}
|
||||
{{- end }}
|
|
@ -0,0 +1,11 @@
|
|||
{{- if include "newrelic.common.serviceAccount.create" . }}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "newrelic.common.serviceAccount.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
{{- include "newrelic.common.serviceAccount.annotations" . | nindent 4 }}
|
||||
{{- end -}}
|
|
@ -0,0 +1,20 @@
|
|||
{{- if and .Values.admissionWebhooks.create .Values.admissionWebhooks.certManager.enabled }}
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.cert-manager.certificate.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
spec:
|
||||
dnsNames:
|
||||
- '{{ include "k8s-agents-operator.webhook.service.name" . }}.{{ .Release.Namespace }}.svc'
|
||||
- '{{ include "k8s-agents-operator.webhook.service.name" . }}.{{ .Release.Namespace }}.svc.{{ .Values.kubernetesClusterDomain }}'
|
||||
issuerRef:
|
||||
kind: Issuer
|
||||
name: {{ include "k8s-agents-operator.cert-manager.issuer.name" . }}
|
||||
secretName: {{ include "k8s-agents-operator.certificateSecret.name" . }}
|
||||
subject:
|
||||
organizationalUnits:
|
||||
- k8s-agents-operator
|
||||
{{- end }}
|
|
@ -0,0 +1,134 @@
|
|||
{{- $tls := fromYaml (include "k8s-agents-operator.webhookCert" .) }}
|
||||
{{- if .Values.admissionWebhooks.autoGenerateCert.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
type: kubernetes.io/tls
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.certificateSecret.name" . }}
|
||||
annotations:
|
||||
"helm.sh/hook": "pre-install,pre-upgrade"
|
||||
"helm.sh/hook-delete-policy": "before-hook-creation"
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: webhook
|
||||
namespace: {{ .Release.Namespace }}
|
||||
data:
|
||||
tls.crt: {{ $tls.clientCert }}
|
||||
tls.key: {{ $tls.clientKey }}
|
||||
ca.crt: {{ $tls.caCert }}
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: admissionregistration.k8s.io/v1
|
||||
kind: MutatingWebhookConfiguration
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.webhook.mutating.name" . }}
|
||||
{{- if .Values.admissionWebhooks.certManager.enabled }}
|
||||
annotations:
|
||||
cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ include "k8s-agents-operator.cert-manager.certificate.name" . }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
webhooks:
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
{{- if .Values.admissionWebhooks.autoGenerateCert.enabled }}
|
||||
caBundle: {{ $tls.caCert }}
|
||||
{{- end }}
|
||||
service:
|
||||
name: {{ include "k8s-agents-operator.webhook.service.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
path: /mutate-newrelic-com-v1alpha2-instrumentation
|
||||
failurePolicy: Fail
|
||||
name: minstrumentation.kb.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- newrelic.com
|
||||
apiVersions:
|
||||
- v1alpha2
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- instrumentations
|
||||
sideEffects: None
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
{{- if .Values.admissionWebhooks.autoGenerateCert.enabled }}
|
||||
caBundle: {{ $tls.caCert }}
|
||||
{{- end }}
|
||||
service:
|
||||
name: {{ include "k8s-agents-operator.webhook.service.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
path: /mutate-v1-pod
|
||||
failurePolicy: Ignore
|
||||
name: mpod.kb.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- pods
|
||||
sideEffects: None
|
||||
---
|
||||
apiVersion: admissionregistration.k8s.io/v1
|
||||
kind: ValidatingWebhookConfiguration
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.webhook.validating.name" . }}
|
||||
{{- if .Values.admissionWebhooks.certManager.enabled }}
|
||||
annotations:
|
||||
cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ include "k8s-agents-operator.cert-manager.certificate.name" . }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
webhooks:
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
{{- if .Values.admissionWebhooks.autoGenerateCert.enabled }}
|
||||
caBundle: {{ $tls.caCert }}
|
||||
{{- end }}
|
||||
service:
|
||||
name: {{ include "k8s-agents-operator.webhook.service.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
path: /validate-newrelic-com-v1alpha2-instrumentation
|
||||
failurePolicy: Fail
|
||||
name: vinstrumentationcreateupdate.kb.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- newrelic.com
|
||||
apiVersions:
|
||||
- v1alpha2
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- instrumentations
|
||||
sideEffects: None
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
{{- if .Values.admissionWebhooks.autoGenerateCert.enabled }}
|
||||
caBundle: {{ $tls.caCert }}
|
||||
{{- end }}
|
||||
service:
|
||||
name: {{ include "k8s-agents-operator.webhook.service.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
path: /validate-newrelic-com-v1alpha2-instrumentation
|
||||
failurePolicy: Ignore
|
||||
name: vinstrumentationdelete.kb.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- newrelic.com
|
||||
apiVersions:
|
||||
- v1alpha2
|
||||
operations:
|
||||
- DELETE
|
||||
resources:
|
||||
- instrumentations
|
||||
sideEffects: None
|
|
@ -0,0 +1,14 @@
|
|||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "k8s-agents-operator.webhook.service.name" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "newrelic.common.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.webhookService.type }}
|
||||
selector:
|
||||
{{- include "newrelic.common.labels.selectorLabels" . | nindent 4 }}
|
||||
control-plane: controller-manager
|
||||
ports:
|
||||
{{- .Values.webhookService.ports | toYaml | nindent 2 -}}
|
|
@ -0,0 +1,107 @@
|
|||
suite: affinity
|
||||
templates:
|
||||
- templates/deployment.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: sets affinity to default when no values provided
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- notExists:
|
||||
path: spec.template.spec.affinity
|
||||
template: templates/deployment.yaml
|
||||
- it: sets affinity from global by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
global:
|
||||
affinity:
|
||||
podAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: globalKey
|
||||
operator: In
|
||||
values:
|
||||
- S1
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.affinity
|
||||
value:
|
||||
podAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: globalKey
|
||||
operator: In
|
||||
values:
|
||||
- S1
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
template: templates/deployment.yaml
|
||||
- it: sets affinity from values by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
affinity:
|
||||
podAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: topLevelKey
|
||||
operator: In
|
||||
values:
|
||||
- S1
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.affinity
|
||||
value:
|
||||
podAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: topLevelKey
|
||||
operator: In
|
||||
values:
|
||||
- S1
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
template: templates/deployment.yaml
|
||||
- it: sets affinity from values by common-library overriding global values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
affinity:
|
||||
podAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: topLevelKey
|
||||
operator: In
|
||||
values:
|
||||
- S1
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
global:
|
||||
affinity:
|
||||
podAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: globalKey
|
||||
operator: In
|
||||
values:
|
||||
- S1
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.affinity
|
||||
value:
|
||||
podAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: topLevelKey
|
||||
operator: In
|
||||
values:
|
||||
- S1
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
template: templates/deployment.yaml
|
|
@ -0,0 +1,29 @@
|
|||
suite: annotations
|
||||
templates:
|
||||
- templates/deployment.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: sets pod annotations to default when no values provided
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- notExists:
|
||||
path: spec.template.metadata.annotations
|
||||
template: templates/deployment.yaml
|
||||
- it: sets pod annotations from values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
podAnnotations:
|
||||
deploymentKey1: "deploymentValue1"
|
||||
deploymentKey2: "deploymentValue2"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.metadata.annotations.deploymentKey1
|
||||
value: deploymentValue1
|
||||
template: templates/deployment.yaml
|
||||
- equal:
|
||||
path: spec.template.metadata.annotations.deploymentKey2
|
||||
value: deploymentValue2
|
||||
template: templates/deployment.yaml
|
|
@ -0,0 +1,53 @@
|
|||
suite: cert-manager
|
||||
templates:
|
||||
- templates/serving-cert.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: creates cert-manager resources if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 1
|
||||
- it: creates Certificate in default domain if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: kind
|
||||
value: Certificate
|
||||
- equal:
|
||||
path: spec.dnsNames
|
||||
value:
|
||||
- my-release-k8s-agents-operator-webhook-service.my-namespace.svc
|
||||
- my-release-k8s-agents-operator-webhook-service.my-namespace.svc.cluster.local
|
||||
- it: creates Certificate in custom domain if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
kubernetesClusterDomain: kubey.test
|
||||
asserts:
|
||||
- equal:
|
||||
path: kind
|
||||
value: Certificate
|
||||
- equal:
|
||||
path: spec.dnsNames
|
||||
value:
|
||||
- my-release-k8s-agents-operator-webhook-service.my-namespace.svc
|
||||
- my-release-k8s-agents-operator-webhook-service.my-namespace.svc.kubey.test
|
|
@ -0,0 +1,32 @@
|
|||
suite: cert-manager
|
||||
templates:
|
||||
- templates/selfsigned-issuer.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: creates cert-manager resources if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 1
|
||||
- it: creates Issuer if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: kind
|
||||
value: Issuer
|
||||
- exists:
|
||||
path: spec.selfSigned
|
|
@ -0,0 +1,61 @@
|
|||
suite: images
|
||||
templates:
|
||||
- templates/deployment.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: has a default image version
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- notMatchRegex:
|
||||
path: spec.template.spec.containers[0].image
|
||||
pattern: ".*nil.*"
|
||||
template: templates/deployment.yaml
|
||||
- notMatchRegex:
|
||||
path: spec.template.spec.containers[1].image
|
||||
pattern: ".*nil.*"
|
||||
template: templates/deployment.yaml
|
||||
- it: loads image and version
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
controllerManager:
|
||||
manager:
|
||||
image:
|
||||
repository: nr/test-1
|
||||
version: "1.1.1"
|
||||
kubeRbacProxy:
|
||||
image:
|
||||
repository: nr/test-2
|
||||
version: "1.1.2"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].image
|
||||
value: nr/test-1:1.1.1
|
||||
template: templates/deployment.yaml
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].image
|
||||
value: nr/test-2:1.1.2
|
||||
template: templates/deployment.yaml
|
||||
- it: loads image and version using SHA digest
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
controllerManager:
|
||||
manager:
|
||||
image:
|
||||
repository: nr/test-1
|
||||
version: "sha256:e2399e70e99ac370ca6a3c7e5affa9655da3b246d0ada77c40ed155b3726ee2e"
|
||||
kubeRbacProxy:
|
||||
image:
|
||||
repository: nr/test-2
|
||||
version: "sha256:771a9a173e033a3ad8b46f5c00a7036eaa88c8d8d1fbd89217325168998113ea"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].image
|
||||
value: nr/test-1@sha256:e2399e70e99ac370ca6a3c7e5affa9655da3b246d0ada77c40ed155b3726ee2e
|
||||
template: templates/deployment.yaml
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].image
|
||||
value: nr/test-2@sha256:771a9a173e033a3ad8b46f5c00a7036eaa88c8d8d1fbd89217325168998113ea
|
||||
template: templates/deployment.yaml
|
|
@ -0,0 +1,51 @@
|
|||
suite: nodeSelector
|
||||
templates:
|
||||
- templates/deployment.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: sets nodeSelector to default when no values provided
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- notExists:
|
||||
path: spec.template.spec.nodeSelector
|
||||
template: templates/deployment.yaml
|
||||
- it: sets nodeSelector from global by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
global:
|
||||
nodeSelector:
|
||||
globalKey: globalValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.nodeSelector
|
||||
value:
|
||||
globalKey: globalValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets nodeSelector from values by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
nodeSelector:
|
||||
topLevelKey: topLevelValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.nodeSelector
|
||||
value:
|
||||
topLevelKey: topLevelValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets nodeSelector from values by common-library overriding global values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
nodeSelector:
|
||||
topLevelKey: topLevelValue
|
||||
global:
|
||||
nodeSelector:
|
||||
globalKey: globalValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.nodeSelector
|
||||
value:
|
||||
topLevelKey: topLevelValue
|
||||
template: templates/deployment.yaml
|
|
@ -0,0 +1,28 @@
|
|||
suite: resources
|
||||
templates:
|
||||
- templates/deployment.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: sets pod resources to default when no values provided
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].resources
|
||||
value:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 64Mi
|
||||
template: templates/deployment.yaml
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].resources
|
||||
value:
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 128Mi
|
||||
requests:
|
||||
cpu: 5m
|
||||
memory: 64Mi
|
||||
template: templates/deployment.yaml
|
|
@ -0,0 +1,191 @@
|
|||
suite: securityContext
|
||||
templates:
|
||||
- templates/deployment.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: sets pod securityContext set to defaults when no values provided
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.securityContext
|
||||
value:
|
||||
runAsGroup: 65532
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65532
|
||||
fsGroup: 65532
|
||||
template: templates/deployment.yaml
|
||||
- it: ignores pod securityContext from global by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
global:
|
||||
podSecurityContext:
|
||||
globalKey: globalValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.securityContext
|
||||
value:
|
||||
runAsGroup: 65532
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65532
|
||||
fsGroup: 65532
|
||||
template: templates/deployment.yaml
|
||||
- it: appends pod securityContext from values by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
podSecurityContext:
|
||||
topLevelKey: topLevelValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.securityContext
|
||||
value:
|
||||
runAsGroup: 65532
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65532
|
||||
fsGroup: 65532
|
||||
topLevelKey: topLevelValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets pod securityContext from values by common-library overriding global values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
podSecurityContext:
|
||||
topLevelKey: topLevelValue
|
||||
global:
|
||||
podSecurityContext:
|
||||
globalKey: globalValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.securityContext
|
||||
value:
|
||||
runAsGroup: 65532
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65532
|
||||
fsGroup: 65532
|
||||
topLevelKey: topLevelValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets container securityContext set to defaults when no values provided
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- notExists:
|
||||
path: spec.template.spec.containers[0].securityContext
|
||||
template: templates/deployment.yaml
|
||||
- notExists:
|
||||
path: spec.template.spec.containers[1].securityContext
|
||||
template: templates/deployment.yaml
|
||||
- it: sets container securityContext from global by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
global:
|
||||
containerSecurityContext:
|
||||
globalKey: globalValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].securityContext
|
||||
value:
|
||||
globalKey: globalValue
|
||||
template: templates/deployment.yaml
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].securityContext
|
||||
value:
|
||||
globalKey: globalValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets container securityContext from values by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
containerSecurityContext:
|
||||
topLevelKey: topLevelValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].securityContext
|
||||
value:
|
||||
topLevelKey: topLevelValue
|
||||
template: templates/deployment.yaml
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].securityContext
|
||||
value:
|
||||
topLevelKey: topLevelValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets container securityContext from values by common-library overriding global values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
containerSecurityContext:
|
||||
topLevelKey: topLevelValue
|
||||
global:
|
||||
containerSecurityContext:
|
||||
globalKey: globalValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].securityContext
|
||||
value:
|
||||
topLevelKey: topLevelValue
|
||||
template: templates/deployment.yaml
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].securityContext
|
||||
value:
|
||||
topLevelKey: topLevelValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets container securityContext from manager values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
controllerManager:
|
||||
manager:
|
||||
containerSecurityContext:
|
||||
managerKey: managerValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].securityContext
|
||||
value:
|
||||
managerKey: managerValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets container securityContext from kubeRbacProxy values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
controllerManager:
|
||||
kubeRbacProxy:
|
||||
containerSecurityContext:
|
||||
kubeRbacProxyKey: kubeRbacProxyValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].securityContext
|
||||
value:
|
||||
kubeRbacProxyKey: kubeRbacProxyValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets container securityContext from manager values overriding top level and global values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
containerSecurityContext:
|
||||
topLevelKey: topLevelValue
|
||||
global:
|
||||
containerSecurityContext:
|
||||
globalKey: globalValue
|
||||
controllerManager:
|
||||
manager:
|
||||
containerSecurityContext:
|
||||
managerKey: managerValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].securityContext
|
||||
value:
|
||||
managerKey: managerValue
|
||||
template: templates/deployment.yaml
|
||||
- it: sets container securityContext from kubeRbacProxy values overriding top level and global values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
containerSecurityContext:
|
||||
topLevelKey: topLevelValue
|
||||
global:
|
||||
containerSecurityContext:
|
||||
globalKey: globalValue
|
||||
controllerManager:
|
||||
kubeRbacProxy:
|
||||
containerSecurityContext:
|
||||
kubeRbacProxyKey: kubeRbacProxyValue
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].securityContext
|
||||
value:
|
||||
kubeRbacProxyKey: kubeRbacProxyValue
|
||||
template: templates/deployment.yaml
|
|
@ -0,0 +1,83 @@
|
|||
suite: serviceAccount
|
||||
templates:
|
||||
- templates/service-account.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: by default creates a service account
|
||||
set:
|
||||
licenseKey: test
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 1
|
||||
|
||||
- it: creates a service account if there are no global values
|
||||
set:
|
||||
licenseKey: test
|
||||
global: null
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 1
|
||||
|
||||
- it: creates a global a service account
|
||||
set:
|
||||
licenseKey: test
|
||||
global:
|
||||
serviceAccount:
|
||||
create: true
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 1
|
||||
|
||||
- it: create a local service account
|
||||
set:
|
||||
licenseKey: test
|
||||
serviceAccount:
|
||||
create: true
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 1
|
||||
|
||||
- it: disables a global a service account
|
||||
set:
|
||||
licenseKey: test
|
||||
global:
|
||||
serviceAccount:
|
||||
create: false
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 0
|
||||
|
||||
- it: disables a local a service account
|
||||
set:
|
||||
licenseKey: test
|
||||
serviceAccount:
|
||||
create: false
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 0
|
||||
|
||||
- it: allows overriding the global enabling of a service account
|
||||
set:
|
||||
licenseKey: test
|
||||
global:
|
||||
serviceAccount:
|
||||
create: true
|
||||
serviceAccount:
|
||||
create: false
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 0
|
||||
|
||||
- it: allows overriding the global disabling of a service account
|
||||
set:
|
||||
licenseKey: test
|
||||
global:
|
||||
serviceAccount:
|
||||
create: false
|
||||
serviceAccount:
|
||||
create: true
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 1
|
|
@ -0,0 +1,65 @@
|
|||
suite: tolerations
|
||||
templates:
|
||||
- templates/deployment.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: sets tolerations to default when no values provided
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- notExists:
|
||||
path: spec.template.spec.tolerations
|
||||
template: templates/deployment.yaml
|
||||
- it: sets tolerations from global by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
global:
|
||||
tolerations:
|
||||
- key: "globalKey"
|
||||
operator: "Exists"
|
||||
effect: "NoSchedule"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.tolerations
|
||||
value:
|
||||
- key: "globalKey"
|
||||
operator: "Exists"
|
||||
effect: "NoSchedule"
|
||||
template: templates/deployment.yaml
|
||||
- it: sets tolerations from values by common-library
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
tolerations:
|
||||
- key: "topLevelKey"
|
||||
operator: "Exists"
|
||||
effect: "NoSchedule"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.tolerations
|
||||
value:
|
||||
- key: "topLevelKey"
|
||||
operator: "Exists"
|
||||
effect: "NoSchedule"
|
||||
template: templates/deployment.yaml
|
||||
- it: sets tolerations from values by common-library overriding global values
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
tolerations:
|
||||
- key: "topLevelKey"
|
||||
operator: "Exists"
|
||||
effect: "NoSchedule"
|
||||
global:
|
||||
tolerations:
|
||||
- key: "globalKey"
|
||||
operator: "Exists"
|
||||
effect: "NoSchedule"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.tolerations
|
||||
value:
|
||||
- key: "topLevelKey"
|
||||
operator: "Exists"
|
||||
effect: "NoSchedule"
|
||||
template: templates/deployment.yaml
|
|
@ -0,0 +1,176 @@
|
|||
suite: webhook ssl
|
||||
templates:
|
||||
- templates/webhook-configuration.yaml
|
||||
release:
|
||||
name: my-release
|
||||
namespace: my-namespace
|
||||
tests:
|
||||
- it: creates ssl certificate secret by default
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 3
|
||||
- containsDocument:
|
||||
kind: Secret
|
||||
apiVersion: v1
|
||||
name: my-release-k8s-agents-operator-controller-manager-service-cert
|
||||
namespace: my-namespace
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-controller-manager-service-cert
|
||||
- exists:
|
||||
path: data["tls.crt"]
|
||||
template: templates/webhook-configuration.yaml
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-controller-manager-service-cert
|
||||
- exists:
|
||||
path: data["tls.key"]
|
||||
template: templates/webhook-configuration.yaml
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-controller-manager-service-cert
|
||||
- exists:
|
||||
path: data["ca.crt"]
|
||||
template: templates/webhook-configuration.yaml
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-controller-manager-service-cert
|
||||
- it: does not inject cert-manager annotations into MutatingWebhook by default
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- notExists:
|
||||
path: metadata.annotations["cert-manager.io/inject-ca-from"]
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-mutation
|
||||
- it: does not inject cert-manager annotations into ValidatingWebhook by default
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- notExists:
|
||||
path: metadata.annotations["cert-manager.io/inject-ca-from"]
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-validation
|
||||
- it: does inject caBundle into MutatingWebhook clientConfigs by default
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- lengthEqual:
|
||||
path: webhooks
|
||||
count: 2
|
||||
- exists:
|
||||
path: webhooks[0].clientConfig.caBundle
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-mutation
|
||||
- exists:
|
||||
path: webhooks[1].clientConfig.caBundle
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-mutation
|
||||
- it: does inject caBundle into ValidatingWebhook clientConfigs by default
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
asserts:
|
||||
- lengthEqual:
|
||||
path: webhooks
|
||||
count: 2
|
||||
- exists:
|
||||
path: webhooks[0].clientConfig.caBundle
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-mutation
|
||||
- exists:
|
||||
path: webhooks[1].clientConfig.caBundle
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-validation
|
||||
- it: does not creates ssl certificate secret if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 2
|
||||
- it: injects cert-manager annotations into MutatingWebhook if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: metadata.annotations["cert-manager.io/inject-ca-from"]
|
||||
value: my-namespace/my-release-k8s-agents-operator-serving-cert
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-mutation
|
||||
- it: injects cert-manager annotations into ValidatingWebhook if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: metadata.annotations["cert-manager.io/inject-ca-from"]
|
||||
value: my-namespace/my-release-k8s-agents-operator-serving-cert
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-validation
|
||||
- it: does not inject caBundle into MutatingWebhook clientConfigs if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
asserts:
|
||||
- lengthEqual:
|
||||
path: webhooks
|
||||
count: 2
|
||||
- notExists:
|
||||
path: webhooks[0].clientConfig.caBundle
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-mutation
|
||||
- notExists:
|
||||
path: webhooks[1].clientConfig.caBundle
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-mutation
|
||||
- it: does not inject caBundle into ValidatingWebhook clientConfigs if cert-manager enabled and auto cert disabled
|
||||
set:
|
||||
licenseKey: us-whatever
|
||||
admissionWebhooks:
|
||||
autoGenerateCert:
|
||||
enabled: false
|
||||
certManager:
|
||||
enabled: true
|
||||
asserts:
|
||||
- lengthEqual:
|
||||
path: webhooks
|
||||
count: 2
|
||||
- notExists:
|
||||
path: webhooks[0].clientConfig.caBundle
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-mutation
|
||||
- notExists:
|
||||
path: webhooks[1].clientConfig.caBundle
|
||||
documentSelector:
|
||||
path: metadata.name
|
||||
value: my-release-k8s-agents-operator-validation
|
|
@ -0,0 +1,132 @@
|
|||
# Default values for k8s-agents-operator.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
# -- This set this license key to use. Can be configured also with `global.licenseKey`
|
||||
licenseKey: ""
|
||||
|
||||
# -- Additional labels for chart pods
|
||||
podLabels: {}
|
||||
# -- Additional labels for chart objects
|
||||
labels: {}
|
||||
# -- Annotations to be added to the deployment.
|
||||
podAnnotations: {}
|
||||
|
||||
# -- Sets pod's priorityClassName. Can be configured also with `global.priorityClassName`
|
||||
priorityClassName: ""
|
||||
|
||||
# -- Sets pod's dnsConfig. Can be configured also with `global.dnsConfig`
|
||||
dnsConfig: {}
|
||||
|
||||
# -- Sets all pods' node selector. Can be configured also with `global.nodeSelector`
|
||||
nodeSelector: {}
|
||||
# -- Sets all pods' tolerations to node taints. Can be configured also with `global.tolerations`
|
||||
tolerations: []
|
||||
# -- Sets all pods' affinities. Can be configured also with `global.affinity`
|
||||
affinity: {}
|
||||
# -- Sets all security contexts (at pod level).
|
||||
# -- Source: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||||
# -- SecurityContext holds pod-level security attributes and common container settings
|
||||
podSecurityContext:
|
||||
runAsGroup: 65532
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65532
|
||||
fsGroup: 65532
|
||||
# -- Sets all security context (at container level). Can be configured also with `global.securityContext.container`
|
||||
containerSecurityContext: {}
|
||||
|
||||
kubernetesClusterDomain: cluster.local
|
||||
|
||||
controllerManager:
|
||||
replicas: 1
|
||||
|
||||
manager:
|
||||
image:
|
||||
# -- Sets the repository and image to use for the manager. Please ensure you're using trusted New Relic images.
|
||||
repository: newrelic/k8s-agents-operator
|
||||
# -- Sets the manager image version to retrieve. Could be a tag i.e. "v0.17.0" or a SHA digest i.e. "sha256:e2399e70e99ac370ca6a3c7e5affa9655da3b246d0ada77c40ed155b3726ee2e"
|
||||
version:
|
||||
pullPolicy:
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 64Mi
|
||||
# -- Sets security context (at container level) for the manager. Overrides `containerSecurityContext` and `global.containerSecurityContext`
|
||||
containerSecurityContext: {}
|
||||
# -- Source: https://docs.openshift.com/container-platform/4.10/operators/operator_sdk/osdk-leader-election.html
|
||||
# -- Enable leader election mechanism for protecting against split brain if multiple operator pods/replicas are started
|
||||
leaderElection:
|
||||
enabled: true
|
||||
|
||||
kubeRbacProxy:
|
||||
image:
|
||||
# -- Sets the repository and image to use for kube-rbac-proxy. Please ensure you're using a trusted image.
|
||||
repository: gcr.io/kubebuilder/kube-rbac-proxy
|
||||
# -- Sets the kube-rbac-proxy image version to retrieve. Could be a tag i.e. "v0.16.0" or a SHA digest i.e. "sha256:771a9a173e033a3ad8b46f5c00a7036eaa88c8d8d1fbd89217325168998113ea"
|
||||
version: sha256:771a9a173e033a3ad8b46f5c00a7036eaa88c8d8d1fbd89217325168998113ea
|
||||
resources:
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 128Mi
|
||||
requests:
|
||||
cpu: 5m
|
||||
memory: 64Mi
|
||||
# -- Sets security context (at container level) for kubeRbacProxy. Overrides `containerSecurityContext` and `global.containerSecurityContext`
|
||||
containerSecurityContext: {}
|
||||
|
||||
# -- Settings controlling ServiceAccount creation
|
||||
# @default -- See `values.yaml`
|
||||
serviceAccount:
|
||||
# serviceAccount.create -- (bool) Specifies whether a ServiceAccount should be created
|
||||
# @default -- `true`
|
||||
create:
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name: ""
|
||||
# Specify any annotations to add to the ServiceAccount
|
||||
annotations:
|
||||
|
||||
metricsService:
|
||||
ports:
|
||||
- name: https
|
||||
port: 8443
|
||||
protocol: TCP
|
||||
targetPort: https
|
||||
type: ClusterIP
|
||||
|
||||
webhookService:
|
||||
ports:
|
||||
- port: 443
|
||||
protocol: TCP
|
||||
targetPort: 9443
|
||||
type: ClusterIP
|
||||
|
||||
# -- Admission webhooks make sure only requests with correctly formatted rules will get into the Operator
|
||||
admissionWebhooks:
|
||||
create: true
|
||||
|
||||
## TLS Certificate Option 1: Use Helm to automatically generate self-signed certificate.
|
||||
## certManager must be disabled and autoGenerateCert must be enabled.
|
||||
autoGenerateCert:
|
||||
# -- If true and certManager.enabled is false, Helm will automatically create a self-signed cert and secret for you.
|
||||
enabled: true
|
||||
# -- If set to true, new webhook key/certificate is generated on helm upgrade.
|
||||
recreate: true
|
||||
# -- Cert validity period time in days.
|
||||
certPeriodDays: 365
|
||||
|
||||
## TLS Certificate Option 2: Use certManager to generate self-signed certificate.
|
||||
certManager:
|
||||
# -- If true and autoGenerateCert.enabled is false, cert-manager will create a self-signed cert and secret for you.
|
||||
enabled: false
|
||||
|
||||
## TLS Certificate Option 3: Use your own self-signed certificate.
|
||||
## certManager and autoGenerateCert must be disabled and certFile, keyFile, and caFile must be set.
|
||||
## The chart reads the contents of the file paths with the helm .Files.Get function.
|
||||
## Refer to this doc https://helm.sh/docs/chart_template_guide/accessing_files/ to understand
|
||||
## limitations of file paths accessible to the chart.
|
||||
# -- Path to your own PEM-encoded certificate.
|
||||
certFile: ""
|
||||
# -- Path to your own PEM-encoded private key.
|
||||
keyFile: ""
|
||||
# -- Path to the CA cert.
|
||||
caFile: ""
|
|
@ -0,0 +1,21 @@
|
|||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
|
@ -0,0 +1,26 @@
|
|||
annotations:
|
||||
artifacthub.io/license: Apache-2.0
|
||||
artifacthub.io/links: |
|
||||
- name: Chart Source
|
||||
url: https://github.com/prometheus-community/helm-charts
|
||||
apiVersion: v2
|
||||
appVersion: 2.13.0
|
||||
description: Install kube-state-metrics to generate and expose cluster-level metrics
|
||||
home: https://github.com/kubernetes/kube-state-metrics/
|
||||
keywords:
|
||||
- metric
|
||||
- monitoring
|
||||
- prometheus
|
||||
- kubernetes
|
||||
maintainers:
|
||||
- email: tariq.ibrahim@mulesoft.com
|
||||
name: tariq1890
|
||||
- email: manuel@rueg.eu
|
||||
name: mrueg
|
||||
- email: david@0xdc.me
|
||||
name: dotdc
|
||||
name: kube-state-metrics
|
||||
sources:
|
||||
- https://github.com/kubernetes/kube-state-metrics/
|
||||
type: application
|
||||
version: 5.26.0
|
|
@ -0,0 +1,85 @@
|
|||
# kube-state-metrics Helm Chart
|
||||
|
||||
Installs the [kube-state-metrics agent](https://github.com/kubernetes/kube-state-metrics).
|
||||
|
||||
## Get Repository Info
|
||||
<!-- textlint-disable -->
|
||||
```console
|
||||
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
|
||||
helm repo update
|
||||
```
|
||||
|
||||
_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._
|
||||
<!-- textlint-enable -->
|
||||
|
||||
## Install Chart
|
||||
|
||||
```console
|
||||
helm install [RELEASE_NAME] prometheus-community/kube-state-metrics [flags]
|
||||
```
|
||||
|
||||
_See [configuration](#configuration) below._
|
||||
|
||||
_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._
|
||||
|
||||
## Uninstall Chart
|
||||
|
||||
```console
|
||||
helm uninstall [RELEASE_NAME]
|
||||
```
|
||||
|
||||
This removes all the Kubernetes components associated with the chart and deletes the release.
|
||||
|
||||
_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._
|
||||
|
||||
## Upgrading Chart
|
||||
|
||||
```console
|
||||
helm upgrade [RELEASE_NAME] prometheus-community/kube-state-metrics [flags]
|
||||
```
|
||||
|
||||
_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._
|
||||
|
||||
### Migrating from stable/kube-state-metrics and kubernetes/kube-state-metrics
|
||||
|
||||
You can upgrade in-place:
|
||||
|
||||
1. [get repository info](#get-repository-info)
|
||||
1. [upgrade](#upgrading-chart) your existing release name using the new chart repository
|
||||
|
||||
## Upgrading to v3.0.0
|
||||
|
||||
v3.0.0 includes kube-state-metrics v2.0, see the [changelog](https://github.com/kubernetes/kube-state-metrics/blob/release-2.0/CHANGELOG.md) for major changes on the application-side.
|
||||
|
||||
The upgraded chart now the following changes:
|
||||
|
||||
* Dropped support for helm v2 (helm v3 or later is required)
|
||||
* collectors key was renamed to resources
|
||||
* namespace key was renamed to namespaces
|
||||
|
||||
## Configuration
|
||||
|
||||
See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments:
|
||||
|
||||
```console
|
||||
helm show values prometheus-community/kube-state-metrics
|
||||
```
|
||||
|
||||
### kube-rbac-proxy
|
||||
|
||||
You can enable `kube-state-metrics` endpoint protection using `kube-rbac-proxy`. By setting `kubeRBACProxy.enabled: true`, this chart will deploy one RBAC proxy container per endpoint (metrics & telemetry).
|
||||
To authorize access, authenticate your requests (via a `ServiceAccount` for example) with a `ClusterRole` attached such as:
|
||||
|
||||
```yaml
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: kube-state-metrics-read
|
||||
rules:
|
||||
- apiGroups: [ "" ]
|
||||
resources: ["services/kube-state-metrics"]
|
||||
verbs:
|
||||
- get
|
||||
```
|
||||
|
||||
See [kube-rbac-proxy examples](https://github.com/brancz/kube-rbac-proxy/tree/master/examples/resource-attributes) for more details.
|
|
@ -0,0 +1,23 @@
|
|||
kube-state-metrics is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects.
|
||||
The exposed metrics can be found here:
|
||||
https://github.com/kubernetes/kube-state-metrics/blob/master/docs/README.md#exposed-metrics
|
||||
|
||||
The metrics are exported on the HTTP endpoint /metrics on the listening port.
|
||||
In your case, {{ template "kube-state-metrics.fullname" . }}.{{ template "kube-state-metrics.namespace" . }}.svc.cluster.local:{{ .Values.service.port }}/metrics
|
||||
|
||||
They are served either as plaintext or protobuf depending on the Accept header.
|
||||
They are designed to be consumed either by Prometheus itself or by a scraper that is compatible with scraping a Prometheus client endpoint.
|
||||
|
||||
{{- if .Values.kubeRBACProxy.enabled}}
|
||||
|
||||
kube-rbac-proxy endpoint protections is enabled:
|
||||
- Metrics endpoints are now HTTPS
|
||||
- Ensure that the client authenticates the requests (e.g. via service account) with the following role permissions:
|
||||
```
|
||||
rules:
|
||||
- apiGroups: [ "" ]
|
||||
resources: ["services/{{ template "kube-state-metrics.fullname" . }}"]
|
||||
verbs:
|
||||
- get
|
||||
```
|
||||
{{- end }}
|
|
@ -0,0 +1,156 @@
|
|||
{{/* vim: set filetype=mustache: */}}
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "kube-state-metrics.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "kube-state-metrics.fullname" -}}
|
||||
{{- if .Values.fullnameOverride -}}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
|
||||
{{- else -}}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
||||
{{- if contains $name .Release.Name -}}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
|
||||
{{- else -}}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "kube-state-metrics.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
{{ default (include "kube-state-metrics.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else -}}
|
||||
{{ default "default" .Values.serviceAccount.name }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Allow the release namespace to be overridden for multi-namespace deployments in combined charts
|
||||
*/}}
|
||||
{{- define "kube-state-metrics.namespace" -}}
|
||||
{{- if .Values.namespaceOverride -}}
|
||||
{{- .Values.namespaceOverride -}}
|
||||
{{- else -}}
|
||||
{{- .Release.Namespace -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "kube-state-metrics.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Generate basic labels
|
||||
*/}}
|
||||
{{- define "kube-state-metrics.labels" }}
|
||||
helm.sh/chart: {{ template "kube-state-metrics.chart" . }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
app.kubernetes.io/component: metrics
|
||||
app.kubernetes.io/part-of: {{ template "kube-state-metrics.name" . }}
|
||||
{{- include "kube-state-metrics.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.customLabels }}
|
||||
{{ tpl (toYaml .Values.customLabels) . }}
|
||||
{{- end }}
|
||||
{{- if .Values.releaseLabel }}
|
||||
release: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "kube-state-metrics.selectorLabels" }}
|
||||
{{- if .Values.selectorOverride }}
|
||||
{{ toYaml .Values.selectorOverride }}
|
||||
{{- else }}
|
||||
app.kubernetes.io/name: {{ include "kube-state-metrics.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/* Sets default scrape limits for servicemonitor */}}
|
||||
{{- define "servicemonitor.scrapeLimits" -}}
|
||||
{{- with .sampleLimit }}
|
||||
sampleLimit: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .targetLimit }}
|
||||
targetLimit: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .labelLimit }}
|
||||
labelLimit: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .labelNameLengthLimit }}
|
||||
labelNameLengthLimit: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .labelValueLengthLimit }}
|
||||
labelValueLengthLimit: {{ . }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Formats imagePullSecrets. Input is (dict "Values" .Values "imagePullSecrets" .{specific imagePullSecrets})
|
||||
*/}}
|
||||
{{- define "kube-state-metrics.imagePullSecrets" -}}
|
||||
{{- range (concat .Values.global.imagePullSecrets .imagePullSecrets) }}
|
||||
{{- if eq (typeOf .) "map[string]interface {}" }}
|
||||
- {{ toYaml . | trim }}
|
||||
{{- else }}
|
||||
- name: {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
The image to use for kube-state-metrics
|
||||
*/}}
|
||||
{{- define "kube-state-metrics.image" -}}
|
||||
{{- if .Values.image.sha }}
|
||||
{{- if .Values.global.imageRegistry }}
|
||||
{{- printf "%s/%s:%s@%s" .Values.global.imageRegistry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) .Values.image.sha }}
|
||||
{{- else }}
|
||||
{{- printf "%s/%s:%s@%s" .Values.image.registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) .Values.image.sha }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- if .Values.global.imageRegistry }}
|
||||
{{- printf "%s/%s:%s" .Values.global.imageRegistry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) }}
|
||||
{{- else }}
|
||||
{{- printf "%s/%s:%s" .Values.image.registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
The image to use for kubeRBACProxy
|
||||
*/}}
|
||||
{{- define "kubeRBACProxy.image" -}}
|
||||
{{- if .Values.kubeRBACProxy.image.sha }}
|
||||
{{- if .Values.global.imageRegistry }}
|
||||
{{- printf "%s/%s:%s@%s" .Values.global.imageRegistry .Values.kubeRBACProxy.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.kubeRBACProxy.image.tag) .Values.kubeRBACProxy.image.sha }}
|
||||
{{- else }}
|
||||
{{- printf "%s/%s:%s@%s" .Values.kubeRBACProxy.image.registry .Values.kubeRBACProxy.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.kubeRBACProxy.image.tag) .Values.kubeRBACProxy.image.sha }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- if .Values.global.imageRegistry }}
|
||||
{{- printf "%s/%s:%s" .Values.global.imageRegistry .Values.kubeRBACProxy.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.kubeRBACProxy.image.tag) }}
|
||||
{{- else }}
|
||||
{{- printf "%s/%s:%s" .Values.kubeRBACProxy.image.registry .Values.kubeRBACProxy.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.kubeRBACProxy.image.tag) }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,33 @@
|
|||
{{- if and .Values.networkPolicy.enabled (eq .Values.networkPolicy.flavor "cilium") }}
|
||||
apiVersion: cilium.io/v2
|
||||
kind: CiliumNetworkPolicy
|
||||
metadata:
|
||||
{{- if .Values.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
spec:
|
||||
endpointSelector:
|
||||
matchLabels:
|
||||
{{- include "kube-state-metrics.selectorLabels" . | indent 6 }}
|
||||
egress:
|
||||
{{- if and .Values.networkPolicy.cilium .Values.networkPolicy.cilium.kubeApiServerSelector }}
|
||||
{{ toYaml .Values.networkPolicy.cilium.kubeApiServerSelector | nindent 6 }}
|
||||
{{- else }}
|
||||
- toEntities:
|
||||
- kube-apiserver
|
||||
{{- end }}
|
||||
ingress:
|
||||
- toPorts:
|
||||
- ports:
|
||||
- port: {{ .Values.service.port | quote }}
|
||||
protocol: TCP
|
||||
{{- if .Values.selfMonitor.enabled }}
|
||||
- port: {{ .Values.selfMonitor.telemetryPort | default 8081 | quote }}
|
||||
protocol: TCP
|
||||
{{ end }}
|
||||
{{ end }}
|
|
@ -0,0 +1,20 @@
|
|||
{{- if and .Values.rbac.create .Values.rbac.useClusterRole -}}
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
{{- if .Values.rbac.useExistingRole }}
|
||||
name: {{ .Values.rbac.useExistingRole }}
|
||||
{{- else }}
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
{{- end }}
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ template "kube-state-metrics.serviceAccountName" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
{{- end -}}
|
|
@ -0,0 +1,16 @@
|
|||
{{- if .Values.customResourceState.enabled}}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}-customresourcestate-config
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
{{- if .Values.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
data:
|
||||
config.yaml: |
|
||||
{{- toYaml .Values.customResourceState.config | nindent 4 }}
|
||||
{{- end }}
|
|
@ -0,0 +1,336 @@
|
|||
apiVersion: apps/v1
|
||||
{{- if .Values.autosharding.enabled }}
|
||||
kind: StatefulSet
|
||||
{{- else }}
|
||||
kind: Deployment
|
||||
{{- end }}
|
||||
metadata:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
{{- if .Values.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.annotations | indent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "kube-state-metrics.selectorLabels" . | indent 6 }}
|
||||
replicas: {{ .Values.replicas }}
|
||||
{{- if not .Values.autosharding.enabled }}
|
||||
strategy:
|
||||
type: {{ .Values.updateStrategy | default "RollingUpdate" }}
|
||||
{{- end }}
|
||||
revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
|
||||
{{- if .Values.autosharding.enabled }}
|
||||
serviceName: {{ template "kube-state-metrics.fullname" . }}
|
||||
volumeClaimTemplates: []
|
||||
{{- end }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 8 }}
|
||||
{{- with .Values.podLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.podAnnotations | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
|
||||
hostNetwork: {{ .Values.hostNetwork }}
|
||||
serviceAccountName: {{ template "kube-state-metrics.serviceAccountName" . }}
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
securityContext: {{- omit .Values.securityContext "enabled" | toYaml | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.priorityClassName }}
|
||||
priorityClassName: {{ .Values.priorityClassName }}
|
||||
{{- end }}
|
||||
{{- with .Values.initContainers }}
|
||||
initContainers:
|
||||
{{- toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
{{- $servicePort := ternary 9090 (.Values.service.port | default 8080) .Values.kubeRBACProxy.enabled}}
|
||||
{{- $telemetryPort := ternary 9091 (.Values.selfMonitor.telemetryPort | default 8081) .Values.kubeRBACProxy.enabled}}
|
||||
- name: {{ template "kube-state-metrics.name" . }}
|
||||
{{- if .Values.autosharding.enabled }}
|
||||
env:
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: POD_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
{{- end }}
|
||||
args:
|
||||
{{- if .Values.extraArgs }}
|
||||
{{- .Values.extraArgs | toYaml | nindent 8 }}
|
||||
{{- end }}
|
||||
- --port={{ $servicePort }}
|
||||
{{- if .Values.collectors }}
|
||||
- --resources={{ .Values.collectors | join "," }}
|
||||
{{- end }}
|
||||
{{- if .Values.metricLabelsAllowlist }}
|
||||
- --metric-labels-allowlist={{ .Values.metricLabelsAllowlist | join "," }}
|
||||
{{- end }}
|
||||
{{- if .Values.metricAnnotationsAllowList }}
|
||||
- --metric-annotations-allowlist={{ .Values.metricAnnotationsAllowList | join "," }}
|
||||
{{- end }}
|
||||
{{- if .Values.metricAllowlist }}
|
||||
- --metric-allowlist={{ .Values.metricAllowlist | join "," }}
|
||||
{{- end }}
|
||||
{{- if .Values.metricDenylist }}
|
||||
- --metric-denylist={{ .Values.metricDenylist | join "," }}
|
||||
{{- end }}
|
||||
{{- $namespaces := list }}
|
||||
{{- if .Values.namespaces }}
|
||||
{{- range $ns := join "," .Values.namespaces | split "," }}
|
||||
{{- $namespaces = append $namespaces (tpl $ns $) }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.releaseNamespace }}
|
||||
{{- $namespaces = append $namespaces ( include "kube-state-metrics.namespace" . ) }}
|
||||
{{- end }}
|
||||
{{- if $namespaces }}
|
||||
- --namespaces={{ $namespaces | mustUniq | join "," }}
|
||||
{{- end }}
|
||||
{{- if .Values.namespacesDenylist }}
|
||||
- --namespaces-denylist={{ tpl (.Values.namespacesDenylist | join ",") $ }}
|
||||
{{- end }}
|
||||
{{- if .Values.autosharding.enabled }}
|
||||
- --pod=$(POD_NAME)
|
||||
- --pod-namespace=$(POD_NAMESPACE)
|
||||
{{- end }}
|
||||
{{- if .Values.kubeconfig.enabled }}
|
||||
- --kubeconfig=/opt/k8s/.kube/config
|
||||
{{- end }}
|
||||
{{- if .Values.kubeRBACProxy.enabled }}
|
||||
- --telemetry-host=127.0.0.1
|
||||
- --telemetry-port={{ $telemetryPort }}
|
||||
{{- else }}
|
||||
{{- if .Values.selfMonitor.telemetryHost }}
|
||||
- --telemetry-host={{ .Values.selfMonitor.telemetryHost }}
|
||||
{{- end }}
|
||||
{{- if .Values.selfMonitor.telemetryPort }}
|
||||
- --telemetry-port={{ $telemetryPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.customResourceState.enabled }}
|
||||
- --custom-resource-state-config-file=/etc/customresourcestate/config.yaml
|
||||
{{- end }}
|
||||
{{- if or (.Values.kubeconfig.enabled) (.Values.customResourceState.enabled) (.Values.volumeMounts) }}
|
||||
volumeMounts:
|
||||
{{- if .Values.kubeconfig.enabled }}
|
||||
- name: kubeconfig
|
||||
mountPath: /opt/k8s/.kube/
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- if .Values.customResourceState.enabled }}
|
||||
- name: customresourcestate-config
|
||||
mountPath: /etc/customresourcestate
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- if .Values.volumeMounts }}
|
||||
{{ toYaml .Values.volumeMounts | indent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
image: {{ include "kube-state-metrics.image" . }}
|
||||
{{- if eq .Values.kubeRBACProxy.enabled false }}
|
||||
ports:
|
||||
- containerPort: {{ .Values.service.port | default 8080}}
|
||||
name: "http"
|
||||
{{- if .Values.selfMonitor.enabled }}
|
||||
- containerPort: {{ $telemetryPort }}
|
||||
name: "metrics"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.startupProbe.enabled }}
|
||||
startupProbe:
|
||||
failureThreshold: {{ .Values.startupProbe.failureThreshold }}
|
||||
httpGet:
|
||||
{{- if .Values.hostNetwork }}
|
||||
host: 127.0.0.1
|
||||
{{- end }}
|
||||
httpHeaders:
|
||||
{{- range $_, $header := .Values.startupProbe.httpGet.httpHeaders }}
|
||||
- name: {{ $header.name }}
|
||||
value: {{ $header.value }}
|
||||
{{- end }}
|
||||
path: /healthz
|
||||
port: {{ $servicePort }}
|
||||
scheme: {{ upper .Values.startupProbe.httpGet.scheme }}
|
||||
initialDelaySeconds: {{ .Values.startupProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.startupProbe.periodSeconds }}
|
||||
successThreshold: {{ .Values.startupProbe.successThreshold }}
|
||||
timeoutSeconds: {{ .Values.startupProbe.timeoutSeconds }}
|
||||
{{- end }}
|
||||
livenessProbe:
|
||||
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||
httpGet:
|
||||
{{- if .Values.hostNetwork }}
|
||||
host: 127.0.0.1
|
||||
{{- end }}
|
||||
httpHeaders:
|
||||
{{- range $_, $header := .Values.livenessProbe.httpGet.httpHeaders }}
|
||||
- name: {{ $header.name }}
|
||||
value: {{ $header.value }}
|
||||
{{- end }}
|
||||
path: /livez
|
||||
port: {{ $servicePort }}
|
||||
scheme: {{ upper .Values.livenessProbe.httpGet.scheme }}
|
||||
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||
readinessProbe:
|
||||
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||
httpGet:
|
||||
{{- if .Values.hostNetwork }}
|
||||
host: 127.0.0.1
|
||||
{{- end }}
|
||||
httpHeaders:
|
||||
{{- range $_, $header := .Values.readinessProbe.httpGet.httpHeaders }}
|
||||
- name: {{ $header.name }}
|
||||
value: {{ $header.value }}
|
||||
{{- end }}
|
||||
path: /readyz
|
||||
port: {{ $servicePort }}
|
||||
scheme: {{ upper .Values.readinessProbe.httpGet.scheme }}
|
||||
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||
resources:
|
||||
{{ toYaml .Values.resources | indent 10 }}
|
||||
{{- if .Values.containerSecurityContext }}
|
||||
securityContext:
|
||||
{{ toYaml .Values.containerSecurityContext | indent 10 }}
|
||||
{{- end }}
|
||||
{{- if .Values.kubeRBACProxy.enabled }}
|
||||
- name: kube-rbac-proxy-http
|
||||
args:
|
||||
{{- if .Values.kubeRBACProxy.extraArgs }}
|
||||
{{- .Values.kubeRBACProxy.extraArgs | toYaml | nindent 8 }}
|
||||
{{- end }}
|
||||
- --secure-listen-address=:{{ .Values.service.port | default 8080}}
|
||||
- --upstream=http://127.0.0.1:{{ $servicePort }}/
|
||||
- --proxy-endpoints-port=8888
|
||||
- --config-file=/etc/kube-rbac-proxy-config/config-file.yaml
|
||||
volumeMounts:
|
||||
- name: kube-rbac-proxy-config
|
||||
mountPath: /etc/kube-rbac-proxy-config
|
||||
{{- with .Values.kubeRBACProxy.volumeMounts }}
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
imagePullPolicy: {{ .Values.kubeRBACProxy.image.pullPolicy }}
|
||||
image: {{ include "kubeRBACProxy.image" . }}
|
||||
ports:
|
||||
- containerPort: {{ .Values.service.port | default 8080}}
|
||||
name: "http"
|
||||
- containerPort: 8888
|
||||
name: "http-healthz"
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
scheme: HTTPS
|
||||
port: 8888
|
||||
path: healthz
|
||||
initialDelaySeconds: 5
|
||||
timeoutSeconds: 5
|
||||
{{- if .Values.kubeRBACProxy.resources }}
|
||||
resources:
|
||||
{{ toYaml .Values.kubeRBACProxy.resources | indent 10 }}
|
||||
{{- end }}
|
||||
{{- if .Values.kubeRBACProxy.containerSecurityContext }}
|
||||
securityContext:
|
||||
{{ toYaml .Values.kubeRBACProxy.containerSecurityContext | indent 10 }}
|
||||
{{- end }}
|
||||
{{- if .Values.selfMonitor.enabled }}
|
||||
- name: kube-rbac-proxy-telemetry
|
||||
args:
|
||||
{{- if .Values.kubeRBACProxy.extraArgs }}
|
||||
{{- .Values.kubeRBACProxy.extraArgs | toYaml | nindent 8 }}
|
||||
{{- end }}
|
||||
- --secure-listen-address=:{{ .Values.selfMonitor.telemetryPort | default 8081 }}
|
||||
- --upstream=http://127.0.0.1:{{ $telemetryPort }}/
|
||||
- --proxy-endpoints-port=8889
|
||||
- --config-file=/etc/kube-rbac-proxy-config/config-file.yaml
|
||||
volumeMounts:
|
||||
- name: kube-rbac-proxy-config
|
||||
mountPath: /etc/kube-rbac-proxy-config
|
||||
{{- with .Values.kubeRBACProxy.volumeMounts }}
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
imagePullPolicy: {{ .Values.kubeRBACProxy.image.pullPolicy }}
|
||||
image: {{ include "kubeRBACProxy.image" . }}
|
||||
ports:
|
||||
- containerPort: {{ .Values.selfMonitor.telemetryPort | default 8081 }}
|
||||
name: "metrics"
|
||||
- containerPort: 8889
|
||||
name: "metrics-healthz"
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
scheme: HTTPS
|
||||
port: 8889
|
||||
path: healthz
|
||||
initialDelaySeconds: 5
|
||||
timeoutSeconds: 5
|
||||
{{- if .Values.kubeRBACProxy.resources }}
|
||||
resources:
|
||||
{{ toYaml .Values.kubeRBACProxy.resources | indent 10 }}
|
||||
{{- end }}
|
||||
{{- if .Values.kubeRBACProxy.containerSecurityContext }}
|
||||
securityContext:
|
||||
{{ toYaml .Values.kubeRBACProxy.containerSecurityContext | indent 10 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.containers }}
|
||||
{{- toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.imagePullSecrets .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- include "kube-state-metrics.imagePullSecrets" (dict "Values" .Values "imagePullSecrets" .Values.imagePullSecrets) | indent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.affinity }}
|
||||
affinity:
|
||||
{{ toYaml .Values.affinity | indent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{ tpl (toYaml .) $ | indent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{ tpl (toYaml .) $ | indent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{ toYaml .Values.topologySpreadConstraints | indent 8 }}
|
||||
{{- end }}
|
||||
{{- if or (.Values.kubeconfig.enabled) (.Values.customResourceState.enabled) (.Values.volumes) (.Values.kubeRBACProxy.enabled) }}
|
||||
volumes:
|
||||
{{- if .Values.kubeconfig.enabled}}
|
||||
- name: kubeconfig
|
||||
secret:
|
||||
secretName: {{ template "kube-state-metrics.fullname" . }}-kubeconfig
|
||||
{{- end }}
|
||||
{{- if .Values.kubeRBACProxy.enabled}}
|
||||
- name: kube-rbac-proxy-config
|
||||
configMap:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}-rbac-config
|
||||
{{- end }}
|
||||
{{- if .Values.customResourceState.enabled}}
|
||||
- name: customresourcestate-config
|
||||
configMap:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}-customresourcestate-config
|
||||
{{- end }}
|
||||
{{- if .Values.volumes }}
|
||||
{{ toYaml .Values.volumes | indent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,4 @@
|
|||
{{ range .Values.extraManifests }}
|
||||
---
|
||||
{{ tpl (toYaml .) $ }}
|
||||
{{ end }}
|
|
@ -0,0 +1,12 @@
|
|||
{{- if .Values.kubeconfig.enabled -}}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}-kubeconfig
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
type: Opaque
|
||||
data:
|
||||
config: '{{ .Values.kubeconfig.secret }}'
|
||||
{{- end -}}
|
|
@ -0,0 +1,43 @@
|
|||
{{- if and .Values.networkPolicy.enabled (eq .Values.networkPolicy.flavor "kubernetes") }}
|
||||
kind: NetworkPolicy
|
||||
apiVersion: networking.k8s.io/v1
|
||||
metadata:
|
||||
{{- if .Values.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
spec:
|
||||
{{- if .Values.networkPolicy.egress }}
|
||||
## Deny all egress by default
|
||||
egress:
|
||||
{{- toYaml .Values.networkPolicy.egress | nindent 4 }}
|
||||
{{- end }}
|
||||
ingress:
|
||||
{{- if .Values.networkPolicy.ingress }}
|
||||
{{- toYaml .Values.networkPolicy.ingress | nindent 4 }}
|
||||
{{- else }}
|
||||
## Allow ingress on default ports by default
|
||||
- ports:
|
||||
- port: {{ .Values.service.port | default 8080 }}
|
||||
protocol: TCP
|
||||
{{- if .Values.selfMonitor.enabled }}
|
||||
{{- $telemetryPort := ternary 9091 (.Values.selfMonitor.telemetryPort | default 8081) .Values.kubeRBACProxy.enabled}}
|
||||
- port: {{ $telemetryPort }}
|
||||
protocol: TCP
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
podSelector:
|
||||
{{- if .Values.networkPolicy.podSelector }}
|
||||
{{- toYaml .Values.networkPolicy.podSelector | nindent 4 }}
|
||||
{{- else }}
|
||||
matchLabels:
|
||||
{{- include "kube-state-metrics.selectorLabels" . | indent 6 }}
|
||||
{{- end }}
|
||||
policyTypes:
|
||||
- Ingress
|
||||
- Egress
|
||||
{{- end }}
|
|
@ -0,0 +1,18 @@
|
|||
{{- if .Values.podDisruptionBudget -}}
|
||||
{{ if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" -}}
|
||||
apiVersion: policy/v1
|
||||
{{- else -}}
|
||||
apiVersion: policy/v1beta1
|
||||
{{- end }}
|
||||
kind: PodDisruptionBudget
|
||||
metadata:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }}
|
||||
{{ toYaml .Values.podDisruptionBudget | indent 2 }}
|
||||
{{- end -}}
|
|
@ -0,0 +1,39 @@
|
|||
{{- if and .Values.podSecurityPolicy.enabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }}
|
||||
apiVersion: policy/v1beta1
|
||||
kind: PodSecurityPolicy
|
||||
metadata:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
{{- if .Values.podSecurityPolicy.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.podSecurityPolicy.annotations | indent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
privileged: false
|
||||
volumes:
|
||||
- 'secret'
|
||||
{{- if .Values.podSecurityPolicy.additionalVolumes }}
|
||||
{{ toYaml .Values.podSecurityPolicy.additionalVolumes | indent 4 }}
|
||||
{{- end }}
|
||||
hostNetwork: false
|
||||
hostIPC: false
|
||||
hostPID: false
|
||||
runAsUser:
|
||||
rule: 'MustRunAsNonRoot'
|
||||
seLinux:
|
||||
rule: 'RunAsAny'
|
||||
supplementalGroups:
|
||||
rule: 'MustRunAs'
|
||||
ranges:
|
||||
# Forbid adding the root group.
|
||||
- min: 1
|
||||
max: 65535
|
||||
fsGroup:
|
||||
rule: 'MustRunAs'
|
||||
ranges:
|
||||
# Forbid adding the root group.
|
||||
- min: 1
|
||||
max: 65535
|
||||
readOnlyRootFilesystem: false
|
||||
{{- end }}
|
|
@ -0,0 +1,19 @@
|
|||
{{- if and .Values.podSecurityPolicy.enabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }}
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
name: psp-{{ template "kube-state-metrics.fullname" . }}
|
||||
rules:
|
||||
{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }}
|
||||
{{- if semverCompare "> 1.15.0-0" $kubeTargetVersion }}
|
||||
- apiGroups: ['policy']
|
||||
{{- else }}
|
||||
- apiGroups: ['extensions']
|
||||
{{- end }}
|
||||
resources: ['podsecuritypolicies']
|
||||
verbs: ['use']
|
||||
resourceNames:
|
||||
- {{ template "kube-state-metrics.fullname" . }}
|
||||
{{- end }}
|
|
@ -0,0 +1,16 @@
|
|||
{{- if and .Values.podSecurityPolicy.enabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }}
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
name: psp-{{ template "kube-state-metrics.fullname" . }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: psp-{{ template "kube-state-metrics.fullname" . }}
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ template "kube-state-metrics.serviceAccountName" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
{{- end }}
|
|
@ -0,0 +1,22 @@
|
|||
{{- if .Values.kubeRBACProxy.enabled}}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}-rbac-config
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
{{- if .Values.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
data:
|
||||
config-file.yaml: |+
|
||||
authorization:
|
||||
resourceAttributes:
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
apiVersion: v1
|
||||
resource: services
|
||||
subresource: {{ template "kube-state-metrics.fullname" . }}
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
{{- end }}
|
|
@ -0,0 +1,212 @@
|
|||
{{- if and (eq .Values.rbac.create true) (not .Values.rbac.useExistingRole) -}}
|
||||
{{- range (ternary (join "," .Values.namespaces | split "," ) (list "") (eq $.Values.rbac.useClusterRole false)) }}
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
{{- if eq $.Values.rbac.useClusterRole false }}
|
||||
kind: Role
|
||||
{{- else }}
|
||||
kind: ClusterRole
|
||||
{{- end }}
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" $ | indent 4 }}
|
||||
name: {{ template "kube-state-metrics.fullname" $ }}
|
||||
{{- if eq $.Values.rbac.useClusterRole false }}
|
||||
namespace: {{ . }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{ if has "certificatesigningrequests" $.Values.collectors }}
|
||||
- apiGroups: ["certificates.k8s.io"]
|
||||
resources:
|
||||
- certificatesigningrequests
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "configmaps" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- configmaps
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "cronjobs" $.Values.collectors }}
|
||||
- apiGroups: ["batch"]
|
||||
resources:
|
||||
- cronjobs
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "daemonsets" $.Values.collectors }}
|
||||
- apiGroups: ["extensions", "apps"]
|
||||
resources:
|
||||
- daemonsets
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "deployments" $.Values.collectors }}
|
||||
- apiGroups: ["extensions", "apps"]
|
||||
resources:
|
||||
- deployments
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "endpoints" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- endpoints
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "endpointslices" $.Values.collectors }}
|
||||
- apiGroups: ["discovery.k8s.io"]
|
||||
resources:
|
||||
- endpointslices
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "horizontalpodautoscalers" $.Values.collectors }}
|
||||
- apiGroups: ["autoscaling"]
|
||||
resources:
|
||||
- horizontalpodautoscalers
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "ingresses" $.Values.collectors }}
|
||||
- apiGroups: ["extensions", "networking.k8s.io"]
|
||||
resources:
|
||||
- ingresses
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "jobs" $.Values.collectors }}
|
||||
- apiGroups: ["batch"]
|
||||
resources:
|
||||
- jobs
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "leases" $.Values.collectors }}
|
||||
- apiGroups: ["coordination.k8s.io"]
|
||||
resources:
|
||||
- leases
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "limitranges" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- limitranges
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "mutatingwebhookconfigurations" $.Values.collectors }}
|
||||
- apiGroups: ["admissionregistration.k8s.io"]
|
||||
resources:
|
||||
- mutatingwebhookconfigurations
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "namespaces" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- namespaces
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "networkpolicies" $.Values.collectors }}
|
||||
- apiGroups: ["networking.k8s.io"]
|
||||
resources:
|
||||
- networkpolicies
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "nodes" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- nodes
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "persistentvolumeclaims" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- persistentvolumeclaims
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "persistentvolumes" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- persistentvolumes
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "poddisruptionbudgets" $.Values.collectors }}
|
||||
- apiGroups: ["policy"]
|
||||
resources:
|
||||
- poddisruptionbudgets
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "pods" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- pods
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "replicasets" $.Values.collectors }}
|
||||
- apiGroups: ["extensions", "apps"]
|
||||
resources:
|
||||
- replicasets
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "replicationcontrollers" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- replicationcontrollers
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "resourcequotas" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- resourcequotas
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "secrets" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- secrets
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "services" $.Values.collectors }}
|
||||
- apiGroups: [""]
|
||||
resources:
|
||||
- services
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "statefulsets" $.Values.collectors }}
|
||||
- apiGroups: ["apps"]
|
||||
resources:
|
||||
- statefulsets
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "storageclasses" $.Values.collectors }}
|
||||
- apiGroups: ["storage.k8s.io"]
|
||||
resources:
|
||||
- storageclasses
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "validatingwebhookconfigurations" $.Values.collectors }}
|
||||
- apiGroups: ["admissionregistration.k8s.io"]
|
||||
resources:
|
||||
- validatingwebhookconfigurations
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{ if has "volumeattachments" $.Values.collectors }}
|
||||
- apiGroups: ["storage.k8s.io"]
|
||||
resources:
|
||||
- volumeattachments
|
||||
verbs: ["list", "watch"]
|
||||
{{ end -}}
|
||||
{{- if $.Values.kubeRBACProxy.enabled }}
|
||||
- apiGroups: ["authentication.k8s.io"]
|
||||
resources:
|
||||
- tokenreviews
|
||||
verbs: ["create"]
|
||||
- apiGroups: ["authorization.k8s.io"]
|
||||
resources:
|
||||
- subjectaccessreviews
|
||||
verbs: ["create"]
|
||||
{{- end }}
|
||||
{{- if $.Values.customResourceState.enabled }}
|
||||
- apiGroups: ["apiextensions.k8s.io"]
|
||||
resources:
|
||||
- customresourcedefinitions
|
||||
verbs: ["list", "watch"]
|
||||
{{- end }}
|
||||
{{ if $.Values.rbac.extraRules }}
|
||||
{{ toYaml $.Values.rbac.extraRules }}
|
||||
{{ end }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,24 @@
|
|||
{{- if and (eq .Values.rbac.create true) (eq .Values.rbac.useClusterRole false) -}}
|
||||
{{- range (join "," $.Values.namespaces) | split "," }}
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" $ | indent 4 }}
|
||||
name: {{ template "kube-state-metrics.fullname" $ }}
|
||||
namespace: {{ . }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
{{- if (not $.Values.rbac.useExistingRole) }}
|
||||
name: {{ template "kube-state-metrics.fullname" $ }}
|
||||
{{- else }}
|
||||
name: {{ $.Values.rbac.useExistingRole }}
|
||||
{{- end }}
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ template "kube-state-metrics.serviceAccountName" $ }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" $ }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
|
@ -0,0 +1,53 @@
|
|||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
annotations:
|
||||
{{- if .Values.prometheusScrape }}
|
||||
prometheus.io/scrape: '{{ .Values.prometheusScrape }}'
|
||||
{{- end }}
|
||||
{{- if .Values.service.annotations }}
|
||||
{{- toYaml .Values.service.annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: "{{ .Values.service.type }}"
|
||||
{{- if .Values.service.ipDualStack.enabled }}
|
||||
ipFamilies: {{ toYaml .Values.service.ipDualStack.ipFamilies | nindent 4 }}
|
||||
ipFamilyPolicy: {{ .Values.service.ipDualStack.ipFamilyPolicy }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: "http"
|
||||
protocol: TCP
|
||||
port: {{ .Values.service.port | default 8080}}
|
||||
{{- if .Values.service.nodePort }}
|
||||
nodePort: {{ .Values.service.nodePort }}
|
||||
{{- end }}
|
||||
targetPort: {{ .Values.service.port | default 8080}}
|
||||
{{ if .Values.selfMonitor.enabled }}
|
||||
- name: "metrics"
|
||||
protocol: TCP
|
||||
port: {{ .Values.selfMonitor.telemetryPort | default 8081 }}
|
||||
targetPort: {{ .Values.selfMonitor.telemetryPort | default 8081 }}
|
||||
{{- if .Values.selfMonitor.telemetryNodePort }}
|
||||
nodePort: {{ .Values.selfMonitor.telemetryNodePort }}
|
||||
{{- end }}
|
||||
{{ end }}
|
||||
{{- if .Values.service.loadBalancerIP }}
|
||||
loadBalancerIP: "{{ .Values.service.loadBalancerIP }}"
|
||||
{{- end }}
|
||||
{{- if .Values.service.loadBalancerSourceRanges }}
|
||||
loadBalancerSourceRanges:
|
||||
{{- range $cidr := .Values.service.loadBalancerSourceRanges }}
|
||||
- {{ $cidr }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.autosharding.enabled }}
|
||||
clusterIP: None
|
||||
{{- else if .Values.service.clusterIP }}
|
||||
clusterIP: "{{ .Values.service.clusterIP }}"
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "kube-state-metrics.selectorLabels" . | indent 4 }}
|
|
@ -0,0 +1,18 @@
|
|||
{{- if .Values.serviceAccount.create -}}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
name: {{ template "kube-state-metrics.serviceAccountName" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
{{- if .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.serviceAccount.annotations | indent 4 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.serviceAccount.imagePullSecrets .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- include "kube-state-metrics.imagePullSecrets" (dict "Values" .Values "imagePullSecrets" .Values.serviceAccount.imagePullSecrets) | indent 2 }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
|
@ -0,0 +1,120 @@
|
|||
{{- if .Values.prometheus.monitor.enabled }}
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: ServiceMonitor
|
||||
metadata:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
{{- with .Values.prometheus.monitor.additionalLabels }}
|
||||
{{- tpl (toYaml . | nindent 4) $ }}
|
||||
{{- end }}
|
||||
{{- with .Values.prometheus.monitor.annotations }}
|
||||
annotations:
|
||||
{{- tpl (toYaml . | nindent 4) $ }}
|
||||
{{- end }}
|
||||
spec:
|
||||
jobLabel: {{ default "app.kubernetes.io/name" .Values.prometheus.monitor.jobLabel }}
|
||||
{{- with .Values.prometheus.monitor.targetLabels }}
|
||||
targetLabels:
|
||||
{{- toYaml . | trim | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.prometheus.monitor.podTargetLabels }}
|
||||
podTargetLabels:
|
||||
{{- toYaml . | trim | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- include "servicemonitor.scrapeLimits" .Values.prometheus.monitor | indent 2 }}
|
||||
{{- if .Values.prometheus.monitor.namespaceSelector }}
|
||||
namespaceSelector:
|
||||
matchNames:
|
||||
{{- with .Values.prometheus.monitor.namespaceSelector }}
|
||||
{{- toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- with .Values.prometheus.monitor.selectorOverride }}
|
||||
{{- toYaml . | nindent 6 }}
|
||||
{{- else }}
|
||||
{{- include "kube-state-metrics.selectorLabels" . | indent 6 }}
|
||||
{{- end }}
|
||||
endpoints:
|
||||
- port: http
|
||||
{{- if or .Values.prometheus.monitor.http.interval .Values.prometheus.monitor.interval }}
|
||||
interval: {{ .Values.prometheus.monitor.http.interval | default .Values.prometheus.monitor.interval }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.http.scrapeTimeout .Values.prometheus.monitor.scrapeTimeout }}
|
||||
scrapeTimeout: {{ .Values.prometheus.monitor.http.scrapeTimeout | default .Values.prometheus.monitor.scrapeTimeout }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.http.proxyUrl .Values.prometheus.monitor.proxyUrl }}
|
||||
proxyUrl: {{ .Values.prometheus.monitor.http.proxyUrl | default .Values.prometheus.monitor.proxyUrl }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.http.enableHttp2 .Values.prometheus.monitor.enableHttp2 }}
|
||||
enableHttp2: {{ .Values.prometheus.monitor.http.enableHttp2 | default .Values.prometheus.monitor.enableHttp2 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.http.honorLabels .Values.prometheus.monitor.honorLabels }}
|
||||
honorLabels: true
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.http.metricRelabelings .Values.prometheus.monitor.metricRelabelings }}
|
||||
metricRelabelings:
|
||||
{{- toYaml (.Values.prometheus.monitor.http.metricRelabelings | default .Values.prometheus.monitor.metricRelabelings) | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.http.relabelings .Values.prometheus.monitor.relabelings }}
|
||||
relabelings:
|
||||
{{- toYaml (.Values.prometheus.monitor.http.relabelings | default .Values.prometheus.monitor.relabelings) | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.http.scheme .Values.prometheus.monitor.scheme }}
|
||||
scheme: {{ .Values.prometheus.monitor.http.scheme | default .Values.prometheus.monitor.scheme }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.http.tlsConfig .Values.prometheus.monitor.tlsConfig }}
|
||||
tlsConfig:
|
||||
{{- toYaml (.Values.prometheus.monitor.http.tlsConfig | default .Values.prometheus.monitor.tlsConfig) | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.http.bearerTokenFile .Values.prometheus.monitor.bearerTokenFile }}
|
||||
bearerTokenFile: {{ .Values.prometheus.monitor.http.bearerTokenFile | default .Values.prometheus.monitor.bearerTokenFile }}
|
||||
{{- end }}
|
||||
{{- with (.Values.prometheus.monitor.http.bearerTokenSecret | default .Values.prometheus.monitor.bearerTokenSecret) }}
|
||||
bearerTokenSecret:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.selfMonitor.enabled }}
|
||||
- port: metrics
|
||||
{{- if or .Values.prometheus.monitor.metrics.interval .Values.prometheus.monitor.interval }}
|
||||
interval: {{ .Values.prometheus.monitor.metrics.interval | default .Values.prometheus.monitor.interval }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.metrics.scrapeTimeout .Values.prometheus.monitor.scrapeTimeout }}
|
||||
scrapeTimeout: {{ .Values.prometheus.monitor.metrics.scrapeTimeout | default .Values.prometheus.monitor.scrapeTimeout }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.metrics.proxyUrl .Values.prometheus.monitor.proxyUrl }}
|
||||
proxyUrl: {{ .Values.prometheus.monitor.metrics.proxyUrl | default .Values.prometheus.monitor.proxyUrl }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.metrics.enableHttp2 .Values.prometheus.monitor.enableHttp2 }}
|
||||
enableHttp2: {{ .Values.prometheus.monitor.metrics.enableHttp2 | default .Values.prometheus.monitor.enableHttp2 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.metrics.honorLabels .Values.prometheus.monitor.honorLabels }}
|
||||
honorLabels: true
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.metrics.metricRelabelings .Values.prometheus.monitor.metricRelabelings }}
|
||||
metricRelabelings:
|
||||
{{- toYaml (.Values.prometheus.monitor.metrics.metricRelabelings | default .Values.prometheus.monitor.metricRelabelings) | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.metrics.relabelings .Values.prometheus.monitor.relabelings }}
|
||||
relabelings:
|
||||
{{- toYaml (.Values.prometheus.monitor.metrics.relabelings | default .Values.prometheus.monitor.relabelings) | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.metrics.scheme .Values.prometheus.monitor.scheme }}
|
||||
scheme: {{ .Values.prometheus.monitor.metrics.scheme | default .Values.prometheus.monitor.scheme }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.metrics.tlsConfig .Values.prometheus.monitor.tlsConfig }}
|
||||
tlsConfig:
|
||||
{{- toYaml (.Values.prometheus.monitor.metrics.tlsConfig | default .Values.prometheus.monitor.tlsConfig) | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.prometheus.monitor.metrics.bearerTokenFile .Values.prometheus.monitor.bearerTokenFile }}
|
||||
bearerTokenFile: {{ .Values.prometheus.monitor.metrics.bearerTokenFile | default .Values.prometheus.monitor.bearerTokenFile }}
|
||||
{{- end }}
|
||||
{{- with (.Values.prometheus.monitor.metrics.bearerTokenSecret | default .Values.prometheus.monitor.bearerTokenSecret) }}
|
||||
bearerTokenSecret:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,26 @@
|
|||
{{- if and .Values.autosharding.enabled .Values.rbac.create -}}
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: Role
|
||||
metadata:
|
||||
name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- pods
|
||||
verbs:
|
||||
- get
|
||||
- apiGroups:
|
||||
- apps
|
||||
resourceNames:
|
||||
- {{ template "kube-state-metrics.fullname" . }}
|
||||
resources:
|
||||
- statefulsets
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
{{- end }}
|
|
@ -0,0 +1,17 @@
|
|||
{{- if and .Values.autosharding.enabled .Values.rbac.create -}}
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }}
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ template "kube-state-metrics.serviceAccountName" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
{{- end }}
|
|
@ -0,0 +1,44 @@
|
|||
{{- if and (.Capabilities.APIVersions.Has "autoscaling.k8s.io/v1") (.Values.verticalPodAutoscaler.enabled) }}
|
||||
apiVersion: autoscaling.k8s.io/v1
|
||||
kind: VerticalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
namespace: {{ template "kube-state-metrics.namespace" . }}
|
||||
labels:
|
||||
{{- include "kube-state-metrics.labels" . | indent 4 }}
|
||||
spec:
|
||||
{{- with .Values.verticalPodAutoscaler.recommenders }}
|
||||
recommenders:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
resourcePolicy:
|
||||
containerPolicies:
|
||||
- containerName: {{ template "kube-state-metrics.name" . }}
|
||||
{{- with .Values.verticalPodAutoscaler.controlledResources }}
|
||||
controlledResources:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.verticalPodAutoscaler.controlledValues }}
|
||||
controlledValues: {{ .Values.verticalPodAutoscaler.controlledValues }}
|
||||
{{- end }}
|
||||
{{- if .Values.verticalPodAutoscaler.maxAllowed }}
|
||||
maxAllowed:
|
||||
{{ toYaml .Values.verticalPodAutoscaler.maxAllowed | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.verticalPodAutoscaler.minAllowed }}
|
||||
minAllowed:
|
||||
{{ toYaml .Values.verticalPodAutoscaler.minAllowed | nindent 8 }}
|
||||
{{- end }}
|
||||
targetRef:
|
||||
apiVersion: apps/v1
|
||||
{{- if .Values.autosharding.enabled }}
|
||||
kind: StatefulSet
|
||||
{{- else }}
|
||||
kind: Deployment
|
||||
{{- end }}
|
||||
name: {{ template "kube-state-metrics.fullname" . }}
|
||||
{{- with .Values.verticalPodAutoscaler.updatePolicy }}
|
||||
updatePolicy:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,542 @@
|
|||
# Default values for kube-state-metrics.
|
||||
prometheusScrape: true
|
||||
image:
|
||||
registry: registry.k8s.io
|
||||
repository: kube-state-metrics/kube-state-metrics
|
||||
# If unset use v + .Charts.appVersion
|
||||
tag: ""
|
||||
sha: ""
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
imagePullSecrets: []
|
||||
# - name: "image-pull-secret"
|
||||
|
||||
global:
|
||||
# To help compatibility with other charts which use global.imagePullSecrets.
|
||||
# Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style).
|
||||
# global:
|
||||
# imagePullSecrets:
|
||||
# - name: pullSecret1
|
||||
# - name: pullSecret2
|
||||
# or
|
||||
# global:
|
||||
# imagePullSecrets:
|
||||
# - pullSecret1
|
||||
# - pullSecret2
|
||||
imagePullSecrets: []
|
||||
#
|
||||
# Allow parent charts to override registry hostname
|
||||
imageRegistry: ""
|
||||
|
||||
# If set to true, this will deploy kube-state-metrics as a StatefulSet and the data
|
||||
# will be automatically sharded across <.Values.replicas> pods using the built-in
|
||||
# autodiscovery feature: https://github.com/kubernetes/kube-state-metrics#automated-sharding
|
||||
# This is an experimental feature and there are no stability guarantees.
|
||||
autosharding:
|
||||
enabled: false
|
||||
|
||||
replicas: 1
|
||||
|
||||
# Change the deployment strategy when autosharding is disabled.
|
||||
# ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
|
||||
# The default is "RollingUpdate" as per Kubernetes defaults.
|
||||
# During a release, 'RollingUpdate' can lead to two running instances for a short period of time while 'Recreate' can create a small gap in data.
|
||||
# updateStrategy: Recreate
|
||||
|
||||
# Number of old history to retain to allow rollback
|
||||
# Default Kubernetes value is set to 10
|
||||
revisionHistoryLimit: 10
|
||||
|
||||
# List of additional cli arguments to configure kube-state-metrics
|
||||
# for example: --enable-gzip-encoding, --log-file, etc.
|
||||
# all the possible args can be found here: https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md
|
||||
extraArgs: []
|
||||
|
||||
# If false then the user will opt out of automounting API credentials.
|
||||
automountServiceAccountToken: true
|
||||
|
||||
service:
|
||||
port: 8080
|
||||
# Default to clusterIP for backward compatibility
|
||||
type: ClusterIP
|
||||
ipDualStack:
|
||||
enabled: false
|
||||
ipFamilies: ["IPv6", "IPv4"]
|
||||
ipFamilyPolicy: "PreferDualStack"
|
||||
nodePort: 0
|
||||
loadBalancerIP: ""
|
||||
# Only allow access to the loadBalancerIP from these IPs
|
||||
loadBalancerSourceRanges: []
|
||||
clusterIP: ""
|
||||
annotations: {}
|
||||
|
||||
## Additional labels to add to all resources
|
||||
customLabels: {}
|
||||
# app: kube-state-metrics
|
||||
|
||||
## Override selector labels
|
||||
selectorOverride: {}
|
||||
|
||||
## set to true to add the release label so scraping of the servicemonitor with kube-prometheus-stack works out of the box
|
||||
releaseLabel: false
|
||||
|
||||
hostNetwork: false
|
||||
|
||||
rbac:
|
||||
# If true, create & use RBAC resources
|
||||
create: true
|
||||
|
||||
# Set to a rolename to use existing role - skipping role creating - but still doing serviceaccount and rolebinding to it, rolename set here.
|
||||
# useExistingRole: your-existing-role
|
||||
|
||||
# If set to false - Run without Cluteradmin privs needed - ONLY works if namespace is also set (if useExistingRole is set this name is used as ClusterRole or Role to bind to)
|
||||
useClusterRole: true
|
||||
|
||||
# Add permissions for CustomResources' apiGroups in Role/ClusterRole. Should be used in conjunction with Custom Resource State Metrics configuration
|
||||
# Example:
|
||||
# - apiGroups: ["monitoring.coreos.com"]
|
||||
# resources: ["prometheuses"]
|
||||
# verbs: ["list", "watch"]
|
||||
extraRules: []
|
||||
|
||||
# Configure kube-rbac-proxy. When enabled, creates one kube-rbac-proxy container per exposed HTTP endpoint (metrics and telemetry if enabled).
|
||||
# The requests are served through the same service but requests are then HTTPS.
|
||||
kubeRBACProxy:
|
||||
enabled: false
|
||||
image:
|
||||
registry: quay.io
|
||||
repository: brancz/kube-rbac-proxy
|
||||
tag: v0.18.0
|
||||
sha: ""
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
# List of additional cli arguments to configure kube-rbac-prxy
|
||||
# for example: --tls-cipher-suites, --log-file, etc.
|
||||
# all the possible args can be found here: https://github.com/brancz/kube-rbac-proxy#usage
|
||||
extraArgs: []
|
||||
|
||||
## Specify security settings for a Container
|
||||
## Allows overrides and additional options compared to (Pod) securityContext
|
||||
## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
|
||||
containerSecurityContext:
|
||||
readOnlyRootFilesystem: true
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
|
||||
resources: {}
|
||||
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||
# choice for the user. This also increases chances charts run on environments with little
|
||||
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 64Mi
|
||||
# requests:
|
||||
# cpu: 10m
|
||||
# memory: 32Mi
|
||||
|
||||
## volumeMounts enables mounting custom volumes in rbac-proxy containers
|
||||
## Useful for TLS certificates and keys
|
||||
volumeMounts: []
|
||||
# - mountPath: /etc/tls
|
||||
# name: kube-rbac-proxy-tls
|
||||
# readOnly: true
|
||||
|
||||
serviceAccount:
|
||||
# Specifies whether a ServiceAccount should be created, require rbac true
|
||||
create: true
|
||||
# The name of the ServiceAccount to use.
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name:
|
||||
# Reference to one or more secrets to be used when pulling images
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||
imagePullSecrets: []
|
||||
# ServiceAccount annotations.
|
||||
# Use case: AWS EKS IAM roles for service accounts
|
||||
# ref: https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html
|
||||
annotations: {}
|
||||
# If false then the user will opt out of automounting API credentials.
|
||||
automountServiceAccountToken: true
|
||||
|
||||
prometheus:
|
||||
monitor:
|
||||
enabled: false
|
||||
annotations: {}
|
||||
additionalLabels: {}
|
||||
namespace: ""
|
||||
namespaceSelector: []
|
||||
jobLabel: ""
|
||||
targetLabels: []
|
||||
podTargetLabels: []
|
||||
## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted.
|
||||
##
|
||||
sampleLimit: 0
|
||||
|
||||
## TargetLimit defines a limit on the number of scraped targets that will be accepted.
|
||||
##
|
||||
targetLimit: 0
|
||||
|
||||
## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer.
|
||||
##
|
||||
labelLimit: 0
|
||||
|
||||
## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer.
|
||||
##
|
||||
labelNameLengthLimit: 0
|
||||
|
||||
## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer.
|
||||
##
|
||||
labelValueLengthLimit: 0
|
||||
selectorOverride: {}
|
||||
|
||||
## kube-state-metrics endpoint
|
||||
http:
|
||||
interval: ""
|
||||
scrapeTimeout: ""
|
||||
proxyUrl: ""
|
||||
## Whether to enable HTTP2 for servicemonitor
|
||||
enableHttp2: false
|
||||
honorLabels: false
|
||||
metricRelabelings: []
|
||||
relabelings: []
|
||||
scheme: ""
|
||||
## File to read bearer token for scraping targets
|
||||
bearerTokenFile: ""
|
||||
## Secret to mount to read bearer token for scraping targets. The secret needs
|
||||
## to be in the same namespace as the service monitor and accessible by the
|
||||
## Prometheus Operator
|
||||
bearerTokenSecret: {}
|
||||
# name: secret-name
|
||||
# key: key-name
|
||||
tlsConfig: {}
|
||||
|
||||
## selfMonitor endpoint
|
||||
metrics:
|
||||
interval: ""
|
||||
scrapeTimeout: ""
|
||||
proxyUrl: ""
|
||||
## Whether to enable HTTP2 for servicemonitor
|
||||
enableHttp2: false
|
||||
honorLabels: false
|
||||
metricRelabelings: []
|
||||
relabelings: []
|
||||
scheme: ""
|
||||
## File to read bearer token for scraping targets
|
||||
bearerTokenFile: ""
|
||||
## Secret to mount to read bearer token for scraping targets. The secret needs
|
||||
## to be in the same namespace as the service monitor and accessible by the
|
||||
## Prometheus Operator
|
||||
bearerTokenSecret: {}
|
||||
# name: secret-name
|
||||
# key: key-name
|
||||
tlsConfig: {}
|
||||
|
||||
## Specify if a Pod Security Policy for kube-state-metrics must be created
|
||||
## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/
|
||||
##
|
||||
podSecurityPolicy:
|
||||
enabled: false
|
||||
annotations: {}
|
||||
## Specify pod annotations
|
||||
## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor
|
||||
## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp
|
||||
## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl
|
||||
##
|
||||
# seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
|
||||
# seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default'
|
||||
# apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default'
|
||||
|
||||
additionalVolumes: []
|
||||
|
||||
## Configure network policy for kube-state-metrics
|
||||
networkPolicy:
|
||||
enabled: false
|
||||
# networkPolicy.flavor -- Flavor of the network policy to use.
|
||||
# Can be:
|
||||
# * kubernetes for networking.k8s.io/v1/NetworkPolicy
|
||||
# * cilium for cilium.io/v2/CiliumNetworkPolicy
|
||||
flavor: kubernetes
|
||||
|
||||
## Configure the cilium network policy kube-apiserver selector
|
||||
# cilium:
|
||||
# kubeApiServerSelector:
|
||||
# - toEntities:
|
||||
# - kube-apiserver
|
||||
|
||||
# egress:
|
||||
# - {}
|
||||
# ingress:
|
||||
# - {}
|
||||
# podSelector:
|
||||
# matchLabels:
|
||||
# app.kubernetes.io/name: kube-state-metrics
|
||||
|
||||
securityContext:
|
||||
enabled: true
|
||||
runAsGroup: 65534
|
||||
runAsUser: 65534
|
||||
fsGroup: 65534
|
||||
runAsNonRoot: true
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
## Specify security settings for a Container
|
||||
## Allows overrides and additional options compared to (Pod) securityContext
|
||||
## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
|
||||
containerSecurityContext:
|
||||
readOnlyRootFilesystem: true
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
|
||||
## Node labels for pod assignment
|
||||
## Ref: https://kubernetes.io/docs/user-guide/node-selection/
|
||||
nodeSelector: {}
|
||||
|
||||
## Affinity settings for pod assignment
|
||||
## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
|
||||
affinity: {}
|
||||
|
||||
## Tolerations for pod assignment
|
||||
## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
|
||||
tolerations: []
|
||||
|
||||
## Topology spread constraints for pod assignment
|
||||
## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/
|
||||
topologySpreadConstraints: []
|
||||
|
||||
# Annotations to be added to the deployment/statefulset
|
||||
annotations: {}
|
||||
|
||||
# Annotations to be added to the pod
|
||||
podAnnotations: {}
|
||||
|
||||
# Labels to be added to the pod
|
||||
podLabels: {}
|
||||
|
||||
## Assign a PriorityClassName to pods if set
|
||||
# priorityClassName: ""
|
||||
|
||||
# Ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
|
||||
podDisruptionBudget: {}
|
||||
|
||||
# Comma-separated list of metrics to be exposed.
|
||||
# This list comprises of exact metric names and/or regex patterns.
|
||||
# The allowlist and denylist are mutually exclusive.
|
||||
metricAllowlist: []
|
||||
|
||||
# Comma-separated list of metrics not to be enabled.
|
||||
# This list comprises of exact metric names and/or regex patterns.
|
||||
# The allowlist and denylist are mutually exclusive.
|
||||
metricDenylist: []
|
||||
|
||||
# Comma-separated list of additional Kubernetes label keys that will be used in the resource's
|
||||
# labels metric. By default the metric contains only name and namespace labels.
|
||||
# To include additional labels, provide a list of resource names in their plural form and Kubernetes
|
||||
# label keys you would like to allow for them (Example: '=namespaces=[k8s-label-1,k8s-label-n,...],pods=[app],...)'.
|
||||
# A single '*' can be provided per resource instead to allow any labels, but that has
|
||||
# severe performance implications (Example: '=pods=[*]').
|
||||
metricLabelsAllowlist: []
|
||||
# - namespaces=[k8s-label-1,k8s-label-n]
|
||||
|
||||
# Comma-separated list of Kubernetes annotations keys that will be used in the resource'
|
||||
# labels metric. By default the metric contains only name and namespace labels.
|
||||
# To include additional annotations provide a list of resource names in their plural form and Kubernetes
|
||||
# annotation keys you would like to allow for them (Example: '=namespaces=[kubernetes.io/team,...],pods=[kubernetes.io/team],...)'.
|
||||
# A single '*' can be provided per resource instead to allow any annotations, but that has
|
||||
# severe performance implications (Example: '=pods=[*]').
|
||||
metricAnnotationsAllowList: []
|
||||
# - pods=[k8s-annotation-1,k8s-annotation-n]
|
||||
|
||||
# Available collectors for kube-state-metrics.
|
||||
# By default, all available resources are enabled, comment out to disable.
|
||||
collectors:
|
||||
- certificatesigningrequests
|
||||
- configmaps
|
||||
- cronjobs
|
||||
- daemonsets
|
||||
- deployments
|
||||
- endpoints
|
||||
- horizontalpodautoscalers
|
||||
- ingresses
|
||||
- jobs
|
||||
- leases
|
||||
- limitranges
|
||||
- mutatingwebhookconfigurations
|
||||
- namespaces
|
||||
- networkpolicies
|
||||
- nodes
|
||||
- persistentvolumeclaims
|
||||
- persistentvolumes
|
||||
- poddisruptionbudgets
|
||||
- pods
|
||||
- replicasets
|
||||
- replicationcontrollers
|
||||
- resourcequotas
|
||||
- secrets
|
||||
- services
|
||||
- statefulsets
|
||||
- storageclasses
|
||||
- validatingwebhookconfigurations
|
||||
- volumeattachments
|
||||
|
||||
# Enabling kubeconfig will pass the --kubeconfig argument to the container
|
||||
kubeconfig:
|
||||
enabled: false
|
||||
# base64 encoded kube-config file
|
||||
secret:
|
||||
|
||||
# Enabling support for customResourceState, will create a configMap including your config that will be read from kube-state-metrics
|
||||
customResourceState:
|
||||
enabled: false
|
||||
# Add (Cluster)Role permissions to list/watch the customResources defined in the config to rbac.extraRules
|
||||
config: {}
|
||||
|
||||
# Enable only the release namespace for collecting resources. By default all namespaces are collected.
|
||||
# If releaseNamespace and namespaces are both set a merged list will be collected.
|
||||
releaseNamespace: false
|
||||
|
||||
# Comma-separated list(string) or yaml list of namespaces to be enabled for collecting resources. By default all namespaces are collected.
|
||||
namespaces: ""
|
||||
|
||||
# Comma-separated list of namespaces not to be enabled. If namespaces and namespaces-denylist are both set,
|
||||
# only namespaces that are excluded in namespaces-denylist will be used.
|
||||
namespacesDenylist: ""
|
||||
|
||||
## Override the deployment namespace
|
||||
##
|
||||
namespaceOverride: ""
|
||||
|
||||
resources: {}
|
||||
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||
# choice for the user. This also increases chances charts run on environments with little
|
||||
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 64Mi
|
||||
# requests:
|
||||
# cpu: 10m
|
||||
# memory: 32Mi
|
||||
|
||||
## Provide a k8s version to define apiGroups for podSecurityPolicy Cluster Role.
|
||||
## For example: kubeTargetVersionOverride: 1.14.9
|
||||
##
|
||||
kubeTargetVersionOverride: ""
|
||||
|
||||
# Enable self metrics configuration for service and Service Monitor
|
||||
# Default values for telemetry configuration can be overridden
|
||||
# If you set telemetryNodePort, you must also set service.type to NodePort
|
||||
selfMonitor:
|
||||
enabled: false
|
||||
# telemetryHost: 0.0.0.0
|
||||
# telemetryPort: 8081
|
||||
# telemetryNodePort: 0
|
||||
|
||||
# Enable vertical pod autoscaler support for kube-state-metrics
|
||||
verticalPodAutoscaler:
|
||||
enabled: false
|
||||
|
||||
# Recommender responsible for generating recommendation for the object.
|
||||
# List should be empty (then the default recommender will generate the recommendation)
|
||||
# or contain exactly one recommender.
|
||||
# recommenders: []
|
||||
# - name: custom-recommender-performance
|
||||
|
||||
# List of resources that the vertical pod autoscaler can control. Defaults to cpu and memory
|
||||
controlledResources: []
|
||||
# Specifies which resource values should be controlled: RequestsOnly or RequestsAndLimits.
|
||||
# controlledValues: RequestsAndLimits
|
||||
|
||||
# Define the max allowed resources for the pod
|
||||
maxAllowed: {}
|
||||
# cpu: 200m
|
||||
# memory: 100Mi
|
||||
# Define the min allowed resources for the pod
|
||||
minAllowed: {}
|
||||
# cpu: 200m
|
||||
# memory: 100Mi
|
||||
|
||||
# updatePolicy:
|
||||
# Specifies minimal number of replicas which need to be alive for VPA Updater to attempt pod eviction
|
||||
# minReplicas: 1
|
||||
# Specifies whether recommended updates are applied when a Pod is started and whether recommended updates
|
||||
# are applied during the life of a Pod. Possible values are "Off", "Initial", "Recreate", and "Auto".
|
||||
# updateMode: Auto
|
||||
|
||||
# volumeMounts are used to add custom volume mounts to deployment.
|
||||
# See example below
|
||||
volumeMounts: []
|
||||
# - mountPath: /etc/config
|
||||
# name: config-volume
|
||||
|
||||
# volumes are used to add custom volumes to deployment
|
||||
# See example below
|
||||
volumes: []
|
||||
# - configMap:
|
||||
# name: cm-for-volume
|
||||
# name: config-volume
|
||||
|
||||
# Extra manifests to deploy as an array
|
||||
extraManifests: []
|
||||
# - apiVersion: v1
|
||||
# kind: ConfigMap
|
||||
# metadata:
|
||||
# labels:
|
||||
# name: prometheus-extra
|
||||
# data:
|
||||
# extra-data: "value"
|
||||
|
||||
## Containers allows injecting additional containers.
|
||||
containers: []
|
||||
# - name: crd-init
|
||||
# image: kiwigrid/k8s-sidecar:latest
|
||||
|
||||
## InitContainers allows injecting additional initContainers.
|
||||
initContainers: []
|
||||
# - name: crd-sidecar
|
||||
# image: kiwigrid/k8s-sidecar:latest
|
||||
|
||||
## Settings for startup, liveness and readiness probes
|
||||
## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
|
||||
##
|
||||
|
||||
## Startup probe can optionally be enabled.
|
||||
##
|
||||
startupProbe:
|
||||
enabled: false
|
||||
failureThreshold: 3
|
||||
httpGet:
|
||||
httpHeaders: []
|
||||
scheme: http
|
||||
initialDelaySeconds: 0
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 5
|
||||
|
||||
## Liveness probe
|
||||
##
|
||||
livenessProbe:
|
||||
failureThreshold: 3
|
||||
httpGet:
|
||||
httpHeaders: []
|
||||
scheme: http
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 5
|
||||
|
||||
## Readiness probe
|
||||
##
|
||||
readinessProbe:
|
||||
failureThreshold: 3
|
||||
httpGet:
|
||||
httpHeaders: []
|
||||
scheme: http
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 5
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue