From 547d189a151799254aa31463168e66156834278f Mon Sep 17 00:00:00 2001 From: Mohammad Abdolirad Date: Tue, 28 Jul 2026 16:44:46 +0200 Subject: [PATCH] upgrade bitnami common chart to 2.31.4 - bump the deployah chart dependency and refresh Chart.lock - drop removed ingress supports helpers and always emit pathType - use modern HPA metric shape and update the golden - remove the unused umbrella chart example Fixes #43 --- examples/umbrella_chart/Chart.lock | 6 - examples/umbrella_chart/Chart.yaml | 15 - .../umbrella_chart/charts/helmet/.helmignore | 1 - .../umbrella_chart/charts/helmet/Chart.lock | 6 - .../umbrella_chart/charts/helmet/Chart.yaml | 11 - .../umbrella_chart/charts/helmet/README.md | 383 ------- .../charts/helmet/charts/common-2.29.1.tgz | Bin 16736 -> 0 bytes .../charts/helmet/templates/_NOTES.txt | 30 - .../charts/helmet/templates/_app.yaml | 30 - .../charts/helmet/templates/_configmap.yaml | 26 - .../charts/helmet/templates/_cronjob.yaml | 47 - .../charts/helmet/templates/_deployment.yaml | 169 ---- .../charts/helmet/templates/_helpers.tpl | 32 - .../charts/helmet/templates/_hpa.yaml | 49 - .../charts/helmet/templates/_ingress.yaml | 61 -- .../charts/helmet/templates/_podmonitor.yaml | 54 - .../charts/helmet/templates/_pvc.yaml | 30 - .../charts/helmet/templates/_secret.yaml | 21 - .../charts/helmet/templates/_service.yaml | 36 - .../helmet/templates/_serviceaccount.yaml | 17 - .../helmet/templates/_servicemonitor.yaml | 54 - .../charts/helmet/templates/_tls-secrets.yaml | 22 - .../helmet/templates/_tls-selfsigned.yaml | 24 - .../umbrella_chart/charts/helmet/values.yaml | 936 ------------------ .../umbrella_chart/charts/web1/Chart.yaml | 6 - .../charts/web1/templates/app.yaml | 1 - .../umbrella_chart/charts/web2/Chart.yaml | 6 - .../charts/web2/templates/app.yaml | 1 - examples/umbrella_chart/values.yaml | 35 - .../helm/chart/charts/deployah/Chart.lock | 6 +- .../helm/chart/charts/deployah/Chart.yaml | 2 +- .../charts/deployah/charts/common-2.29.1.tgz | Bin 16736 -> 0 bytes .../charts/deployah/charts/common-2.31.4.tgz | Bin 0 -> 20003 bytes .../chart/charts/deployah/templates/hpa.yaml | 8 - .../charts/deployah/templates/ingress.yaml | 6 +- .../helm/chart/charts/deployah/values.yaml | 5 +- ...scaler-autoscaling-hpa-production-api.yaml | 10 +- 37 files changed, 14 insertions(+), 2132 deletions(-) delete mode 100644 examples/umbrella_chart/Chart.lock delete mode 100644 examples/umbrella_chart/Chart.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/.helmignore delete mode 100644 examples/umbrella_chart/charts/helmet/Chart.lock delete mode 100644 examples/umbrella_chart/charts/helmet/Chart.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/README.md delete mode 100644 examples/umbrella_chart/charts/helmet/charts/common-2.29.1.tgz delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_NOTES.txt delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_app.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_configmap.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_cronjob.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_deployment.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_helpers.tpl delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_hpa.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_ingress.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_podmonitor.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_pvc.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_secret.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_service.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_serviceaccount.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_servicemonitor.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_tls-secrets.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/templates/_tls-selfsigned.yaml delete mode 100644 examples/umbrella_chart/charts/helmet/values.yaml delete mode 100644 examples/umbrella_chart/charts/web1/Chart.yaml delete mode 100644 examples/umbrella_chart/charts/web1/templates/app.yaml delete mode 100644 examples/umbrella_chart/charts/web2/Chart.yaml delete mode 100644 examples/umbrella_chart/charts/web2/templates/app.yaml delete mode 100644 examples/umbrella_chart/values.yaml delete mode 100644 internal/helm/chart/charts/deployah/charts/common-2.29.1.tgz create mode 100644 internal/helm/chart/charts/deployah/charts/common-2.31.4.tgz diff --git a/examples/umbrella_chart/Chart.lock b/examples/umbrella_chart/Chart.lock deleted file mode 100644 index cc923c6..0000000 --- a/examples/umbrella_chart/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: helmet - repository: file://charts/helmet - version: 0.1.0-alpha.1 -digest: sha256:ab91bc9dfec3b6408c78ece8ac8ac1c92289e3df228b2642e1caed8613b2d50e -generated: "2025-07-27T13:56:17.817620119+02:00" diff --git a/examples/umbrella_chart/Chart.yaml b/examples/umbrella_chart/Chart.yaml deleted file mode 100644 index 1951673..0000000 --- a/examples/umbrella_chart/Chart.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v2 -name: umbrella -description: An example Helm chart for an umbrella application -type: application -version: 0.1.0 -appVersion: 0.1.0 -dependencies: - - name: helmet - repository: file://charts/helmet - version: 0.1.0-alpha.1 - import-values: - - child: exports.defaults - parent: web1 - - child: exports.defaults - parent: web2 diff --git a/examples/umbrella_chart/charts/helmet/.helmignore b/examples/umbrella_chart/charts/helmet/.helmignore deleted file mode 100644 index 1e107f5..0000000 --- a/examples/umbrella_chart/charts/helmet/.helmignore +++ /dev/null @@ -1 +0,0 @@ -examples diff --git a/examples/umbrella_chart/charts/helmet/Chart.lock b/examples/umbrella_chart/charts/helmet/Chart.lock deleted file mode 100644 index be5cf46..0000000 --- a/examples/umbrella_chart/charts/helmet/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: oci://registry-1.docker.io/bitnamicharts - version: 2.29.1 -digest: sha256:7bf3bb546e534cd64cc861f46fcfe30e11055c6083df54a64539744ecbab018a -generated: "2025-01-24T10:40:17.531952014+01:00" diff --git a/examples/umbrella_chart/charts/helmet/Chart.yaml b/examples/umbrella_chart/charts/helmet/Chart.yaml deleted file mode 100644 index 100cbc4..0000000 --- a/examples/umbrella_chart/charts/helmet/Chart.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v2 -name: helmet -version: 0.1.0-alpha.1 -dependencies: -- name: common - repository: oci://registry-1.docker.io/bitnamicharts - version: 2.29.1 -description: Helmet is a library Helm Chart for grouping common logics. This chart - is not deployable by itself. -type: library -appVersion: 0.1.0-alpha.1 \ No newline at end of file diff --git a/examples/umbrella_chart/charts/helmet/README.md b/examples/umbrella_chart/charts/helmet/README.md deleted file mode 100644 index f9a2b79..0000000 --- a/examples/umbrella_chart/charts/helmet/README.md +++ /dev/null @@ -1,383 +0,0 @@ -# Helmet - -The Helmet is a [Helm Library Chart](https://helm.sh/docs/topics/library_charts/) that defines many chart templates like Deployment, Service, Ingress, etc which can used in other application charts. - -## Background - -In Helm 3, their team introduced the concept of a -[Library chart](https://helm.sh/docs/topics/library_charts/). - -> A library chart is a type of Helm chart that defines chart primitives or -definitions which can be shared by Helm templates in other charts. This -allows users to share snippets of code that can be re-used across charts, -avoiding repetition and keeping charts DRY. - -The Helmet library was created because we saw many charts requiring only a -few select configuration options in their Helm charts. - -In order to stay somewhat DRY (Don't Repeat Yourself) and keeping with Helm 3 -usage for a Library chart, we saw this pattern and decided it was worth it for -us to create a library. This means each one of application charts has a -dependency on what we call the `Helmet` library. - -## Prerequisites - -- Kubernetes 1.23+ -- Helm 3.9.0+ - -## Getting started - -1. Add the Helmet as a dependency to your chart. - -```yaml -# file: Chart.yaml - -dependencies: - - name: helmet - version: 0.12.0 - repository: https://charts.companyinfo.dev - import-values: # <== It is mandatory if you want to import the Helmet default values. - - defaults -``` - -1. Update the Helm dependencies: - -```shell -helm dependency update -``` - -1. Include the app template: - -```yaml -# file: templates/app.yaml - -{{ include "helmet.app" . }} -``` - -1. Configure your chart - -```yaml -# file: values.yaml - -image: - repository: nginx - -ports: - - name: http - containerPort: 80 - protocol: TCP - -ingress: - enabled: true -``` - -1. Install the chart: - -```shell -helm install nginx . -``` - -## Parameters - -### Global parameters - -| Name | Description | Value | -|---------------------------|-------------------------------------------------|-------| -| `global.imageRegistry` | Global Docker image registry | `""` | -| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | -| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | - -### Common parameters - -| Name | Description | Value | -|---------------------|------------------------------------------------------------------------------------------------------------|-------------------| -| `kubeVersion` | Force target Kubernetes version (using Helm capabilities if not set) | `""` | -| `nameOverride` | String to partially override common.names.fullname template with a string (will maintain the release name) | `""` | -| `fullnameOverride` | String to fully override common.names.fullname template with a string | `""` | -| `namespaceOverride` | String to fully override common.names.namespace template with a string | `""` | -| `clusterDomain` | Kubernetes Cluster Domain name | `"cluster.local"` | -| `commonLabels` | Labels to be added to all deployed resources | `{}` | -| `commonAnnotations` | Annotations to be added to all deployed resources | `{}` | - -### Image parameters - -| Name | Description | Value | -|---------------------|--------------------------------------------------------------------------------------------------------------|-------------| -| `image.registry` | Image registry | `docker.io` | -| `image.repository` | Image repository | `""` | -| `image.tag` | Image tag (immutable tags are recommended) | `latest` | -| `image.digest` | Image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `image.pullPolicy` | Image pull policy, Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' | `Always` | -| `image.pullSecrets` | Image pull secrets, specify an array of imagePullSecrets (secrets must be manually created in the namespace) | `[]` | - -### Deployment/Statefulset parameters - -| Name | Description | Value | -|-----------------------------------------|--------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------| -| `replicaCount` | Number of APP replicas | `1` | -| `revisionHistoryLimit` | The number of old history to retain to allow rollback | `10` | -| `ports` | List of ports to expose from the container | `[{"name": "http", "containerPort": "8080", "protocol": "TCP"}]` | -| `livenessProbe.enabled` | Enable livenessProbe on APP container (only main container) | `false` | -| `readinessProbe.enabled` | Enable readinessProbe on APP container (only main container) | `false` | -| `startupProbe.enabled` | Enable startupProbe on APP container (only main container) | `false` | -| `podRestartPolicy` | Set restart policy for all containers within the pod | `Always` | -| `podSecurityContext.enabled` | Enabled APP pods' Security Context | `false` | -| `podSecurityContext.fsGroup` | Set APP pod's Security Context fsGroup | `0` | -| `containerSecurityContext.enabled` | Enabled APP containers' Security Context (only main container) | `false` | -| `containerSecurityContext.runAsUser` | Set APP containers' Security Context runAsUser | `1001` | -| `containerSecurityContext.runAsNonRoot` | Set APP containers' Security Context runAsNonRoot | `true` | -| `lifecycleHooks` | for the APP main container to automate configuration before or after startup | `{}` | -| `resources.limits` | The resources limits for the APP container (only main container) | `{}` | -| `resources.requests` | The resources requests for the APP container (only main container) | `{}` | -| `hostAliases` | Add deployment host aliases | `[]` | -| `podLabels` | Additional pods' labels | `{}` | -| `podAnnotations` | Additional pods' annotations | `{}` | -| `podAffinityPreset` | Pod affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `soft` | -| `nodeAffinityPreset.type` | Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `nodeAffinityPreset.key` | Node label key to match Ignored if `affinity` is set. | `""` | -| `nodeAffinityPreset.values` | Node label values to match. Ignored if `affinity` is set. | `[]` | -| `affinity` | Affinity for pod assignment | `{}` | -| `nodeSelector` | Node labels for pod assignment | `{}` | -| `tolerations` | Tolerations for pod assignment | `[]` | -| `topologySpreadConstraints` | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template | `{}` | -| `priorityClassName` | Name of the existing priority class to be used by APP pods, priority class needs to be created beforehand | `""` | -| `schedulerName` | Use an alternate scheduler, e.g. "stork" | `""` | -| `terminationGracePeriodSeconds` | Seconds APP pod needs to terminate gracefully | `""` | -| `updateStrategy.type` | APP deployment strategy type | `RollingUpdate` | -| `updateStrategy.rollingUpdate` | APP deployment rolling update configuration parameters | `{}` | -| `extraVolumes` | Optionally specify extra list of additional volumes for the APP pod(s) | `[]` | -| `extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the APP container(s) | `[]` | -| `sidecars` | Add additional sidecar containers to the APP pod(s) | `[]` | -| `initContainers` | Add additional init containers to the APP pod(s) | `[]` | -| `command` | Override main container's command | `[]` | -| `args` | Override main container's args | `[]` | -| `envVars` | Environment variables to be set on APP container | `{} or []` | -| `envVarsConfigMap` | ConfigMap with environment variables | `""` | -| `envVarsSecret` | Secret with environment variables | `""` | - -### Autoscaling parameters - -| Name | Description | Value | -|----------------------------|----------------------------------------------------------------------------------------------------|---------| -| `autoscaling.enabled` | Enable APP deployment autoscaling (Deploy a HorizontalPodAutoscaler object for the APP deployment) | `false` | -| `autoscaling.minReplicas` | Minimum number of replicas to scale back | `3` | -| `autoscaling.maxReplicas` | Maximum number of replicas to scale out | `5` | -| `autoscaling.targetCPU` | Define the CPU target to trigger the scaling actions (utilization percentage) | `80` | -| `autoscaling.targetMemory` | Define the memory target to trigger the scaling actions (utilization percentage) | `80` | -| `autoscaling.metrics` | Metrics to use when deciding to scale the deployment (evaluated as a template) | `[]` | - -### ConfigMap parameters - -| Name | Description | Value | -|-------------------------|-------------------------------------------------|---------------| -| `configMap.mounted` | Mount the ConfigMap in the main container | `false` | -| `configMap.mountPath` | ConfigMap mount path | `/app/config` | -| `configMap.subPath` | ConfigMap sub path | `""` | -| `configMap.data` | ConfigMap data | `{}` | -| `configMap.annotations` | Additional custom annotations for the ConfigMap | `{}` | -| `configMap.labels` | Additional custom labels for the ConfigMap | `{}` | - -### Secret parameters - -| Name | Description | Value | -|----------------------|-------------------------------------------------------------------------|----------| -| `secret.type` | The type is used to facilitate programmatic handling of the Secret data | `Opaque` | -| `secret.data` | Store data in key-value pairs (base64 encoded) | `{}` | -| `secret.stringData` | Store data in key-value pairs | `{}` | -| `secret.annotations` | Additional custom annotations for the Secret | `{}` | -| `secret.labels` | Additional custom labels for the Secret | `{}` | - -### Traffic Exposure (Ingress) parameters - -| Name | Description | Value | -|----------------------------|-----------------------------------------------------------------------------------------------|--------------------------| -| `ingress.enabled` | Enable ingress resource for the APP | `false` | -| `ingress.path` | Path for the default host | `/` | -| `ingress.apiVersion` | Override API Version (automatically detected if not set) | `""` | -| `ingress.pathType` | Ingress path type | `ImplementationSpecific` | -| `ingress.hostname` | Default host for the ingress resource, a host pointing to this will be created | `app.local` | -| `ingress.annotations` | Additional annotations for the Ingress resource | `{}` | -| `ingress.ingressClassName` | Set the ingerssClassName on the ingress record for k8s 1.18+ | `""` | -| `ingress.tls` | Enable TLS configuration for the hostname defined at ingress.hostname parameter | `false` | -| `ingress.extraHosts` | An array with additional hostname(s) to be covered with the ingress record | `[]` | -| `ingress.extraPaths` | Any additional arbitrary paths that may need to be added to the ingress under the main host | `[]` | -| `ingress.selfSigned` | Create a TLS secret for this ingress record using self-signed certificates generated by Helm | `false` | -| `ingress.extraTls` | TLS configuration for additional hostname(s) to be covered with this ingress record | `[]` | -| `ingress.secrets` | If you're providing your own certificates, please use this to add the certificates as secrets | `[]` | -| `ingress.existingSecret` | It is you own the certificate as secret | `""` | -| `ingress.extraRules` | Additional rules to be covered with this ingress record | `[]` | - -### Traffic Exposure (Service) parameters - -| Name | Description | Value | -|------------------------------------|------------------------------------------------------------------|---------------------------------------------------------------------------| -| `service.type` | APP service type | `ClusterIP` | -| `service.ports` | APP service ports | `[{"name": "http", "protocol": "TCP", "port": 80, "targetPort": "http"}]` | -| `service.sessionAffinity` | Control where client requests go, to the same pod or round-robin | `None` | -| `service.clusterIP` | APP service Cluster IP | `""` | -| `service.loadBalancerIP` | APP service Load Balancer IP | `""` | -| `service.loadBalancerSourceRanges` | APP service Load Balancer sources | `[]` | -| `service.externalTrafficPolicy` | APP service external traffic policy | `Cluster` | -| `service.annotations` | Additional custom annotations for APP service | `{}` | - -### Prometheus Operator ServiceMonitor parameters - -| Name | Description | Value | -|------------------------------------|-------------------------------------------------------------------------------------------------|-----------| -| `serviceMonitor.enabled` | Specify if a ServiceMonitor will be deployed for Prometheus Operator | `false` | -| `serviceMonitor.namespace` | Namespace in which Prometheus is running | `""` | -| `serviceMonitor.labels` | Additional ServiceMonitor labels (evaluated as a template) | `{}` | -| `serviceMonitor.annotations` | Additional ServiceMonitor annotations (evaluated as a template) | `{}` | -| `serviceMonitor.jobLabel` | The name of the label on the target service to use as the job name in Prometheus | `""` | -| `serviceMonitor.honorLabels` | The honorLabels chooses the metric's labels on collisions with target labels | `false` | -| `serviceMonitor.interval` | How frequently to scrape metrics | `""` | -| `serviceMonitor.scrapeTimeout` | Timeout after which the scrape is ended | `""` | -| `serviceMonitor.metricRelabelings` | Specify additional relabeling of metrics | `[]` | -| `serviceMonitor.relabelings` | Specify general relabeling | `[]` | -| `serviceMonitor.selector` | Prometheus instance selector labels | `{}` | -| `serviceMonitor.namespaceSelector` | The namespaceSelector is a selector for selecting either all namespaces or a list of namespaces | `{}` | -| `serviceMonitor.port` | The port used by ServiceMonitor | `http` | -| `serviceMonitor.path` | The path used by ServiceMonitor | `metrics` | - -### Prometheus Operator PodMonitor parameters - -| Name | Description | Value | -|------------------------------------|-------------------------------------------------------------------------------------------------|-----------| -| `podMonitor.enabled` | Specify if a PodMonitor will be deployed for Prometheus Operator | `false` | -| `podMonitor.namespace` | Namespace in which Prometheus is running | `""` | -| `podMonitor.labels` | Additional PodMonitor labels (evaluated as a template) | `{}` | -| `podMonitor.annotations` | Additional PodMonitor annotations (evaluated as a template) | `{}` | -| `podMonitor.jobLabel` | The name of the label on the target service to use as the job name in Prometheus | `""` | -| `podMonitor.honorLabels` | The honorLabels chooses the metric's labels on collisions with target labels | `false` | -| `podMonitor.interval` | How frequently to scrape metrics | `""` | -| `podMonitor.scrapeTimeout` | Timeout after which the scrape is ended | `""` | -| `podMonitor.metricRelabelings` | Specify additional relabeling of metrics | `[]` | -| `podMonitor.relabelings` | Specify general relabeling | `[]` | -| `podMonitor.selector` | Prometheus instance selector labels | `{}` | -| `podMonitor.namespaceSelector` | The namespaceSelector is a selector for selecting either all namespaces or a list of namespaces | `{}` | -| `podMonitor.port` | The port used by PodMonitor | `http` | -| `podMonitor.path` | The path used by PodMonitor | `metrics` | - -### ServiceAccount parameters - -| Name | Description | Value | -|-----------------------------------------------|------------------------------------------------------------------------|---------| -| `serviceAccount.create` | Enable creation of ServiceAccount for APP pods | `false` | -| `serviceAccount.name` | The name of the ServiceAccount to use | `""` | -| `serviceAccount.automountServiceAccountToken` | Allows auto mount of ServiceAccountToken on the serviceAccount created | `true` | -| `serviceAccount.annotations` | Additional custom annotations for the ServiceAccount | `{}` | -| `serviceAccount.labels` | Additional custom labels for the ServiceAccount | `{}` | - -Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, - -```shell -helm install my-release --set ingress.hostname=example.com,serviceMonitor.enabled=true company/app -``` - -The above command sets the APP Ingress hostname to `example.com` and enabled the ServiceMonitor. - -Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example, - -```console -helm install my-release -f values.yaml company/app -``` - -> **Tip**: You can use the default [values.yaml](values.yaml) just by [`import-values`](#Getting started) - -## Configuration and installation details - -It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image. - -### Ingress - -This chart provides support for ingress resources. If you have an ingress controller installed on your cluster, such as nginx-ingress or traefik you can utilize the ingress controller to serve your application. -To enable ingress integration, please set `ingress.enabled` to `true`. - -#### Hosts - -Most likely you will only want to have one hostname that maps to this APP installation. If that's your case, the property `ingress.hostname` will set it. However, it is possible to have more than one host. To facilitate this, the `ingress.extraHosts` object can be specified as an array. You can also use `ingress.extraTLS` to add the TLS configuration for extra hosts. - -For each host indicated at `ingress.extraHosts`, please indicate a `name`, `path`, and any `annotations` that you may want the ingress controller to know about. - -For annotations, please see [this document](https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md). Not all annotations are supported by all ingress controllers, but this document does a good job of indicating which annotation is supported by many popular ingress controllers. - -### TLS Secrets - -This chart will facilitate the creation of TLS secrets for use with the ingress controller, however, this is not required. There are three common use cases: - -- Helm generates/manages certificate secrets -- User generates/manages certificates separately -- An additional tool (like cert-manager) manages the secrets for the application - -In the first two cases, one will need a certificate and a key. We would expect them to look like this: - -- certificate files should look like (and there can be more than one certificate if there is a certificate chain) - -```text ------BEGIN CERTIFICATE----- -MIID6TCCAtGgAwIBAgIJAIaCwivkeB5EMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -... -jScrvkiBO65F46KioCL9h5tDvomdU1aqpI/CBzhvZn1c0ZTf87tGQR8NK7v7 ------END CERTIFICATE----- -``` - -- keys should look like: - -```text ------BEGIN RSA PRIVATE KEY----- -MIIEogIBAAKCAQEAvLYcyu8f3skuRyUgeeNpeDvYBCDcgq+LsWap6zbX5f8oLqp4 -... -wrj2wDbCDCFmfqnSJ+dKI3vFLlEz44sAV8jX/kd4Y6ZTQhlLbYc= ------END RSA PRIVATE KEY----- -``` - -If you are going to use Helm to manage the certificates, please copy these values into the `certificate` and `key` values for a given `ingress.secrets` entry. - -If you are going to manage TLS secrets outside of Helm, please know that you can create a TLS secret (named `app.local-tls` for example). - -Please see [this example](https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx/examples/tls) for more information. - -### Adding environment variables - -In case you want to add extra environment variables (useful for advanced operations like custom init scripts), you can use the `envVars` property. - -```yaml -envVars: - - name: LOG_LEVEL - value: error -``` - -Alternatively, you can use a ConfigMap or a Secret with the environment variables. To do so, use the `.envVarsConfigMap` or the `envVarsSecret` properties. - -### Setting Pod's affinity - -This chart allows you to set your custom affinity using the `affinity` parameter. Find more information about Pod's affinity in the [kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity). - -As an alternative, you can use of the preset configurations for pod affinity, pod anti-affinity, and node affinity available at the [bitnami/common](https://github.com/bitnami/charts/tree/master/bitnami/common#affinities) chart. To do so, set the `podAffinityPreset`, `podAntiAffinityPreset`, or `nodeAffinityPreset` parameters. - -### Sidecars and Init Containers - -If you have a need for additional containers to run within the same pod as Redis®, you can do so via the `sidecars` config parameter. Simply define your container according to the Kubernetes container spec. - -```yaml -sidecars: - - name: your-image-name - image: your-image - imagePullPolicy: Always - ports: - - name: portName - containerPort: 1234 -``` - -Similarly, you can add extra init containers using the `initContainers` parameter. - -```yaml -initContainers: - - name: your-image-name - image: your-image - imagePullPolicy: Always - ports: - - name: portName - containerPort: 1234 -``` diff --git a/examples/umbrella_chart/charts/helmet/charts/common-2.29.1.tgz b/examples/umbrella_chart/charts/helmet/charts/common-2.29.1.tgz deleted file mode 100644 index 8b9abbbc5b6c62a743cc0fb041d26b199c4313c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16736 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 H0EPhoi4COk diff --git a/examples/umbrella_chart/charts/helmet/templates/_NOTES.txt b/examples/umbrella_chart/charts/helmet/templates/_NOTES.txt deleted file mode 100644 index 51b5080..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_NOTES.txt +++ /dev/null @@ -1,30 +0,0 @@ -{{- define "helmet.notes" -}} -CHART NAME: {{ .Chart.Name }} -CHART VERSION: {{ .Chart.Version }} -APP VERSION: {{ .Chart.AppVersion }} - -1. Get the "{{ .Chart.Name }}" URL by running these commands: -{{- if .Values.ingress.enabled }} - - You should be able to access your new "{{ .Chart.Name }}" installation through: - http://{{- .Values.ingress.hostname }}/ -{{- else if eq .Values.service.type "NodePort" }} - - export NODE_PORT=$(kubectl get --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.names.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if eq .Values.service.type "LoadBalancer" }} - - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - Watch the status with: 'kubectl get svc --namespace {{ include "common.names.namespace" . }} -w {{ include "common.names.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.names.namespace" . }} {{ include "common.names.fullname" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") -{{- $port:=(coalesce .Values.service.ports.http .Values.service.port) | toString }} - echo "{{ .Chart.Name }} URL: http://$SERVICE_IP{{- if ne $port "80" }}:{{ coalesce .Values.service.ports.http .Values.service.port }}{{ end }}/" -{{- else if eq .Values.service.type "ClusterIP" }} - - export POD_NAME=$(kubectl get pods --namespace {{ include "common.names.namespace" . }} -l "app.kubernetes.io/name={{ include "common.names.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - export CONTAINER_PORT=$(kubectl get pod --namespace {{ include "common.names.namespace" . }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ include "common.names.namespace" . }} port-forward $POD_NAME 8080:$CONTAINER_PORT -{{- end }} -{{- end }} diff --git a/examples/umbrella_chart/charts/helmet/templates/_app.yaml b/examples/umbrella_chart/charts/helmet/templates/_app.yaml deleted file mode 100644 index b60ff84..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_app.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{- define "helmet.app" -}} -{{- if .Values.configMap.data }} -{{ include "helmet.configmap" . }} -{{- end }} - -{{- if .Values.image.repository }} -{{ include "helmet.deployment" . }} -{{- end }} - -{{ include "helmet.persistence" . }} - -{{ include "helmet.hpa" . }} -{{ include "helmet.ingress" . }} - -{{- if or .Values.secret.data .Values.secret.stringData }} -{{ include "helmet.secret" . }} -{{- end }} - -{{ include "helmet.tls.secrets" . }} -{{ include "helmet.tls.selfsigned" . }} - -{{- if and .Values.ports .Values.service.ports }} -{{ include "helmet.service" . }} -{{- end }} - -{{ include "helmet.serviceaccount" . }} -{{ include "helmet.servicemonitor" . }} -{{ include "helmet.cronjob" . }} -{{ include "helmet.podmonitor" . }} -{{- end }} diff --git a/examples/umbrella_chart/charts/helmet/templates/_configmap.yaml b/examples/umbrella_chart/charts/helmet/templates/_configmap.yaml deleted file mode 100644 index 546f9f6..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_configmap.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- define "helmet.configmap" -}} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - {{- $labels := include "common.tplvalues.merge" (dict "values" (list .Values.configMap.labels .Values.commonLabels) "context" .) | fromYaml }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.configMap.annotations .Values.commonAnnotations) "context" .) | fromYaml }} - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} - {{- end }} -{{- if .Values.configMap.data }} -data: - {{- range $k, $v := .Values.configMap.data }} - {{- $configKey := (include "common.tplvalues.render" (dict "value" $k "context" $)) }} - {{- $configValue := (include "common.tplvalues.render" (dict "value" $v "context" $)) }} - {{- if or (typeIs "map[string]interface {}" $v) (typeIs "string" $v) }} - {{ $configKey }}: |- {{ $configValue | nindent 4 }} - {{- else }} - {{ $configKey }}: {{ $configValue }} - {{- end }} - {{- end }} -{{- end }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_cronjob.yaml b/examples/umbrella_chart/charts/helmet/templates/_cronjob.yaml deleted file mode 100644 index 8f3ef4f..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_cronjob.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- define "helmet.cronjob" -}} -{{- if .Values.cronjob.enabled -}} ---- -apiVersion: {{ include "common.capabilities.cronjob.apiVersion" . }} -kind: CronJob -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - concurrencyPolicy: {{ .Values.cronjob.concurrencyPolicy | quote }} - schedule: {{ .Values.cronjob.schedule | quote }} - successfulJobsHistoryLimit: {{ .Values.cronjob.successfulJobsHistoryLimit }} - jobTemplate: - spec: - template: - metadata: - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 12 }} - {{- if .Values.cronjob.podAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.cronjob.podAnnotations "context" $) | nindent 12 }} - {{- end }} - spec: - {{- include "common.images.pullSecrets" (dict "images" (list .Values.image) "global" .Values.global) | indent 10 }} - {{- if and .Values.cronjob.nodeSelector .Values.nodeSelector }} - nodeSelector: {{- default (toYaml .Values.nodeSelector) (toYaml .Values.cronjob.nodeSelector) | nindent 12 }} - {{- end }} - {{- if and .Values.cronjob.tolerations .Values.tolerations }} - tolerations: {{- default (toYaml .Values.tolerations) (toYaml .Values.cronjob.tolerations) | nindent 12 }} - {{- end }} - restartPolicy: OnFailure - {{- if .Values.podSecurityContext.enabled }} - securityContext: {{- omit .Values.podSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.cronjob.initContainers }} - initContainers: {{- include "common.tplvalues.render" (dict "value" .Values.cronjob.initContainers "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.cronjob.containers }} - containers: {{- include "common.tplvalues.render" (dict "value" .Values.cronjob.containers "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.cronjob.volumes }} - volumes: {{- include "common.tplvalues.render" (dict "value" .Values.cronjob.volumes "context" $) | nindent 12 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/examples/umbrella_chart/charts/helmet/templates/_deployment.yaml b/examples/umbrella_chart/charts/helmet/templates/_deployment.yaml deleted file mode 100644 index 2704199..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_deployment.yaml +++ /dev/null @@ -1,169 +0,0 @@ -{{- define "helmet.deployment" -}} ---- -apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - {{- $labels := include "common.tplvalues.merge" (dict "values" (list .Values.labels .Values.commonLabels) "context" .) | fromYaml }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.annotations .Values.commonAnnotations) "context" .) | fromYaml }} - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.podLabels .Values.commonLabels) "context" .) | fromYaml }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} - {{- if .Values.updateStrategy }} - strategy: {{- toYaml .Values.updateStrategy | nindent 4 }} - {{- end }} - template: - metadata: - annotations: - {{- if .Values.podAnnotations }} - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.configMap.data }} - checksum/configMap: {{ include "helmet.configmap" . | sha256sum }} - {{- end }} - {{- if or .Values.secret.data .Values.secret.stringData }} - checksum/secret: {{ include "helmet.secret" . | sha256sum }} - {{- end }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} - spec: - {{- if .Values.initContainers }} - initContainers: {{- include "common.tplvalues.render" (dict "value" .Values.initContainers "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podRestartPolicy }} - restartPolicy: {{ .Values.podRestartPolicy }} - {{- end }} - containers: - - name: {{ .Chart.Name }} - {{- if .Values.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - image: {{ include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) }} - imagePullPolicy: {{ default (eq .Values.image.tag "latest" | ternary "Always" "IfNotPresent") .Values.image.pullPolicy }} - {{- if .Values.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.command "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.args "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.envVars }} - env: {{- include "helmet.toEnvArray" (dict "envVars" .Values.envVars "context" $) | indent 12 }} - {{- end }} - {{- if or .Values.envVarsConfigMap .Values.envVarsSecret }} - envFrom: - {{- if .Values.envVarsConfigMap }} - - configMapRef: - name: {{ include "common.tplvalues.render" (dict "value" .Values.envVarsConfigMap "context" $) }} - {{- end }} - {{- if .Values.envVarsSecret }} - - secretRef: - name: {{ include "common.tplvalues.render" (dict "value" .Values.envVarsSecret "context" $) }} - {{- end }} - {{- end }} - {{- if .Values.ports }} - ports: {{- include "common.tplvalues.render" (dict "value" .Values.ports "context" $) | nindent 12 }} - {{- end }} - {{- if and .Values.livenessProbe.enabled (omit .Values.livenessProbe "enabled") }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.livenessProbe "enabled") "context" $) | nindent 12 }} - {{- end }} - {{- if and .Values.readinessProbe.enabled (omit .Values.readinessProbe "enabled") }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readinessProbe "enabled") "context" $) | nindent 12 }} - {{- end }} - {{- if and .Values.startupProbe.enabled (omit .Values.startupProbe "enabled") }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.startupProbe "enabled") "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.lifecycleHooks }} - lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.lifecycleHooks "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 12 }} - {{- end }} - {{- if or .Values.configMap.mounted .Values.extraVolumeMounts .Values.persistence.enabled }} - volumeMounts: - {{- if .Values.configMap.mounted }} - - name: {{ include "common.names.fullname" . }} - mountPath: {{ .Values.configMap.mountPath }} - {{- if .Values.configMap.subPath }} - subPath: {{ .Values.configMap.subPath }} - {{- end }} - {{- end }} - {{- if .Values.persistence.enabled }} - - name: data - mountPath: {{ .Values.persistence.mountPath }} - {{- if .Values.persistence.subPath }} - subPath: {{ .Values.persistence.subPath }} - {{- end }} - {{- end }} - {{- if .Values.extraVolumeMounts }} - {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumeMounts "context" $) | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.sidecars }} - {{- include "common.tplvalues.render" (dict "value" .Values.sidecars "context" $) | nindent 8 }} - {{- end }} - {{- if or .Values.configMap.mounted .Values.extraVolumes .Values.persistence.enabled }} - volumes: - {{- if .Values.configMap.mounted }} - - name: {{ include "common.names.fullname" . }} - configMap: - name: {{ include "common.names.fullname" . }} - {{- end }} - {{- if .Values.persistence.enabled }} - - name: data - persistentVolumeClaim: - claimName: {{ default (include "common.names.fullname" .) .Values.persistence.existingClaim }} - {{- end }} - {{- if .Values.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.extraVolumes "context" $) | nindent 8 }} - {{- end }} - {{- end }} - {{- include "common.images.renderPullSecrets" (dict "images" (list .Values.image) "context" $) | nindent 6 }} - {{- if .Values.hostAliases }} - hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.hostAliases "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- else if or .Values.podAffinityPreset .Values.podAntiAffinityPreset .Values.nodeAffinityPreset.type }} - affinity: - {{- if not (empty .Values.podAffinityPreset) }} - podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAffinityPreset "customLabels" $podLabels "context" $) | nindent 10 }} - {{- end }} - {{- if not (empty .Values.podAntiAffinityPreset) }} - podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAntiAffinityPreset "customLabels" $podLabels "context" $) | nindent 10 }} - {{- end }} - {{- if not (empty .Values.nodeAffinityPreset.type) }} - nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.nodeAffinityPreset.type "key" .Values.nodeAffinityPreset.key "values" .Values.nodeAffinityPreset.values) | nindent 10 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.priorityClassName }} - priorityClassName: {{ .Values.priorityClassName | quote }} - {{- end }} - {{- if .Values.topologySpreadConstraints }} - topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.topologySpreadConstraints "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.schedulerName }} - schedulerName: {{ .Values.schedulerName | quote }} - {{- end }} - {{- if .Values.podSecurityContext.enabled }} - securityContext: {{- omit .Values.podSecurityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - {{- if .Values.terminationGracePeriodSeconds }} - terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }} - {{- end }} - serviceAccountName: {{ include "helmet.serviceAccountName" . }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_helpers.tpl b/examples/umbrella_chart/charts/helmet/templates/_helpers.tpl deleted file mode 100644 index fab16ff..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_helpers.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{{/* -Create the name of the service account to use -*/}} -{{- define "helmet.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "common.names.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - - -{{/* -Render an array of env variables. The input can be a map or a slice. -Values can be templates using the "common.tplvalues.render" helper, but changes to scope are not processed. -Usage: -{{ include "helmet.toEnvArray" ( dict "envVars" .Values.envVars "context" $ ) }} -*/}} -{{- define "helmet.toEnvArray" -}} -{{- if kindIs "map" .envVars }} -{{- range $key, $val := .envVars }} -- name: {{ $key | quote }} -{{- if kindIs "string" $val }} - value: {{ (include "common.tplvalues.render" (dict "value" $val "context" $.context)) | quote }} -{{- else if kindIs "map" $val }} -{{ include "common.tplvalues.render" (dict "value" (omit $val "name") "context" $.context) | indent 2 }} -{{- end -}} -{{- end -}} -{{- else if kindIs "slice" .envVars }} -{{ include "common.tplvalues.render" (dict "value" .envVars "context" $.context) }} -{{- end }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_hpa.yaml b/examples/umbrella_chart/charts/helmet/templates/_hpa.yaml deleted file mode 100644 index 1a92841..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_hpa.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- define "helmet.hpa" -}} -{{- if .Values.autoscaling.enabled }} ---- -apiVersion: {{ include "common.capabilities.hpa.apiVersion" ( dict "context" $ ) }} -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - scaleTargetRef: - apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} - kind: Deployment - name: {{ include "common.names.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetCPU }} - - type: Resource - resource: - name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.autoscaling.targetCPU }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetCPU }} - {{- end }} - {{- end }} - {{- if .Values.autoscaling.targetMemory }} - - type: Resource - resource: - name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.autoscaling.targetMemory }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetMemory }} - {{- end }} - {{- end }} - {{- if .Values.autoscaling.metrics }} - {{- include "common.tplvalues.render" (dict "value" .Values.autoscaling.metrics "context" $) | nindent 4 }} - {{- end }} -{{- end }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_ingress.yaml b/examples/umbrella_chart/charts/helmet/templates/_ingress.yaml deleted file mode 100644 index 44d73f9..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_ingress.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- define "helmet.ingress" -}} -{{- if .Values.ingress.enabled -}} ---- -apiVersion: {{ include "common.capabilities.ingress.apiVersion" . }} -kind: Ingress -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.ingress.annotations .Values.commonAnnotations) "context" .) | fromYaml }} - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} - ingressClassName: {{ include "common.tplvalues.render" (dict "value" .Values.ingress.ingressClassName "context" $) | quote }} - {{- end }} - rules: - {{- if .Values.ingress.hostname }} - - host: {{ include "common.tplvalues.render" (dict "value" .Values.ingress.hostname "context" $) }} - http: - paths: - {{- if .Values.ingress.extraPaths }} - {{- toYaml .Values.ingress.extraPaths | nindent 10 }} - {{- end }} - - path: {{ .Values.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} - pathType: {{ .Values.ingress.pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" .) "servicePort" "http" "context" $) | nindent 14 }} - {{- end }} - {{- range .Values.ingress.extraHosts }} - - host: {{ include "common.tplvalues.render" (dict "value" .name "context" $) | quote }} - http: - paths: - - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} - pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" $) "servicePort" "http" "context" $) | nindent 14 }} - {{- end }} - {{- if .Values.ingress.extraRules }} - {{- include "common.tplvalues.render" (dict "value" .Values.ingress.extraRules "context" $) | nindent 4 }} - {{- end }} - {{- if or (and .Values.ingress.tls (or .Values.ingress.existingSecret (include "common.ingress.certManagerRequest" ( dict "annotations" .Values.ingress.annotations )) .Values.ingress.selfSigned)) .Values.ingress.extraTls }} - tls: - {{- if and .Values.ingress.tls (or .Values.ingress.existingSecret (include "common.ingress.certManagerRequest" ( dict "annotations" .Values.ingress.annotations )) .Values.ingress.selfSigned) }} - - hosts: - - {{ include "common.tplvalues.render" (dict "value" .Values.ingress.hostname "context" $) | quote }} - {{- if .Values.ingress.existingSecret }} - secretName: {{ .Values.ingress.existingSecret }} - {{- else }} - secretName: {{ include "common.tplvalues.render" (dict "value" (printf "%s-tls" .Values.ingress.hostname) "context" $) }} - {{- end }} - {{- end }} - {{- if .Values.ingress.extraTls }} - {{- include "common.tplvalues.render" ( dict "value" .Values.ingress.extraTls "context" $ ) | nindent 4 }} - {{- end }} - {{- end }} -{{- end }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_podmonitor.yaml b/examples/umbrella_chart/charts/helmet/templates/_podmonitor.yaml deleted file mode 100644 index d035a4a..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_podmonitor.yaml +++ /dev/null @@ -1,54 +0,0 @@ -{{- define "helmet.podmonitor" -}} -{{- if .Values.podMonitor.enabled }} ---- -apiVersion: monitoring.coreos.com/v1 -kind: PodMonitor -metadata: - name: {{ include "common.names.fullname" . }} - {{- if .Values.podMonitor.namespace }} - namespace: {{ .Values.podMonitor.namespace | quote }} - {{- else }} - namespace: {{ include "common.names.namespace" . | quote }} - {{- end }} - {{- $labels := include "common.tplvalues.merge" (dict "values" (list .Values.podMonitor.labels .Values.commonLabels) "context" .) | fromYaml }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.podMonitor.annotations .Values.commonAnnotations) "context" .) | fromYaml }} - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if .Values.podMonitor.jobLabel }} - jobLabel: {{ .Values.podMonitor.jobLabel }} - {{- end }} - podMetricsEndpoints: - - port: {{ .Values.podMonitor.port | quote }} - path: {{ .Values.podMonitor.path | quote }} - {{- if .Values.podMonitor.interval }} - interval: {{ .Values.podMonitor.interval }} - {{- end }} - {{- if .Values.podMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.podMonitor.scrapeTimeout }} - {{- end }} - {{- if .Values.podMonitor.relabelings }} - relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.podMonitor.relabelings "context" $) | nindent 6 }} - {{- end }} - {{- if .Values.podMonitor.metricRelabelings }} - metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.podMonitor.metricRelabelings "context" $) | nindent 6 }} - {{- end }} - {{- if .Values.podMonitor.honorLabels }} - honorLabels: {{ .Values.podMonitor.honorLabels }} - {{- end }} - namespaceSelector: - {{- if .Values.podMonitor.namespaceSelector }} - {{- include "common.tplvalues.render" (dict "value" .Values.podMonitor.namespaceSelector "context" $) | indent 4 }} - {{- else }} - matchNames: - - {{ include "common.names.namespace" . | quote }} - {{- end }} - selector: - matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }} - {{- if .Values.podMonitor.selector }} - {{- include "common.tplvalues.render" (dict "value" .Values.podMonitor.selector "context" $) | nindent 6 }} - {{- end }} -{{- end }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_pvc.yaml b/examples/umbrella_chart/charts/helmet/templates/_pvc.yaml deleted file mode 100644 index 76eeadf..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_pvc.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{- define "helmet.persistence" -}} -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}} ---- -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if or .Values.persistence.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.persistence.annotations .Values.commonAnnotations) "context" .) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - accessModes: - {{- range .Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} - {{- if .Values.persistence.selector }} - selector: {{- include "common.tplvalues.render" (dict "value" .Values.persistence.selector "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.persistence.dataSource }} - dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.persistence.dataSource "context" $) | nindent 4 }} - {{- end }} - {{- include "common.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) | nindent 2 }} -{{- end -}} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_secret.yaml b/examples/umbrella_chart/charts/helmet/templates/_secret.yaml deleted file mode 100644 index 1805a88..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_secret.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- define "helmet.secret" -}} ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - {{- $labels := include "common.tplvalues.merge" (dict "values" (list .Values.secret.labels .Values.commonLabels) "context" .) | fromYaml }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.secret.annotations .Values.commonAnnotations) "context" .) | fromYaml }} - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} - {{- end }} -type: {{ .Values.secret.type }} -{{- if .Values.secret.data }} -data: {{- include "common.tplvalues.render" (dict "value" .Values.secret.data "context" $) | nindent 2 }} -{{- end }} -{{- if .Values.secret.stringData }} -stringData: {{- include "common.tplvalues.render" (dict "value" .Values.secret.stringData "context" $) | nindent 2 }} -{{- end }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_service.yaml b/examples/umbrella_chart/charts/helmet/templates/_service.yaml deleted file mode 100644 index 8805480..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_service.yaml +++ /dev/null @@ -1,36 +0,0 @@ -{{- define "helmet.service" -}} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.service.annotations .Values.commonAnnotations) "context" .) | fromYaml }} - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.service.type }} - {{- if .Values.service.sessionAffinity }} - sessionAffinity: {{ .Values.service.sessionAffinity }} - {{- end }} - {{- if .Values.service.sessionAffinityConfig }} - sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.service.sessionAffinityConfig "context" $) | nindent 4 }} - {{- end }} - {{- if and .Values.service.clusterIP (eq .Values.service.type "ClusterIP") }} - clusterIP: {{ .Values.service.clusterIP }} - {{- end }} - {{- if (and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP))) }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} - {{- end }} - {{- if and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: {{- toYaml .Values.service.loadBalancerSourceRanges | nindent 4 }} - {{- end }} - {{- if or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort") }} - externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy | quote }} - {{- end }} - ports: {{- include "common.tplvalues.render" (dict "value" .Values.service.ports "context" $) | nindent 4 }} - {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.podLabels .Values.commonLabels) "context" .) | fromYaml }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_serviceaccount.yaml b/examples/umbrella_chart/charts/helmet/templates/_serviceaccount.yaml deleted file mode 100644 index 5e2433b..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_serviceaccount.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "helmet.serviceaccount" -}} -{{- if .Values.serviceAccount.create }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "helmet.serviceAccountName" . }} - namespace: {{ include "common.names.namespace" . | quote }} - {{- $labels := include "common.tplvalues.merge" (dict "values" (list .Values.serviceAccount.labels .Values.commonLabels) "context" .) | fromYaml }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.serviceAccount.annotations .Values.commonAnnotations) "context" .) | fromYaml }} - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_servicemonitor.yaml b/examples/umbrella_chart/charts/helmet/templates/_servicemonitor.yaml deleted file mode 100644 index d149f60..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_servicemonitor.yaml +++ /dev/null @@ -1,54 +0,0 @@ -{{- define "helmet.servicemonitor" -}} -{{- if .Values.serviceMonitor.enabled }} ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "common.names.fullname" . }} - {{- if .Values.serviceMonitor.namespace }} - namespace: {{ .Values.serviceMonitor.namespace | quote }} - {{- else }} - namespace: {{ include "common.names.namespace" . | quote }} - {{- end }} - {{- $labels := include "common.tplvalues.merge" (dict "values" (list .Values.serviceMonitor.labels .Values.commonLabels) "context" .) | fromYaml }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.serviceMonitor.annotations .Values.commonAnnotations) "context" .) | fromYaml }} - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if .Values.serviceMonitor.jobLabel }} - jobLabel: {{ .Values.serviceMonitor.jobLabel }} - {{- end }} - endpoints: - - port: {{ .Values.serviceMonitor.port | quote }} - path: {{ .Values.serviceMonitor.path | quote }} - {{- if .Values.serviceMonitor.interval }} - interval: {{ .Values.serviceMonitor.interval }} - {{- end }} - {{- if .Values.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.serviceMonitor.scrapeTimeout }} - {{- end }} - {{- if .Values.serviceMonitor.relabelings }} - relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.serviceMonitor.relabelings "context" $) | nindent 6 }} - {{- end }} - {{- if .Values.serviceMonitor.metricRelabelings }} - metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.serviceMonitor.metricRelabelings "context" $) | nindent 6 }} - {{- end }} - {{- if .Values.serviceMonitor.honorLabels }} - honorLabels: {{ .Values.serviceMonitor.honorLabels }} - {{- end }} - namespaceSelector: - {{- if .Values.serviceMonitor.namespaceSelector }} - {{- include "common.tplvalues.render" (dict "value" .Values.serviceMonitor.namespaceSelector "context" $) | indent 4 }} - {{- else }} - matchNames: - - {{ include "common.names.namespace" . | quote }} - {{- end }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} - {{- if .Values.serviceMonitor.selector }} - {{- include "common.tplvalues.render" (dict "value" .Values.serviceMonitor.selector "context" $) | nindent 6 }} - {{- end }} -{{- end }} -{{- end -}} diff --git a/examples/umbrella_chart/charts/helmet/templates/_tls-secrets.yaml b/examples/umbrella_chart/charts/helmet/templates/_tls-secrets.yaml deleted file mode 100644 index 571bef6..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_tls-secrets.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- define "helmet.tls.secrets" -}} -{{- if .Values.ingress.enabled }} -{{- if .Values.ingress.secrets }} -{{- range .Values.ingress.secrets }} ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ .name }} - namespace: {{ include "common.names.namespace" $ | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $.Values.commonLabels "context" $ ) | nindent 4 }} - {{- if $.Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $.Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: kubernetes.io/tls -data: - tls.crt: {{ .certificate | b64enc }} - tls.key: {{ .key | b64enc }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/examples/umbrella_chart/charts/helmet/templates/_tls-selfsigned.yaml b/examples/umbrella_chart/charts/helmet/templates/_tls-selfsigned.yaml deleted file mode 100644 index 2e4c588..0000000 --- a/examples/umbrella_chart/charts/helmet/templates/_tls-selfsigned.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- define "helmet.tls.selfsigned" -}} -{{- if .Values.ingress.enabled }} -{{- if and .Values.ingress.tls .Values.ingress.selfSigned (not .Values.ingress.secrets) }} -{{- $ca := genCA "helmet-ca" 365 }} -{{- $cert := genSignedCert (include "common.tplvalues.render" (dict "value" .Values.ingress.hostname "context" $) | quote) nil (list .Values.ingress.hostname) 365 $ca }} ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.tplvalues.render" (dict "value" (printf "%s-tls" .Values.ingress.hostname) "context" $) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $.Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: kubernetes.io/tls -data: - tls.crt: {{ $cert.Cert | b64enc | quote }} - tls.key: {{ $cert.Key | b64enc | quote }} - ca.crt: {{ $ca.Cert | b64enc | quote }} -{{- end }} -{{- end }} -{{- end }} - diff --git a/examples/umbrella_chart/charts/helmet/values.yaml b/examples/umbrella_chart/charts/helmet/values.yaml deleted file mode 100644 index 22d7a33..0000000 --- a/examples/umbrella_chart/charts/helmet/values.yaml +++ /dev/null @@ -1,936 +0,0 @@ -exports: - defaults: - ## @section Global parameters - ## Global Docker image parameters - ## Please, note that this will override the image parameters, including dependencies, configured to use the global value - ## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass - - ## @param global.imageRegistry Global Docker image registry - ## @param global.imagePullSecrets Global Docker registry secret names as an array - ## @param global.storageClass Global StorageClass for Persistent Volume(s) - ## - global: - imageRegistry: "" - ## E.g. - ## imagePullSecrets: - ## - myRegistryKeySecretName - ## - imagePullSecrets: [] - defaultStorageClass: "" - ## Compatibility adaptations for Kubernetes platforms - ## - compatibility: - ## Compatibility adaptations for Openshift - ## - openshift: - ## @param global.compatibility.openshift.adaptSecurityContext Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) - ## - adaptSecurityContext: auto - ## @param global.compatibility.omitEmptySeLinuxOptions If set to true, removes the seLinuxOptions from the securityContexts when it is set to an empty object - ## - omitEmptySeLinuxOptions: false - - ## @section Common parameters - - ## @param kubeVersion Force target Kubernetes version (using Helm capabilities if not set) - ## - kubeVersion: "" - - ## @param nameOverride String to partially override common.names.fullname template with a string (will maintain the release name) - ## - nameOverride: "" - - ## @param fullnameOverride String to fully override common.names.fullname template with a string - ## - fullnameOverride: "" - - ## @param namespaceOverride String to fully override common.names.namespace template with a string - ## - namespaceOverride: "" - - ## @param clusterDomain Kubernetes Cluster Domain name - ## - clusterDomain: cluster.local - - ## @param annotations Additional annotations to be added to the App Deployment or Statefulset. Evaluated as a template - ## - annotations: {} - - ## @param labels Additional labels to be added to the App Deployment or Statefulset. Evaluated as a template - ## - labels: {} - - ## @param commonLabels Labels to be added to all deployed resources - ## - commonLabels: {} - - ## @param commonAnnotations Annotations to be added to all deployed resources - ## - commonAnnotations: {} - - ## @section Helmet parameters - - ## Helmet (App) image version - ## ref: https://kubernetes.io/docs/concepts/containers/images - ## @param image.registry Image registry - ## @param image.repository Image repository - ## @param image.tag Image tag (immutable tags are recommended) - ## @param image.digest Image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag - ## @param image.pullPolicy Image pull policy - ## @param image.pullSecrets Image pull secrets - ## - image: - registry: docker.io - repository: "" - tag: latest - digest: "" - - ## Specify a imagePullPolicy - ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images - ## - pullPolicy: null - - ## Optionally specify an array of imagePullSecrets (secrets must be manually created in the namespace) - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## Example: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - - ## @param replicaCount Number of APP replicas - ## Note: ReadWriteMany PVCs are required to scale - ## - replicaCount: 1 - - ## @param revisionHistoryLimit The number of old history to retain to allow rollback - ## - revisionHistoryLimit: 10 - - ## List of ports to expose from the container. - ## ref: https://kubernetes.io/docs/concepts/services-networking/connect-applications-service - ## - ports: - - name: http - containerPort: 8080 - protocol: TCP - - ## Configure extra options for liveness probe - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes - ## @param livenessProbe.enabled Enable livenessProbe - ## @param livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe - ## @param livenessProbe.periodSeconds Period seconds for livenessProbe - ## @param livenessProbe.timeoutSeconds Timeout seconds for livenessProbe - ## @param livenessProbe.failureThreshold Failure threshold for livenessProbe - ## @param livenessProbe.successThreshold Success threshold for livenessProbe - ## - ## Example: - ## livenessProbe: - ## enabled: true - ## httpGet: - ## path: / - ## port: http - ## httpHeaders: - ## - name: Custom-Header - ## value: Awesome - ## grpc: - ## port: 2379 - ## tcpSocket: - ## port: http - ## exec: - ## command: - ## - cat - ## - /tmp/healthy - ## initialDelaySeconds: 0 - ## periodSeconds: 10 - ## timeoutSeconds: 1 - ## failureThreshold: 3 - ## successThreshold: 1 - ## - livenessProbe: - enabled: false - - ## Configure extra options for readiness probe - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes - ## @param readinessProbe.enabled Enable readinessProbe - ## @param readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe - ## @param readinessProbe.periodSeconds Period seconds for readinessProbe - ## @param readinessProbe.timeoutSeconds Timeout seconds for readinessProbe - ## @param readinessProbe.failureThreshold Failure threshold for readinessProbe - ## @param readinessProbe.successThreshold Success threshold for readinessProbe - ## - ## Example: - ## readinessProbe: - ## enabled: true - ## httpGet: - ## path: / - ## port: http - ## httpHeaders: - ## - name: Custom-Header - ## value: Awesome - ## grpc: - ## port: 2379 - ## tcpSocket: - ## port: http - ## exec: - ## command: - ## - cat - ## - /tmp/healthy - ## initialDelaySeconds: 0 - ## periodSeconds: 10 - ## timeoutSeconds: 1 - ## failureThreshold: 3 - ## successThreshold: 1 - ## - readinessProbe: - enabled: false - - ## Configure extra options for startup probe - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes - ## @param startupProbe.enabled Enable startupProbe - ## @param startupProbe.httpGet.path Request path for startupProbe - ## @param startupProbe.initialDelaySeconds Initial delay seconds for startupProbe - ## @param startupProbe.periodSeconds Period seconds for startupProbe - ## @param startupProbe.timeoutSeconds Timeout seconds for startupProbe - ## @param startupProbe.failureThreshold Failure threshold for startupProbe - ## @param startupProbe.successThreshold Success threshold for startupProbe - ## - ## Example: - ## startupProbe: - ## enabled: true - ## httpGet: - ## path: / - ## port: http - ## httpHeaders: - ## - name: Custom-Header - ## value: Awesome - ## grpc: - ## port: 2379 - ## tcpSocket: - ## port: http - ## exec: - ## command: - ## - cat - ## - /tmp/healthy - ## initialDelaySeconds: 0 - ## periodSeconds: 10 - ## timeoutSeconds: 1 - ## failureThreshold: 3 - ## successThreshold: 1 - ## - startupProbe: - enabled: false - - ## Configure pod Restart Policy - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy - ## @param RestartPolicy Restart policy for all containers within the pod - podRestartPolicy: Always - - ## Configure APP pods Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod - ## @param podSecurityContext.enabled Enabled APP pods' Security Context - ## @param podSecurityContext.fsGroup Set APP pod's Security Context fsGroup - ## - podSecurityContext: - enabled: false - fsGroup: 0 - - ## Configure Container Security Context (only main container) - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container - ## @param containerSecurityContext.enabled Enabled APP containers' Security Context - ## @param containerSecurityContext.runAsUser Set APP containers' Security Context runAsUser - ## @param containerSecurityContext.runAsNonRoot Set APP container's Security Context runAsNonRoot - ## - containerSecurityContext: - enabled: false - runAsUser: 1001 - runAsNonRoot: true - - ## @param lifecycleHooks LifecycleHook to set additional configuration at startup Evaluated as a template - ## - lifecycleHooks: {} - - ## APP's resource requests and limits - ## ref: https://kubernetes.io/docs/user-guide/compute-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:'. - ## @param resources.limits The resources limits for the container - ## @param resources.requests The requested resources for the container - ## - resources: - ## Example: - ## limits: - ## cpu: 100m - ## memory: 128Mi - limits: {} - ## Examples: - ## requests: - ## cpu: 100m - ## memory: 128Mi - requests: {} - - ## @param hostAliases Add deployment host aliases - ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ - ## - hostAliases: [] - - ## @param podLabels Additional pod labels - ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ - ## - podLabels: {} - - ## @param podAnnotations Additional pod annotations - ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ - ## - podAnnotations: {} - - ## @param podAffinityPreset Pod affinity preset. Allowed values: soft, hard - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAffinityPreset: "" - - ## @param podAntiAffinityPreset Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` - ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAntiAffinityPreset: soft - - ## Node affinity preset - ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity - ## @param nodeAffinityPreset.type Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard` - ## @param nodeAffinityPreset.key Node label key to match Ignored if `affinity` is set. - ## @param nodeAffinityPreset.values Node label values to match. Ignored if `affinity` is set. - ## - nodeAffinityPreset: - type: "" - ## E.g. - ## key: "kubernetes.io/e2e-az-name" - ## - key: "" - ## E.g. - ## values: - ## - e2e-az1 - ## - e2e-az2 - ## - values: [] - - ## @param affinity Affinity for pod assignment - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - ## Note: podAffinityPreset, podAntiAffinityPreset, and nodeAffinityPreset will be ignored when it's set - ## - affinity: {} - - ## @param nodeSelector Node labels for pod assignment. - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## @param tolerations Tolerations for pod assignment. - ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - - ## @param topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template - ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods - ## - topologySpreadConstraints: [] - - ## @param priorityClassName Priority Class Name - ## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass - ## - priorityClassName: "" - - ## @param schedulerName Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - schedulerName: "" - - ## @param terminationGracePeriodSeconds Seconds APP pod needs to terminate gracefully - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods - ## - terminationGracePeriodSeconds: "" - - ## @param updateStrategy.type APP deployment strategy type - ## @param updateStrategy.rollingUpdate APP deployment rolling update configuration parameters - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy - ## - updateStrategy: - type: RollingUpdate - - ## @param extraVolumes Array to add extra volumes (evaluated as a template) - ## Example: - ## extraVolumes: - ## - name: vol-conf - ## configMap: - ## name: "configmap-name" - ## - name: vol-secret - ## secret: - ## secretName: "secret-name" - ## - extraVolumes: [] - - ## @param extraVolumeMounts Array to add extra mounts (normally used with extraVolumes, evaluated as a template) - ## Example: - ## extraVolumeMounts: - ## - name: vol-conf - ## mountPath: "/app/config" - ## - extraVolumeMounts: [] - - ## @param sidecars Add additional sidecar containers to the APP pods - ## Example: - ## sidecars: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## ports: - ## - name: portname - ## containerPort: 1234 - ## - sidecars: [] - - ## @param initContainers Add additional init containers to the APP pods - ## Example: - ## initContainers: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## ports: - ## - name: portname - ## containerPort: 1234 - ## - initContainers: [] - - ## @param command Override default container command - ## - command: [] - - ## @param args Override default container args - ## - args: [] - - ## @param envVars Environment variables to be set on APP container - ## Example: - ## envVars: - ## FOO: "foo" - ## BAZ: - ## valueFrom: - ## configMapRef: ... - ## - envVars: null - - ## @param envVarsConfigMap ConfigMap with environment variables - ## - envVarsConfigMap: "" - - ## @param envVarsSecret Secret with environment variables - ## - envVarsSecret: "" - - ## Add an horizontal pod autoscaler - ## ref: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ - ## @param autoscaling.enabled Deploy a HorizontalPodAutoscaler object for the APP deployment - ## @param autoscaling.minReplicas Minimum number of replicas to scale back - ## @param autoscaling.maxReplicas Maximum number of replicas to scale out - ## @param autoscaling.targetCPU Define the CPU target to trigger the scaling actions (utilization percentage) - ## @param autoscaling.targetMemory Define the memory target to trigger the scaling actions (utilization percentage) - ## @param autoscaling.metrics [array] Metrics to use when deciding to scale the deployment (evaluated as a template) - ## - autoscaling: - enabled: false - minReplicas: 3 - maxReplicas: 5 - targetCPU: 80 - targetMemory: 80 - metrics: [] - - ## Configure the ConfigMap resource that allows you to store non-confidential data in key-value pairs. - ## ref: https://kubernetes.io/docs/concepts/configuration/configmap/ - ## - configMap: - mounted: false - mountPath: "/app/config" - subPath: "" - ## @param configMap.data store data in key-value pairs - ## - ## e.g: - ## data: - ## config.yaml: - ## mode: production - ## FOO: bar - ## DEBUG: true - ## - data: {} - - ## @param secret.annotations Additional custom annotations for the ConfigMap - ## - annotations: {} - - ## @param secret.labels Additional custom labels for the ConfigMap - ## - labels: {} - - ## Configure the Secret resource that allows you to store a small amount of sensitive data such as a password, a token, or a key. - ## ref: https://kubernetes.io/docs/concepts/configuration/secret - ## - secret: - ## @param secret.type the type is used to facilitate programmatic handling of the Secret data - type: "Opaque" - ## @param secret.data store data in key-value pairs - ## - ## e.g: - ## data: - ## username: YWRtaW4= - ## password: MWYyZDFlMmU2N2Rm - ## - data: {} - ## @param secret.stringData store data in key-value pairs - ## - ## e.g: - ## stringData: - ## username: admin - ## password: t0p-Secret - ## - stringData: {} - - ## @param secret.annotations Additional custom annotations for the Secret - ## - annotations: {} - - ## @param secret.labels Additional custom labels for the Secret - ## - labels: {} - - ## Configure the ingress resource that allows you to access the APP - ## ref: https://kubernetes.io/docs/user-guide/ingress/ - ## - ingress: - ## @param ingress.enabled Enable ingress resource for the APP - ## - enabled: false - - ## @param ingress.path Path for the default host - ## - path: / - - ## @param ingress.apiVersion Override API Version (automatically detected if not set) - ## - apiVersion: "" - - ## @param ingress.pathType Ingress path type - ## - pathType: ImplementationSpecific - - ## @param ingress.hostname Default host for the ingress resource, a host pointing to this will be created - ## - hostname: app.local - - ## @param ingress.annotations Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations. - ## For a full list of possible ingress annotations, please see - ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md - ## Use this parameter to set the required annotations for cert-manager, see - ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations - ## - ## e.g: - ## annotations: - ## kubernetes.io/ingress.class: nginx - ## cert-manager.io/cluster-issuer: cluster-issuer-name - ## - annotations: {} - - ## @param ingress.ingressClassName Set the ingerssClassName on the ingress record for k8s 1.18+ - ## This is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster . - ## ref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/ - ## - ingressClassName: "" - - ## @param ingress.tls Enable TLS configuration for the hostname defined at ingress.hostname parameter - ## TLS certificates will be retrieved from a TLS secret with name: {{- printf "%s-tls" .Values.ingress.hostname }} - ## or a custom one if you use the tls.existingSecret parameter - ## You can use the ingress.secrets parameter to create this TLS secret or relay on cert-manager to create it - ## Example: - ## existingSecret: name-of-existing-secret - ## - tls: false - - ## @param ingress.extraHosts An array with additional hostname(s) to be covered with the ingress record - ## Most likely the hostname above will be enough, but in the event more hosts are needed, this is an array - ## extraHosts: - ## - name: app.local - ## path: / - extraHosts: [] - - ## @param ingress.extraPaths Any additional arbitrary paths that may need to be added to the ingress under the main host. - ## For example: The ALB ingress controller requires a special rule for handling SSL redirection. - ## extraPaths: - ## - path: /* - ## backend: - ## serviceName: ssl-redirect - ## servicePort: use-annotation - ## - extraPaths: [] - - ## @param ingress.selfSigned Create a TLS secret for this ingress record using self-signed certificates generated by Helm - ## - selfSigned: false - - ## @param ingress.extraTls TLS configuration for additional hostname(s) to be covered with this ingress record - ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls - ## extraTls: - ## - hosts: - ## - ap.local - ## secretName: app.local-tls - ## - extraTls: [] - - ## @param ingress.secrets If you're providing your own certificates, please use this to add the certificates as secrets - ## key and certificate should start with -----BEGIN CERTIFICATE----- or - ## -----BEGIN RSA PRIVATE KEY----- - ## - ## name should line up with a tlsSecret set further up - ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set - ## - ## It is also possible to create and manage the certificates outside of this helm chart - ## Please see README.md for more information - ## Example: - ## - name: app.local-tls - ## key: - ## certificate: - ## - secrets: [] - - ## @param ingress.existingSecret It is you own the certificate as secret. - existingSecret: "" - - ## @param ingress.extraRules Additional rules to be covered with this ingress record - ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-rules - ## e.g: - ## extraRules: - ## - host: example.local - ## http: - ## path: / - ## backend: - ## service: - ## name: example-svc - ## port: - ## name: http - ## - extraRules: [] - - ## Enable persistence using Persistent Volume Claims - ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ - ## - persistence: - ## @param persistence.enabled Enable persistence using Persistent Volume Claims - ## - enabled: false - ## @param persistence.mountPath Path to mount the volume at. - ## - mountPath: /data - ## @param persistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services - ## - subPath: "" - ## @param persistence.storageClass Storage class of backing PVC - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - storageClass: "" - ## @param persistence.annotations Persistent Volume Claim annotations - ## - annotations: {} - ## @param persistence.accessModes Persistent Volume Access Modes - ## - accessModes: - - ReadWriteOnce - ## @param persistence.size Size of data volume - ## - size: 8Gi - ## @param persistence.existingClaim The name of an existing PVC to use for persistence - ## - existingClaim: "" - ## @param persistence.selector Selector to match an existing Persistent Volume for WordPress data PVC - ## If set, the PVC can't have a PV dynamically provisioned for it - ## E.g. - ## selector: - ## matchLabels: - ## app: my-app - ## - selector: {} - ## @param persistence.dataSource Custom PVC data source - ## - dataSource: {} - - ## APP service parameters - ## - service: - ## @param service.type APP service type - ## - type: ClusterIP - - ## @param service.ports APP service ports - ## - ports: - - name: http - protocol: TCP - port: 80 - targetPort: http - - ## @param service.sessionAffinity Control where client requests go, to the same pod or round-robin - ## Values: ClientIP or None - ## ref: https://kubernetes.io/docs/user-guide/services/ - ## - sessionAffinity: None - - ## @param service.clusterIP APP service Cluster IP - ## e.g.: - ## clusterIP: None - ## - clusterIP: "" - - ## @param service.loadBalancerIP APP service Load Balancer IP - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer - ## - loadBalancerIP: "" - - ## @param service.loadBalancerSourceRanges APP service Load Balancer sources - ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service - ## e.g: - ## loadBalancerSourceRanges: - ## - 10.10.10.0/24 - ## - loadBalancerSourceRanges: [] - - ## @param service.externalTrafficPolicy APP service external traffic policy - ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - ## - externalTrafficPolicy: Cluster - - ## @param service.annotations Additional custom annotations for APP service - ## - annotations: {} - - ## Prometheus Operator ServiceMonitor configuration - ## - serviceMonitor: - ## @param serviceMonitor.enabled Specify if a ServiceMonitor will be deployed for Prometheus Operator - ## - enabled: false - - ## @param serviceMonitor.namespace Namespace in which Prometheus is running - ## - namespace: "" - - ## @param serviceMonitor.labels Additional ServiceMonitor labels (evaluated as a template) - ## - labels: {} - - ## @param serviceMonitor.annotations Additional ServiceMonitor annotations (evaluated as a template) - ## - annotations: {} - - ## @param serviceMonitor.jobLabel The name of the label on the target service to use as the job name in Prometheus - ## - jobLabel: "" - - ## @param serviceMonitor.honorLabels honorLabels chooses the metric's labels on collisions with target labels - ## - honorLabels: false - - ## @param serviceMonitor.interval How frequently to scrape metrics - ## e.g: - ## interval: 10s - ## - interval: "" - - ## @param serviceMonitor.scrapeTimeout Timeout after which the scrape is ended - ## e.g: - ## scrapeTimeout: 10s - ## - scrapeTimeout: "" - - ## @param serviceMonitor.metricRelabelings [array] Specify additional relabeling of metrics - ## - metricRelabelings: [] - - ## @param serviceMonitor.relabelings [array] Specify general relabeling - ## - relabelings: [] - - ## @param serviceMonitor.selector Prometheus instance selector labels - ## ref: https://github.com/bitnami/charts/tree/master/bitnami/prometheus-operator#prometheus-configuration - ## - selector: {} - - ## @param serviceMonitor.namespaceSelector is a selector for selecting either all namespaces or a list of namespaces. - ## - namespaceSelector: {} - - ## @param serviceMonitor.port port used by serviceMonitor - ## - port: "http" - - ## @param serviceMonitor.path path used by serviceMonitor - ## - path: "/metrics" - - ## Prometheus Operator PodMonitor configuration - ## - podMonitor: - ## @param podMonitor.enabled - Whether or not the PodMonitor should be created. - ## - enabled: false - - ## @param podMonitor.namespace Namespace in which Prometheus is running - ## - namespace: "" - - ## @param podMonitor.jobLabel Namespace in which Prometheus is running - ## - jobLabel: "" - - #@param podMonitor.port The port where metrics should be scraped. - port: "http" - - ## @param podMonitor.path The path where metrics are exposed. - ## - path: "/metrics" - - ## @param podMonitor.interval Scrape interval. Prometheus default used if not set. - ## - interval: "30s" - - ## @param podMonitor.scrapeTimeout The timeout duration after which the scrape is ended. - ## - scrapeTimeout: "10s" - - ## @param podMonitor.labels Additional PodMonitor labels (evaluated as a template) - ## - labels: {} - - ## @param podMonitor.relabelings [array] Specify general relabeling - ## - relabelings: {} - - ## @param podMonitor.metricRelabelings [array] Specify additional relabeling of metrics - ## - metricRelabelings: [] - - ## @param podMonitor.namespaceSelector is a selector for selecting either all namespaces or a list of namespaces. - ## - namespaceSelector: {} - - ## @param podMonitor.selector is a selector to select which pods will be monitored. - ## - selector: {} - - ## Service account for APP pods to use. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ - ## - serviceAccount: - ## @param serviceAccount.create Enable creation of ServiceAccount for APP pods - ## - create: false - - ## @param serviceAccount.name The name of the ServiceAccount to use. - ## If not set and create is true, a name is generated using the common.names.fullname template - ## - name: "" - - ## @param serviceAccount.automountServiceAccountToken Allows auto mount of ServiceAccountToken on the serviceAccount created - ## Can be set to false if pods using this serviceAccount do not need to use K8s API - ## - automountServiceAccountToken: true - - ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount - ## - annotations: {} - - ## @param serviceAccount.labels Additional custom labels for the ServiceAccount - ## - labels: {} - - ## Cronjob: create jobs on a repeated schedule - ## Ref: https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ - ## - cronjob: - ## @param cronjob.enabled - ## - enabled: false - - ## @param cronjob.concurrencyPolicy Allow/Forbid/Replace concurrency - ## - concurrencyPolicy: Allow - - ## @param cronjob.schedule run schedule for the cronjob - ## Cron format: " " - ## - schedule: "" - - ## @param cronjob.successfulJobsHistoryLimit - ## - successfulJobsHistoryLimit: 3 - - ## @param nodeSelector Node labels for pod assignment. - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## @param tolerations Tolerations for pod assignment. - ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - - ## @param restartPolicy Restart conditions - ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy - ## - restartPolicy: OnFailure - - ## Configure APP pods Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod - ## @param podSecurityContext.enabled Enabled APP pods' Security Context - ## @param podSecurityContext.fsGroup Set APP pod's Security Context fsGroup - ## - podSecurityContext: - enabled: false - fsGroup: 0 - - ## @param initContainers Add additional init containers to the APP pods - ## Example: - ## initContainers: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## ports: - ## - name: portname - ## containerPort: 1234 - ## - initContainers: [] - - ## @param containers Add additional containers to the APP pods - ## Example: - ## containers: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## ports: - ## - name: portname - ## containerPort: 1234 - ## - containers: [] - - ## @param volumes Array to add volumes (evaluated as a template) - ## Example: - ## volumes: - ## - name: vol-conf - ## configMap: - ## name: "configmap-name" - ## - name: vol-secret - ## secret: - ## secretName: "secret-name" - ## - volumes: [] diff --git a/examples/umbrella_chart/charts/web1/Chart.yaml b/examples/umbrella_chart/charts/web1/Chart.yaml deleted file mode 100644 index 7c836b9..0000000 --- a/examples/umbrella_chart/charts/web1/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -name: web1 -description: A Helm chart for a web server -type: application -version: 0.1.0 -appVersion: 0.1.0 \ No newline at end of file diff --git a/examples/umbrella_chart/charts/web1/templates/app.yaml b/examples/umbrella_chart/charts/web1/templates/app.yaml deleted file mode 100644 index a5ec2dd..0000000 --- a/examples/umbrella_chart/charts/web1/templates/app.yaml +++ /dev/null @@ -1 +0,0 @@ -{{- include "helmet.app" . -}} \ No newline at end of file diff --git a/examples/umbrella_chart/charts/web2/Chart.yaml b/examples/umbrella_chart/charts/web2/Chart.yaml deleted file mode 100644 index a23e748..0000000 --- a/examples/umbrella_chart/charts/web2/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -name: web2 -description: A Helm chart for a web server -type: application -version: 0.1.0 -appVersion: 0.1.0 \ No newline at end of file diff --git a/examples/umbrella_chart/charts/web2/templates/app.yaml b/examples/umbrella_chart/charts/web2/templates/app.yaml deleted file mode 100644 index a5ec2dd..0000000 --- a/examples/umbrella_chart/charts/web2/templates/app.yaml +++ /dev/null @@ -1 +0,0 @@ -{{- include "helmet.app" . -}} \ No newline at end of file diff --git a/examples/umbrella_chart/values.yaml b/examples/umbrella_chart/values.yaml deleted file mode 100644 index 681de2c..0000000 --- a/examples/umbrella_chart/values.yaml +++ /dev/null @@ -1,35 +0,0 @@ -web1: - image: - repository: nginx - tag: 1.21.6 - ports: - - name: http - containerPort: 80 - protocol: TCP - resources: - requests: - cpu: 200m - memory: 128Mi - limits: - cpu: 500m - memory: 256Mi - ingress: - enabled: true - -web2: - image: - repository: nginx - tag: 1.22.0 - ports: - - name: http - containerPort: 80 - protocol: TCP - resources: - requests: - cpu: 200m - memory: 128Mi - limits: - cpu: 500m - memory: 256Mi - ingress: - enabled: true \ No newline at end of file diff --git a/internal/helm/chart/charts/deployah/Chart.lock b/internal/helm/chart/charts/deployah/Chart.lock index be5cf46..06303d9 100644 --- a/internal/helm/chart/charts/deployah/Chart.lock +++ b/internal/helm/chart/charts/deployah/Chart.lock @@ -1,6 +1,6 @@ dependencies: - name: common repository: oci://registry-1.docker.io/bitnamicharts - version: 2.29.1 -digest: sha256:7bf3bb546e534cd64cc861f46fcfe30e11055c6083df54a64539744ecbab018a -generated: "2025-01-24T10:40:17.531952014+01:00" + version: 2.31.4 +digest: sha256:fc519c18953426ea08c3271397f369f90e049346889b5ac60d22e94d33e4a130 +generated: "2026-07-28T16:24:12.693087017+02:00" diff --git a/internal/helm/chart/charts/deployah/Chart.yaml b/internal/helm/chart/charts/deployah/Chart.yaml index dff7d81..ad3c490 100644 --- a/internal/helm/chart/charts/deployah/Chart.yaml +++ b/internal/helm/chart/charts/deployah/Chart.yaml @@ -4,7 +4,7 @@ version: 0.1.0-alpha.1 dependencies: - name: common repository: oci://registry-1.docker.io/bitnamicharts - version: 2.29.1 + version: 2.31.4 description: A Helm Chart library intended for use as a dependency to deploy applications. This chart cannot be deployed directly. type: library appVersion: 0.1.0-alpha.1 \ No newline at end of file diff --git a/internal/helm/chart/charts/deployah/charts/common-2.29.1.tgz b/internal/helm/chart/charts/deployah/charts/common-2.29.1.tgz deleted file mode 100644 index 8b9abbbc5b6c62a743cc0fb041d26b199c4313c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16736 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 H0EPhoi4COk diff --git a/internal/helm/chart/charts/deployah/charts/common-2.31.4.tgz b/internal/helm/chart/charts/deployah/charts/common-2.31.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8c7e4d542f6ecd7c9ca48b016fb8598b2c714064 GIT binary patch literal 20003 zcmV(@K-Rw>iwFP!00000|LuL-b{j{MU_aw4av}AIu!#b|tD8NV9*UA}ZtFIrEN_qH zF$+KeD6>!nR~1OXmiEja?E9SEbLKPld-@0V7d9gDUN;m-kfJ=SnU=w-yhKJsMn*

+N=T_V#vm;eV{#>+SD#|G;){6e{t| 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