mirror of
https://github.com/openappsec/openappsec.git
synced 2025-06-28 16:41:02 +03:00
Adding open-appsec-kong helm chart to repo based on kong 2.16.1
This commit is contained in:
parent
2c750513a1
commit
240f58217a
22
build_system/charts/open-appsec-kong/.helmignore
Normal file
22
build_system/charts/open-appsec-kong/.helmignore
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# Patterns to ignore when building packages.
|
||||||
|
# This supports shell glob matching, relative path matching, and
|
||||||
|
# negation (prefixed with !). Only one pattern per line.
|
||||||
|
.DS_Store
|
||||||
|
# Common VCS dirs
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.bzr/
|
||||||
|
.bzrignore
|
||||||
|
.hg/
|
||||||
|
.hgignore
|
||||||
|
.svn/
|
||||||
|
# Common backup files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*~
|
||||||
|
# Various IDEs
|
||||||
|
.project
|
||||||
|
.idea/
|
||||||
|
*.tmproj
|
||||||
|
OWNERS
|
1427
build_system/charts/open-appsec-kong/CHANGELOG.md
Normal file
1427
build_system/charts/open-appsec-kong/CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
6
build_system/charts/open-appsec-kong/Chart.lock
Normal file
6
build_system/charts/open-appsec-kong/Chart.lock
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
dependencies:
|
||||||
|
- name: postgresql
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
version: 11.9.13
|
||||||
|
digest: sha256:051285066cef2799e39e2953c4abd405c36510a09e9e1bd1833a29224daffddb
|
||||||
|
generated: "2022-12-19T11:56:46.951582785-08:00"
|
19
build_system/charts/open-appsec-kong/Chart.yaml
Normal file
19
build_system/charts/open-appsec-kong/Chart.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
apiVersion: v2
|
||||||
|
appVersion: "3.1"
|
||||||
|
dependencies:
|
||||||
|
- condition: postgresql.enabled
|
||||||
|
name: postgresql
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
version: 11.9.13
|
||||||
|
description: The Cloud-Native Ingress and API-management
|
||||||
|
home: https://konghq.com/
|
||||||
|
icon: https://s3.amazonaws.com/downloads.kong/universe/assets/icon-kong-inc-large.png
|
||||||
|
maintainers:
|
||||||
|
- email: harry@konghq.com
|
||||||
|
name: hbagdi
|
||||||
|
- email: traines@konghq.com
|
||||||
|
name: rainest
|
||||||
|
name: open-appsec-kong
|
||||||
|
sources:
|
||||||
|
- https://github.com/Kong/charts/tree/main/charts/kong
|
||||||
|
version: 2.16.1
|
139
build_system/charts/open-appsec-kong/FAQs.md
Normal file
139
build_system/charts/open-appsec-kong/FAQs.md
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
# Frequently Asked Questions (FAQs)
|
||||||
|
|
||||||
|
Despite the title, this is more a list of common problems.
|
||||||
|
|
||||||
|
#### Kong cannot connect to a fresh Postgres install and fails to start
|
||||||
|
|
||||||
|
If Kong is reporting that it cannot connect to Postgres because of an invalid
|
||||||
|
password on a fresh install, you likely have a leftover PersistentVolume from a
|
||||||
|
previous install using the same name. You should delete your install, delete
|
||||||
|
the associated PersistentVolumeClaim, and install again.
|
||||||
|
|
||||||
|
Postgres PVCs [are not deleted when the chart install is
|
||||||
|
deleted](https://docs.bitnami.com/kubernetes/faq/troubleshooting/troubleshooting-helm-chart-issues/#persistence-volumes-pvs-retained-from-previous-releases),
|
||||||
|
and will be reused by subsequent installs if still present. Since the `kong`
|
||||||
|
user password is written to disk during database initialization only, that old
|
||||||
|
user's password is expected, not the new user's.
|
||||||
|
|
||||||
|
PVC names use the pattern `data-<release name>-postgresql-<replica index>`. If
|
||||||
|
you named your install `foo` and did not increase the Postgres replica count,
|
||||||
|
you will have a single `data-foo-postgresql-0` PVC that needs to be deleted:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl delete pvc data-foo-postgresql-0
|
||||||
|
```
|
||||||
|
|
||||||
|
If you use a workflow that frequently deletes and re-creates installs, you
|
||||||
|
should make sure to delete PVCs when you delete the release:
|
||||||
|
|
||||||
|
```
|
||||||
|
helm delete foo; kubectl delete pvc data-foo-postgresql-0
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Upgrading a release fails due to missing ServiceAccount
|
||||||
|
|
||||||
|
When upgrading a release, some configuration changes result in this error:
|
||||||
|
|
||||||
|
```
|
||||||
|
Error creating: pods "releasename-kong-pre-upgrade-migrations-" is forbidden: error looking up service account releasename-kong: serviceaccount "releasename-kong" not found
|
||||||
|
```
|
||||||
|
|
||||||
|
Enabling the ingress controller or PodSecurityPolicy requires that the Kong
|
||||||
|
chart also create a ServiceAccount. When upgrading from a configuration that
|
||||||
|
previously had neither of these features enabled, the pre-upgrade-migrations
|
||||||
|
Job attempts to use this ServiceAccount before it is created. It is [not
|
||||||
|
possible to easily handle this case automatically](https://github.com/Kong/charts/pull/31).
|
||||||
|
|
||||||
|
Users encountering this issue should temporarily modify their
|
||||||
|
[pre-upgrade-migrations template](https://github.com/Kong/charts/blob/main/charts/kong/templates/migrations-pre-upgrade.yaml),
|
||||||
|
adding the following at the bottom:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ if or .Values.podSecurityPolicy.enabled (and .Values.ingressController.enabled .Values.ingressController.serviceAccount.create) -}}
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: {{ template "kong.serviceAccountName" . }}
|
||||||
|
namespace: {{ template "kong.namespace" . }}
|
||||||
|
annotations:
|
||||||
|
"helm.sh/hook": pre-upgrade
|
||||||
|
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
|
||||||
|
labels:
|
||||||
|
{{- include "kong.metaLabels" . | nindent 4 }}
|
||||||
|
{{- end -}}
|
||||||
|
```
|
||||||
|
|
||||||
|
Upgrading with this in place will create a temporary service account before
|
||||||
|
creating the actual service account. After this initial upgrade, users must
|
||||||
|
revert to the original pre-upgrade migrations template, as leaving the
|
||||||
|
temporary ServiceAccount template in place will [cause permissions issues on
|
||||||
|
subsequent upgrades](https://github.com/Kong/charts/issues/30).
|
||||||
|
|
||||||
|
#### Running "helm upgrade" fails because of old init-migrations Job
|
||||||
|
|
||||||
|
When running `helm upgrade`, the upgrade fails and Helm reports an error
|
||||||
|
similar to the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
Error: UPGRADE FAILED: cannot patch "RELEASE-NAME-kong-init-migrations" with
|
||||||
|
kind Job: Job.batch "RELEASE-NAME-kong-init-migrations" is invalid ... field
|
||||||
|
is immutable
|
||||||
|
```
|
||||||
|
|
||||||
|
This occurs if a `RELEASE-NAME-kong-init-migrations` Job is left over from a
|
||||||
|
previous `helm install` or `helm upgrade`. Deleting it with
|
||||||
|
`kubectl delete job RELEASE-NAME-kong-init-migrations` will allow the upgrade
|
||||||
|
to proceed. Chart versions greater than 1.5.0 delete the job automatically.
|
||||||
|
|
||||||
|
#### DB-backed instances do not start when deployed within a service mesh
|
||||||
|
|
||||||
|
Service meshes, such as Istio and Kuma, if deployed in a mode that injects
|
||||||
|
a sidecar to Kong, don't make the mesh available to `InitContainer`s,
|
||||||
|
because the sidecar starts _after_ all `InitContainer`s finish.
|
||||||
|
|
||||||
|
By default, this chart uses init containers to ensure that the database is
|
||||||
|
online and has migrations applied before starting Kong. This provides for a
|
||||||
|
smoother startup, but isn't compatible with service mesh sidecar requirements
|
||||||
|
if Kong is to access the database through the mesh.
|
||||||
|
|
||||||
|
Setting `waitImage.enabled=false` in values.yaml disables these init containers
|
||||||
|
and resolves this issue. However, during the initial install, your Kong
|
||||||
|
Deployment will enter the CrashLoopBackOff state while waiting for migrations
|
||||||
|
to complete. It will eventually exit this state and enter Running as long as
|
||||||
|
there are no issues finishing migrations, usually within 2 minutes.
|
||||||
|
|
||||||
|
If your Deployment is stuck in CrashLoopBackoff for longer, check the init
|
||||||
|
migrations Job logs to see if it is unable to connect to the database or unable
|
||||||
|
to complete migrations for some other reason. Resolve any issues you find,
|
||||||
|
delete the release, and attempt to install again.
|
||||||
|
|
||||||
|
#### Kong fails to start after `helm upgrade` when Postgres is used
|
||||||
|
|
||||||
|
As of Kong chart 2.8, this issue is no longer present. 2.8 updates the Postgres
|
||||||
|
sub-chart to a version that checks for existing password Secrets and leaves
|
||||||
|
them as-is rather than overwriting them.
|
||||||
|
|
||||||
|
You may be running into this issue: https://github.com/helm/charts/issues/12575.
|
||||||
|
This issue is caused due to: https://github.com/helm/helm/issues/3053.
|
||||||
|
|
||||||
|
The problem that happens is that Postgres database has the old password but
|
||||||
|
the new secret has a different password, which is used by Kong, and password
|
||||||
|
based authentication fails.
|
||||||
|
|
||||||
|
The solution to the problem is to specify a password to the `postgresql` chart.
|
||||||
|
This is to ensure that the password is not generated randomly but is set to
|
||||||
|
the same one that is user-provided on each upgrade.
|
||||||
|
|
||||||
|
The Postgres chart provides [two options](https://github.com/bitnami/charts/tree/master/bitnami/postgresql#postgresql-common-parameters)
|
||||||
|
for setting a password:
|
||||||
|
|
||||||
|
- `auth.password` sets a password directly in values.yaml, in cleartext. This
|
||||||
|
is fine if you are using the instance for testing and have no security
|
||||||
|
concerns.
|
||||||
|
- `auth.existingSecret` specifies a Secret that contains [specific keys](https://github.com/bitnami/charts/blob/a6146a1ed392c8683c30b21e3fef905d86b0d2d6/bitnami/postgresql/values.yaml#L134-L143).
|
||||||
|
This should be used if you need to properly secure the Postgres instance.
|
||||||
|
|
||||||
|
If you have already upgraded, the old password is lost. You will need to
|
||||||
|
delete the Helm release and the Postgres PersistentVolumeClaim before
|
||||||
|
re-installing with a non-random password.
|
1089
build_system/charts/open-appsec-kong/README.md
Normal file
1089
build_system/charts/open-appsec-kong/README.md
Normal file
File diff suppressed because it is too large
Load Diff
754
build_system/charts/open-appsec-kong/UPGRADE.md
Normal file
754
build_system/charts/open-appsec-kong/UPGRADE.md
Normal file
@ -0,0 +1,754 @@
|
|||||||
|
# Upgrade considerations
|
||||||
|
|
||||||
|
New versions of the Kong chart may add significant new functionality or
|
||||||
|
deprecate/entirely remove old functionality. This document covers how and why
|
||||||
|
users should update their chart configuration to take advantage of new features
|
||||||
|
or migrate away from deprecated features.
|
||||||
|
|
||||||
|
In general, breaking changes deprecate their old features before removing them
|
||||||
|
entirely. While support for the old functionality remains, the chart will show
|
||||||
|
a warning about the outdated configuration when running `helm
|
||||||
|
install/status/upgrade`.
|
||||||
|
|
||||||
|
Note that not all versions contain breaking changes. If a version is not
|
||||||
|
present in the table of contents, it requires no version-specific changes when
|
||||||
|
upgrading from a previous version.
|
||||||
|
|
||||||
|
## Table of contents
|
||||||
|
|
||||||
|
- [Upgrade considerations for all versions](#upgrade-considerations-for-all-versions)
|
||||||
|
- [2.13.0](#2130)
|
||||||
|
- [2.8.0](#280)
|
||||||
|
- [2.7.0](#270)
|
||||||
|
- [2.4.0](#240)
|
||||||
|
- [2.3.0](#230)
|
||||||
|
- [2.2.0](#220)
|
||||||
|
- [2.1.0](#210)
|
||||||
|
- [2.0.0](#200)
|
||||||
|
- [1.14.0](#1140)
|
||||||
|
- [1.11.0](#1110)
|
||||||
|
- [1.10.0](#1100)
|
||||||
|
- [1.9.0](#190)
|
||||||
|
- [1.6.0](#160)
|
||||||
|
- [1.5.0](#150)
|
||||||
|
- [1.4.0](#140)
|
||||||
|
- [1.3.0](#130)
|
||||||
|
|
||||||
|
## Upgrade considerations for all versions
|
||||||
|
|
||||||
|
The chart automates the
|
||||||
|
[upgrade migration process](https://github.com/Kong/kong/blob/master/UPGRADE.md).
|
||||||
|
When running `helm upgrade`, the chart spawns an initial job to run `kong
|
||||||
|
migrations up` and then spawns new Kong pods with the updated version. Once
|
||||||
|
these pods become ready, they begin processing traffic and old pods are
|
||||||
|
terminated. Once this is complete, the chart spawns another job to run `kong
|
||||||
|
migrations finish`.
|
||||||
|
|
||||||
|
If you split your Kong deployment across multiple Helm releases (to create
|
||||||
|
proxy-only and admin-only nodes, for example), you must
|
||||||
|
[set which migration jobs run based on your upgrade order](https://github.com/Kong/charts/blob/main/charts/kong/README.md#separate-admin-and-proxy-nodes).
|
||||||
|
However, this does not apply to hybrid mode, which can run both migrations but
|
||||||
|
requires [upgrading the control plane version
|
||||||
|
first](https://docs.konghq.com/gateway/latest/plan-and-deploy/hybrid-mode/#version-compatibility).
|
||||||
|
|
||||||
|
While the migrations themselves are automated, the chart does not automatically
|
||||||
|
ensure that you follow the recommended upgrade path. If you are upgrading from
|
||||||
|
more than one minor Kong version back, check the [upgrade path
|
||||||
|
recommendations for Kong open source](https://github.com/Kong/kong/blob/master/UPGRADE.md#3-suggested-upgrade-path)
|
||||||
|
or [Kong Enterprise](https://docs.konghq.com/enterprise/latest/deployment/migrations/).
|
||||||
|
|
||||||
|
Although not required, users should upgrade their chart version and Kong
|
||||||
|
version indepedently. In the even of any issues, this will help clarify whether
|
||||||
|
the issue stems from changes in Kubernetes resources or changes in Kong.
|
||||||
|
|
||||||
|
Users may encounter an error when upgrading which displays a large block of
|
||||||
|
text ending with `field is immutable`. This is typically due to a bug with the
|
||||||
|
`init-migrations` job, which was not removed automatically prior to 1.5.0.
|
||||||
|
If you encounter this error, deleting any existing `init-migrations` jobs will
|
||||||
|
clear it.
|
||||||
|
|
||||||
|
### Updates to CRDs
|
||||||
|
|
||||||
|
Helm installs CRDs at initial install but [does not update them
|
||||||
|
after](https://github.com/helm/community/blob/main/hips/hip-0011.md). Some
|
||||||
|
chart releases include updates to CRDs that must be applied to successfully
|
||||||
|
upgrade. Because Helm does not handle these updates, you must manually apply
|
||||||
|
them before upgrading your release.
|
||||||
|
|
||||||
|
``` kubectl apply -f
|
||||||
|
https://raw.githubusercontent.com/Kong/charts/kong-<version>/charts/kong/crds/custom-resource-definitions.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
For example, if your release is 2.6.4, you would apply
|
||||||
|
`https://raw.githubusercontent.com/Kong/charts/kong-2.6.4/charts/kong/crds/custom-resource-definitions.yaml`.
|
||||||
|
|
||||||
|
## 2.13.0
|
||||||
|
|
||||||
|
2.13.0 includes updated CRDs. You must [apply these manually](#updates-to-crds)
|
||||||
|
before upgrading an existing release.
|
||||||
|
|
||||||
|
2.13 changes the default Kong tag to 3.0 and the default KIC tag to 2.6. We
|
||||||
|
recommend that you set these versions (`image.tag` and
|
||||||
|
`ingressController.image.tag`) in your values.yaml to allow updating the chart
|
||||||
|
without also updating the container versions. If you do update to these
|
||||||
|
container image versions, you should first review the Kong 3.0 breaking changes
|
||||||
|
(see the [open
|
||||||
|
source](https://github.com/Kong/kong/blob/master/CHANGELOG.md#300) and
|
||||||
|
[Enterprise](https://docs.konghq.com/gateway/changelog/#3000) Kong changelogs)
|
||||||
|
and the [ingress controller upgrade guide for Kong
|
||||||
|
3.x](https://docs.konghq.com/kubernetes-ingress-controller/2.6.x/guides/upgrade-kong-3x).
|
||||||
|
|
||||||
|
Kong 3.0 requires KIC version 2.6 at minimum. It will not work with any
|
||||||
|
previous versions. Changes to regular expression paths in Kong 3.x furthermore
|
||||||
|
require changes to Ingresses that use regular expression paths in rules.
|
||||||
|
|
||||||
|
## 2.8.0
|
||||||
|
|
||||||
|
### IngressClass controller name change requires manual delete
|
||||||
|
|
||||||
|
2.8 updates the chart-managed IngressClass's controller name to match the
|
||||||
|
controller name used elsewhere in Kong's documenation. Controller names are
|
||||||
|
immutable, so Helm cannot actually update existing IngressClass resources.
|
||||||
|
|
||||||
|
Prior to your upgrade, you must delete the existing IngressClass. Helm will
|
||||||
|
create a new IngressClass with the new controller name during the upgrade:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl delete ingressclass <class name, "kong" by default>
|
||||||
|
helm upgrade RELEASE_NAME kong/kong ...
|
||||||
|
```
|
||||||
|
|
||||||
|
Removing the IngressClass will not affect configuration: the controller
|
||||||
|
IngressClass implementation is still in progress, and it will still ingest
|
||||||
|
resources whose `ingress.class` annotation or `ingressClassName` value matches
|
||||||
|
the the `CONTROLLER_INGRESS_CLASS` value in the controller environment even if
|
||||||
|
no matching IngressClass exists.
|
||||||
|
|
||||||
|
### Postgres subchart version update
|
||||||
|
|
||||||
|
2.8 updates the Postgres subchart version from 8.6.8 to 11.1.15. This changes
|
||||||
|
a number of values.yaml keys and the default Postgres version. The previous
|
||||||
|
default Postgres version was [11.7.0-debian-10-r37](https://github.com/bitnami/charts/blob/590c6b0f4e07161614453b12efe71f22e0c00a46/bitnami/postgresql/values.yaml#L18).
|
||||||
|
|
||||||
|
To use the new version on an existing install, you should [follow Bitnami's
|
||||||
|
instructions for updating values.yaml keys and upgrading their chart]() as well
|
||||||
|
as [the Postgres upgrade instructions](https://www.postgresql.org/docs/current/upgrading.html).
|
||||||
|
|
||||||
|
You can alternately use the new chart without upgrading Postgres by setting
|
||||||
|
`postgresql.image.tag=11.7.0-debian-10-r37` or use the old version of the
|
||||||
|
chart. Helm documentation is unclear on whether ignoring a subchart version
|
||||||
|
change for a release is possible, so we recommend [dumping the
|
||||||
|
database](https://www.postgresql.org/docs/current/backup-dump.html) and
|
||||||
|
creating a separate release if you wish to continue using 8.6.8:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ helm install my-release -f values.yaml --version 8.6.8 bitnami/postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
Afterwords, you will upgrade your Kong chart release with
|
||||||
|
`postgresql.enabled=false` and `env.pg_host` and `env.pg_password` set to the
|
||||||
|
appropriate hostname and Secret reference for your new release (these are set
|
||||||
|
automatically when the subchart is enabled, but will not be set automatically
|
||||||
|
with a separate release).
|
||||||
|
|
||||||
|
## 2.7.0
|
||||||
|
|
||||||
|
2.7 updates CRDs to the version released in KIC 2.1.0. Helm does not upgrade
|
||||||
|
CRDs automatically; you must `kubectl apply -f https://raw.githubusercontent.com/Kong/charts/kong-2.7.0/charts/kong/crds/custom-resource-definitions.yaml`
|
||||||
|
manually before upgrading.
|
||||||
|
|
||||||
|
You should not apply the updated CRDs until you are prepared to upgrade to KIC
|
||||||
|
2.1 or higher, and [must have first upgraded to 2.0](https://github.com/Kong/kubernetes-ingress-controller/blob/v2.1.1/CHANGELOG.md#breaking-changes)
|
||||||
|
and applied the [previous version of the CRDs](https://raw.githubusercontent.com/Kong/charts/kong-2.6.4/charts/kong/crds/custom-resource-definitions.yaml).
|
||||||
|
|
||||||
|
## 2.4.0
|
||||||
|
|
||||||
|
### Disable ingress controller prior to 2.x upgrade when using PostgreSQL
|
||||||
|
|
||||||
|
Chart version 2.4 is the first Kong chart version that defaults to the 2.x
|
||||||
|
series of ingress controller releases. 2.x uses a different leader election
|
||||||
|
system than 1.x. If both versions are running simultaneously, both controller
|
||||||
|
versions will attempt to interact with the admin API, potentially setting
|
||||||
|
inconsistent configuration in the database when PostgreSQL is the backend.
|
||||||
|
|
||||||
|
If you are configured with the following:
|
||||||
|
|
||||||
|
- ingressController.enabled=true
|
||||||
|
- postgresql.enabled=true
|
||||||
|
|
||||||
|
and do not override the ingress controller version, you must perform the
|
||||||
|
upgrade in multiple steps:
|
||||||
|
|
||||||
|
First, pin the controller version and upgrade to chart 2.4.0:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm upgrade --wait \
|
||||||
|
--set ingressController.image.tag=<CURRENT_CONTROLLER_VERSION> \
|
||||||
|
--version 2.4.0 \
|
||||||
|
--namespace <YOUR_RELEASE_NAMESPACE> \
|
||||||
|
<YOUR_RELEASE_NAME> kong/kong
|
||||||
|
```
|
||||||
|
Second, temporarily disable the ingress controller:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm upgrade --wait \
|
||||||
|
--set ingressController.enabled=false \
|
||||||
|
--set deployment.serviceaccount.create=true \
|
||||||
|
--version 2.4.0 \
|
||||||
|
--namespace <YOUR_RELEASE_NAMESPACE> \
|
||||||
|
<YOUR_RELEASE_NAME> kong/kong
|
||||||
|
```
|
||||||
|
Finally, re-enable the ingress controller at the new version:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm upgrade --wait \
|
||||||
|
--set ingressController.enabled=true \
|
||||||
|
--set ingressController.image.tag=<NEW_CONTROLLER_VERSION> \
|
||||||
|
--version 2.4.0 \
|
||||||
|
--namespace <YOUR_RELEASE_NAMESPACE> \
|
||||||
|
<YOUR_RELEASE_NAME> kong/kong
|
||||||
|
```
|
||||||
|
|
||||||
|
While the controller is disabled, changes to Kubernetes configuration (Ingress
|
||||||
|
resources, KongPlugin resources, Service Endpoints, etc.) will not update Kong
|
||||||
|
proxy configuration. We recommend you establish an active maintenance window
|
||||||
|
under which to perform this upgrade and inform users and stakeholders so as to
|
||||||
|
avoid unexpected disruption.
|
||||||
|
|
||||||
|
### Changed ServiceAccount configuration location
|
||||||
|
|
||||||
|
2.4.0 moved ServiceAccount configuration from
|
||||||
|
`ingressController.serviceAccount` to `deployment.serviceAccount` to accomodate
|
||||||
|
configurations that required a ServiceAccount but did not use the controller.
|
||||||
|
|
||||||
|
The chart now creates a ServiceAccount by default. When enabled, upgrade
|
||||||
|
migration hooks require the ServiceAccount, but Helm will not create it before
|
||||||
|
the hooks run, and the migration jobs will fail. To avoid this, first perform
|
||||||
|
an initial chart upgrade that does not update the Kong image version and sets
|
||||||
|
`migrations.preUpgrade=false` and `migrations.postUpgrade=false`. This will
|
||||||
|
create the account for future upgrades, and you can re-enable migrations and
|
||||||
|
upgrade your Kong version after.
|
||||||
|
|
||||||
|
If you disable ServiceAccount or override its name, you must move your
|
||||||
|
configuration under `deployment.serviceAccount`. The chart will warn you if it
|
||||||
|
detects non-default configuration in the original location when you upgrade.
|
||||||
|
You can use `helm upgrade --dry-run` to see if you are affected before actually
|
||||||
|
upgrading.
|
||||||
|
|
||||||
|
## 2.3.0
|
||||||
|
|
||||||
|
### Updated CRDs and CRD API version
|
||||||
|
|
||||||
|
2.3.0 adds new and updated CRDs for KIC 2.x. These CRDs are compatible with
|
||||||
|
KIC 1.x also. The CRD API version is now v1, replacing the deprecated v1beta1,
|
||||||
|
to support Kubernetes 1.22 and onward. API version v1 requires Kubernetes 1.16
|
||||||
|
and newer.
|
||||||
|
|
||||||
|
Helm 2-style CRD management will upgrade CRDs automatically. You can check to
|
||||||
|
see if you are using Helm 2-style management by running:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl get crd kongconsumers.configuration.konghq.com -o yaml | grep "meta.helm.sh/release-name"
|
||||||
|
```
|
||||||
|
|
||||||
|
If you see output, you are using Helm 2-style CRD management.
|
||||||
|
|
||||||
|
Helm 3-style CRD management (the default) does not upgrade CRDs automatically.
|
||||||
|
You must apply the changes manually by running:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl apply -f https://raw.githubusercontent.com/Kong/charts/kong-2.2.0/charts/kong/crds/custom-resource-definitions.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Although not recommended, you can remain on an older Kubernetes version and not
|
||||||
|
upgrade your CRDs if you are using Helm 3-style CRD management. However, you
|
||||||
|
will not be able to run KIC 2.x, and these configurations are considered
|
||||||
|
unsupported.
|
||||||
|
|
||||||
|
### Ingress controller feature detection
|
||||||
|
|
||||||
|
2.3.0 includes some features that are enabled by default, but require KIC 2.x.
|
||||||
|
KIC 2.x is not yet the default ingress controller version because there are
|
||||||
|
currently only preview releases for it. To maintain compatibility with KIC 1.x,
|
||||||
|
the chart automatically detects the KIC image version and disables incompatible
|
||||||
|
features. This feature detection requires a semver image tag, and the chart
|
||||||
|
cannot render successfully if the image tag is not semver-compliant.
|
||||||
|
|
||||||
|
Standard KIC images do use semver-compliant tags, and you do not need to make
|
||||||
|
any configuration changes if you use one. If you use a non-semver tag, such as
|
||||||
|
`next`, you must set the new `ingressController.image.effectiveSemver` field to
|
||||||
|
your approximate semver version. For example, if your `next` tag is for an
|
||||||
|
unreleased `2.1.0` KIC version, you should set `effectiveSemver: 2.1.0`.
|
||||||
|
|
||||||
|
## 2.2.0
|
||||||
|
|
||||||
|
### Changes to pod disruption budget defaults
|
||||||
|
|
||||||
|
Prior to 2.2.0, the default values.yaml included
|
||||||
|
`podDisruptionBudget.maxUnavailable: 50%`. This prevented setting
|
||||||
|
`podDisruptionBudget.minUnavailable` at all. To allow use of
|
||||||
|
`podDisruptionBudget.minUnavailable`, we have removed the
|
||||||
|
`podDisruptionBudget.maxUnavailable` default. If you previously relied on this
|
||||||
|
default (you set `podDisruptionBudget.enabled: true` but did not set
|
||||||
|
`podDisruptionBudget.maxUnavailable`), you now must explicitly set
|
||||||
|
`podDisruptionBudget.maxUnavailable: 50%` in your values.yaml.
|
||||||
|
|
||||||
|
## 2.1.0
|
||||||
|
|
||||||
|
### Migration off Bintray
|
||||||
|
|
||||||
|
Bintray, the Docker registry previously used for several images used by this
|
||||||
|
chart, is [sunsetting May 1,
|
||||||
|
2021](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/).
|
||||||
|
|
||||||
|
The chart default `values.yaml` now uses the new Docker Hub repositories for all
|
||||||
|
affected images. You should check your release `values.yaml` files to confirm that
|
||||||
|
they do not still reference Bintray repositories. If they do, update them to
|
||||||
|
use the Docker Hub repositories now in the default `values.yaml`.
|
||||||
|
|
||||||
|
## 2.0.0
|
||||||
|
|
||||||
|
### Support for Helm 2 dropped
|
||||||
|
|
||||||
|
2.0.0 takes advantage of template functionality that is only available in Helm
|
||||||
|
3 and reworks values defaults to target Helm 3 CRD handling, and requires Helm
|
||||||
|
3 as such. If you are not already using Helm 3, you must migrate to it before
|
||||||
|
updating to 2.0.0 or later:
|
||||||
|
|
||||||
|
https://helm.sh/docs/topics/v2_v3_migration/
|
||||||
|
|
||||||
|
If desired, you can migrate your Kong chart releases without migrating charts'
|
||||||
|
releases.
|
||||||
|
|
||||||
|
### Support for deprecated 1.x features removed
|
||||||
|
|
||||||
|
Several previous 1.x chart releases reworked sections of values.yaml while
|
||||||
|
maintaining support for the older version of those settings. 2.x drops support
|
||||||
|
for the older versions of these settings entirely:
|
||||||
|
|
||||||
|
* [Portal auth settings](#removal-of-dedicated-portal-authentication-configuration-parameters)
|
||||||
|
* [The `runMigrations` setting](#changes-to-migration-job-configuration)
|
||||||
|
* [Single-stack admin API Service configuration](#changes-to-kong-service-configuration)
|
||||||
|
* [Multi-host proxy configuration](#removal-of-multi-host-proxy-ingress)
|
||||||
|
|
||||||
|
Each deprecated setting is accompanied by a warning that appears at the end of
|
||||||
|
`helm upgrade` output on a 1.x release:
|
||||||
|
|
||||||
|
```
|
||||||
|
WARNING: You are currently using legacy ...
|
||||||
|
```
|
||||||
|
|
||||||
|
If you do not see any such warnings when upgrading a release using chart
|
||||||
|
1.15.0, you are not using deprecated configuration and are ready to upgrade to
|
||||||
|
2.0.0. If you do see these warnings, follow the linked instructions to migrate
|
||||||
|
to the current settings format.
|
||||||
|
|
||||||
|
## 1.14.0
|
||||||
|
|
||||||
|
### Removal of multi-host proxy Ingress
|
||||||
|
|
||||||
|
Most of the chart's Ingress templates support a single hostname and TLS Secret.
|
||||||
|
The proxy Ingress template originally differed, and allowed multiple hostnames
|
||||||
|
and TLS configurations. As of chart 1.14.0, we have deprecated the unique proxy
|
||||||
|
Ingress configuration; it is now identical to all other Kong services. If you
|
||||||
|
do not need to configure multiple Ingress rules for your proxy, you will
|
||||||
|
change:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
ingress:
|
||||||
|
hosts: ["proxy.kong.example"]
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- proxy.kong.example
|
||||||
|
secretName: example-tls-secret
|
||||||
|
path: /
|
||||||
|
```
|
||||||
|
to:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
ingress:
|
||||||
|
tls: example-tls-secret
|
||||||
|
hostname: proxy.kong.example
|
||||||
|
path: /
|
||||||
|
```
|
||||||
|
We plan to remove support for the multi-host configuration entirely in version
|
||||||
|
2.0 of the chart. If you currently use multiple hosts, we recommend that you
|
||||||
|
either:
|
||||||
|
- Define Ingresses for each application, e.g. if you proxy applicationA at
|
||||||
|
`foo.kong.example` and applicationB at `bar.kong.example`, you deploy those
|
||||||
|
applications with their own Ingress resources that target the proxy.
|
||||||
|
- Define a multi-host Ingress manually. Before upgrading, save your current
|
||||||
|
proxy Ingress, delete labels from the saved copy, and set
|
||||||
|
`proxy.ingress.enabled=false`. After upgrading, create your Ingress from the
|
||||||
|
saved copy and edit it directly to add new rules.
|
||||||
|
|
||||||
|
We expect that most users do not need a built-in multi-host proxy Ingress or
|
||||||
|
even a proxy Ingress at all: the old configuration predates the Kong Ingress
|
||||||
|
Controller and is most useful if you place Kong behind some other controller.
|
||||||
|
If you are interested in preserving this functionality, please [discuss your
|
||||||
|
use case with us](https://github.com/Kong/charts/issues/73). If there is
|
||||||
|
sufficient interest, we will explore options for continuing to support the
|
||||||
|
original proxy Ingress configuration format.
|
||||||
|
|
||||||
|
### Default custom server block replaced with status listen
|
||||||
|
|
||||||
|
Earlier versions of the chart included [a custom server block](https://github.com/Kong/charts/blob/kong-1.13.0/charts/kong/templates/config-custom-server-blocks.yaml)
|
||||||
|
to provide `/status` and `/metrics` endpoints. This server block simplified
|
||||||
|
RBAC-enabled Enterprise deployments by providing access to these endpoints
|
||||||
|
outside the (protected) admin API.
|
||||||
|
|
||||||
|
Current versions (Kong 1.4.0+ and Kong Enterprise 1.5.0+) have a built-in
|
||||||
|
status listen that provides the same functionality, and chart 1.14.0 uses it
|
||||||
|
for readiness/liveness probes and the Prometheus service monitor.
|
||||||
|
|
||||||
|
If you are using a version that supports the new status endpoint, you do not
|
||||||
|
need to make any changes to your values unless you include `readinessProbe` and
|
||||||
|
`livenessProbe` in them. If you do, you must change the port from `metrics` to
|
||||||
|
`status`.
|
||||||
|
|
||||||
|
If you are using an older version that does not support the status listen, you
|
||||||
|
will need to:
|
||||||
|
- Create the server block ConfigMap independent of the chart. You will need to
|
||||||
|
set the ConfigMap name and namespace manually and remove the labels block.
|
||||||
|
- Add an `extraConfigMaps` values entry for your ConfigMap.
|
||||||
|
- Set `env.nginx_http_include` to `/path/to/your/mount/servers.conf`.
|
||||||
|
- Add the [old readiness/liveness probe blocks](https://github.com/Kong/charts/blob/kong-1.13.0/charts/kong/values.yaml#L437-L458)
|
||||||
|
to your values.yaml.
|
||||||
|
- If you use the Prometheus service monitor, edit it after installing the chart
|
||||||
|
and set `targetPort` to `9542`. This cannot be set from values.yaml, but Helm
|
||||||
|
3 will preserve the change on subsequent upgrades.
|
||||||
|
|
||||||
|
## 1.11.0
|
||||||
|
|
||||||
|
### `KongCredential` custom resources no longer supported
|
||||||
|
|
||||||
|
1.11.0 updates the default Kong Ingress Controller version to 1.0. Controller
|
||||||
|
1.0 removes support for the deprecated KongCredential resource. Before
|
||||||
|
upgrading to chart 1.11.0, you must convert existing KongCredential resources
|
||||||
|
to [credential Secrets](https://github.com/Kong/kubernetes-ingress-controller/blob/next/docs/guides/using-consumer-credential-resource.md#provision-a-consumer).
|
||||||
|
|
||||||
|
Custom resource management varies depending on your exact chart configuration.
|
||||||
|
By default, Helm 3 only creates CRDs in the `crds` directory if they are not
|
||||||
|
already present, and does not modify or remove them after. If you use this
|
||||||
|
management method, you should create a manifest file that contains [only the
|
||||||
|
KongCredential CRD](https://github.com/Kong/charts/blob/kong-1.10.0/charts/kong/crds/custom-resource-definitions.yaml#L35-L68)
|
||||||
|
and then [delete it](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#delete-a-customresourcedefinition).
|
||||||
|
|
||||||
|
Helm 2 and Helm 3 both allow managing CRDs via the chart. In Helm 2, this is
|
||||||
|
required; in Helm 3, it is optional. When using this method, only a single
|
||||||
|
release will actually manage the CRD. Check to see which release has
|
||||||
|
`ingressController.installCRDs: true` to determine which does so if you have
|
||||||
|
multiple releases. When using this management method, upgrading a release to
|
||||||
|
chart 1.11.0 will delete the KongCredential CRD during the upgrade, which will
|
||||||
|
_delete any existing KongCredential resources_. To avoid losing configuration,
|
||||||
|
check to see if your CRD is managed:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl get crd kongcredentials.configuration.konghq.com -o yaml | grep "app.kubernetes.io/managed-by: Helm"
|
||||||
|
```
|
||||||
|
|
||||||
|
If that command returns output, your CRD is managed and you must convert to
|
||||||
|
credential Secrets before upgrading (you should do so regardless, but are not
|
||||||
|
at risk of losing data, and can downgrade to an older chart version if you have
|
||||||
|
issues).
|
||||||
|
|
||||||
|
### Changes to CRDs
|
||||||
|
|
||||||
|
Controller 1.0 [introduces a status field](https://github.com/Kong/kubernetes-ingress-controller/blob/main/CHANGELOG.md#added)
|
||||||
|
for its custom resources. By default, Helm 3 does not apply updates to custom
|
||||||
|
resource definitions if those definitions are already present on the Kubernetes
|
||||||
|
API server (and they will be if you are upgrading a release from a previous
|
||||||
|
chart version). To update your custom resources:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl apply -f https://raw.githubusercontent.com/Kong/charts/main/charts/kong/crds/custom-resource-definitions.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deprecated controller flags/environment variables and annotations removed
|
||||||
|
|
||||||
|
Kong Ingress Controller 0.x versions had a number of deprecated
|
||||||
|
flags/environment variables and annotations. Version 1.0 removes support for
|
||||||
|
these, and you must update your configuration to use their modern equivalents
|
||||||
|
before upgrading to chart 1.11.0.
|
||||||
|
|
||||||
|
The [controller changelog](https://github.com/Kong/kubernetes-ingress-controller/blob/master/CHANGELOG.md#breaking-changes)
|
||||||
|
provides links to lists of deprecated configuration and their replacements.
|
||||||
|
|
||||||
|
## 1.10.0
|
||||||
|
|
||||||
|
### `KongClusterPlugin` replaces global `KongPlugin`s
|
||||||
|
|
||||||
|
Kong Ingress Controller 0.10.0 no longer supports `KongPlugin`s with a `global: true` label. See the [KIC changelog for 0.10.0](https://github.com/Kong/kubernetes-ingress-controller/blob/main/CHANGELOG.md#0100---20200915) for migration hints.
|
||||||
|
|
||||||
|
### Dropping support for resources not specifying an ingress class
|
||||||
|
|
||||||
|
Kong Ingress Controller 0.10.0 drops support for certain kinds of resources without a `kubernetes.io/ingress.class` annotation. See the [KIC changelog for 0.10.0](https://github.com/Kong/kubernetes-ingress-controller/blob/main/CHANGELOG.md#0100---20200915) for the exact list of those kinds, and for possible migration paths.
|
||||||
|
|
||||||
|
## 1.9.0
|
||||||
|
|
||||||
|
### New image for Enterprise controller-managed DB-less deployments
|
||||||
|
|
||||||
|
As of Kong Enterprise 2.1.3.0, there is no longer a separate image
|
||||||
|
(`kong-enterprise-k8s`) for controller-managed DB-less deployments. All Kong
|
||||||
|
Enterprise deployments now use the `kong-enterprise-edition` image.
|
||||||
|
|
||||||
|
Existing users of the `kong-enterprise-k8s` image can use the latest
|
||||||
|
`kong-enterprise-edition` image as a drop-in replacement for the
|
||||||
|
`kong-enterprise-k8s` image. You will also need to [create a Docker registry
|
||||||
|
secret](https://github.com/Kong/charts/blob/main/charts/kong/README.md#kong-enterprise-docker-registry-access)
|
||||||
|
for the `kong-enterprise-edition` registry and add it to `image.pullSecrets` in
|
||||||
|
values.yaml if you do not have one already.
|
||||||
|
|
||||||
|
### Changes to wait-for-postgres image
|
||||||
|
|
||||||
|
Prior to 1.9.0, the chart launched a busybox initContainer for migration Pods
|
||||||
|
to check Postgres' reachability [using
|
||||||
|
netcat](https://github.com/Kong/charts/blob/kong-1.8.0/charts/kong/templates/_helpers.tpl#L626).
|
||||||
|
|
||||||
|
As of 1.9.0, the chart uses a [bash
|
||||||
|
script](https://github.com/Kong/charts/blob/kong-1.9.0/charts/kong/templates/wait-for-postgres-script.yaml)
|
||||||
|
to perform the same connectivity check. The default `waitImage.repository`
|
||||||
|
value is now `bash` rather than `busybox`. Double-check your values.yaml to
|
||||||
|
confirm that you do not set `waitImage.repository` and `waitImage.tag` to the
|
||||||
|
old defaults: if you do, remove that configuration before upgrading.
|
||||||
|
|
||||||
|
The Helm upgrade cycle requires this script be available for upgrade jobs. On
|
||||||
|
existing installations, you must first perform an initial `helm upgrade --set
|
||||||
|
migrations.preUpgrade=false --migrations.postUpgrade=false` to chart 1.9.0.
|
||||||
|
Perform this initial upgrade without making changes to your Kong image version:
|
||||||
|
if you are upgrading Kong along with the chart, perform a separate upgrade
|
||||||
|
after with the migration jobs re-enabled.
|
||||||
|
|
||||||
|
If you do not override `waitImage.repository` in your releases, you do not need
|
||||||
|
to make any other configuration changes when upgrading to 1.9.0.
|
||||||
|
|
||||||
|
If you do override `waitImage.repository` to use a custom image, you must
|
||||||
|
switch to a custom image that provides a `bash` executable. Note that busybox
|
||||||
|
images, or images derived from it, do _not_ include a `bash` executable. We
|
||||||
|
recommend switching to an image derived from the public bash Docker image or a
|
||||||
|
base operating system image that provides a `bash` executable.
|
||||||
|
|
||||||
|
## 1.6.0
|
||||||
|
|
||||||
|
### Changes to Custom Resource Definitions
|
||||||
|
|
||||||
|
The KongPlugin and KongClusterPlugin resources have changed. Helm 3's CRD
|
||||||
|
management system does not modify CRDs during `helm upgrade`, and these must be
|
||||||
|
updated manually:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl apply -f https://raw.githubusercontent.com/Kong/charts/kong-1.6.0/charts/kong/crds/custom-resource-definitions.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Existing plugin resources do not require changes; the CRD update only adds new
|
||||||
|
fields.
|
||||||
|
|
||||||
|
### Removal of default security context UID setting
|
||||||
|
|
||||||
|
Versions of Kong prior to 2.0 and Kong Enterprise prior to 1.3 use Docker
|
||||||
|
images that required setting a UID via Kubernetes in some environments
|
||||||
|
(primarily OpenShift). This is no longer necessary with modern Docker images
|
||||||
|
and can cause issues depending on other environment settings, so it was
|
||||||
|
removed.
|
||||||
|
|
||||||
|
Most users should not need to take any action, but if you encounter permissions
|
||||||
|
errors when upgrading (`kubectl describe pod PODNAME` should contain any), you
|
||||||
|
can restore it by adding the following to your values.yaml:
|
||||||
|
|
||||||
|
```
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 1000
|
||||||
|
```
|
||||||
|
|
||||||
|
## 1.5.0
|
||||||
|
|
||||||
|
### PodSecurityPolicy defaults to read-only root filesystem
|
||||||
|
|
||||||
|
1.5.0 defaults to using a read-only root container filesystem if
|
||||||
|
`podSecurityPolicy.enabled: true` is set in values.yaml. This improves
|
||||||
|
security, but is incompatible with Kong Enterprise versions prior to 1.5. If
|
||||||
|
you use an older version and enable PodSecurityPolicy, you must set
|
||||||
|
`podSecurityPolicy.spec.readOnlyRootFilesystem: false`.
|
||||||
|
|
||||||
|
Kong open-source and Kong for Kubernetes Enterprise are compatible with a
|
||||||
|
read-only root filesystem on all versions.
|
||||||
|
|
||||||
|
### Changes to migration job configuration
|
||||||
|
|
||||||
|
Previously, all migration jobs were enabled/disabled through a single
|
||||||
|
`runMigrations` setting. 1.5.0 splits these into toggles for each of the
|
||||||
|
individual upgrade migrations:
|
||||||
|
|
||||||
|
```
|
||||||
|
migrations:
|
||||||
|
preUpgrade: true
|
||||||
|
postUpgrade: true
|
||||||
|
```
|
||||||
|
|
||||||
|
Initial migration jobs are now only run during `helm install` and are deleted
|
||||||
|
automatically when users first run `helm upgrade`.
|
||||||
|
|
||||||
|
Users should replace `runMigrations` with the above block from the latest
|
||||||
|
values.yaml.
|
||||||
|
|
||||||
|
The new format addresses several needs:
|
||||||
|
* The initial migrations job are only created during the initial install,
|
||||||
|
preventing [conflicts on upgrades](https://github.com/Kong/charts/blob/main/charts/kong/FAQs.md#running-helm-upgrade-fails-because-of-old-init-migrations-job).
|
||||||
|
* The upgrade migrations jobs can be disabled as need for managing
|
||||||
|
[multi-release clusters](https://github.com/Kong/charts/blob/main/charts/kong/README.md#separate-admin-and-proxy-nodes).
|
||||||
|
This enables management of clusters that have nodes with different roles,
|
||||||
|
e.g. nodes that only run the proxy and nodes that only run the admin API.
|
||||||
|
* Migration jobs now allow specifying annotations, and provide a default set
|
||||||
|
of annotations that disable some service mesh sidecars. Because sidecar
|
||||||
|
containers do not terminate, they [prevent the jobs from completing](https://github.com/kubernetes/kubernetes/issues/25908).
|
||||||
|
|
||||||
|
## 1.4.0
|
||||||
|
|
||||||
|
### Changes to default Postgres permissions
|
||||||
|
|
||||||
|
The [Postgres sub-chart](https://github.com/bitnami/charts/tree/master/bitnami/postgresql)
|
||||||
|
used by this chart has modified the way their chart handles file permissions.
|
||||||
|
This is not an issue for new installations, but prevents Postgres from starting
|
||||||
|
if its PVC was created with an older version. If affected, your Postgres pod
|
||||||
|
logs will show:
|
||||||
|
|
||||||
|
```
|
||||||
|
postgresql 19:16:04.03 INFO ==> ** Starting PostgreSQL **
|
||||||
|
2020-03-27 19:16:04.053 GMT [1] FATAL: data directory "/bitnami/postgresql/data" has group or world access
|
||||||
|
2020-03-27 19:16:04.053 GMT [1] DETAIL: Permissions should be u=rwx (0700).
|
||||||
|
```
|
||||||
|
|
||||||
|
You can restore the old permission handling behavior by adding two settings to
|
||||||
|
the `postgresql` block in values.yaml:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
postgresql:
|
||||||
|
enabled: true
|
||||||
|
postgresqlDataDir: /bitnami/postgresql/data
|
||||||
|
volumePermissions:
|
||||||
|
enabled: true
|
||||||
|
```
|
||||||
|
|
||||||
|
For background, see https://github.com/helm/charts/issues/13651
|
||||||
|
|
||||||
|
### `strip_path` now defaults to `false` for controller-managed routes
|
||||||
|
|
||||||
|
1.4.0 defaults to version 0.8 of the ingress controller, which changes the
|
||||||
|
default value of the `strip_path` route setting from `true` to `false`. To
|
||||||
|
understand how this works in practice, compare the upstream path for these
|
||||||
|
requests when `strip_path` is toggled:
|
||||||
|
|
||||||
|
| Ingress path | `strip_path` | Request path | Upstream path |
|
||||||
|
|--------------|--------------|--------------|---------------|
|
||||||
|
| /foo/bar | true | /foo/bar/baz | /baz |
|
||||||
|
| /foo/bar | false | /foo/bar/baz | /foo/bar/baz |
|
||||||
|
|
||||||
|
This change brings the controller in line with the Kubernetes Ingress
|
||||||
|
specification, which expects that controllers will not modify the request
|
||||||
|
before passing it upstream unless explicitly configured to do so.
|
||||||
|
|
||||||
|
To preserve your existing route handling, you should add this annotation to
|
||||||
|
your ingress resources:
|
||||||
|
|
||||||
|
```
|
||||||
|
konghq.com/strip-path: "true"
|
||||||
|
```
|
||||||
|
|
||||||
|
This is a new annotation that is equivalent to the `route.strip_path` setting
|
||||||
|
in KongIngress resources. Note that if you have already set this to `false`,
|
||||||
|
you should leave it as-is and not add an annotation to the ingress.
|
||||||
|
|
||||||
|
### Changes to Kong service configuration
|
||||||
|
|
||||||
|
1.4.0 reworks the templates and configuration used to generate Kong
|
||||||
|
configuration and Kuberenetes resources for Kong's services (the admin API,
|
||||||
|
proxy, Developer Portal, etc.). For the admin API, this requires breaking
|
||||||
|
changes to the configuration format in values.yaml. Prior to 1.4.0, the admin
|
||||||
|
API allowed a single listen only, which could be toggled between HTTPS and
|
||||||
|
HTTP:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
admin:
|
||||||
|
enabled: false # create Service
|
||||||
|
useTLS: true
|
||||||
|
servicePort: 8444
|
||||||
|
containerPort: 8444
|
||||||
|
```
|
||||||
|
In 1.4.0+, the admin API allows enabling or disabling the HTTP and TLS listens
|
||||||
|
independently. The equivalent of the above configuration is:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
admin:
|
||||||
|
enabled: false # create Service
|
||||||
|
http:
|
||||||
|
enabled: false # create HTTP listen
|
||||||
|
servicePort: 8001
|
||||||
|
containerPort: 8001
|
||||||
|
parameters: []
|
||||||
|
|
||||||
|
tls:
|
||||||
|
enabled: true # create HTTPS listen
|
||||||
|
servicePort: 8444
|
||||||
|
containerPort: 8444
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
```
|
||||||
|
All Kong services now support `SERVICE.enabled` parameters: these allow
|
||||||
|
disabling the creation of a Kubernetes Service resource for that Kong service,
|
||||||
|
which is useful in configurations where nodes have different roles, e.g. where
|
||||||
|
some nodes only handle proxy traffic and some only handle admin API traffic. To
|
||||||
|
disable a Kong service completely, you should also set `SERVICE.http.enabled:
|
||||||
|
false` and `SERVICE.tls.enabled: false`. Disabling creation of the Service
|
||||||
|
resource only leaves the Kong service enabled, but only accessible within its
|
||||||
|
pod. The admin API is configured with only Service creation disabled to allow
|
||||||
|
the ingress controller to access it without allowing access from other pods.
|
||||||
|
|
||||||
|
Services now also include a new `parameters` section that allows setting
|
||||||
|
additional listen options, e.g. the `reuseport` and `backlog=16384` parameters
|
||||||
|
from the [default 2.0.0 proxy
|
||||||
|
listen](https://github.com/Kong/kong/blob/2.0.0/kong.conf.default#L186). For
|
||||||
|
compatibility with older Kong versions, the chart defaults do not enable most
|
||||||
|
of the newer parameters, only HTTP/2 support. Users of versions 1.3.0 and newer
|
||||||
|
can safely add the new parameters.
|
||||||
|
|
||||||
|
## 1.3.0
|
||||||
|
|
||||||
|
### Removal of dedicated Portal authentication configuration parameters
|
||||||
|
|
||||||
|
1.3.0 deprecates the `enterprise.portal.portal_auth` and
|
||||||
|
`enterprise.portal.session_conf_secret` settings in values.yaml in favor of
|
||||||
|
placing equivalent configuration under `env`. These settings are less important
|
||||||
|
in Kong Enterprise 0.36+, as they can both be set per workspace in Kong
|
||||||
|
Manager.
|
||||||
|
|
||||||
|
These settings provide the default settings for Portal instances: when the
|
||||||
|
"Authentication plugin" and "Session Config" dropdowns at
|
||||||
|
https://manager.kong.example/WORKSPACE/portal/settings/ are set to "Default",
|
||||||
|
the settings from `KONG_PORTAL_AUTH` and `KONG_PORTAL_SESSION_CONF` are used.
|
||||||
|
If these environment variables are not set, the defaults are to use
|
||||||
|
`basic-auth` and `{}` (which applies the [session plugin default
|
||||||
|
configuration](https://docs.konghq.com/hub/kong-inc/session/)).
|
||||||
|
|
||||||
|
If you set nonstandard defaults and wish to keep using these settings, or use
|
||||||
|
Kong Enterprise 0.35 (which did not provide a means to set per-workspace
|
||||||
|
session configuration) you should convert them to environment variables. For
|
||||||
|
example, if you currently have:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
portal:
|
||||||
|
enabled: true
|
||||||
|
portal_auth: basic-auth
|
||||||
|
session_conf_secret: portal-session
|
||||||
|
```
|
||||||
|
You should remove the `portal_auth` and `session_conf_secret` entries and
|
||||||
|
replace them with their equivalents under the `env` block:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
env:
|
||||||
|
portal_auth: basic-auth
|
||||||
|
portal_session_conf:
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: portal-session
|
||||||
|
key: portal_session_conf
|
||||||
|
```
|
@ -0,0 +1,21 @@
|
|||||||
|
# Patterns to ignore when building packages.
|
||||||
|
# This supports shell glob matching, relative path matching, and
|
||||||
|
# negation (prefixed with !). Only one pattern per line.
|
||||||
|
.DS_Store
|
||||||
|
# Common VCS dirs
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.bzr/
|
||||||
|
.bzrignore
|
||||||
|
.hg/
|
||||||
|
.hgignore
|
||||||
|
.svn/
|
||||||
|
# Common backup files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*~
|
||||||
|
# Various IDEs
|
||||||
|
.project
|
||||||
|
.idea/
|
||||||
|
*.tmproj
|
@ -0,0 +1,6 @@
|
|||||||
|
dependencies:
|
||||||
|
- name: common
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
version: 2.0.4
|
||||||
|
digest: sha256:ec5726c5d8f1e474cc6c9ca90c18efc35f4dbd15ccaf2df148764947d5ad6a6c
|
||||||
|
generated: "2022-10-25T14:40:27.273494162Z"
|
@ -0,0 +1,30 @@
|
|||||||
|
annotations:
|
||||||
|
category: Database
|
||||||
|
apiVersion: v2
|
||||||
|
appVersion: 14.5.0
|
||||||
|
dependencies:
|
||||||
|
- name: common
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
tags:
|
||||||
|
- bitnami-common
|
||||||
|
version: 2.x.x
|
||||||
|
description: PostgreSQL (Postgres) is an open source object-relational database known
|
||||||
|
for reliability and data integrity. ACID-compliant, it supports foreign keys, joins,
|
||||||
|
views, triggers and stored procedures.
|
||||||
|
home: https://github.com/bitnami/charts/tree/main/bitnami/postgresql
|
||||||
|
icon: https://bitnami.com/assets/stacks/postgresql/img/postgresql-stack-220x234.png
|
||||||
|
keywords:
|
||||||
|
- postgresql
|
||||||
|
- postgres
|
||||||
|
- database
|
||||||
|
- sql
|
||||||
|
- replication
|
||||||
|
- cluster
|
||||||
|
maintainers:
|
||||||
|
- name: Bitnami
|
||||||
|
url: https://github.com/bitnami/charts
|
||||||
|
name: postgresql
|
||||||
|
sources:
|
||||||
|
- https://github.com/bitnami/containers/tree/main/bitnami/postgresql
|
||||||
|
- https://www.postgresql.org/
|
||||||
|
version: 11.9.13
|
683
build_system/charts/open-appsec-kong/charts/postgresql/README.md
Normal file
683
build_system/charts/open-appsec-kong/charts/postgresql/README.md
Normal file
@ -0,0 +1,683 @@
|
|||||||
|
<!--- app-name: PostgreSQL -->
|
||||||
|
|
||||||
|
# PostgreSQL packaged by Bitnami
|
||||||
|
|
||||||
|
PostgreSQL (Postgres) is an open source object-relational database known for reliability and data integrity. ACID-compliant, it supports foreign keys, joins, views, triggers and stored procedures.
|
||||||
|
|
||||||
|
[Overview of PostgreSQL](http://www.postgresql.org)
|
||||||
|
|
||||||
|
Trademarks: This software listing is packaged by Bitnami. The respective trademarks mentioned in the offering are owned by the respective companies, and use of them does not imply any affiliation or endorsement.
|
||||||
|
|
||||||
|
## TL;DR
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add my-repo https://charts.bitnami.com/bitnami
|
||||||
|
helm install my-release my-repo/postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This chart bootstraps a [PostgreSQL](https://github.com/bitnami/containers/tree/main/bitnami/postgresql) deployment on a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
|
||||||
|
|
||||||
|
For HA, please see [this repo](https://github.com/bitnami/charts/tree/main/bitnami/postgresql-ha)
|
||||||
|
|
||||||
|
Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Kubernetes 1.19+
|
||||||
|
- Helm 3.2.0+
|
||||||
|
- PV provisioner support in the underlying infrastructure
|
||||||
|
|
||||||
|
## Installing the Chart
|
||||||
|
|
||||||
|
To install the chart with the release name `my-release`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm install my-release my-repo/postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
The command deploys PostgreSQL on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation.
|
||||||
|
|
||||||
|
> **Tip**: List all releases using `helm list`
|
||||||
|
|
||||||
|
## Uninstalling the Chart
|
||||||
|
|
||||||
|
To uninstall/delete the `my-release` deployment:
|
||||||
|
|
||||||
|
```console
|
||||||
|
helm delete my-release
|
||||||
|
```
|
||||||
|
|
||||||
|
The command removes all the Kubernetes components but PVC's associated with the chart and deletes the release.
|
||||||
|
|
||||||
|
To delete the PVC's associated with `my-release`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl delete pvc -l release=my-release
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**: Deleting the PVC's will delete postgresql data as well. Please be cautious before doing it.
|
||||||
|
|
||||||
|
## 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) | `""` |
|
||||||
|
| `global.postgresql.auth.postgresPassword` | Password for the "postgres" admin user (overrides `auth.postgresPassword`) | `""` |
|
||||||
|
| `global.postgresql.auth.username` | Name for a custom user to create (overrides `auth.username`) | `""` |
|
||||||
|
| `global.postgresql.auth.password` | Password for the custom user to create (overrides `auth.password`) | `""` |
|
||||||
|
| `global.postgresql.auth.database` | Name for a custom database to create (overrides `auth.database`) | `""` |
|
||||||
|
| `global.postgresql.auth.existingSecret` | Name of existing secret to use for PostgreSQL credentials (overrides `auth.existingSecret`). | `""` |
|
||||||
|
| `global.postgresql.auth.secretKeys.adminPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.adminPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. | `""` |
|
||||||
|
| `global.postgresql.auth.secretKeys.userPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.userPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. | `""` |
|
||||||
|
| `global.postgresql.auth.secretKeys.replicationPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.replicationPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. | `""` |
|
||||||
|
| `global.postgresql.service.ports.postgresql` | PostgreSQL service port (overrides `service.ports.postgresql`) | `""` |
|
||||||
|
|
||||||
|
|
||||||
|
### Common parameters
|
||||||
|
|
||||||
|
| Name | Description | Value |
|
||||||
|
| ------------------------ | -------------------------------------------------------------------------------------------- | --------------- |
|
||||||
|
| `kubeVersion` | Override Kubernetes version | `""` |
|
||||||
|
| `nameOverride` | String to partially override common.names.fullname template (will maintain the release name) | `""` |
|
||||||
|
| `fullnameOverride` | String to fully override common.names.fullname template | `""` |
|
||||||
|
| `clusterDomain` | Kubernetes Cluster Domain | `cluster.local` |
|
||||||
|
| `extraDeploy` | Array of extra objects to deploy with the release (evaluated as a template) | `[]` |
|
||||||
|
| `commonLabels` | Add labels to all the deployed resources | `{}` |
|
||||||
|
| `commonAnnotations` | Add annotations to all the deployed resources | `{}` |
|
||||||
|
| `diagnosticMode.enabled` | Enable diagnostic mode (all probes will be disabled and the command will be overridden) | `false` |
|
||||||
|
| `diagnosticMode.command` | Command to override all containers in the statefulset | `["sleep"]` |
|
||||||
|
| `diagnosticMode.args` | Args to override all containers in the statefulset | `["infinity"]` |
|
||||||
|
|
||||||
|
|
||||||
|
### PostgreSQL common parameters
|
||||||
|
|
||||||
|
| Name | Description | Value |
|
||||||
|
| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
|
||||||
|
| `image.registry` | PostgreSQL image registry | `docker.io` |
|
||||||
|
| `image.repository` | PostgreSQL image repository | `bitnami/postgresql` |
|
||||||
|
| `image.tag` | PostgreSQL image tag (immutable tags are recommended) | `14.5.0-debian-11-r35` |
|
||||||
|
| `image.digest` | PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` |
|
||||||
|
| `image.pullPolicy` | PostgreSQL image pull policy | `IfNotPresent` |
|
||||||
|
| `image.pullSecrets` | Specify image pull secrets | `[]` |
|
||||||
|
| `image.debug` | Specify if debug values should be set | `false` |
|
||||||
|
| `auth.enablePostgresUser` | Assign a password to the "postgres" admin user. Otherwise, remote access will be blocked for this user | `true` |
|
||||||
|
| `auth.postgresPassword` | Password for the "postgres" admin user. Ignored if `auth.existingSecret` with key `postgres-password` is provided | `""` |
|
||||||
|
| `auth.username` | Name for a custom user to create | `""` |
|
||||||
|
| `auth.password` | Password for the custom user to create. Ignored if `auth.existingSecret` with key `password` is provided | `""` |
|
||||||
|
| `auth.database` | Name for a custom database to create | `""` |
|
||||||
|
| `auth.replicationUsername` | Name of the replication user | `repl_user` |
|
||||||
|
| `auth.replicationPassword` | Password for the replication user. Ignored if `auth.existingSecret` with key `replication-password` is provided | `""` |
|
||||||
|
| `auth.existingSecret` | Name of existing secret to use for PostgreSQL credentials. `auth.postgresPassword`, `auth.password`, and `auth.replicationPassword` will be ignored and picked up from this secret. The secret might also contains the key `ldap-password` if LDAP is enabled. `ldap.bind_password` will be ignored and picked from this secret in this case. | `""` |
|
||||||
|
| `auth.secretKeys.adminPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `postgres-password` |
|
||||||
|
| `auth.secretKeys.userPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `password` |
|
||||||
|
| `auth.secretKeys.replicationPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `replication-password` |
|
||||||
|
| `auth.usePasswordFiles` | Mount credentials as a files instead of using an environment variable | `false` |
|
||||||
|
| `architecture` | PostgreSQL architecture (`standalone` or `replication`) | `standalone` |
|
||||||
|
| `replication.synchronousCommit` | Set synchronous commit mode. Allowed values: `on`, `remote_apply`, `remote_write`, `local` and `off` | `off` |
|
||||||
|
| `replication.numSynchronousReplicas` | Number of replicas that will have synchronous replication. Note: Cannot be greater than `readReplicas.replicaCount`. | `0` |
|
||||||
|
| `replication.applicationName` | Cluster application name. Useful for advanced replication settings | `my_application` |
|
||||||
|
| `containerPorts.postgresql` | PostgreSQL container port | `5432` |
|
||||||
|
| `audit.logHostname` | Log client hostnames | `false` |
|
||||||
|
| `audit.logConnections` | Add client log-in operations to the log file | `false` |
|
||||||
|
| `audit.logDisconnections` | Add client log-outs operations to the log file | `false` |
|
||||||
|
| `audit.pgAuditLog` | Add operations to log using the pgAudit extension | `""` |
|
||||||
|
| `audit.pgAuditLogCatalog` | Log catalog using pgAudit | `off` |
|
||||||
|
| `audit.clientMinMessages` | Message log level to share with the user | `error` |
|
||||||
|
| `audit.logLinePrefix` | Template for log line prefix (default if not set) | `""` |
|
||||||
|
| `audit.logTimezone` | Timezone for the log timestamps | `""` |
|
||||||
|
| `ldap.enabled` | Enable LDAP support | `false` |
|
||||||
|
| `ldap.server` | IP address or name of the LDAP server. | `""` |
|
||||||
|
| `ldap.port` | Port number on the LDAP server to connect to | `""` |
|
||||||
|
| `ldap.prefix` | String to prepend to the user name when forming the DN to bind | `""` |
|
||||||
|
| `ldap.suffix` | String to append to the user name when forming the DN to bind | `""` |
|
||||||
|
| `ldap.basedn` | Root DN to begin the search for the user in | `""` |
|
||||||
|
| `ldap.binddn` | DN of user to bind to LDAP | `""` |
|
||||||
|
| `ldap.bindpw` | Password for the user to bind to LDAP | `""` |
|
||||||
|
| `ldap.searchAttribute` | Attribute to match against the user name in the search | `""` |
|
||||||
|
| `ldap.searchFilter` | The search filter to use when doing search+bind authentication | `""` |
|
||||||
|
| `ldap.scheme` | Set to `ldaps` to use LDAPS | `""` |
|
||||||
|
| `ldap.tls.enabled` | Se to true to enable TLS encryption | `false` |
|
||||||
|
| `ldap.uri` | LDAP URL beginning in the form `ldap[s]://host[:port]/basedn`. If provided, all the other LDAP parameters will be ignored. | `""` |
|
||||||
|
| `postgresqlDataDir` | PostgreSQL data dir folder | `/bitnami/postgresql/data` |
|
||||||
|
| `postgresqlSharedPreloadLibraries` | Shared preload libraries (comma-separated list) | `pgaudit` |
|
||||||
|
| `shmVolume.enabled` | Enable emptyDir volume for /dev/shm for PostgreSQL pod(s) | `true` |
|
||||||
|
| `shmVolume.sizeLimit` | Set this to enable a size limit on the shm tmpfs | `""` |
|
||||||
|
| `tls.enabled` | Enable TLS traffic support | `false` |
|
||||||
|
| `tls.autoGenerated` | Generate automatically self-signed TLS certificates | `false` |
|
||||||
|
| `tls.preferServerCiphers` | Whether to use the server's TLS cipher preferences rather than the client's | `true` |
|
||||||
|
| `tls.certificatesSecret` | Name of an existing secret that contains the certificates | `""` |
|
||||||
|
| `tls.certFilename` | Certificate filename | `""` |
|
||||||
|
| `tls.certKeyFilename` | Certificate key filename | `""` |
|
||||||
|
| `tls.certCAFilename` | CA Certificate filename | `""` |
|
||||||
|
| `tls.crlFilename` | File containing a Certificate Revocation List | `""` |
|
||||||
|
|
||||||
|
|
||||||
|
### PostgreSQL Primary parameters
|
||||||
|
|
||||||
|
| Name | Description | Value |
|
||||||
|
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | --------------------- |
|
||||||
|
| `primary.name` | Name of the primary database (eg primary, master, leader, ...) | `primary` |
|
||||||
|
| `primary.configuration` | PostgreSQL Primary main configuration to be injected as ConfigMap | `""` |
|
||||||
|
| `primary.pgHbaConfiguration` | PostgreSQL Primary client authentication configuration | `""` |
|
||||||
|
| `primary.existingConfigmap` | Name of an existing ConfigMap with PostgreSQL Primary configuration | `""` |
|
||||||
|
| `primary.extendedConfiguration` | Extended PostgreSQL Primary configuration (appended to main or default configuration) | `""` |
|
||||||
|
| `primary.existingExtendedConfigmap` | Name of an existing ConfigMap with PostgreSQL Primary extended configuration | `""` |
|
||||||
|
| `primary.initdb.args` | PostgreSQL initdb extra arguments | `""` |
|
||||||
|
| `primary.initdb.postgresqlWalDir` | Specify a custom location for the PostgreSQL transaction log | `""` |
|
||||||
|
| `primary.initdb.scripts` | Dictionary of initdb scripts | `{}` |
|
||||||
|
| `primary.initdb.scriptsConfigMap` | ConfigMap with scripts to be run at first boot | `""` |
|
||||||
|
| `primary.initdb.scriptsSecret` | Secret with scripts to be run at first boot (in case it contains sensitive information) | `""` |
|
||||||
|
| `primary.initdb.user` | Specify the PostgreSQL username to execute the initdb scripts | `""` |
|
||||||
|
| `primary.initdb.password` | Specify the PostgreSQL password to execute the initdb scripts | `""` |
|
||||||
|
| `primary.standby.enabled` | Whether to enable current cluster's primary as standby server of another cluster or not | `false` |
|
||||||
|
| `primary.standby.primaryHost` | The Host of replication primary in the other cluster | `""` |
|
||||||
|
| `primary.standby.primaryPort` | The Port of replication primary in the other cluster | `""` |
|
||||||
|
| `primary.extraEnvVars` | Array with extra environment variables to add to PostgreSQL Primary nodes | `[]` |
|
||||||
|
| `primary.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for PostgreSQL Primary nodes | `""` |
|
||||||
|
| `primary.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for PostgreSQL Primary nodes | `""` |
|
||||||
|
| `primary.command` | Override default container command (useful when using custom images) | `[]` |
|
||||||
|
| `primary.args` | Override default container args (useful when using custom images) | `[]` |
|
||||||
|
| `primary.livenessProbe.enabled` | Enable livenessProbe on PostgreSQL Primary containers | `true` |
|
||||||
|
| `primary.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `30` |
|
||||||
|
| `primary.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` |
|
||||||
|
| `primary.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` |
|
||||||
|
| `primary.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` |
|
||||||
|
| `primary.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` |
|
||||||
|
| `primary.readinessProbe.enabled` | Enable readinessProbe on PostgreSQL Primary containers | `true` |
|
||||||
|
| `primary.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` |
|
||||||
|
| `primary.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` |
|
||||||
|
| `primary.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `5` |
|
||||||
|
| `primary.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` |
|
||||||
|
| `primary.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` |
|
||||||
|
| `primary.startupProbe.enabled` | Enable startupProbe on PostgreSQL Primary containers | `false` |
|
||||||
|
| `primary.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `30` |
|
||||||
|
| `primary.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` |
|
||||||
|
| `primary.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` |
|
||||||
|
| `primary.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` |
|
||||||
|
| `primary.startupProbe.successThreshold` | Success threshold for startupProbe | `1` |
|
||||||
|
| `primary.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` |
|
||||||
|
| `primary.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` |
|
||||||
|
| `primary.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` |
|
||||||
|
| `primary.lifecycleHooks` | for the PostgreSQL Primary container to automate configuration before or after startup | `{}` |
|
||||||
|
| `primary.resources.limits` | The resources limits for the PostgreSQL Primary containers | `{}` |
|
||||||
|
| `primary.resources.requests.memory` | The requested memory for the PostgreSQL Primary containers | `256Mi` |
|
||||||
|
| `primary.resources.requests.cpu` | The requested cpu for the PostgreSQL Primary containers | `250m` |
|
||||||
|
| `primary.podSecurityContext.enabled` | Enable security context | `true` |
|
||||||
|
| `primary.podSecurityContext.fsGroup` | Group ID for the pod | `1001` |
|
||||||
|
| `primary.containerSecurityContext.enabled` | Enable container security context | `true` |
|
||||||
|
| `primary.containerSecurityContext.runAsUser` | User ID for the container | `1001` |
|
||||||
|
| `primary.hostAliases` | PostgreSQL primary pods host aliases | `[]` |
|
||||||
|
| `primary.hostNetwork` | Specify if host network should be enabled for PostgreSQL pod (postgresql primary) | `false` |
|
||||||
|
| `primary.hostIPC` | Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) | `false` |
|
||||||
|
| `primary.labels` | Map of labels to add to the statefulset (postgresql primary) | `{}` |
|
||||||
|
| `primary.annotations` | Annotations for PostgreSQL primary pods | `{}` |
|
||||||
|
| `primary.podLabels` | Map of labels to add to the pods (postgresql primary) | `{}` |
|
||||||
|
| `primary.podAnnotations` | Map of annotations to add to the pods (postgresql primary) | `{}` |
|
||||||
|
| `primary.podAffinityPreset` | PostgreSQL primary pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` |
|
||||||
|
| `primary.podAntiAffinityPreset` | PostgreSQL primary pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `soft` |
|
||||||
|
| `primary.nodeAffinityPreset.type` | PostgreSQL primary node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` |
|
||||||
|
| `primary.nodeAffinityPreset.key` | PostgreSQL primary node label key to match Ignored if `primary.affinity` is set. | `""` |
|
||||||
|
| `primary.nodeAffinityPreset.values` | PostgreSQL primary node label values to match. Ignored if `primary.affinity` is set. | `[]` |
|
||||||
|
| `primary.affinity` | Affinity for PostgreSQL primary pods assignment | `{}` |
|
||||||
|
| `primary.nodeSelector` | Node labels for PostgreSQL primary pods assignment | `{}` |
|
||||||
|
| `primary.tolerations` | Tolerations for PostgreSQL primary pods assignment | `[]` |
|
||||||
|
| `primary.topologySpreadConstraints` | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template | `[]` |
|
||||||
|
| `primary.priorityClassName` | Priority Class to use for each pod (postgresql primary) | `""` |
|
||||||
|
| `primary.schedulerName` | Use an alternate scheduler, e.g. "stork". | `""` |
|
||||||
|
| `primary.terminationGracePeriodSeconds` | Seconds PostgreSQL primary pod needs to terminate gracefully | `""` |
|
||||||
|
| `primary.updateStrategy.type` | PostgreSQL Primary statefulset strategy type | `RollingUpdate` |
|
||||||
|
| `primary.updateStrategy.rollingUpdate` | PostgreSQL Primary statefulset rolling update configuration parameters | `{}` |
|
||||||
|
| `primary.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the PostgreSQL Primary container(s) | `[]` |
|
||||||
|
| `primary.extraVolumes` | Optionally specify extra list of additional volumes for the PostgreSQL Primary pod(s) | `[]` |
|
||||||
|
| `primary.sidecars` | Add additional sidecar containers to the PostgreSQL Primary pod(s) | `[]` |
|
||||||
|
| `primary.initContainers` | Add additional init containers to the PostgreSQL Primary pod(s) | `[]` |
|
||||||
|
| `primary.extraPodSpec` | Optionally specify extra PodSpec for the PostgreSQL Primary pod(s) | `{}` |
|
||||||
|
| `primary.service.type` | Kubernetes Service type | `ClusterIP` |
|
||||||
|
| `primary.service.ports.postgresql` | PostgreSQL service port | `5432` |
|
||||||
|
| `primary.service.nodePorts.postgresql` | Node port for PostgreSQL | `""` |
|
||||||
|
| `primary.service.clusterIP` | Static clusterIP or None for headless services | `""` |
|
||||||
|
| `primary.service.annotations` | Annotations for PostgreSQL primary service | `{}` |
|
||||||
|
| `primary.service.loadBalancerIP` | Load balancer IP if service type is `LoadBalancer` | `""` |
|
||||||
|
| `primary.service.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` |
|
||||||
|
| `primary.service.loadBalancerSourceRanges` | Addresses that are allowed when service is LoadBalancer | `[]` |
|
||||||
|
| `primary.service.extraPorts` | Extra ports to expose in the PostgreSQL primary service | `[]` |
|
||||||
|
| `primary.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` |
|
||||||
|
| `primary.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` |
|
||||||
|
| `primary.persistence.enabled` | Enable PostgreSQL Primary data persistence using PVC | `true` |
|
||||||
|
| `primary.persistence.existingClaim` | Name of an existing PVC to use | `""` |
|
||||||
|
| `primary.persistence.mountPath` | The path the volume will be mounted at | `/bitnami/postgresql` |
|
||||||
|
| `primary.persistence.subPath` | The subdirectory of the volume to mount to | `""` |
|
||||||
|
| `primary.persistence.storageClass` | PVC Storage Class for PostgreSQL Primary data volume | `""` |
|
||||||
|
| `primary.persistence.accessModes` | PVC Access Mode for PostgreSQL volume | `["ReadWriteOnce"]` |
|
||||||
|
| `primary.persistence.size` | PVC Storage Request for PostgreSQL volume | `8Gi` |
|
||||||
|
| `primary.persistence.annotations` | Annotations for the PVC | `{}` |
|
||||||
|
| `primary.persistence.labels` | Labels for the PVC | `{}` |
|
||||||
|
| `primary.persistence.selector` | Selector to match an existing Persistent Volume (this value is evaluated as a template) | `{}` |
|
||||||
|
| `primary.persistence.dataSource` | Custom PVC data source | `{}` |
|
||||||
|
|
||||||
|
|
||||||
|
### PostgreSQL read only replica parameters (only used when `architecture` is set to `replication`)
|
||||||
|
|
||||||
|
| Name | Description | Value |
|
||||||
|
| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | --------------------- |
|
||||||
|
| `readReplicas.name` | Name of the read replicas database (eg secondary, slave, ...) | `read` |
|
||||||
|
| `readReplicas.replicaCount` | Number of PostgreSQL read only replicas | `1` |
|
||||||
|
| `readReplicas.extendedConfiguration` | Extended PostgreSQL read only replicas configuration (appended to main or default configuration) | `""` |
|
||||||
|
| `readReplicas.extraEnvVars` | Array with extra environment variables to add to PostgreSQL read only nodes | `[]` |
|
||||||
|
| `readReplicas.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for PostgreSQL read only nodes | `""` |
|
||||||
|
| `readReplicas.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for PostgreSQL read only nodes | `""` |
|
||||||
|
| `readReplicas.command` | Override default container command (useful when using custom images) | `[]` |
|
||||||
|
| `readReplicas.args` | Override default container args (useful when using custom images) | `[]` |
|
||||||
|
| `readReplicas.livenessProbe.enabled` | Enable livenessProbe on PostgreSQL read only containers | `true` |
|
||||||
|
| `readReplicas.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `30` |
|
||||||
|
| `readReplicas.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` |
|
||||||
|
| `readReplicas.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` |
|
||||||
|
| `readReplicas.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` |
|
||||||
|
| `readReplicas.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` |
|
||||||
|
| `readReplicas.readinessProbe.enabled` | Enable readinessProbe on PostgreSQL read only containers | `true` |
|
||||||
|
| `readReplicas.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` |
|
||||||
|
| `readReplicas.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` |
|
||||||
|
| `readReplicas.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `5` |
|
||||||
|
| `readReplicas.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` |
|
||||||
|
| `readReplicas.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` |
|
||||||
|
| `readReplicas.startupProbe.enabled` | Enable startupProbe on PostgreSQL read only containers | `false` |
|
||||||
|
| `readReplicas.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `30` |
|
||||||
|
| `readReplicas.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` |
|
||||||
|
| `readReplicas.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` |
|
||||||
|
| `readReplicas.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` |
|
||||||
|
| `readReplicas.startupProbe.successThreshold` | Success threshold for startupProbe | `1` |
|
||||||
|
| `readReplicas.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` |
|
||||||
|
| `readReplicas.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` |
|
||||||
|
| `readReplicas.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` |
|
||||||
|
| `readReplicas.lifecycleHooks` | for the PostgreSQL read only container to automate configuration before or after startup | `{}` |
|
||||||
|
| `readReplicas.resources.limits` | The resources limits for the PostgreSQL read only containers | `{}` |
|
||||||
|
| `readReplicas.resources.requests.memory` | The requested memory for the PostgreSQL read only containers | `256Mi` |
|
||||||
|
| `readReplicas.resources.requests.cpu` | The requested cpu for the PostgreSQL read only containers | `250m` |
|
||||||
|
| `readReplicas.podSecurityContext.enabled` | Enable security context | `true` |
|
||||||
|
| `readReplicas.podSecurityContext.fsGroup` | Group ID for the pod | `1001` |
|
||||||
|
| `readReplicas.containerSecurityContext.enabled` | Enable container security context | `true` |
|
||||||
|
| `readReplicas.containerSecurityContext.runAsUser` | User ID for the container | `1001` |
|
||||||
|
| `readReplicas.hostAliases` | PostgreSQL read only pods host aliases | `[]` |
|
||||||
|
| `readReplicas.hostNetwork` | Specify if host network should be enabled for PostgreSQL pod (PostgreSQL read only) | `false` |
|
||||||
|
| `readReplicas.hostIPC` | Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) | `false` |
|
||||||
|
| `readReplicas.labels` | Map of labels to add to the statefulset (PostgreSQL read only) | `{}` |
|
||||||
|
| `readReplicas.annotations` | Annotations for PostgreSQL read only pods | `{}` |
|
||||||
|
| `readReplicas.podLabels` | Map of labels to add to the pods (PostgreSQL read only) | `{}` |
|
||||||
|
| `readReplicas.podAnnotations` | Map of annotations to add to the pods (PostgreSQL read only) | `{}` |
|
||||||
|
| `readReplicas.podAffinityPreset` | PostgreSQL read only pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` |
|
||||||
|
| `readReplicas.podAntiAffinityPreset` | PostgreSQL read only pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `soft` |
|
||||||
|
| `readReplicas.nodeAffinityPreset.type` | PostgreSQL read only node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` |
|
||||||
|
| `readReplicas.nodeAffinityPreset.key` | PostgreSQL read only node label key to match Ignored if `primary.affinity` is set. | `""` |
|
||||||
|
| `readReplicas.nodeAffinityPreset.values` | PostgreSQL read only node label values to match. Ignored if `primary.affinity` is set. | `[]` |
|
||||||
|
| `readReplicas.affinity` | Affinity for PostgreSQL read only pods assignment | `{}` |
|
||||||
|
| `readReplicas.nodeSelector` | Node labels for PostgreSQL read only pods assignment | `{}` |
|
||||||
|
| `readReplicas.tolerations` | Tolerations for PostgreSQL read only pods assignment | `[]` |
|
||||||
|
| `readReplicas.topologySpreadConstraints` | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template | `[]` |
|
||||||
|
| `readReplicas.priorityClassName` | Priority Class to use for each pod (PostgreSQL read only) | `""` |
|
||||||
|
| `readReplicas.schedulerName` | Use an alternate scheduler, e.g. "stork". | `""` |
|
||||||
|
| `readReplicas.terminationGracePeriodSeconds` | Seconds PostgreSQL read only pod needs to terminate gracefully | `""` |
|
||||||
|
| `readReplicas.updateStrategy.type` | PostgreSQL read only statefulset strategy type | `RollingUpdate` |
|
||||||
|
| `readReplicas.updateStrategy.rollingUpdate` | PostgreSQL read only statefulset rolling update configuration parameters | `{}` |
|
||||||
|
| `readReplicas.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the PostgreSQL read only container(s) | `[]` |
|
||||||
|
| `readReplicas.extraVolumes` | Optionally specify extra list of additional volumes for the PostgreSQL read only pod(s) | `[]` |
|
||||||
|
| `readReplicas.sidecars` | Add additional sidecar containers to the PostgreSQL read only pod(s) | `[]` |
|
||||||
|
| `readReplicas.initContainers` | Add additional init containers to the PostgreSQL read only pod(s) | `[]` |
|
||||||
|
| `readReplicas.extraPodSpec` | Optionally specify extra PodSpec for the PostgreSQL read only pod(s) | `{}` |
|
||||||
|
| `readReplicas.service.type` | Kubernetes Service type | `ClusterIP` |
|
||||||
|
| `readReplicas.service.ports.postgresql` | PostgreSQL service port | `5432` |
|
||||||
|
| `readReplicas.service.nodePorts.postgresql` | Node port for PostgreSQL | `""` |
|
||||||
|
| `readReplicas.service.clusterIP` | Static clusterIP or None for headless services | `""` |
|
||||||
|
| `readReplicas.service.annotations` | Annotations for PostgreSQL read only service | `{}` |
|
||||||
|
| `readReplicas.service.loadBalancerIP` | Load balancer IP if service type is `LoadBalancer` | `""` |
|
||||||
|
| `readReplicas.service.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` |
|
||||||
|
| `readReplicas.service.loadBalancerSourceRanges` | Addresses that are allowed when service is LoadBalancer | `[]` |
|
||||||
|
| `readReplicas.service.extraPorts` | Extra ports to expose in the PostgreSQL read only service | `[]` |
|
||||||
|
| `readReplicas.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` |
|
||||||
|
| `readReplicas.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` |
|
||||||
|
| `readReplicas.persistence.enabled` | Enable PostgreSQL read only data persistence using PVC | `true` |
|
||||||
|
| `readReplicas.persistence.existingClaim` | Name of an existing PVC to use | `""` |
|
||||||
|
| `readReplicas.persistence.mountPath` | The path the volume will be mounted at | `/bitnami/postgresql` |
|
||||||
|
| `readReplicas.persistence.subPath` | The subdirectory of the volume to mount to | `""` |
|
||||||
|
| `readReplicas.persistence.storageClass` | PVC Storage Class for PostgreSQL read only data volume | `""` |
|
||||||
|
| `readReplicas.persistence.accessModes` | PVC Access Mode for PostgreSQL volume | `["ReadWriteOnce"]` |
|
||||||
|
| `readReplicas.persistence.size` | PVC Storage Request for PostgreSQL volume | `8Gi` |
|
||||||
|
| `readReplicas.persistence.annotations` | Annotations for the PVC | `{}` |
|
||||||
|
| `readReplicas.persistence.labels` | Labels for the PVC | `{}` |
|
||||||
|
| `readReplicas.persistence.selector` | Selector to match an existing Persistent Volume (this value is evaluated as a template) | `{}` |
|
||||||
|
| `readReplicas.persistence.dataSource` | Custom PVC data source | `{}` |
|
||||||
|
|
||||||
|
|
||||||
|
### NetworkPolicy parameters
|
||||||
|
|
||||||
|
| Name | Description | Value |
|
||||||
|
| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
||||||
|
| `networkPolicy.enabled` | Enable network policies | `false` |
|
||||||
|
| `networkPolicy.metrics.enabled` | Enable network policies for metrics (prometheus) | `false` |
|
||||||
|
| `networkPolicy.metrics.namespaceSelector` | Monitoring namespace selector labels. These labels will be used to identify the prometheus' namespace. | `{}` |
|
||||||
|
| `networkPolicy.metrics.podSelector` | Monitoring pod selector labels. These labels will be used to identify the Prometheus pods. | `{}` |
|
||||||
|
| `networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled` | Enable ingress rule that makes PostgreSQL primary node only accessible from a particular origin. | `false` |
|
||||||
|
| `networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector` | Namespace selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed namespace(s). | `{}` |
|
||||||
|
| `networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector` | Pods selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed pod(s). | `{}` |
|
||||||
|
| `networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules` | Custom network policy for the PostgreSQL primary node. | `{}` |
|
||||||
|
| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled` | Enable ingress rule that makes PostgreSQL read-only nodes only accessible from a particular origin. | `false` |
|
||||||
|
| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector` | Namespace selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed namespace(s). | `{}` |
|
||||||
|
| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector` | Pods selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed pod(s). | `{}` |
|
||||||
|
| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules` | Custom network policy for the PostgreSQL read-only nodes. | `{}` |
|
||||||
|
| `networkPolicy.egressRules.denyConnectionsToExternal` | Enable egress rule that denies outgoing traffic outside the cluster, except for DNS (port 53). | `false` |
|
||||||
|
| `networkPolicy.egressRules.customRules` | Custom network policy rule | `{}` |
|
||||||
|
|
||||||
|
|
||||||
|
### Volume Permissions parameters
|
||||||
|
|
||||||
|
| Name | Description | Value |
|
||||||
|
| ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |
|
||||||
|
| `volumePermissions.enabled` | Enable init container that changes the owner and group of the persistent volume | `false` |
|
||||||
|
| `volumePermissions.image.registry` | Init container volume-permissions image registry | `docker.io` |
|
||||||
|
| `volumePermissions.image.repository` | Init container volume-permissions image repository | `bitnami/bitnami-shell` |
|
||||||
|
| `volumePermissions.image.tag` | Init container volume-permissions image tag (immutable tags are recommended) | `11-debian-11-r45` |
|
||||||
|
| `volumePermissions.image.digest` | Init container volume-permissions image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` |
|
||||||
|
| `volumePermissions.image.pullPolicy` | Init container volume-permissions image pull policy | `IfNotPresent` |
|
||||||
|
| `volumePermissions.image.pullSecrets` | Init container volume-permissions image pull secrets | `[]` |
|
||||||
|
| `volumePermissions.resources.limits` | Init container volume-permissions resource limits | `{}` |
|
||||||
|
| `volumePermissions.resources.requests` | Init container volume-permissions resource requests | `{}` |
|
||||||
|
| `volumePermissions.containerSecurityContext.runAsUser` | User ID for the init container | `0` |
|
||||||
|
|
||||||
|
|
||||||
|
### Other Parameters
|
||||||
|
|
||||||
|
| Name | Description | Value |
|
||||||
|
| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
||||||
|
| `serviceAccount.create` | Enable creation of ServiceAccount for PostgreSQL pod | `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 | `{}` |
|
||||||
|
| `rbac.create` | Create Role and RoleBinding (required for PSP to work) | `false` |
|
||||||
|
| `rbac.rules` | Custom RBAC rules to set | `[]` |
|
||||||
|
| `psp.create` | Whether to create a PodSecurityPolicy. WARNING: PodSecurityPolicy is deprecated in Kubernetes v1.21 or later, unavailable in v1.25 or later | `false` |
|
||||||
|
|
||||||
|
|
||||||
|
### Metrics Parameters
|
||||||
|
|
||||||
|
| Name | Description | Value |
|
||||||
|
| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | --------------------------- |
|
||||||
|
| `metrics.enabled` | Start a prometheus exporter | `false` |
|
||||||
|
| `metrics.image.registry` | PostgreSQL Prometheus Exporter image registry | `docker.io` |
|
||||||
|
| `metrics.image.repository` | PostgreSQL Prometheus Exporter image repository | `bitnami/postgres-exporter` |
|
||||||
|
| `metrics.image.tag` | PostgreSQL Prometheus Exporter image tag (immutable tags are recommended) | `0.11.1-debian-11-r22` |
|
||||||
|
| `metrics.image.digest` | PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` |
|
||||||
|
| `metrics.image.pullPolicy` | PostgreSQL Prometheus Exporter image pull policy | `IfNotPresent` |
|
||||||
|
| `metrics.image.pullSecrets` | Specify image pull secrets | `[]` |
|
||||||
|
| `metrics.customMetrics` | Define additional custom metrics | `{}` |
|
||||||
|
| `metrics.extraEnvVars` | Extra environment variables to add to PostgreSQL Prometheus exporter | `[]` |
|
||||||
|
| `metrics.containerSecurityContext.enabled` | Enable PostgreSQL Prometheus exporter containers' Security Context | `true` |
|
||||||
|
| `metrics.containerSecurityContext.runAsUser` | Set PostgreSQL Prometheus exporter containers' Security Context runAsUser | `1001` |
|
||||||
|
| `metrics.containerSecurityContext.runAsNonRoot` | Set PostgreSQL Prometheus exporter containers' Security Context runAsNonRoot | `true` |
|
||||||
|
| `metrics.livenessProbe.enabled` | Enable livenessProbe on PostgreSQL Prometheus exporter containers | `true` |
|
||||||
|
| `metrics.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `5` |
|
||||||
|
| `metrics.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` |
|
||||||
|
| `metrics.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` |
|
||||||
|
| `metrics.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` |
|
||||||
|
| `metrics.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` |
|
||||||
|
| `metrics.readinessProbe.enabled` | Enable readinessProbe on PostgreSQL Prometheus exporter containers | `true` |
|
||||||
|
| `metrics.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` |
|
||||||
|
| `metrics.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` |
|
||||||
|
| `metrics.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `5` |
|
||||||
|
| `metrics.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` |
|
||||||
|
| `metrics.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` |
|
||||||
|
| `metrics.startupProbe.enabled` | Enable startupProbe on PostgreSQL Prometheus exporter containers | `false` |
|
||||||
|
| `metrics.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `10` |
|
||||||
|
| `metrics.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` |
|
||||||
|
| `metrics.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` |
|
||||||
|
| `metrics.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` |
|
||||||
|
| `metrics.startupProbe.successThreshold` | Success threshold for startupProbe | `1` |
|
||||||
|
| `metrics.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` |
|
||||||
|
| `metrics.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` |
|
||||||
|
| `metrics.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` |
|
||||||
|
| `metrics.containerPorts.metrics` | PostgreSQL Prometheus exporter metrics container port | `9187` |
|
||||||
|
| `metrics.resources.limits` | The resources limits for the PostgreSQL Prometheus exporter container | `{}` |
|
||||||
|
| `metrics.resources.requests` | The requested resources for the PostgreSQL Prometheus exporter container | `{}` |
|
||||||
|
| `metrics.service.ports.metrics` | PostgreSQL Prometheus Exporter service port | `9187` |
|
||||||
|
| `metrics.service.clusterIP` | Static clusterIP or None for headless services | `""` |
|
||||||
|
| `metrics.service.sessionAffinity` | Control where client requests go, to the same pod or round-robin | `None` |
|
||||||
|
| `metrics.service.annotations` | Annotations for Prometheus to auto-discover the metrics endpoint | `{}` |
|
||||||
|
| `metrics.serviceMonitor.enabled` | Create ServiceMonitor Resource for scraping metrics using Prometheus Operator | `false` |
|
||||||
|
| `metrics.serviceMonitor.namespace` | Namespace for the ServiceMonitor Resource (defaults to the Release Namespace) | `""` |
|
||||||
|
| `metrics.serviceMonitor.interval` | Interval at which metrics should be scraped. | `""` |
|
||||||
|
| `metrics.serviceMonitor.scrapeTimeout` | Timeout after which the scrape is ended | `""` |
|
||||||
|
| `metrics.serviceMonitor.labels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}` |
|
||||||
|
| `metrics.serviceMonitor.selector` | Prometheus instance selector labels | `{}` |
|
||||||
|
| `metrics.serviceMonitor.relabelings` | RelabelConfigs to apply to samples before scraping | `[]` |
|
||||||
|
| `metrics.serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion | `[]` |
|
||||||
|
| `metrics.serviceMonitor.honorLabels` | Specify honorLabels parameter to add the scrape endpoint | `false` |
|
||||||
|
| `metrics.serviceMonitor.jobLabel` | The name of the label on the target service to use as the job name in prometheus. | `""` |
|
||||||
|
| `metrics.prometheusRule.enabled` | Create a PrometheusRule for Prometheus Operator | `false` |
|
||||||
|
| `metrics.prometheusRule.namespace` | Namespace for the PrometheusRule Resource (defaults to the Release Namespace) | `""` |
|
||||||
|
| `metrics.prometheusRule.labels` | Additional labels that can be used so PrometheusRule will be discovered by Prometheus | `{}` |
|
||||||
|
| `metrics.prometheusRule.rules` | PrometheusRule definitions | `[]` |
|
||||||
|
|
||||||
|
|
||||||
|
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm install my-release \
|
||||||
|
--set auth.postgresPassword=secretpassword
|
||||||
|
my-repo/postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
The above command sets the PostgreSQL `postgres` account password to `secretpassword`.
|
||||||
|
|
||||||
|
> NOTE: Once this chart is deployed, it is not possible to change the application's access credentials, such as usernames or passwords, using Helm. To change these application credentials after deployment, delete any persistent volumes (PVs) used by the chart and re-deploy it, or use the application's built-in administrative tools if available.
|
||||||
|
|
||||||
|
> **Warning** Setting a password will be ignored on new installation in case when previous Posgresql release was deleted through the helm command. In that case, old PVC will have an old password, and setting it through helm won't take effect. Deleting persistent volumes (PVs) will solve the issue. Refer to [issue 2061](https://github.com/bitnami/charts/issues/2061) for more details
|
||||||
|
|
||||||
|
Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm install my-release -f values.yaml my-repo/postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Tip**: You can use the default [values.yaml](values.yaml)
|
||||||
|
|
||||||
|
## Configuration and installation details
|
||||||
|
|
||||||
|
### [Rolling VS Immutable tags](https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/)
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Bitnami will release a new chart updating its containers if a new version of the main container, significant changes, or critical vulnerabilities exist.
|
||||||
|
|
||||||
|
### Customizing primary and read replica services in a replicated configuration
|
||||||
|
|
||||||
|
At the top level, there is a service object which defines the services for both primary and readReplicas. For deeper customization, there are service objects for both the primary and read types individually. This allows you to override the values in the top level service object so that the primary and read can be of different service types and with different clusterIPs / nodePorts. Also in the case you want the primary and read to be of type nodePort, you will need to set the nodePorts to different values to prevent a collision. The values that are deeper in the primary.service or readReplicas.service objects will take precedence over the top level service object.
|
||||||
|
|
||||||
|
### Use a different PostgreSQL version
|
||||||
|
|
||||||
|
To modify the application version used in this chart, specify a different version of the image using the `image.tag` parameter and/or a different repository using the `image.repository` parameter. Refer to the [chart documentation for more information on these parameters and how to use them with images from a private registry](https://docs.bitnami.com/kubernetes/infrastructure/postgresql/configuration/change-image-version/).
|
||||||
|
|
||||||
|
### postgresql.conf / pg_hba.conf files as configMap
|
||||||
|
|
||||||
|
This helm chart also supports to customize the PostgreSQL configuration file. You can add additional PostgreSQL configuration parameters using the `primary.extendedConfiguration`/`readReplicas.extendedConfiguration` parameters as a string. Alternatively, to replace the entire default configuration use `primary.configuration`.
|
||||||
|
|
||||||
|
You can also add a custom pg_hba.conf using the `primary.pgHbaConfiguration` parameter.
|
||||||
|
|
||||||
|
In addition to these options, you can also set an external ConfigMap with all the configuration files. This is done by setting the `primary.existingConfigmap` parameter. Note that this will override the two previous options.
|
||||||
|
|
||||||
|
### Initialize a fresh instance
|
||||||
|
|
||||||
|
The [Bitnami PostgreSQL](https://github.com/bitnami/containers/tree/main/bitnami/postgresql) image allows you to use your custom scripts to initialize a fresh instance. In order to execute the scripts, you can specify custom scripts using the `primary.initdb.scripts` parameter as a string.
|
||||||
|
|
||||||
|
In addition, you can also set an external ConfigMap with all the initialization scripts. This is done by setting the `primary.initdb.scriptsConfigMap` parameter. Note that this will override the two previous options. If your initialization scripts contain sensitive information such as credentials or passwords, you can use the `primary.initdb.scriptsSecret` parameter.
|
||||||
|
|
||||||
|
The allowed extensions are `.sh`, `.sql` and `.sql.gz`.
|
||||||
|
|
||||||
|
### Securing traffic using TLS
|
||||||
|
|
||||||
|
TLS support can be enabled in the chart by specifying the `tls.` parameters while creating a release. The following parameters should be configured to properly enable the TLS support in the chart:
|
||||||
|
|
||||||
|
- `tls.enabled`: Enable TLS support. Defaults to `false`
|
||||||
|
- `tls.certificatesSecret`: Name of an existing secret that contains the certificates. No defaults.
|
||||||
|
- `tls.certFilename`: Certificate filename. No defaults.
|
||||||
|
- `tls.certKeyFilename`: Certificate key filename. No defaults.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
- First, create the secret with the cetificates files:
|
||||||
|
|
||||||
|
```console
|
||||||
|
kubectl create secret generic certificates-tls-secret --from-file=./cert.crt --from-file=./cert.key --from-file=./ca.crt
|
||||||
|
```
|
||||||
|
|
||||||
|
- Then, use the following parameters:
|
||||||
|
|
||||||
|
```console
|
||||||
|
volumePermissions.enabled=true
|
||||||
|
tls.enabled=true
|
||||||
|
tls.certificatesSecret="certificates-tls-secret"
|
||||||
|
tls.certFilename="cert.crt"
|
||||||
|
tls.certKeyFilename="cert.key"
|
||||||
|
```
|
||||||
|
|
||||||
|
> Note TLS and VolumePermissions: PostgreSQL requires certain permissions on sensitive files (such as certificate keys) to start up. Due to an on-going [issue](https://github.com/kubernetes/kubernetes/issues/57923) regarding kubernetes permissions and the use of `containerSecurityContext.runAsUser`, you must enable `volumePermissions` to ensure everything works as expected.
|
||||||
|
|
||||||
|
### Sidecars
|
||||||
|
|
||||||
|
If you need additional containers to run within the same pod as PostgreSQL (e.g. an additional metrics or logging exporter), you can do so via the `sidecars` config parameter. Simply define your container according to the Kubernetes container spec.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# For the PostgreSQL primary
|
||||||
|
primary:
|
||||||
|
sidecars:
|
||||||
|
- name: your-image-name
|
||||||
|
image: your-image
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- name: portname
|
||||||
|
containerPort: 1234
|
||||||
|
# For the PostgreSQL replicas
|
||||||
|
readReplicas:
|
||||||
|
sidecars:
|
||||||
|
- name: your-image-name
|
||||||
|
image: your-image
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- name: portname
|
||||||
|
containerPort: 1234
|
||||||
|
```
|
||||||
|
|
||||||
|
### Metrics
|
||||||
|
|
||||||
|
The chart optionally can start a metrics exporter for [prometheus](https://prometheus.io). The metrics endpoint (port 9187) is not exposed and it is expected that the metrics are collected from inside the k8s cluster using something similar as the described in the [example Prometheus scrape configuration](https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml).
|
||||||
|
|
||||||
|
The exporter allows to create custom metrics from additional SQL queries. See the Chart's `values.yaml` for an example and consult the [exporters documentation](https://github.com/wrouesnel/postgres_exporter#adding-new-metrics-via-a-config-file) for more details.
|
||||||
|
|
||||||
|
### Use of global variables
|
||||||
|
|
||||||
|
In more complex scenarios, we may have the following tree of dependencies
|
||||||
|
|
||||||
|
```
|
||||||
|
+--------------+
|
||||||
|
| |
|
||||||
|
+------------+ Chart 1 +-----------+
|
||||||
|
| | | |
|
||||||
|
| --------+------+ |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
v v v
|
||||||
|
+-------+------+ +--------+------+ +--------+------+
|
||||||
|
| | | | | |
|
||||||
|
| PostgreSQL | | Sub-chart 1 | | Sub-chart 2 |
|
||||||
|
| | | | | |
|
||||||
|
+--------------+ +---------------+ +---------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
The three charts below depend on the parent chart Chart 1. However, subcharts 1 and 2 may need to connect to PostgreSQL as well. In order to do so, subcharts 1 and 2 need to know the PostgreSQL credentials, so one option for deploying could be deploy Chart 1 with the following parameters:
|
||||||
|
|
||||||
|
```
|
||||||
|
postgresql.auth.username=testuser
|
||||||
|
subchart1.postgresql.auth.username=testuser
|
||||||
|
subchart2.postgresql.auth.username=testuser
|
||||||
|
postgresql.auth.password=testpass
|
||||||
|
subchart1.postgresql.auth.password=testpass
|
||||||
|
subchart2.postgresql.auth.password=testpass
|
||||||
|
postgresql.auth.database=testdb
|
||||||
|
subchart1.postgresql.auth.database=testdb
|
||||||
|
subchart2.postgresql.auth.database=testdb
|
||||||
|
```
|
||||||
|
|
||||||
|
If the number of dependent sub-charts increases, installing the chart with parameters can become increasingly difficult. An alternative would be to set the credentials using global variables as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
global.postgresql.auth.username=testuser
|
||||||
|
global.postgresql.auth.password=testpass
|
||||||
|
global.postgresql.auth.database=testdb
|
||||||
|
```
|
||||||
|
|
||||||
|
This way, the credentials will be available in all of the subcharts.
|
||||||
|
|
||||||
|
## Persistence
|
||||||
|
|
||||||
|
The [Bitnami PostgreSQL](https://github.com/bitnami/containers/tree/main/bitnami/postgresql) image stores the PostgreSQL data and configurations at the `/bitnami/postgresql` path of the container.
|
||||||
|
|
||||||
|
Persistent Volume Claims are used to keep the data across deployments. This is known to work in GCE, AWS, and minikube.
|
||||||
|
See the [Parameters](#parameters) section to configure the PVC or to disable persistence.
|
||||||
|
|
||||||
|
If you already have data in it, you will fail to sync to standby nodes for all commits, details can refer to the [code present in the container repository](https://github.com/bitnami/containers/tree/main/bitnami/postgresql). If you need to use those data, please covert them to sql and import after `helm install` finished.
|
||||||
|
|
||||||
|
## NetworkPolicy
|
||||||
|
|
||||||
|
To enable network policy for PostgreSQL, install [a networking plugin that implements the Kubernetes NetworkPolicy spec](https://kubernetes.io/docs/tasks/administer-cluster/declare-network-policy#before-you-begin), and set `networkPolicy.enabled` to `true`.
|
||||||
|
|
||||||
|
For Kubernetes v1.5 & v1.6, you must also turn on NetworkPolicy by setting the DefaultDeny namespace annotation. Note: this will enforce policy for _all_ pods in the namespace:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl annotate namespace default "net.beta.kubernetes.io/network-policy={\"ingress\":{\"isolation\":\"DefaultDeny\"}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
With NetworkPolicy enabled, traffic will be limited to just port 5432.
|
||||||
|
|
||||||
|
For more precise policy, set `networkPolicy.allowExternal=false`. This will only allow pods with the generated client label to connect to PostgreSQL.
|
||||||
|
This label will be displayed in the output of a successful install.
|
||||||
|
|
||||||
|
## Differences between Bitnami PostgreSQL image and [Docker Official](https://hub.docker.com/_/postgres) image
|
||||||
|
|
||||||
|
- The Docker Official PostgreSQL image does not support replication. If you pass any replication environment variable, this would be ignored. The only environment variables supported by the Docker Official image are POSTGRES_USER, POSTGRES_DB, POSTGRES_PASSWORD, POSTGRES_INITDB_ARGS, POSTGRES_INITDB_WALDIR and PGDATA. All the remaining environment variables are specific to the Bitnami PostgreSQL image.
|
||||||
|
- The Bitnami PostgreSQL image is non-root by default. This requires that you run the pod with `securityContext` and updates the permissions of the volume with an `initContainer`. A key benefit of this configuration is that the pod follows security best practices and is prepared to run on Kubernetes distributions with hard security constraints like OpenShift.
|
||||||
|
- For OpenShift, one may either define the runAsUser and fsGroup accordingly, or try this more dynamic option: volumePermissions.securityContext.runAsUser="auto",securityContext.enabled=false,containerSecurityContext.enabled=false,shmVolume.chmod.enabled=false
|
||||||
|
|
||||||
|
### Setting Pod's affinity
|
||||||
|
|
||||||
|
This chart allows you to set your custom affinity using the `XXX.affinity` parameter(s). 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/main/bitnami/common#affinities) chart. To do so, set the `XXX.podAffinityPreset`, `XXX.podAntiAffinityPreset`, or `XXX.nodeAffinityPreset` parameters.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
Find more information about how to deal with common errors related to Bitnami's Helm charts in [this troubleshooting guide](https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues).
|
||||||
|
|
||||||
|
## Upgrading
|
||||||
|
|
||||||
|
Refer to the [chart documentation for more information about how to upgrade from previous releases](https://docs.bitnami.com/kubernetes/infrastructure/postgresql/administration/upgrade/).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright © 2022 Bitnami
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
@ -0,0 +1,22 @@
|
|||||||
|
# Patterns to ignore when building packages.
|
||||||
|
# This supports shell glob matching, relative path matching, and
|
||||||
|
# negation (prefixed with !). Only one pattern per line.
|
||||||
|
.DS_Store
|
||||||
|
# Common VCS dirs
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.bzr/
|
||||||
|
.bzrignore
|
||||||
|
.hg/
|
||||||
|
.hgignore
|
||||||
|
.svn/
|
||||||
|
# Common backup files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*~
|
||||||
|
# Various IDEs
|
||||||
|
.project
|
||||||
|
.idea/
|
||||||
|
*.tmproj
|
||||||
|
.vscode/
|
@ -0,0 +1,23 @@
|
|||||||
|
annotations:
|
||||||
|
category: Infrastructure
|
||||||
|
apiVersion: v2
|
||||||
|
appVersion: 2.0.4
|
||||||
|
description: A Library Helm Chart for grouping common logic between bitnami charts.
|
||||||
|
This chart is not deployable by itself.
|
||||||
|
home: https://github.com/bitnami/charts/tree/main/bitnami/common
|
||||||
|
icon: https://bitnami.com/downloads/logos/bitnami-mark.png
|
||||||
|
keywords:
|
||||||
|
- common
|
||||||
|
- helper
|
||||||
|
- template
|
||||||
|
- function
|
||||||
|
- bitnami
|
||||||
|
maintainers:
|
||||||
|
- name: Bitnami
|
||||||
|
url: https://github.com/bitnami/charts
|
||||||
|
name: common
|
||||||
|
sources:
|
||||||
|
- https://github.com/bitnami/charts
|
||||||
|
- https://www.bitnami.com/
|
||||||
|
type: library
|
||||||
|
version: 2.0.4
|
@ -0,0 +1,350 @@
|
|||||||
|
# Bitnami Common Library Chart
|
||||||
|
|
||||||
|
A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts.
|
||||||
|
|
||||||
|
## TL;DR
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
dependencies:
|
||||||
|
- name: common
|
||||||
|
version: 1.x.x
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm dependency update
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ include "common.names.fullname" . }}
|
||||||
|
data:
|
||||||
|
myvalue: "Hello World"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager.
|
||||||
|
|
||||||
|
Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Kubernetes 1.19+
|
||||||
|
- Helm 3.2.0+
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
The following table lists the helpers available in the library which are scoped in different sections.
|
||||||
|
|
||||||
|
### Affinities
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|-------------------------------|------------------------------------------------------|------------------------------------------------|
|
||||||
|
| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` |
|
||||||
|
| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` |
|
||||||
|
| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` |
|
||||||
|
| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` |
|
||||||
|
|
||||||
|
### Capabilities
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------|
|
||||||
|
| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context |
|
||||||
|
| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context |
|
||||||
|
| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context |
|
||||||
|
| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context |
|
||||||
|
| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context |
|
||||||
|
| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context |
|
||||||
|
| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context |
|
||||||
|
| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context |
|
||||||
|
| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context |
|
||||||
|
| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context |
|
||||||
|
| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context |
|
||||||
|
| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context |
|
||||||
|
|
||||||
|
### Errors
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|
|
||||||
|
| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` |
|
||||||
|
|
||||||
|
### Images
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------|
|
||||||
|
| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. |
|
||||||
|
| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` |
|
||||||
|
| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` |
|
||||||
|
|
||||||
|
### Ingress
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences |
|
||||||
|
| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context |
|
||||||
|
| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context |
|
||||||
|
| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` |
|
||||||
|
|
||||||
|
### Labels
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|-----------------------------|-----------------------------------------------------------------------------|-------------------|
|
||||||
|
| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context |
|
||||||
|
| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context |
|
||||||
|
|
||||||
|
### Names
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|-----------------------------------|-----------------------------------------------------------------------|-------------------|
|
||||||
|
| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context |
|
||||||
|
| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context |
|
||||||
|
| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context |
|
||||||
|
| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context |
|
||||||
|
| `common.names.chart` | Chart name plus version | `.` Chart context |
|
||||||
|
|
||||||
|
### Secrets
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. |
|
||||||
|
| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. |
|
||||||
|
| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. |
|
||||||
|
| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` |
|
||||||
|
|
||||||
|
### Storage
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. |
|
||||||
|
|
||||||
|
### TplValues
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` |
|
||||||
|
|
||||||
|
### Utils
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------|
|
||||||
|
| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` |
|
||||||
|
| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` |
|
||||||
|
| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` |
|
||||||
|
| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` |
|
||||||
|
|
||||||
|
### Validations
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) |
|
||||||
|
| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) |
|
||||||
|
| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. |
|
||||||
|
| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. |
|
||||||
|
| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. |
|
||||||
|
| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. |
|
||||||
|
| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. |
|
||||||
|
| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. |
|
||||||
|
|
||||||
|
### Warnings
|
||||||
|
|
||||||
|
| Helper identifier | Description | Expected Input |
|
||||||
|
|------------------------------|----------------------------------|------------------------------------------------------------|
|
||||||
|
| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. |
|
||||||
|
|
||||||
|
## Special input schemas
|
||||||
|
|
||||||
|
### ImageRoot
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
registry:
|
||||||
|
type: string
|
||||||
|
description: Docker registry where the image is located
|
||||||
|
example: docker.io
|
||||||
|
|
||||||
|
repository:
|
||||||
|
type: string
|
||||||
|
description: Repository and image name
|
||||||
|
example: bitnami/nginx
|
||||||
|
|
||||||
|
tag:
|
||||||
|
type: string
|
||||||
|
description: image tag
|
||||||
|
example: 1.16.1-debian-10-r63
|
||||||
|
|
||||||
|
pullPolicy:
|
||||||
|
type: string
|
||||||
|
description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
|
||||||
|
pullSecrets:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
description: Optionally specify an array of imagePullSecrets (evaluated as templates).
|
||||||
|
|
||||||
|
debug:
|
||||||
|
type: boolean
|
||||||
|
description: Set to true if you would like to see extra information on logs
|
||||||
|
example: false
|
||||||
|
|
||||||
|
## An instance would be:
|
||||||
|
# registry: docker.io
|
||||||
|
# repository: bitnami/nginx
|
||||||
|
# tag: 1.16.1-debian-10-r63
|
||||||
|
# pullPolicy: IfNotPresent
|
||||||
|
# debug: false
|
||||||
|
```
|
||||||
|
|
||||||
|
### Persistence
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
enabled:
|
||||||
|
type: boolean
|
||||||
|
description: Whether enable persistence.
|
||||||
|
example: true
|
||||||
|
|
||||||
|
storageClass:
|
||||||
|
type: string
|
||||||
|
description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning.
|
||||||
|
example: "-"
|
||||||
|
|
||||||
|
accessMode:
|
||||||
|
type: string
|
||||||
|
description: Access mode for the Persistent Volume Storage.
|
||||||
|
example: ReadWriteOnce
|
||||||
|
|
||||||
|
size:
|
||||||
|
type: string
|
||||||
|
description: Size the Persistent Volume Storage.
|
||||||
|
example: 8Gi
|
||||||
|
|
||||||
|
path:
|
||||||
|
type: string
|
||||||
|
description: Path to be persisted.
|
||||||
|
example: /bitnami
|
||||||
|
|
||||||
|
## An instance would be:
|
||||||
|
# enabled: true
|
||||||
|
# storageClass: "-"
|
||||||
|
# accessMode: ReadWriteOnce
|
||||||
|
# size: 8Gi
|
||||||
|
# path: /bitnami
|
||||||
|
```
|
||||||
|
|
||||||
|
### ExistingSecret
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
description: Name of the existing secret.
|
||||||
|
example: mySecret
|
||||||
|
keyMapping:
|
||||||
|
description: Mapping between the expected key name and the name of the key in the existing secret.
|
||||||
|
type: object
|
||||||
|
|
||||||
|
## An instance would be:
|
||||||
|
# name: mySecret
|
||||||
|
# keyMapping:
|
||||||
|
# password: myPasswordKey
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example of use
|
||||||
|
|
||||||
|
When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# templates/secret.yaml
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ include "common.names.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ include "common.names.fullname" . }}
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
password: {{ .Values.password | b64enc | quote }}
|
||||||
|
|
||||||
|
# templates/dpl.yaml
|
||||||
|
---
|
||||||
|
...
|
||||||
|
env:
|
||||||
|
- name: PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }}
|
||||||
|
key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }}
|
||||||
|
...
|
||||||
|
|
||||||
|
# values.yaml
|
||||||
|
---
|
||||||
|
name: mySecret
|
||||||
|
keyMapping:
|
||||||
|
password: myPasswordKey
|
||||||
|
```
|
||||||
|
|
||||||
|
### ValidateValue
|
||||||
|
|
||||||
|
#### NOTES.txt
|
||||||
|
|
||||||
|
```console
|
||||||
|
{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}}
|
||||||
|
{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}}
|
||||||
|
|
||||||
|
{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }}
|
||||||
|
```
|
||||||
|
|
||||||
|
If we force those values to be empty we will see some alerts
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm install test mychart --set path.to.value00="",path.to.value01=""
|
||||||
|
'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value:
|
||||||
|
|
||||||
|
export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d)
|
||||||
|
|
||||||
|
'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value:
|
||||||
|
|
||||||
|
export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Upgrading
|
||||||
|
|
||||||
|
### To 1.0.0
|
||||||
|
|
||||||
|
[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL.
|
||||||
|
|
||||||
|
**What changes were introduced in this major version?**
|
||||||
|
|
||||||
|
- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field.
|
||||||
|
- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information.
|
||||||
|
- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts
|
||||||
|
|
||||||
|
**Considerations when upgrading to this version**
|
||||||
|
|
||||||
|
- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues
|
||||||
|
- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore
|
||||||
|
- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3
|
||||||
|
|
||||||
|
**Useful links**
|
||||||
|
|
||||||
|
- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/
|
||||||
|
- https://helm.sh/docs/topics/v2_v3_migration/
|
||||||
|
- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright © 2022 Bitnami
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
@ -0,0 +1,102 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return a soft nodeAffinity definition
|
||||||
|
{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.affinities.nodes.soft" -}}
|
||||||
|
preferredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- preference:
|
||||||
|
matchExpressions:
|
||||||
|
- key: {{ .key }}
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
{{- range .values }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
weight: 1
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return a hard nodeAffinity definition
|
||||||
|
{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.affinities.nodes.hard" -}}
|
||||||
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
nodeSelectorTerms:
|
||||||
|
- matchExpressions:
|
||||||
|
- key: {{ .key }}
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
{{- range .values }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return a nodeAffinity definition
|
||||||
|
{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.affinities.nodes" -}}
|
||||||
|
{{- if eq .type "soft" }}
|
||||||
|
{{- include "common.affinities.nodes.soft" . -}}
|
||||||
|
{{- else if eq .type "hard" }}
|
||||||
|
{{- include "common.affinities.nodes.hard" . -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return a soft podAffinity/podAntiAffinity definition
|
||||||
|
{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.affinities.pods.soft" -}}
|
||||||
|
{{- $component := default "" .component -}}
|
||||||
|
{{- $extraMatchLabels := default (dict) .extraMatchLabels -}}
|
||||||
|
preferredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- podAffinityTerm:
|
||||||
|
labelSelector:
|
||||||
|
matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }}
|
||||||
|
{{- if not (empty $component) }}
|
||||||
|
{{ printf "app.kubernetes.io/component: %s" $component }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range $key, $value := $extraMatchLabels }}
|
||||||
|
{{ $key }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
namespaces:
|
||||||
|
- {{ include "common.names.namespace" .context | quote }}
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
weight: 1
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return a hard podAffinity/podAntiAffinity definition
|
||||||
|
{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.affinities.pods.hard" -}}
|
||||||
|
{{- $component := default "" .component -}}
|
||||||
|
{{- $extraMatchLabels := default (dict) .extraMatchLabels -}}
|
||||||
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- labelSelector:
|
||||||
|
matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }}
|
||||||
|
{{- if not (empty $component) }}
|
||||||
|
{{ printf "app.kubernetes.io/component: %s" $component }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range $key, $value := $extraMatchLabels }}
|
||||||
|
{{ $key }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
namespaces:
|
||||||
|
- {{ include "common.names.namespace" .context | quote }}
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return a podAffinity/podAntiAffinity definition
|
||||||
|
{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.affinities.pods" -}}
|
||||||
|
{{- if eq .type "soft" }}
|
||||||
|
{{- include "common.affinities.pods.soft" . -}}
|
||||||
|
{{- else if eq .type "hard" }}
|
||||||
|
{{- include "common.affinities.pods.hard" . -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,154 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the target Kubernetes version
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.kubeVersion" -}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.kubeVersion }}
|
||||||
|
{{- .Values.global.kubeVersion -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for poddisruptionbudget.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.policy.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "policy/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "policy/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for networkpolicy.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.networkPolicy.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "extensions/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "networking.k8s.io/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for cronjob.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.cronjob.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "batch/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "batch/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for deployment.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.deployment.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "extensions/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "apps/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for statefulset.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.statefulset.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "apps/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "apps/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for ingress.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.ingress.apiVersion" -}}
|
||||||
|
{{- if .Values.ingress -}}
|
||||||
|
{{- if .Values.ingress.apiVersion -}}
|
||||||
|
{{- .Values.ingress.apiVersion -}}
|
||||||
|
{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "extensions/v1beta1" -}}
|
||||||
|
{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "networking.k8s.io/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "networking.k8s.io/v1" -}}
|
||||||
|
{{- end }}
|
||||||
|
{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "extensions/v1beta1" -}}
|
||||||
|
{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "networking.k8s.io/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "networking.k8s.io/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for RBAC resources.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.rbac.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "rbac.authorization.k8s.io/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "rbac.authorization.k8s.io/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for CRDs.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.crd.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "apiextensions.k8s.io/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "apiextensions.k8s.io/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for APIService.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.apiService.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "apiregistration.k8s.io/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "apiregistration.k8s.io/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for Horizontal Pod Autoscaler.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.hpa.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}}
|
||||||
|
{{- if .beta2 -}}
|
||||||
|
{{- print "autoscaling/v2beta2" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "autoscaling/v2beta1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "autoscaling/v2" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Returns true if the used Helm version is 3.3+.
|
||||||
|
A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure.
|
||||||
|
This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error.
|
||||||
|
**To be removed when the catalog's minimun Helm version is 3.3**
|
||||||
|
*/}}
|
||||||
|
{{- define "common.capabilities.supportsHelmVersion" -}}
|
||||||
|
{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,23 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Through error when upgrading using empty passwords values that must not be empty.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}}
|
||||||
|
{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}}
|
||||||
|
{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }}
|
||||||
|
|
||||||
|
Required password params:
|
||||||
|
- validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error.
|
||||||
|
- context - Context - Required. Parent context.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.errors.upgrade.passwords.empty" -}}
|
||||||
|
{{- $validationErrors := join "" .validationErrors -}}
|
||||||
|
{{- if and $validationErrors .context.Release.IsUpgrade -}}
|
||||||
|
{{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}}
|
||||||
|
{{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}}
|
||||||
|
{{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}}
|
||||||
|
{{- $errorString = print $errorString "\n%s" -}}
|
||||||
|
{{- printf $errorString $validationErrors | fail -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,76 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Return the proper image name
|
||||||
|
{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.images.image" -}}
|
||||||
|
{{- $registryName := .imageRoot.registry -}}
|
||||||
|
{{- $repositoryName := .imageRoot.repository -}}
|
||||||
|
{{- $separator := ":" -}}
|
||||||
|
{{- $termination := .imageRoot.tag | toString -}}
|
||||||
|
{{- if .global }}
|
||||||
|
{{- if .global.imageRegistry }}
|
||||||
|
{{- $registryName = .global.imageRegistry -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if .imageRoot.digest }}
|
||||||
|
{{- $separator = "@" -}}
|
||||||
|
{{- $termination = .imageRoot.digest | toString -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- printf "%s/%s%s%s" $registryName $repositoryName $separator $termination -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead)
|
||||||
|
{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.images.pullSecrets" -}}
|
||||||
|
{{- $pullSecrets := list }}
|
||||||
|
|
||||||
|
{{- if .global }}
|
||||||
|
{{- range .global.imagePullSecrets -}}
|
||||||
|
{{- $pullSecrets = append $pullSecrets . -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- range .images -}}
|
||||||
|
{{- range .pullSecrets -}}
|
||||||
|
{{- $pullSecrets = append $pullSecrets . -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if (not (empty $pullSecrets)) }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range $pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Docker Image Registry Secret Names evaluating values as templates
|
||||||
|
{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.images.renderPullSecrets" -}}
|
||||||
|
{{- $pullSecrets := list }}
|
||||||
|
{{- $context := .context }}
|
||||||
|
|
||||||
|
{{- if $context.Values.global }}
|
||||||
|
{{- range $context.Values.global.imagePullSecrets -}}
|
||||||
|
{{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- range .images -}}
|
||||||
|
{{- range .pullSecrets -}}
|
||||||
|
{{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if (not (empty $pullSecrets)) }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range $pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,68 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Generate backend entry that is compatible with all Kubernetes API versions.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }}
|
||||||
|
|
||||||
|
Params:
|
||||||
|
- serviceName - String. Name of an existing service backend
|
||||||
|
- servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer.
|
||||||
|
- context - Dict - Required. The context for the template evaluation.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.ingress.backend" -}}
|
||||||
|
{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}}
|
||||||
|
{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}}
|
||||||
|
serviceName: {{ .serviceName }}
|
||||||
|
servicePort: {{ .servicePort }}
|
||||||
|
{{- else -}}
|
||||||
|
service:
|
||||||
|
name: {{ .serviceName }}
|
||||||
|
port:
|
||||||
|
{{- if typeIs "string" .servicePort }}
|
||||||
|
name: {{ .servicePort }}
|
||||||
|
{{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }}
|
||||||
|
number: {{ .servicePort | int }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Print "true" if the API pathType field is supported
|
||||||
|
Usage:
|
||||||
|
{{ include "common.ingress.supportsPathType" . }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.ingress.supportsPathType" -}}
|
||||||
|
{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}}
|
||||||
|
{{- print "false" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "true" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Returns true if the ingressClassname field is supported
|
||||||
|
Usage:
|
||||||
|
{{ include "common.ingress.supportsIngressClassname" . }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.ingress.supportsIngressClassname" -}}
|
||||||
|
{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}}
|
||||||
|
{{- print "false" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "true" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return true if cert-manager required annotations for TLS signed
|
||||||
|
certificates are set in the Ingress annotations
|
||||||
|
Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations
|
||||||
|
Usage:
|
||||||
|
{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.ingress.certManagerRequest" -}}
|
||||||
|
{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") (hasKey .annotations "kubernetes.io/tls-acme") }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,18 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Kubernetes standard labels
|
||||||
|
*/}}
|
||||||
|
{{- define "common.labels.standard" -}}
|
||||||
|
app.kubernetes.io/name: {{ include "common.names.name" . }}
|
||||||
|
helm.sh/chart: {{ include "common.names.chart" . }}
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector
|
||||||
|
*/}}
|
||||||
|
{{- define "common.labels.matchLabels" -}}
|
||||||
|
app.kubernetes.io/name: {{ include "common.names.name" . }}
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,70 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.names.name" -}}
|
||||||
|
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create chart name and version as used by the chart label.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.names.chart" -}}
|
||||||
|
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
If release name contains chart name it will be used as a full name.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.names.fullname" -}}
|
||||||
|
{{- if .Values.fullnameOverride -}}
|
||||||
|
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
||||||
|
{{- if contains $name .Release.Name -}}
|
||||||
|
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified dependency name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
If release name contains chart name it will be used as a full name.
|
||||||
|
Usage:
|
||||||
|
{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.names.dependency.fullname" -}}
|
||||||
|
{{- if .chartValues.fullnameOverride -}}
|
||||||
|
{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $name := default .chartName .chartValues.nameOverride -}}
|
||||||
|
{{- if contains $name .context.Release.Name -}}
|
||||||
|
{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Allow the release namespace to be overridden for multi-namespace deployments in combined charts.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.names.namespace" -}}
|
||||||
|
{{- if .Values.namespaceOverride -}}
|
||||||
|
{{- .Values.namespaceOverride -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .Release.Namespace -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a fully qualified app name adding the installation's namespace.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.names.fullname.namespace" -}}
|
||||||
|
{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,140 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Generate secret name.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }}
|
||||||
|
|
||||||
|
Params:
|
||||||
|
- existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user
|
||||||
|
to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility.
|
||||||
|
+info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret
|
||||||
|
- defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment.
|
||||||
|
- context - Dict - Required. The context for the template evaluation.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.secrets.name" -}}
|
||||||
|
{{- $name := (include "common.names.fullname" .context) -}}
|
||||||
|
|
||||||
|
{{- if .defaultNameSuffix -}}
|
||||||
|
{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- with .existingSecret -}}
|
||||||
|
{{- if not (typeIs "string" .) -}}
|
||||||
|
{{- with .name -}}
|
||||||
|
{{- $name = . -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $name = . -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- printf "%s" $name -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Generate secret key.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }}
|
||||||
|
|
||||||
|
Params:
|
||||||
|
- existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user
|
||||||
|
to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility.
|
||||||
|
+info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret
|
||||||
|
- key - String - Required. Name of the key in the secret.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.secrets.key" -}}
|
||||||
|
{{- $key := .key -}}
|
||||||
|
|
||||||
|
{{- if .existingSecret -}}
|
||||||
|
{{- if not (typeIs "string" .existingSecret) -}}
|
||||||
|
{{- if .existingSecret.keyMapping -}}
|
||||||
|
{{- $key = index .existingSecret.keyMapping $.key -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- printf "%s" $key -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Generate secret password or retrieve one if already created.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }}
|
||||||
|
|
||||||
|
Params:
|
||||||
|
- secret - String - Required - Name of the 'Secret' resource where the password is stored.
|
||||||
|
- key - String - Required - Name of the key in the secret.
|
||||||
|
- providedValues - List<String> - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value.
|
||||||
|
- length - int - Optional - Length of the generated random password.
|
||||||
|
- strong - Boolean - Optional - Whether to add symbols to the generated random password.
|
||||||
|
- chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart.
|
||||||
|
- context - Context - Required - Parent context.
|
||||||
|
|
||||||
|
The order in which this function returns a secret password:
|
||||||
|
1. Already existing 'Secret' resource
|
||||||
|
(If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned)
|
||||||
|
2. Password provided via the values.yaml
|
||||||
|
(If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned)
|
||||||
|
3. Randomly generated secret password
|
||||||
|
(A new random secret password with the length specified in the 'length' parameter will be generated and returned)
|
||||||
|
|
||||||
|
*/}}
|
||||||
|
{{- define "common.secrets.passwords.manage" -}}
|
||||||
|
|
||||||
|
{{- $password := "" }}
|
||||||
|
{{- $subchart := "" }}
|
||||||
|
{{- $chartName := default "" .chartName }}
|
||||||
|
{{- $passwordLength := default 10 .length }}
|
||||||
|
{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }}
|
||||||
|
{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }}
|
||||||
|
{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }}
|
||||||
|
{{- if $secretData }}
|
||||||
|
{{- if hasKey $secretData .key }}
|
||||||
|
{{- $password = index $secretData .key | quote }}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else if $providedPasswordValue }}
|
||||||
|
{{- $password = $providedPasswordValue | toString | b64enc | quote }}
|
||||||
|
{{- else }}
|
||||||
|
|
||||||
|
{{- if .context.Values.enabled }}
|
||||||
|
{{- $subchart = $chartName }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}}
|
||||||
|
{{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}}
|
||||||
|
{{- $passwordValidationErrors := list $requiredPasswordError -}}
|
||||||
|
{{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}}
|
||||||
|
|
||||||
|
{{- if .strong }}
|
||||||
|
{{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }}
|
||||||
|
{{- $password = randAscii $passwordLength }}
|
||||||
|
{{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }}
|
||||||
|
{{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }}
|
||||||
|
{{- else }}
|
||||||
|
{{- $password = randAlphaNum $passwordLength | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- printf "%s" $password -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Returns whether a previous generated secret already exists
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }}
|
||||||
|
|
||||||
|
Params:
|
||||||
|
- secret - String - Required - Name of the 'Secret' resource where the password is stored.
|
||||||
|
- context - Context - Required - Parent context.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.secrets.exists" -}}
|
||||||
|
{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }}
|
||||||
|
{{- if $secret }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,23 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Return the proper Storage Class
|
||||||
|
{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.storage.class" -}}
|
||||||
|
|
||||||
|
{{- $storageClass := .persistence.storageClass -}}
|
||||||
|
{{- if .global -}}
|
||||||
|
{{- if .global.storageClass -}}
|
||||||
|
{{- $storageClass = .global.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if $storageClass -}}
|
||||||
|
{{- if (eq "-" $storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" $storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- end -}}
|
@ -0,0 +1,13 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Renders a value that contains template.
|
||||||
|
Usage:
|
||||||
|
{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.tplvalues.render" -}}
|
||||||
|
{{- if typeIs "string" .value }}
|
||||||
|
{{- tpl .value .context }}
|
||||||
|
{{- else }}
|
||||||
|
{{- tpl (.value | toYaml) .context }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,62 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Print instructions to get a secret value.
|
||||||
|
Usage:
|
||||||
|
{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.utils.secret.getvalue" -}}
|
||||||
|
{{- $varname := include "common.utils.fieldToEnvVar" . -}}
|
||||||
|
export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d)
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Build env var name given a field
|
||||||
|
Usage:
|
||||||
|
{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.utils.fieldToEnvVar" -}}
|
||||||
|
{{- $fieldNameSplit := splitList "-" .field -}}
|
||||||
|
{{- $upperCaseFieldNameSplit := list -}}
|
||||||
|
|
||||||
|
{{- range $fieldNameSplit -}}
|
||||||
|
{{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{ join "_" $upperCaseFieldNameSplit }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Gets a value from .Values given
|
||||||
|
Usage:
|
||||||
|
{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.utils.getValueFromKey" -}}
|
||||||
|
{{- $splitKey := splitList "." .key -}}
|
||||||
|
{{- $value := "" -}}
|
||||||
|
{{- $latestObj := $.context.Values -}}
|
||||||
|
{{- range $splitKey -}}
|
||||||
|
{{- if not $latestObj -}}
|
||||||
|
{{- printf "please review the entire path of '%s' exists in values" $.key | fail -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- $value = ( index $latestObj . ) -}}
|
||||||
|
{{- $latestObj = $value -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- printf "%v" (default "" $value) -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Returns first .Values key with a defined value or first of the list if all non-defined
|
||||||
|
Usage:
|
||||||
|
{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.utils.getKeyFromList" -}}
|
||||||
|
{{- $key := first .keys -}}
|
||||||
|
{{- $reverseKeys := reverse .keys }}
|
||||||
|
{{- range $reverseKeys }}
|
||||||
|
{{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }}
|
||||||
|
{{- if $value -}}
|
||||||
|
{{- $key = . }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- printf "%s" $key -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,14 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Warning about using rolling tag.
|
||||||
|
Usage:
|
||||||
|
{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.warnings.rollingTag" -}}
|
||||||
|
|
||||||
|
{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }}
|
||||||
|
WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment.
|
||||||
|
+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- end -}}
|
@ -0,0 +1,72 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Validate Cassandra required passwords are not empty.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }}
|
||||||
|
Params:
|
||||||
|
- secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret"
|
||||||
|
- subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.validations.values.cassandra.passwords" -}}
|
||||||
|
{{- $existingSecret := include "common.cassandra.values.existingSecret" . -}}
|
||||||
|
{{- $enabled := include "common.cassandra.values.enabled" . -}}
|
||||||
|
{{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}}
|
||||||
|
{{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}}
|
||||||
|
|
||||||
|
{{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}}
|
||||||
|
{{- $requiredPasswords := list -}}
|
||||||
|
|
||||||
|
{{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredPassword -}}
|
||||||
|
|
||||||
|
{{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}}
|
||||||
|
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for existingSecret.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.cassandra.values.existingSecret" (dict "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.cassandra.values.existingSecret" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- .context.Values.cassandra.dbUser.existingSecret | quote -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .context.Values.dbUser.existingSecret | quote -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for enabled cassandra.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.cassandra.values.enabled" (dict "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.cassandra.values.enabled" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- printf "%v" .context.Values.cassandra.enabled -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%v" (not .context.Values.enabled) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for the key dbUser
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.cassandra.values.key.dbUser" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
cassandra.dbUser
|
||||||
|
{{- else -}}
|
||||||
|
dbUser
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,103 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Validate MariaDB required passwords are not empty.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }}
|
||||||
|
Params:
|
||||||
|
- secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret"
|
||||||
|
- subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.validations.values.mariadb.passwords" -}}
|
||||||
|
{{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}}
|
||||||
|
{{- $enabled := include "common.mariadb.values.enabled" . -}}
|
||||||
|
{{- $architecture := include "common.mariadb.values.architecture" . -}}
|
||||||
|
{{- $authPrefix := include "common.mariadb.values.key.auth" . -}}
|
||||||
|
{{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}}
|
||||||
|
{{- $valueKeyUsername := printf "%s.username" $authPrefix -}}
|
||||||
|
{{- $valueKeyPassword := printf "%s.password" $authPrefix -}}
|
||||||
|
{{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}}
|
||||||
|
|
||||||
|
{{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}}
|
||||||
|
{{- $requiredPasswords := list -}}
|
||||||
|
|
||||||
|
{{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}}
|
||||||
|
|
||||||
|
{{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }}
|
||||||
|
{{- if not (empty $valueUsername) -}}
|
||||||
|
{{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredPassword -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if (eq $architecture "replication") -}}
|
||||||
|
{{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}}
|
||||||
|
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for existingSecret.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mariadb.values.auth.existingSecret" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- .context.Values.mariadb.auth.existingSecret | quote -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .context.Values.auth.existingSecret | quote -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for enabled mariadb.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mariadb.values.enabled" (dict "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mariadb.values.enabled" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- printf "%v" .context.Values.mariadb.enabled -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%v" (not .context.Values.enabled) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for architecture
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mariadb.values.architecture" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- .context.Values.mariadb.architecture -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .context.Values.architecture -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for the key auth
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mariadb.values.key.auth" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
mariadb.auth
|
||||||
|
{{- else -}}
|
||||||
|
auth
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,108 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Validate MongoDB® required passwords are not empty.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }}
|
||||||
|
Params:
|
||||||
|
- secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret"
|
||||||
|
- subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.validations.values.mongodb.passwords" -}}
|
||||||
|
{{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}}
|
||||||
|
{{- $enabled := include "common.mongodb.values.enabled" . -}}
|
||||||
|
{{- $authPrefix := include "common.mongodb.values.key.auth" . -}}
|
||||||
|
{{- $architecture := include "common.mongodb.values.architecture" . -}}
|
||||||
|
{{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}}
|
||||||
|
{{- $valueKeyUsername := printf "%s.username" $authPrefix -}}
|
||||||
|
{{- $valueKeyDatabase := printf "%s.database" $authPrefix -}}
|
||||||
|
{{- $valueKeyPassword := printf "%s.password" $authPrefix -}}
|
||||||
|
{{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}}
|
||||||
|
{{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}}
|
||||||
|
|
||||||
|
{{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}}
|
||||||
|
|
||||||
|
{{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}}
|
||||||
|
{{- $requiredPasswords := list -}}
|
||||||
|
|
||||||
|
{{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}}
|
||||||
|
|
||||||
|
{{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }}
|
||||||
|
{{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }}
|
||||||
|
{{- if and $valueUsername $valueDatabase -}}
|
||||||
|
{{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredPassword -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if (eq $architecture "replicaset") -}}
|
||||||
|
{{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}}
|
||||||
|
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for existingSecret.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mongodb.values.auth.existingSecret" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- .context.Values.mongodb.auth.existingSecret | quote -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .context.Values.auth.existingSecret | quote -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for enabled mongodb.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mongodb.values.enabled" (dict "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mongodb.values.enabled" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- printf "%v" .context.Values.mongodb.enabled -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%v" (not .context.Values.enabled) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for the key auth
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mongodb.values.key.auth" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
mongodb.auth
|
||||||
|
{{- else -}}
|
||||||
|
auth
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for architecture
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mongodb.values.architecture" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- .context.Values.mongodb.architecture -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .context.Values.architecture -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,103 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Validate MySQL required passwords are not empty.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }}
|
||||||
|
Params:
|
||||||
|
- secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret"
|
||||||
|
- subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.validations.values.mysql.passwords" -}}
|
||||||
|
{{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}}
|
||||||
|
{{- $enabled := include "common.mysql.values.enabled" . -}}
|
||||||
|
{{- $architecture := include "common.mysql.values.architecture" . -}}
|
||||||
|
{{- $authPrefix := include "common.mysql.values.key.auth" . -}}
|
||||||
|
{{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}}
|
||||||
|
{{- $valueKeyUsername := printf "%s.username" $authPrefix -}}
|
||||||
|
{{- $valueKeyPassword := printf "%s.password" $authPrefix -}}
|
||||||
|
{{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}}
|
||||||
|
|
||||||
|
{{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}}
|
||||||
|
{{- $requiredPasswords := list -}}
|
||||||
|
|
||||||
|
{{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}}
|
||||||
|
|
||||||
|
{{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }}
|
||||||
|
{{- if not (empty $valueUsername) -}}
|
||||||
|
{{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredPassword -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if (eq $architecture "replication") -}}
|
||||||
|
{{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}}
|
||||||
|
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for existingSecret.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mysql.values.auth.existingSecret" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- .context.Values.mysql.auth.existingSecret | quote -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .context.Values.auth.existingSecret | quote -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for enabled mysql.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mysql.values.enabled" (dict "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mysql.values.enabled" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- printf "%v" .context.Values.mysql.enabled -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%v" (not .context.Values.enabled) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for architecture
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mysql.values.architecture" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- .context.Values.mysql.architecture -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .context.Values.architecture -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for the key auth
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.mysql.values.key.auth" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
mysql.auth
|
||||||
|
{{- else -}}
|
||||||
|
auth
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,129 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Validate PostgreSQL required passwords are not empty.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }}
|
||||||
|
Params:
|
||||||
|
- secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret"
|
||||||
|
- subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.validations.values.postgresql.passwords" -}}
|
||||||
|
{{- $existingSecret := include "common.postgresql.values.existingSecret" . -}}
|
||||||
|
{{- $enabled := include "common.postgresql.values.enabled" . -}}
|
||||||
|
{{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}}
|
||||||
|
{{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}}
|
||||||
|
{{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}}
|
||||||
|
{{- $requiredPasswords := list -}}
|
||||||
|
{{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}}
|
||||||
|
|
||||||
|
{{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}}
|
||||||
|
{{- if (eq $enabledReplication "true") -}}
|
||||||
|
{{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to decide whether evaluate global values.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- key - String - Required. Field to be evaluated within global, e.g: "existingSecret"
|
||||||
|
*/}}
|
||||||
|
{{- define "common.postgresql.values.use.global" -}}
|
||||||
|
{{- if .context.Values.global -}}
|
||||||
|
{{- if .context.Values.global.postgresql -}}
|
||||||
|
{{- index .context.Values.global.postgresql .key | quote -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for existingSecret.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.postgresql.values.existingSecret" (dict "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.postgresql.values.existingSecret" -}}
|
||||||
|
{{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}}
|
||||||
|
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- default (.context.Values.existingSecret | quote) $globalValue -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for enabled postgresql.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.postgresql.values.enabled" (dict "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.postgresql.values.enabled" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- printf "%v" .context.Values.postgresql.enabled -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%v" (not .context.Values.enabled) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for the key postgressPassword.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.postgresql.values.key.postgressPassword" -}}
|
||||||
|
{{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}}
|
||||||
|
|
||||||
|
{{- if not $globalValue -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
postgresql.postgresqlPassword
|
||||||
|
{{- else -}}
|
||||||
|
postgresqlPassword
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
global.postgresql.postgresqlPassword
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for enabled.replication.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.postgresql.values.enabled.replication" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- printf "%v" .context.Values.postgresql.replication.enabled -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%v" .context.Values.replication.enabled -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for the key replication.password.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.postgresql.values.key.replicationPassword" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
postgresql.replication.password
|
||||||
|
{{- else -}}
|
||||||
|
replication.password
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,76 @@
|
|||||||
|
|
||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Validate Redis® required passwords are not empty.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }}
|
||||||
|
Params:
|
||||||
|
- secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret"
|
||||||
|
- subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.validations.values.redis.passwords" -}}
|
||||||
|
{{- $enabled := include "common.redis.values.enabled" . -}}
|
||||||
|
{{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}}
|
||||||
|
{{- $standarizedVersion := include "common.redis.values.standarized.version" . }}
|
||||||
|
|
||||||
|
{{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }}
|
||||||
|
{{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }}
|
||||||
|
|
||||||
|
{{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }}
|
||||||
|
{{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }}
|
||||||
|
|
||||||
|
{{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}}
|
||||||
|
{{- $requiredPasswords := list -}}
|
||||||
|
|
||||||
|
{{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}}
|
||||||
|
{{- if eq $useAuth "true" -}}
|
||||||
|
{{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}}
|
||||||
|
{{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right value for enabled redis.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.redis.values.enabled" (dict "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.redis.values.enabled" -}}
|
||||||
|
{{- if .subchart -}}
|
||||||
|
{{- printf "%v" .context.Values.redis.enabled -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%v" (not .context.Values.enabled) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Auxiliary function to get the right prefix path for the values
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }}
|
||||||
|
Params:
|
||||||
|
- subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false
|
||||||
|
*/}}
|
||||||
|
{{- define "common.redis.values.keys.prefix" -}}
|
||||||
|
{{- if .subchart -}}redis.{{- else -}}{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Checks whether the redis chart's includes the standarizations (version >= 14)
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.redis.values.standarized.version" (dict "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "common.redis.values.standarized.version" -}}
|
||||||
|
|
||||||
|
{{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}}
|
||||||
|
{{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }}
|
||||||
|
|
||||||
|
{{- if $standarizedAuthValues -}}
|
||||||
|
{{- true -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,46 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Validate values must not be empty.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}}
|
||||||
|
{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}}
|
||||||
|
{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }}
|
||||||
|
|
||||||
|
Validate value params:
|
||||||
|
- valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password"
|
||||||
|
- secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret"
|
||||||
|
- field - String - Optional. Name of the field in the secret data, e.g: "mysql-password"
|
||||||
|
*/}}
|
||||||
|
{{- define "common.validations.values.multiple.empty" -}}
|
||||||
|
{{- range .required -}}
|
||||||
|
{{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Validate a value must not be empty.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }}
|
||||||
|
|
||||||
|
Validate value params:
|
||||||
|
- valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password"
|
||||||
|
- secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret"
|
||||||
|
- field - String - Optional. Name of the field in the secret data, e.g: "mysql-password"
|
||||||
|
- subchart - String - Optional - Name of the subchart that the validated password is part of.
|
||||||
|
*/}}
|
||||||
|
{{- define "common.validations.values.single.empty" -}}
|
||||||
|
{{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }}
|
||||||
|
{{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }}
|
||||||
|
|
||||||
|
{{- if not $value -}}
|
||||||
|
{{- $varname := "my-value" -}}
|
||||||
|
{{- $getCurrentValue := "" -}}
|
||||||
|
{{- if and .secret .field -}}
|
||||||
|
{{- $varname = include "common.utils.fieldToEnvVar" . -}}
|
||||||
|
{{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,5 @@
|
|||||||
|
## bitnami/common
|
||||||
|
## It is required by CI/CD tools and processes.
|
||||||
|
## @skip exampleValue
|
||||||
|
##
|
||||||
|
exampleValue: common-chart
|
@ -0,0 +1,89 @@
|
|||||||
|
CHART NAME: {{ .Chart.Name }}
|
||||||
|
CHART VERSION: {{ .Chart.Version }}
|
||||||
|
APP VERSION: {{ .Chart.AppVersion }}
|
||||||
|
|
||||||
|
** Please be patient while the chart is being deployed **
|
||||||
|
|
||||||
|
{{- if .Values.diagnosticMode.enabled }}
|
||||||
|
The chart has been deployed in diagnostic mode. All probes have been disabled and the command has been overwritten with:
|
||||||
|
|
||||||
|
command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 4 }}
|
||||||
|
args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 4 }}
|
||||||
|
|
||||||
|
Get the list of pods by executing:
|
||||||
|
|
||||||
|
kubectl get pods --namespace {{ .Release.Namespace }} -l app.kubernetes.io/instance={{ .Release.Name }}
|
||||||
|
|
||||||
|
Access the pod you want to debug by executing
|
||||||
|
|
||||||
|
kubectl exec --namespace {{ .Release.Namespace }} -ti <NAME OF THE POD> -- /opt/bitnami/scripts/postgresql/entrypoint.sh /bin/bash
|
||||||
|
|
||||||
|
In order to replicate the container startup scripts execute this command:
|
||||||
|
|
||||||
|
/opt/bitnami/scripts/postgresql/entrypoint.sh /opt/bitnami/scripts/postgresql/run.sh
|
||||||
|
|
||||||
|
{{- else }}
|
||||||
|
|
||||||
|
PostgreSQL can be accessed via port {{ include "postgresql.service.port" . }} on the following DNS names from within your cluster:
|
||||||
|
|
||||||
|
{{ include "postgresql.primary.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - Read/Write connection
|
||||||
|
|
||||||
|
{{- if eq .Values.architecture "replication" }}
|
||||||
|
|
||||||
|
{{ include "postgresql.readReplica.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - Read only connection
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- $customUser := include "postgresql.username" . }}
|
||||||
|
{{- if and (not (empty $customUser)) (ne $customUser "postgres") .Values.auth.enablePostgresUser }}
|
||||||
|
|
||||||
|
To get the password for "postgres" run:
|
||||||
|
|
||||||
|
export POSTGRES_ADMIN_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "postgresql.secretName" . }} -o jsonpath="{.data.postgres-password}" | base64 -d)
|
||||||
|
|
||||||
|
To get the password for "{{ $customUser }}" run:
|
||||||
|
|
||||||
|
export POSTGRES_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "postgresql.secretName" . }} -o jsonpath="{.data.password}" | base64 -d)
|
||||||
|
|
||||||
|
{{- else }}
|
||||||
|
|
||||||
|
To get the password for "{{ default "postgres" $customUser }}" run:
|
||||||
|
|
||||||
|
export POSTGRES_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "postgresql.secretName" . }} -o jsonpath="{.data.{{ ternary "password" "postgres-password" (and (not (empty $customUser)) (ne $customUser "postgres")) }}}" | base64 -d)
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
To connect to your database run the following command:
|
||||||
|
|
||||||
|
kubectl run {{ include "common.names.fullname" . }}-client --rm --tty -i --restart='Never' --namespace {{ .Release.Namespace }} --image {{ include "postgresql.image" . }} --env="PGPASSWORD=$POSTGRES_PASSWORD" \
|
||||||
|
--command -- psql --host {{ include "postgresql.primary.fullname" . }} -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.database" . }} {{ include "postgresql.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.service.port" . }}
|
||||||
|
|
||||||
|
> NOTE: If you access the container using bash, make sure that you execute "/opt/bitnami/scripts/postgresql/entrypoint.sh /bin/bash" in order to avoid the error "psql: local user with ID {{ .Values.primary.containerSecurityContext.runAsUser }}} does not exist"
|
||||||
|
|
||||||
|
To connect to your database from outside the cluster execute the following commands:
|
||||||
|
|
||||||
|
{{- if contains "NodePort" .Values.primary.service.type }}
|
||||||
|
|
||||||
|
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||||
|
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "postgresql.primary.fullname" . }})
|
||||||
|
PGPASSWORD="$POSTGRES_PASSWORD" psql --host $NODE_IP --port $NODE_PORT -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.database" . }} {{ include "postgresql.database" . }}{{- else }} postgres{{- end }}
|
||||||
|
|
||||||
|
{{- else if contains "LoadBalancer" .Values.primary.service.type }}
|
||||||
|
|
||||||
|
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||||
|
Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ include "postgresql.primary.fullname" . }}'
|
||||||
|
|
||||||
|
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "postgresql.primary.fullname" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}")
|
||||||
|
PGPASSWORD="$POSTGRES_PASSWORD" psql --host $SERVICE_IP --port {{ include "postgresql.service.port" . }} -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.database" . }} {{ include "postgresql.database" . }}{{- else }} postgres{{- end }}
|
||||||
|
|
||||||
|
{{- else if contains "ClusterIP" .Values.primary.service.type }}
|
||||||
|
|
||||||
|
kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ include "postgresql.primary.fullname" . }} {{ include "postgresql.service.port" . }}:{{ include "postgresql.service.port" . }} &
|
||||||
|
PGPASSWORD="$POSTGRES_PASSWORD" psql --host 127.0.0.1 -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.database" . }} {{ include "postgresql.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.service.port" . }}
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- include "postgresql.validateValues" . -}}
|
||||||
|
{{- include "common.warnings.rollingTag" .Values.image -}}
|
||||||
|
{{- include "common.warnings.rollingTag" .Values.volumePermissions.image }}
|
@ -0,0 +1,399 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name for PostgreSQL Primary objects
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.primary.fullname" -}}
|
||||||
|
{{- if eq .Values.architecture "replication" }}
|
||||||
|
{{- printf "%s-%s" (include "common.names.fullname" .) .Values.primary.name | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- include "common.names.fullname" . -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name for PostgreSQL read-only replicas objects
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.readReplica.fullname" -}}
|
||||||
|
{{- printf "%s-%s" (include "common.names.fullname" .) .Values.readReplicas.name | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the default FQDN for PostgreSQL primary headless service
|
||||||
|
We truncate at 63 chars because of the DNS naming spec.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.primary.svc.headless" -}}
|
||||||
|
{{- printf "%s-hl" (include "postgresql.primary.fullname" .) | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the default FQDN for PostgreSQL read-only replicas headless service
|
||||||
|
We truncate at 63 chars because of the DNS naming spec.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.readReplica.svc.headless" -}}
|
||||||
|
{{- printf "%s-hl" (include "postgresql.readReplica.fullname" .) | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper PostgreSQL image name
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.image" -}}
|
||||||
|
{{ include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper PostgreSQL metrics image name
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.metrics.image" -}}
|
||||||
|
{{ include "common.images.image" (dict "imageRoot" .Values.metrics.image "global" .Values.global) }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper image name (for the init container volume-permissions image)
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.volumePermissions.image" -}}
|
||||||
|
{{ include "common.images.image" (dict "imageRoot" .Values.volumePermissions.image "global" .Values.global) }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Docker Image Registry Secret Names
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.imagePullSecrets" -}}
|
||||||
|
{{ include "common.images.pullSecrets" (dict "images" (list .Values.image .Values.metrics.image .Values.volumePermissions.image) "global" .Values.global) }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the name for a custom user to create
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.username" -}}
|
||||||
|
{{- if .Values.global.postgresql.auth.username }}
|
||||||
|
{{- .Values.global.postgresql.auth.username -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .Values.auth.username -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the name for a custom database to create
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.database" -}}
|
||||||
|
{{- if .Values.global.postgresql.auth.database }}
|
||||||
|
{{- .Values.global.postgresql.auth.database -}}
|
||||||
|
{{- else if .Values.auth.database -}}
|
||||||
|
{{- .Values.auth.database -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the password secret.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.secretName" -}}
|
||||||
|
{{- if .Values.global.postgresql.auth.existingSecret }}
|
||||||
|
{{- printf "%s" (tpl .Values.global.postgresql.auth.existingSecret $) -}}
|
||||||
|
{{- else if .Values.auth.existingSecret -}}
|
||||||
|
{{- printf "%s" (tpl .Values.auth.existingSecret $) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s" (include "common.names.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the replication-password key.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.replicationPasswordKey" -}}
|
||||||
|
{{- if or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret }}
|
||||||
|
{{- if .Values.global.postgresql.auth.secretKeys.replicationPasswordKey }}
|
||||||
|
{{- printf "%s" (tpl .Values.global.postgresql.auth.secretKeys.replicationPasswordKey $) -}}
|
||||||
|
{{- else if .Values.auth.secretKeys.replicationPasswordKey -}}
|
||||||
|
{{- printf "%s" (tpl .Values.auth.secretKeys.replicationPasswordKey $) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- "replication-password" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- "replication-password" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the admin-password key.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.adminPasswordKey" -}}
|
||||||
|
{{- if or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret }}
|
||||||
|
{{- if .Values.global.postgresql.auth.secretKeys.adminPasswordKey }}
|
||||||
|
{{- printf "%s" (tpl .Values.global.postgresql.auth.secretKeys.adminPasswordKey $) -}}
|
||||||
|
{{- else if .Values.auth.secretKeys.adminPasswordKey -}}
|
||||||
|
{{- printf "%s" (tpl .Values.auth.secretKeys.adminPasswordKey $) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- "postgres-password" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the user-password key.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.userPasswordKey" -}}
|
||||||
|
{{- if or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret }}
|
||||||
|
{{- if or (empty (include "postgresql.username" .)) (eq (include "postgresql.username" .) "postgres") }}
|
||||||
|
{{- printf "%s" (include "postgresql.adminPasswordKey" .) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- if .Values.global.postgresql.auth.secretKeys.userPasswordKey }}
|
||||||
|
{{- printf "%s" (tpl .Values.global.postgresql.auth.secretKeys.userPasswordKey $) -}}
|
||||||
|
{{- else if .Values.auth.secretKeys.userPasswordKey -}}
|
||||||
|
{{- printf "%s" (tpl .Values.auth.secretKeys.userPasswordKey $) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- ternary "password" "postgres-password" (and (not (empty (include "postgresql.username" .))) (ne (include "postgresql.username" .) "postgres")) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return true if a secret object should be created
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.createSecret" -}}
|
||||||
|
{{- if not (or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret) -}}
|
||||||
|
{{- true -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return PostgreSQL service port
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.service.port" -}}
|
||||||
|
{{- if .Values.global.postgresql.service.ports.postgresql }}
|
||||||
|
{{- .Values.global.postgresql.service.ports.postgresql -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .Values.primary.service.ports.postgresql -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return PostgreSQL service port
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.readReplica.service.port" -}}
|
||||||
|
{{- if .Values.global.postgresql.service.ports.postgresql }}
|
||||||
|
{{- .Values.global.postgresql.service.ports.postgresql -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .Values.readReplicas.service.ports.postgresql -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the PostgreSQL primary configuration ConfigMap name.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.primary.configmapName" -}}
|
||||||
|
{{- if .Values.primary.existingConfigmap -}}
|
||||||
|
{{- printf "%s" (tpl .Values.primary.existingConfigmap $) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s-configuration" (include "postgresql.primary.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return true if a configmap object should be created for PostgreSQL primary with the configuration
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.primary.createConfigmap" -}}
|
||||||
|
{{- if and (or .Values.primary.configuration .Values.primary.pgHbaConfiguration) (not .Values.primary.existingConfigmap) }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the PostgreSQL primary extended configuration ConfigMap name.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.primary.extendedConfigmapName" -}}
|
||||||
|
{{- if .Values.primary.existingExtendedConfigmap -}}
|
||||||
|
{{- printf "%s" (tpl .Values.primary.existingExtendedConfigmap $) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s-extended-configuration" (include "postgresql.primary.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the PostgreSQL read replica extended configuration ConfigMap name.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.readReplicas.extendedConfigmapName" -}}
|
||||||
|
{{- printf "%s-extended-configuration" (include "postgresql.readReplica.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return true if a configmap object should be created for PostgreSQL primary with the extended configuration
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.primary.createExtendedConfigmap" -}}
|
||||||
|
{{- if and .Values.primary.extendedConfiguration (not .Values.primary.existingExtendedConfigmap) }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return true if a configmap object should be created for PostgreSQL read replica with the extended configuration
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.readReplicas.createExtendedConfigmap" -}}
|
||||||
|
{{- if .Values.readReplicas.extendedConfiguration }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the name of the service account to use
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.serviceAccountName" -}}
|
||||||
|
{{- if .Values.serviceAccount.create -}}
|
||||||
|
{{ default (include "common.names.fullname" .) .Values.serviceAccount.name }}
|
||||||
|
{{- else -}}
|
||||||
|
{{ default "default" .Values.serviceAccount.name }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return true if a configmap should be mounted with PostgreSQL configuration
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.mountConfigurationCM" -}}
|
||||||
|
{{- if or .Values.primary.configuration .Values.primary.pgHbaConfiguration .Values.primary.existingConfigmap }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the initialization scripts ConfigMap name.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.initdb.scriptsCM" -}}
|
||||||
|
{{- if .Values.primary.initdb.scriptsConfigMap -}}
|
||||||
|
{{- printf "%s" (tpl .Values.primary.initdb.scriptsConfigMap $) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s-init-scripts" (include "postgresql.primary.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{/*
|
||||||
|
Return true if TLS is enabled for LDAP connection
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.ldap.tls.enabled" -}}
|
||||||
|
{{- if and (kindIs "string" .Values.ldap.tls) (not (empty .Values.ldap.tls)) }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- else if and (kindIs "map" .Values.ldap.tls) .Values.ldap.tls.enabled }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the readiness probe command
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.readinessProbeCommand" -}}
|
||||||
|
{{- $customUser := include "postgresql.username" . }}
|
||||||
|
- |
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.database" . }} {{- if .Values.tls.enabled }} sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- else }}
|
||||||
|
exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if .Values.tls.enabled }} -d "sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if contains "bitnami/" .Values.image.repository }}
|
||||||
|
[ -f /opt/bitnami/postgresql/tmp/.initialized ] || [ -f /bitnami/postgresql/.initialized ]
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Compile all warnings into a single message, and call fail.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.validateValues" -}}
|
||||||
|
{{- $messages := list -}}
|
||||||
|
{{- $messages := append $messages (include "postgresql.validateValues.ldapConfigurationMethod" .) -}}
|
||||||
|
{{- $messages := append $messages (include "postgresql.validateValues.psp" .) -}}
|
||||||
|
{{- $messages := without $messages "" -}}
|
||||||
|
{{- $message := join "\n" $messages -}}
|
||||||
|
|
||||||
|
{{- if $message -}}
|
||||||
|
{{- printf "\nVALUES VALIDATION:\n%s" $message | fail -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Validate values of Postgresql - If ldap.url is used then you don't need the other settings for ldap
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.validateValues.ldapConfigurationMethod" -}}
|
||||||
|
{{- if and .Values.ldap.enabled (and (not (empty .Values.ldap.url)) (not (empty .Values.ldap.server))) }}
|
||||||
|
postgresql: ldap.url, ldap.server
|
||||||
|
You cannot set both `ldap.url` and `ldap.server` at the same time.
|
||||||
|
Please provide a unique way to configure LDAP.
|
||||||
|
More info at https://www.postgresql.org/docs/current/auth-ldap.html
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Validate values of Postgresql - If PSP is enabled RBAC should be enabled too
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.validateValues.psp" -}}
|
||||||
|
{{- if and .Values.psp.create (not .Values.rbac.create) }}
|
||||||
|
postgresql: psp.create, rbac.create
|
||||||
|
RBAC should be enabled if PSP is enabled in order for PSP to work.
|
||||||
|
More info at https://kubernetes.io/docs/concepts/policy/pod-security-policy/#authorizing-policies
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the path to the cert file.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.tlsCert" -}}
|
||||||
|
{{- if .Values.tls.autoGenerated }}
|
||||||
|
{{- printf "/opt/bitnami/postgresql/certs/tls.crt" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- required "Certificate filename is required when TLS in enabled" .Values.tls.certFilename | printf "/opt/bitnami/postgresql/certs/%s" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the path to the cert key file.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.tlsCertKey" -}}
|
||||||
|
{{- if .Values.tls.autoGenerated }}
|
||||||
|
{{- printf "/opt/bitnami/postgresql/certs/tls.key" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- required "Certificate Key filename is required when TLS in enabled" .Values.tls.certKeyFilename | printf "/opt/bitnami/postgresql/certs/%s" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the path to the CA cert file.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.tlsCACert" -}}
|
||||||
|
{{- if .Values.tls.autoGenerated }}
|
||||||
|
{{- printf "/opt/bitnami/postgresql/certs/ca.crt" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "/opt/bitnami/postgresql/certs/%s" .Values.tls.certCAFilename -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the path to the CRL file.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.tlsCRL" -}}
|
||||||
|
{{- if .Values.tls.crlFilename -}}
|
||||||
|
{{- printf "/opt/bitnami/postgresql/certs/%s" .Values.tls.crlFilename -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return true if a TLS credentials secret object should be created
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.createTlsSecret" -}}
|
||||||
|
{{- if and .Values.tls.autoGenerated (not .Values.tls.certificatesSecret) }}
|
||||||
|
{{- true -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the path to the CA cert file.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.tlsSecretName" -}}
|
||||||
|
{{- if .Values.tls.autoGenerated }}
|
||||||
|
{{- printf "%s-crt" (include "common.names.fullname" .) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{ required "A secret containing TLS certificates is required when TLS is enabled" .Values.tls.certificatesSecret }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,4 @@
|
|||||||
|
{{- range .Values.extraDeploy }}
|
||||||
|
---
|
||||||
|
{{ include "common.tplvalues.render" (dict "value" . "context" $) }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,32 @@
|
|||||||
|
{{- if and .Values.networkPolicy.enabled (or .Values.networkPolicy.egressRules.denyConnectionsToExternal .Values.networkPolicy.egressRules.customRules) }}
|
||||||
|
apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }}
|
||||||
|
kind: NetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-egress" (include "common.names.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
podSelector:
|
||||||
|
matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
|
||||||
|
policyTypes:
|
||||||
|
- Egress
|
||||||
|
egress:
|
||||||
|
{{- if .Values.networkPolicy.egressRules.denyConnectionsToExternal }}
|
||||||
|
- ports:
|
||||||
|
- port: 53
|
||||||
|
protocol: UDP
|
||||||
|
- port: 53
|
||||||
|
protocol: TCP
|
||||||
|
- to:
|
||||||
|
- namespaceSelector: {}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.networkPolicy.egressRules.customRules }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.egressRules.customRules "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,24 @@
|
|||||||
|
{{- if (include "postgresql.primary.createConfigmap" .) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-configuration" (include "postgresql.primary.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
data:
|
||||||
|
{{- if .Values.primary.configuration }}
|
||||||
|
postgresql.conf: |-
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.configuration "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.pgHbaConfiguration }}
|
||||||
|
pg_hba.conf: |
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.pgHbaConfiguration "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,18 @@
|
|||||||
|
{{- if (include "postgresql.primary.createExtendedConfigmap" .) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-extended-configuration" (include "postgresql.primary.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
data:
|
||||||
|
override.conf: |-
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.extendedConfiguration "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,15 @@
|
|||||||
|
{{- if and .Values.primary.initdb.scripts (not .Values.primary.initdb.scriptsConfigMap) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-init-scripts" (include "postgresql.primary.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
data: {{- include "common.tplvalues.render" (dict "value" .Values.primary.initdb.scripts "context" .) | nindent 2 }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,16 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.customMetrics }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-metrics" (include "postgresql.primary.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
data:
|
||||||
|
custom-metrics.yaml: {{ toYaml .Values.metrics.customMetrics | quote }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,31 @@
|
|||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-metrics" (include "postgresql.primary.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: metrics
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.service.annotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.metrics.service.annotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
sessionAffinity: {{ .Values.metrics.service.sessionAffinity }}
|
||||||
|
{{- if .Values.metrics.service.clusterIP }}
|
||||||
|
clusterIP: {{ .Values.metrics.service.clusterIP }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: http-metrics
|
||||||
|
port: {{ .Values.metrics.service.ports.metrics }}
|
||||||
|
targetPort: http-metrics
|
||||||
|
selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
{{- end }}
|
@ -0,0 +1,57 @@
|
|||||||
|
{{- if and .Values.networkPolicy.enabled (or .Values.networkPolicy.metrics.enabled .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled) }}
|
||||||
|
apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }}
|
||||||
|
kind: NetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-ingress" (include "postgresql.primary.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
podSelector:
|
||||||
|
matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
ingress:
|
||||||
|
{{- if and .Values.metrics.enabled .Values.networkPolicy.metrics.enabled (or .Values.networkPolicy.metrics.namespaceSelector .Values.networkPolicy.metrics.podSelector) }}
|
||||||
|
- from:
|
||||||
|
{{- if .Values.networkPolicy.metrics.namespaceSelector }}
|
||||||
|
- namespaceSelector:
|
||||||
|
matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.metrics.namespaceSelector "context" $) | nindent 14 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.networkPolicy.metrics.podSelector }}
|
||||||
|
- podSelector:
|
||||||
|
matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.metrics.podSelector "context" $) | nindent 14 }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- port: {{ .Values.metrics.containerPorts.metrics }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled (or .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector) }}
|
||||||
|
- from:
|
||||||
|
{{- if .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector }}
|
||||||
|
- namespaceSelector:
|
||||||
|
matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector "context" $) | nindent 14 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector }}
|
||||||
|
- podSelector:
|
||||||
|
matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector "context" $) | nindent 14 }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- port: {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled (eq .Values.architecture "replication") }}
|
||||||
|
- from:
|
||||||
|
- podSelector:
|
||||||
|
matchLabels: {{- include "common.labels.matchLabels" . | nindent 14 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
ports:
|
||||||
|
- port: {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,48 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: ServiceMonitor
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.primary.fullname" . }}
|
||||||
|
namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: metrics
|
||||||
|
{{- if .Values.metrics.serviceMonitor.labels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if .Values.metrics.serviceMonitor.jobLabel }}
|
||||||
|
jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.selector }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/component: metrics
|
||||||
|
endpoints:
|
||||||
|
- port: http-metrics
|
||||||
|
{{- if .Values.metrics.serviceMonitor.interval }}
|
||||||
|
interval: {{ .Values.metrics.serviceMonitor.interval }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
|
||||||
|
scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.relabelings }}
|
||||||
|
relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.relabelings "context" $) | nindent 6 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.metricRelabelings }}
|
||||||
|
metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.metricRelabelings "context" $) | nindent 6 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.honorLabels }}
|
||||||
|
honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
|
||||||
|
{{- end }}
|
||||||
|
namespaceSelector:
|
||||||
|
matchNames:
|
||||||
|
- {{ .Release.Namespace | quote }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,634 @@
|
|||||||
|
{{- $customUser := include "postgresql.username" . }}
|
||||||
|
apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.primary.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.labels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.labels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.annotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.annotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
serviceName: {{ include "postgresql.primary.svc.headless" . }}
|
||||||
|
{{- if .Values.primary.updateStrategy }}
|
||||||
|
updateStrategy: {{- toYaml .Values.primary.updateStrategy | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.primary.fullname" . }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 8 }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.podLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.podLabels "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
{{- if (include "postgresql.primary.createConfigmap" .) }}
|
||||||
|
checksum/configuration: {{ include (print $.Template.BasePath "/primary/configmap.yaml") . | sha256sum }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if (include "postgresql.primary.createExtendedConfigmap" .) }}
|
||||||
|
checksum/extended-configuration: {{ include (print $.Template.BasePath "/primary/extended-configmap.yaml") . | sha256sum }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.podAnnotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.podAnnotations "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if .Values.primary.extraPodSpec }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.primary.extraPodSpec "context" $) | nindent 6 }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: {{ include "postgresql.serviceAccountName" . }}
|
||||||
|
{{- include "postgresql.imagePullSecrets" . | nindent 6 }}
|
||||||
|
{{- if .Values.primary.hostAliases }}
|
||||||
|
hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.primary.hostAliases "context" $) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.affinity }}
|
||||||
|
affinity: {{- include "common.tplvalues.render" (dict "value" .Values.primary.affinity "context" $) | nindent 8 }}
|
||||||
|
{{- else }}
|
||||||
|
affinity:
|
||||||
|
podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.primary.podAffinityPreset "component" "primary" "context" $) | nindent 10 }}
|
||||||
|
podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.primary.podAntiAffinityPreset "component" "primary" "context" $) | nindent 10 }}
|
||||||
|
nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.primary.nodeAffinityPreset.type "key" .Values.primary.nodeAffinityPreset.key "values" .Values.primary.nodeAffinityPreset.values) | nindent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.nodeSelector }}
|
||||||
|
nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.primary.nodeSelector "context" $) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.tolerations }}
|
||||||
|
tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.primary.tolerations "context" $) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.topologySpreadConstraints }}
|
||||||
|
topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.primary.topologySpreadConstraints "context" .) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.priorityClassName }}
|
||||||
|
priorityClassName: {{ .Values.primary.priorityClassName }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.schedulerName }}
|
||||||
|
schedulerName: {{ .Values.primary.schedulerName | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.terminationGracePeriodSeconds }}
|
||||||
|
terminationGracePeriodSeconds: {{ .Values.primary.terminationGracePeriodSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.podSecurityContext.enabled }}
|
||||||
|
securityContext: {{- omit .Values.primary.podSecurityContext "enabled" | toYaml | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
hostNetwork: {{ .Values.primary.hostNetwork }}
|
||||||
|
hostIPC: {{ .Values.primary.hostIPC }}
|
||||||
|
initContainers:
|
||||||
|
{{- if and .Values.tls.enabled (not .Values.volumePermissions.enabled) }}
|
||||||
|
- name: copy-certs
|
||||||
|
image: {{ include "postgresql.volumePermissions.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.primary.resources }}
|
||||||
|
resources: {{- toYaml .Values.primary.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
# We don't require a privileged container in this case
|
||||||
|
{{- if .Values.primary.containerSecurityContext.enabled }}
|
||||||
|
securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -ec
|
||||||
|
- |
|
||||||
|
cp /tmp/certs/* /opt/bitnami/postgresql/certs/
|
||||||
|
chmod 600 {{ include "postgresql.tlsCertKey" . }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: raw-certificates
|
||||||
|
mountPath: /tmp/certs
|
||||||
|
- name: postgresql-certificates
|
||||||
|
mountPath: /opt/bitnami/postgresql/certs
|
||||||
|
{{- else if and .Values.volumePermissions.enabled (or .Values.primary.persistence.enabled .Values.shmVolume.enabled) }}
|
||||||
|
- name: init-chmod-data
|
||||||
|
image: {{ include "postgresql.volumePermissions.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.volumePermissions.resources }}
|
||||||
|
resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -ec
|
||||||
|
- |
|
||||||
|
{{- if .Values.primary.persistence.enabled }}
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
|
||||||
|
chown `id -u`:`id -G | cut -d " " -f2` {{ .Values.primary.persistence.mountPath }}
|
||||||
|
{{- else }}
|
||||||
|
chown {{ .Values.primary.containerSecurityContext.runAsUser }}:{{ .Values.primary.podSecurityContext.fsGroup }} {{ .Values.primary.persistence.mountPath }}
|
||||||
|
{{- end }}
|
||||||
|
mkdir -p {{ .Values.primary.persistence.mountPath }}/data {{- if (include "postgresql.mountConfigurationCM" .) }} {{ .Values.primary.persistence.mountPath }}/conf {{- end }}
|
||||||
|
chmod 700 {{ .Values.primary.persistence.mountPath }}/data {{- if (include "postgresql.mountConfigurationCM" .) }} {{ .Values.primary.persistence.mountPath }}/conf {{- end }}
|
||||||
|
find {{ .Values.primary.persistence.mountPath }} -mindepth 1 -maxdepth 1 {{- if not (include "postgresql.mountConfigurationCM" .) }} -not -name "conf" {{- end }} -not -name ".snapshot" -not -name "lost+found" | \
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
|
||||||
|
xargs -r chown -R `id -u`:`id -G | cut -d " " -f2`
|
||||||
|
{{- else }}
|
||||||
|
xargs -r chown -R {{ .Values.primary.containerSecurityContext.runAsUser }}:{{ .Values.primary.podSecurityContext.fsGroup }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
chmod -R 777 /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
cp /tmp/certs/* /opt/bitnami/postgresql/certs/
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
|
||||||
|
chown -R `id -u`:`id -G | cut -d " " -f2` /opt/bitnami/postgresql/certs/
|
||||||
|
{{- else }}
|
||||||
|
chown -R {{ .Values.primary.containerSecurityContext.runAsUser }}:{{ .Values.primary.podSecurityContext.fsGroup }} /opt/bitnami/postgresql/certs/
|
||||||
|
{{- end }}
|
||||||
|
chmod 600 {{ include "postgresql.tlsCertKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
|
||||||
|
securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }}
|
||||||
|
{{- else }}
|
||||||
|
securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.primary.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
mountPath: {{ .Values.primary.persistence.mountPath }}
|
||||||
|
{{- if .Values.primary.persistence.subPath }}
|
||||||
|
subPath: {{ .Values.primary.persistence.subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
mountPath: /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
- name: raw-certificates
|
||||||
|
mountPath: /tmp/certs
|
||||||
|
- name: postgresql-certificates
|
||||||
|
mountPath: /opt/bitnami/postgresql/certs
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.initContainers }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.initContainers "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: postgresql
|
||||||
|
image: {{ include "postgresql.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.primary.containerSecurityContext.enabled }}
|
||||||
|
securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.diagnosticMode.enabled }}
|
||||||
|
command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.primary.command }}
|
||||||
|
command: {{- include "common.tplvalues.render" (dict "value" .Values.primary.command "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.diagnosticMode.enabled }}
|
||||||
|
args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.primary.args }}
|
||||||
|
args: {{- include "common.tplvalues.render" (dict "value" .Values.primary.args "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
- name: BITNAMI_DEBUG
|
||||||
|
value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }}
|
||||||
|
- name: POSTGRESQL_PORT_NUMBER
|
||||||
|
value: {{ .Values.containerPorts.postgresql | quote }}
|
||||||
|
- name: POSTGRESQL_VOLUME_DIR
|
||||||
|
value: {{ .Values.primary.persistence.mountPath | quote }}
|
||||||
|
{{- if .Values.primary.persistence.mountPath }}
|
||||||
|
- name: PGDATA
|
||||||
|
value: {{ .Values.postgresqlDataDir | quote }}
|
||||||
|
{{- end }}
|
||||||
|
# Authentication
|
||||||
|
{{- if and (not (empty $customUser)) (ne $customUser "postgres") }}
|
||||||
|
- name: POSTGRES_USER
|
||||||
|
value: {{ $customUser | quote }}
|
||||||
|
{{- if .Values.auth.enablePostgresUser }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: POSTGRES_POSTGRES_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/postgres-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_POSTGRES_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "postgresql.secretName" . }}
|
||||||
|
key: {{ include "postgresql.adminPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: POSTGRES_PASSWORD_FILE
|
||||||
|
value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (ternary "password" "postgres-password" (and (not (empty $customUser)) (ne $customUser "postgres"))) }}
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "postgresql.secretName" . }}
|
||||||
|
key: {{ include "postgresql.userPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
- name: POSTGRES_DB
|
||||||
|
value: {{ (include "postgresql.database" .) | quote }}
|
||||||
|
{{- end }}
|
||||||
|
# Replication
|
||||||
|
{{- if or (eq .Values.architecture "replication") .Values.primary.standby.enabled }}
|
||||||
|
- name: POSTGRES_REPLICATION_MODE
|
||||||
|
value: {{ ternary "slave" "master" .Values.primary.standby.enabled | quote }}
|
||||||
|
- name: POSTGRES_REPLICATION_USER
|
||||||
|
value: {{ .Values.auth.replicationUsername | quote }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: POSTGRES_REPLICATION_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/replication-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_REPLICATION_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "postgresql.secretName" . }}
|
||||||
|
key: {{ include "postgresql.replicationPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if not (eq .Values.replication.synchronousCommit "off") }}
|
||||||
|
- name: POSTGRES_SYNCHRONOUS_COMMIT_MODE
|
||||||
|
value: {{ .Values.replication.synchronousCommit | quote }}
|
||||||
|
- name: POSTGRES_NUM_SYNCHRONOUS_REPLICAS
|
||||||
|
value: {{ .Values.replication.numSynchronousReplicas | quote }}
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRES_CLUSTER_APP_NAME
|
||||||
|
value: {{ .Values.replication.applicationName }}
|
||||||
|
{{- end }}
|
||||||
|
# Initdb
|
||||||
|
{{- if .Values.primary.initdb.args }}
|
||||||
|
- name: POSTGRES_INITDB_ARGS
|
||||||
|
value: {{ .Values.primary.initdb.args | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.initdb.postgresqlWalDir }}
|
||||||
|
- name: POSTGRES_INITDB_WALDIR
|
||||||
|
value: {{ .Values.primary.initdb.postgresqlWalDir | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.initdb.user }}
|
||||||
|
- name: POSTGRESQL_INITSCRIPTS_USERNAME
|
||||||
|
value: {{ .Values.primary.initdb.user }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.initdb.password }}
|
||||||
|
- name: POSTGRESQL_INITSCRIPTS_PASSWORD
|
||||||
|
value: {{ .Values.primary.initdb.password | quote }}
|
||||||
|
{{- end }}
|
||||||
|
# Standby
|
||||||
|
{{- if .Values.primary.standby.enabled }}
|
||||||
|
- name: POSTGRES_MASTER_HOST
|
||||||
|
value: {{ .Values.primary.standby.primaryHost }}
|
||||||
|
- name: POSTGRES_MASTER_PORT_NUMBER
|
||||||
|
value: {{ .Values.primary.standby.primaryPort | quote }}
|
||||||
|
{{- end }}
|
||||||
|
# LDAP
|
||||||
|
- name: POSTGRESQL_ENABLE_LDAP
|
||||||
|
value: {{ ternary "yes" "no" .Values.ldap.enabled | quote }}
|
||||||
|
{{- if .Values.ldap.enabled }}
|
||||||
|
{{- if or .Values.ldap.url .Values.ldap.uri }}
|
||||||
|
- name: POSTGRESQL_LDAP_URL
|
||||||
|
value: {{ coalesce .Values.ldap.url .Values.ldap.uri }}
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRESQL_LDAP_SERVER
|
||||||
|
value: {{ .Values.ldap.server }}
|
||||||
|
- name: POSTGRESQL_LDAP_PORT
|
||||||
|
value: {{ .Values.ldap.port | quote }}
|
||||||
|
- name: POSTGRESQL_LDAP_SCHEME
|
||||||
|
value: {{ .Values.ldap.scheme }}
|
||||||
|
{{- if (include "postgresql.ldap.tls.enabled" .) }}
|
||||||
|
- name: POSTGRESQL_LDAP_TLS
|
||||||
|
value: "1"
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRESQL_LDAP_PREFIX
|
||||||
|
value: {{ .Values.ldap.prefix | quote }}
|
||||||
|
- name: POSTGRESQL_LDAP_SUFFIX
|
||||||
|
value: {{ .Values.ldap.suffix | quote }}
|
||||||
|
- name: POSTGRESQL_LDAP_BASE_DN
|
||||||
|
value: {{ coalesce .Values.ldap.baseDN .Values.ldap.basedn }}
|
||||||
|
- name: POSTGRESQL_LDAP_BIND_DN
|
||||||
|
value: {{ coalesce .Values.ldap.bindDN .Values.ldap.binddn}}
|
||||||
|
{{- if or (not (empty .Values.ldap.bind_password)) (not (empty .Values.ldap.bindpw)) }}
|
||||||
|
- name: POSTGRESQL_LDAP_BIND_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "postgresql.secretName" . }}
|
||||||
|
key: ldap-password
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRESQL_LDAP_SEARCH_ATTR
|
||||||
|
value: {{ coalesce .Values.ldap.search_attr .Values.ldap.searchAttribute }}
|
||||||
|
- name: POSTGRESQL_LDAP_SEARCH_FILTER
|
||||||
|
value: {{ coalesce .Values.ldap.search_filter .Values.ldap.searchFilter }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
# TLS
|
||||||
|
- name: POSTGRESQL_ENABLE_TLS
|
||||||
|
value: {{ ternary "yes" "no" .Values.tls.enabled | quote }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
- name: POSTGRESQL_TLS_PREFER_SERVER_CIPHERS
|
||||||
|
value: {{ ternary "yes" "no" .Values.tls.preferServerCiphers | quote }}
|
||||||
|
- name: POSTGRESQL_TLS_CERT_FILE
|
||||||
|
value: {{ include "postgresql.tlsCert" . }}
|
||||||
|
- name: POSTGRESQL_TLS_KEY_FILE
|
||||||
|
value: {{ include "postgresql.tlsCertKey" . }}
|
||||||
|
{{- if .Values.tls.certCAFilename }}
|
||||||
|
- name: POSTGRESQL_TLS_CA_FILE
|
||||||
|
value: {{ include "postgresql.tlsCACert" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.crlFilename }}
|
||||||
|
- name: POSTGRESQL_TLS_CRL_FILE
|
||||||
|
value: {{ include "postgresql.tlsCRL" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
# Audit
|
||||||
|
- name: POSTGRESQL_LOG_HOSTNAME
|
||||||
|
value: {{ .Values.audit.logHostname | quote }}
|
||||||
|
- name: POSTGRESQL_LOG_CONNECTIONS
|
||||||
|
value: {{ .Values.audit.logConnections | quote }}
|
||||||
|
- name: POSTGRESQL_LOG_DISCONNECTIONS
|
||||||
|
value: {{ .Values.audit.logDisconnections | quote }}
|
||||||
|
{{- if .Values.audit.logLinePrefix }}
|
||||||
|
- name: POSTGRESQL_LOG_LINE_PREFIX
|
||||||
|
value: {{ .Values.audit.logLinePrefix | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.audit.logTimezone }}
|
||||||
|
- name: POSTGRESQL_LOG_TIMEZONE
|
||||||
|
value: {{ .Values.audit.logTimezone | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.audit.pgAuditLog }}
|
||||||
|
- name: POSTGRESQL_PGAUDIT_LOG
|
||||||
|
value: {{ .Values.audit.pgAuditLog | quote }}
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRESQL_PGAUDIT_LOG_CATALOG
|
||||||
|
value: {{ .Values.audit.pgAuditLogCatalog | quote }}
|
||||||
|
# Others
|
||||||
|
- name: POSTGRESQL_CLIENT_MIN_MESSAGES
|
||||||
|
value: {{ .Values.audit.clientMinMessages | quote }}
|
||||||
|
- name: POSTGRESQL_SHARED_PRELOAD_LIBRARIES
|
||||||
|
value: {{ .Values.postgresqlSharedPreloadLibraries | quote }}
|
||||||
|
{{- if .Values.primary.extraEnvVars }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.primary.extraEnvVars "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.primary.extraEnvVarsCM .Values.primary.extraEnvVarsSecret }}
|
||||||
|
envFrom:
|
||||||
|
{{- if .Values.primary.extraEnvVarsCM }}
|
||||||
|
- configMapRef:
|
||||||
|
name: {{ .Values.primary.extraEnvVarsCM }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.extraEnvVarsSecret }}
|
||||||
|
- secretRef:
|
||||||
|
name: {{ .Values.primary.extraEnvVarsSecret }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
containerPort: {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- if not .Values.diagnosticMode.enabled }}
|
||||||
|
{{- if .Values.primary.customStartupProbe }}
|
||||||
|
startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.primary.customStartupProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.primary.startupProbe.enabled }}
|
||||||
|
startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.primary.startupProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
- exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- else }}
|
||||||
|
- exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.customLivenessProbe }}
|
||||||
|
livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.primary.customLivenessProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.primary.livenessProbe.enabled }}
|
||||||
|
livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.primary.livenessProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
- exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- else }}
|
||||||
|
- exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.customReadinessProbe }}
|
||||||
|
readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.primary.customReadinessProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.primary.readinessProbe.enabled }}
|
||||||
|
readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.primary.readinessProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- -e
|
||||||
|
{{- include "postgresql.readinessProbeCommand" . | nindent 16 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.resources }}
|
||||||
|
resources: {{- toYaml .Values.primary.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.lifecycleHooks }}
|
||||||
|
lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.primary.lifecycleHooks "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if or .Values.primary.initdb.scriptsConfigMap .Values.primary.initdb.scripts }}
|
||||||
|
- name: custom-init-scripts
|
||||||
|
mountPath: /docker-entrypoint-initdb.d/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.initdb.scriptsSecret }}
|
||||||
|
- name: custom-init-scripts-secret
|
||||||
|
mountPath: /docker-entrypoint-initdb.d/secret
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.primary.extendedConfiguration .Values.primary.existingExtendedConfigmap }}
|
||||||
|
- name: postgresql-extended-config
|
||||||
|
mountPath: /bitnami/postgresql/conf/conf.d/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: postgresql-password
|
||||||
|
mountPath: /opt/bitnami/postgresql/secrets/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
- name: postgresql-certificates
|
||||||
|
mountPath: /opt/bitnami/postgresql/certs
|
||||||
|
readOnly: true
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
mountPath: /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
mountPath: {{ .Values.primary.persistence.mountPath }}
|
||||||
|
{{- if .Values.primary.persistence.subPath }}
|
||||||
|
subPath: {{ .Values.primary.persistence.subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.primary.configuration .Values.primary.pgHbaConfiguration .Values.primary.existingConfigmap }}
|
||||||
|
- name: postgresql-config
|
||||||
|
mountPath: /bitnami/postgresql/conf
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.extraVolumeMounts }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.primary.extraVolumeMounts "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
- name: metrics
|
||||||
|
image: {{ include "postgresql.metrics.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.metrics.containerSecurityContext.enabled }}
|
||||||
|
securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.diagnosticMode.enabled }}
|
||||||
|
command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
|
||||||
|
args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.metrics.customMetrics }}
|
||||||
|
args: ["--extend.query-path", "/conf/custom-metrics.yaml"]
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
{{- $database := required "In order to enable metrics you need to specify a database (.Values.auth.database or .Values.global.postgresql.auth.database)" (include "postgresql.database" .) }}
|
||||||
|
- name: DATA_SOURCE_URI
|
||||||
|
value: {{ printf "127.0.0.1:%d/%s?sslmode=disable" (int (include "postgresql.service.port" .)) $database }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: DATA_SOURCE_PASS_FILE
|
||||||
|
value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (ternary "password" "postgres-password" (and (not (empty $customUser)) (ne $customUser "postgres"))) }}
|
||||||
|
{{- else }}
|
||||||
|
- name: DATA_SOURCE_PASS
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "postgresql.secretName" . }}
|
||||||
|
key: {{ include "postgresql.userPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
- name: DATA_SOURCE_USER
|
||||||
|
value: {{ default "postgres" $customUser | quote }}
|
||||||
|
{{- if .Values.metrics.extraEnvVars }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: http-metrics
|
||||||
|
containerPort: {{ .Values.metrics.containerPorts.metrics }}
|
||||||
|
{{- if not .Values.diagnosticMode.enabled }}
|
||||||
|
{{- if .Values.metrics.customStartupProbe }}
|
||||||
|
startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.metrics.startupProbe.enabled }}
|
||||||
|
startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
tcpSocket:
|
||||||
|
port: http-metrics
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.customLivenessProbe }}
|
||||||
|
livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.metrics.livenessProbe.enabled }}
|
||||||
|
livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http-metrics
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.customReadinessProbe }}
|
||||||
|
readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.metrics.readinessProbe.enabled }}
|
||||||
|
readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http-metrics
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: postgresql-password
|
||||||
|
mountPath: /opt/bitnami/postgresql/secrets/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.customMetrics }}
|
||||||
|
- name: custom-metrics
|
||||||
|
mountPath: /conf
|
||||||
|
readOnly: true
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.resources }}
|
||||||
|
resources: {{- toYaml .Values.metrics.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.sidecars }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.sidecars "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
volumes:
|
||||||
|
{{- if or .Values.primary.configuration .Values.primary.pgHbaConfiguration .Values.primary.existingConfigmap }}
|
||||||
|
- name: postgresql-config
|
||||||
|
configMap:
|
||||||
|
name: {{ include "postgresql.primary.configmapName" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.primary.extendedConfiguration .Values.primary.existingExtendedConfigmap }}
|
||||||
|
- name: postgresql-extended-config
|
||||||
|
configMap:
|
||||||
|
name: {{ include "postgresql.primary.extendedConfigmapName" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: postgresql-password
|
||||||
|
secret:
|
||||||
|
secretName: {{ include "postgresql.secretName" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.primary.initdb.scriptsConfigMap .Values.primary.initdb.scripts }}
|
||||||
|
- name: custom-init-scripts
|
||||||
|
configMap:
|
||||||
|
name: {{ include "postgresql.initdb.scriptsCM" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.initdb.scriptsSecret }}
|
||||||
|
- name: custom-init-scripts-secret
|
||||||
|
secret:
|
||||||
|
secretName: {{ tpl .Values.primary.initdb.scriptsSecret $ }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
- name: raw-certificates
|
||||||
|
secret:
|
||||||
|
secretName: {{ include "postgresql.tlsSecretName" . }}
|
||||||
|
- name: postgresql-certificates
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.extraVolumes }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.primary.extraVolumes "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.customMetrics }}
|
||||||
|
- name: custom-metrics
|
||||||
|
configMap:
|
||||||
|
name: {{ printf "%s-metrics" (include "common.names.fullname" .) }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
emptyDir:
|
||||||
|
medium: Memory
|
||||||
|
{{- if .Values.shmVolume.sizeLimit }}
|
||||||
|
sizeLimit: {{ .Values.shmVolume.sizeLimit }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.primary.persistence.enabled .Values.primary.persistence.existingClaim }}
|
||||||
|
- name: data
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ tpl .Values.primary.persistence.existingClaim $ }}
|
||||||
|
{{- else if not .Values.primary.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
emptyDir: {}
|
||||||
|
{{- else }}
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: data
|
||||||
|
{{- if .Values.primary.persistence.annotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.annotations "context" $) | nindent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.persistence.labels }}
|
||||||
|
labels: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.labels "context" $) | nindent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
{{- range .Values.primary.persistence.accessModes }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.persistence.dataSource }}
|
||||||
|
dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.dataSource "context" $) | nindent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.primary.persistence.size | quote }}
|
||||||
|
{{- if .Values.primary.persistence.selector }}
|
||||||
|
selector: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.selector "context" $) | nindent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- include "common.storage.class" (dict "persistence" .Values.primary.persistence "global" .Values.global) | nindent 8 }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,31 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.primary.svc.headless" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
# Use this annotation in addition to the actual publishNotReadyAddresses
|
||||||
|
# field below because the annotation will stop being respected soon but the
|
||||||
|
# field is broken in some versions of Kubernetes:
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/58662
|
||||||
|
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
clusterIP: None
|
||||||
|
# We want all pods in the StatefulSet to have their addresses published for
|
||||||
|
# the sake of the other Postgresql pods even before they're ready, since they
|
||||||
|
# have to be able to talk to each other in order to become ready.
|
||||||
|
publishNotReadyAddresses: true
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
port: {{ template "postgresql.service.port" . }}
|
||||||
|
targetPort: tcp-postgresql
|
||||||
|
selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: primary
|
@ -0,0 +1,51 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.primary.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/component: primary
|
||||||
|
annotations:
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.service.annotations }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.primary.service.annotations "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.primary.service.type }}
|
||||||
|
{{- if or (eq .Values.primary.service.type "LoadBalancer") (eq .Values.primary.service.type "NodePort") }}
|
||||||
|
externalTrafficPolicy: {{ .Values.primary.service.externalTrafficPolicy | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq .Values.primary.service.type "LoadBalancer") (not (empty .Values.primary.service.loadBalancerSourceRanges)) }}
|
||||||
|
loadBalancerSourceRanges: {{ .Values.primary.service.loadBalancerSourceRanges }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq .Values.primary.service.type "LoadBalancer") (not (empty .Values.primary.service.loadBalancerIP)) }}
|
||||||
|
loadBalancerIP: {{ .Values.primary.service.loadBalancerIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.primary.service.clusterIP (eq .Values.primary.service.type "ClusterIP") }}
|
||||||
|
clusterIP: {{ .Values.primary.service.clusterIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.service.sessionAffinity }}
|
||||||
|
sessionAffinity: {{ .Values.primary.service.sessionAffinity }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.service.sessionAffinityConfig }}
|
||||||
|
sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.primary.service.sessionAffinityConfig "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
port: {{ template "postgresql.service.port" . }}
|
||||||
|
targetPort: tcp-postgresql
|
||||||
|
{{- if and (or (eq .Values.primary.service.type "NodePort") (eq .Values.primary.service.type "LoadBalancer")) (not (empty .Values.primary.service.nodePorts.postgresql)) }}
|
||||||
|
nodePort: {{ .Values.primary.service.nodePorts.postgresql }}
|
||||||
|
{{- else if eq .Values.primary.service.type "ClusterIP" }}
|
||||||
|
nodePort: null
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.primary.service.extraPorts }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.primary.service.extraPorts "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: primary
|
@ -0,0 +1,22 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }}
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: PrometheusRule
|
||||||
|
metadata:
|
||||||
|
name: {{ include "common.names.fullname" . }}
|
||||||
|
namespace: {{ default .Release.Namespace .Values.metrics.prometheusRule.namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: metrics
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.prometheusRule.labels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.labels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
groups:
|
||||||
|
- name: {{ include "common.names.fullname" . }}
|
||||||
|
rules: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.rules "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,41 @@
|
|||||||
|
{{- $pspAvailable := (semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .)) -}}
|
||||||
|
{{- if and $pspAvailable .Values.psp.create }}
|
||||||
|
apiVersion: policy/v1beta1
|
||||||
|
kind: PodSecurityPolicy
|
||||||
|
metadata:
|
||||||
|
name: {{ include "common.names.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
privileged: false
|
||||||
|
volumes:
|
||||||
|
- 'configMap'
|
||||||
|
- 'secret'
|
||||||
|
- 'persistentVolumeClaim'
|
||||||
|
- 'emptyDir'
|
||||||
|
- 'projected'
|
||||||
|
hostNetwork: false
|
||||||
|
hostIPC: false
|
||||||
|
hostPID: false
|
||||||
|
runAsUser:
|
||||||
|
rule: 'RunAsAny'
|
||||||
|
seLinux:
|
||||||
|
rule: 'RunAsAny'
|
||||||
|
supplementalGroups:
|
||||||
|
rule: 'MustRunAs'
|
||||||
|
ranges:
|
||||||
|
- min: 1
|
||||||
|
max: 65535
|
||||||
|
fsGroup:
|
||||||
|
rule: 'MustRunAs'
|
||||||
|
ranges:
|
||||||
|
- min: 1
|
||||||
|
max: 65535
|
||||||
|
readOnlyRootFilesystem: false
|
||||||
|
{{- end }}
|
@ -0,0 +1,18 @@
|
|||||||
|
{{- if (include "postgresql.readReplicas.createExtendedConfigmap" .) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-extended-configuration" (include "postgresql.readReplica.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
data:
|
||||||
|
override.conf: |-
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.extendedConfiguration "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,16 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.customMetrics (eq .Values.architecture "replication") }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-metrics" (include "postgresql.readReplica.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
data:
|
||||||
|
custom-metrics.yaml: {{ toYaml .Values.metrics.customMetrics | quote }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,31 @@
|
|||||||
|
{{- if and .Values.metrics.enabled (eq .Values.architecture "replication") }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-metrics" (include "postgresql.readReplica.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: metrics-read
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.service.annotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.metrics.service.annotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
sessionAffinity: {{ .Values.metrics.service.sessionAffinity }}
|
||||||
|
{{- if .Values.metrics.service.clusterIP }}
|
||||||
|
clusterIP: {{ .Values.metrics.service.clusterIP }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: http-metrics
|
||||||
|
port: {{ .Values.metrics.service.ports.metrics }}
|
||||||
|
targetPort: http-metrics
|
||||||
|
selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
{{- end }}
|
@ -0,0 +1,36 @@
|
|||||||
|
{{- if and .Values.networkPolicy.enabled (eq .Values.architecture "replication") .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled }}
|
||||||
|
apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }}
|
||||||
|
kind: NetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-ingress" (include "postgresql.readReplica.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
podSelector:
|
||||||
|
matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
ingress:
|
||||||
|
{{- if and .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled (or .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector) }}
|
||||||
|
- from:
|
||||||
|
{{- if .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector }}
|
||||||
|
- namespaceSelector:
|
||||||
|
matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector "context" $) | nindent 14 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector }}
|
||||||
|
- podSelector:
|
||||||
|
matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector "context" $) | nindent 14 }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- port: {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,48 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled (eq .Values.architecture "replication") }}
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: ServiceMonitor
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.readReplica.fullname" . }}
|
||||||
|
namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: metrics-read
|
||||||
|
{{- if .Values.metrics.serviceMonitor.labels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if .Values.metrics.serviceMonitor.jobLabel }}
|
||||||
|
jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.selector }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/component: metrics-read
|
||||||
|
endpoints:
|
||||||
|
- port: http-metrics
|
||||||
|
{{- if .Values.metrics.serviceMonitor.interval }}
|
||||||
|
interval: {{ .Values.metrics.serviceMonitor.interval }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
|
||||||
|
scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.relabelings }}
|
||||||
|
relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.relabelings "context" $) | nindent 6 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.metricRelabelings }}
|
||||||
|
metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.metricRelabelings "context" $) | nindent 6 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.honorLabels }}
|
||||||
|
honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
|
||||||
|
{{- end }}
|
||||||
|
namespaceSelector:
|
||||||
|
matchNames:
|
||||||
|
- {{ .Release.Namespace | quote }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,531 @@
|
|||||||
|
{{- if eq .Values.architecture "replication" }}
|
||||||
|
{{- $customUser := include "postgresql.username" . }}
|
||||||
|
apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.readReplica.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.labels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.labels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.annotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.annotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
replicas: {{ .Values.readReplicas.replicaCount }}
|
||||||
|
serviceName: {{ include "postgresql.readReplica.svc.headless" . }}
|
||||||
|
{{- if .Values.readReplicas.updateStrategy }}
|
||||||
|
updateStrategy: {{- toYaml .Values.readReplicas.updateStrategy | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.readReplica.fullname" . }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 8 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.podLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.podLabels "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
{{- if (include "postgresql.readReplicas.createExtendedConfigmap" .) }}
|
||||||
|
checksum/extended-configuration: {{ include (print $.Template.BasePath "/read/extended-configmap.yaml") . | sha256sum }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.podAnnotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.podAnnotations "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if .Values.readReplicas.extraPodSpec }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.extraPodSpec "context" $) | nindent 6 }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: {{ include "postgresql.serviceAccountName" . }}
|
||||||
|
{{- include "postgresql.imagePullSecrets" . | nindent 6 }}
|
||||||
|
{{- if .Values.readReplicas.hostAliases }}
|
||||||
|
hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.hostAliases "context" $) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.affinity }}
|
||||||
|
affinity: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.affinity "context" $) | nindent 8 }}
|
||||||
|
{{- else }}
|
||||||
|
affinity:
|
||||||
|
podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.readReplicas.podAffinityPreset "component" "read" "context" $) | nindent 10 }}
|
||||||
|
podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.readReplicas.podAntiAffinityPreset "component" "read" "context" $) | nindent 10 }}
|
||||||
|
nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.readReplicas.nodeAffinityPreset.type "key" .Values.readReplicas.nodeAffinityPreset.key "values" .Values.readReplicas.nodeAffinityPreset.values) | nindent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.nodeSelector }}
|
||||||
|
nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.nodeSelector "context" $) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.tolerations }}
|
||||||
|
tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.tolerations "context" $) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.topologySpreadConstraints }}
|
||||||
|
topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.topologySpreadConstraints "context" $) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.priorityClassName }}
|
||||||
|
priorityClassName: {{ .Values.readReplicas.priorityClassName }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.schedulerName }}
|
||||||
|
schedulerName: {{ .Values.readReplicas.schedulerName | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.terminationGracePeriodSeconds }}
|
||||||
|
terminationGracePeriodSeconds: {{ .Values.readReplicas.terminationGracePeriodSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.podSecurityContext.enabled }}
|
||||||
|
securityContext: {{- omit .Values.readReplicas.podSecurityContext "enabled" | toYaml | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
hostNetwork: {{ .Values.readReplicas.hostNetwork }}
|
||||||
|
hostIPC: {{ .Values.readReplicas.hostIPC }}
|
||||||
|
initContainers:
|
||||||
|
{{- if and .Values.tls.enabled (not .Values.volumePermissions.enabled) }}
|
||||||
|
- name: copy-certs
|
||||||
|
image: {{ include "postgresql.volumePermissions.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.readReplicas.resources }}
|
||||||
|
resources: {{- toYaml .Values.readReplicas.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
# We don't require a privileged container in this case
|
||||||
|
{{- if .Values.readReplicas.containerSecurityContext.enabled }}
|
||||||
|
securityContext: {{- omit .Values.readReplicas.containerSecurityContext "enabled" | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -ec
|
||||||
|
- |
|
||||||
|
cp /tmp/certs/* /opt/bitnami/postgresql/certs/
|
||||||
|
chmod 600 {{ include "postgresql.tlsCertKey" . }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: raw-certificates
|
||||||
|
mountPath: /tmp/certs
|
||||||
|
- name: postgresql-certificates
|
||||||
|
mountPath: /opt/bitnami/postgresql/certs
|
||||||
|
{{- else if and .Values.volumePermissions.enabled (or .Values.readReplicas.persistence.enabled .Values.shmVolume.enabled) }}
|
||||||
|
- name: init-chmod-data
|
||||||
|
image: {{ include "postgresql.volumePermissions.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.readReplicas.resources }}
|
||||||
|
resources: {{- toYaml .Values.readReplicas.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -ec
|
||||||
|
- |
|
||||||
|
{{- if .Values.readReplicas.persistence.enabled }}
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
|
||||||
|
chown `id -u`:`id -G | cut -d " " -f2` {{ .Values.readReplicas.persistence.mountPath }}
|
||||||
|
{{- else }}
|
||||||
|
chown {{ .Values.readReplicas.containerSecurityContext.runAsUser }}:{{ .Values.readReplicas.podSecurityContext.fsGroup }} {{ .Values.readReplicas.persistence.mountPath }}
|
||||||
|
{{- end }}
|
||||||
|
mkdir -p {{ .Values.readReplicas.persistence.mountPath }}/data {{- if (include "postgresql.mountConfigurationCM" .) }} {{ .Values.readReplicas.persistence.mountPath }}/conf {{- end }}
|
||||||
|
chmod 700 {{ .Values.readReplicas.persistence.mountPath }}/data {{- if (include "postgresql.mountConfigurationCM" .) }} {{ .Values.readReplicas.persistence.mountPath }}/conf {{- end }}
|
||||||
|
find {{ .Values.readReplicas.persistence.mountPath }} -mindepth 1 -maxdepth 1 {{- if not (include "postgresql.mountConfigurationCM" .) }} -not -name "conf" {{- end }} -not -name ".snapshot" -not -name "lost+found" | \
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
|
||||||
|
xargs -r chown -R `id -u`:`id -G | cut -d " " -f2`
|
||||||
|
{{- else }}
|
||||||
|
xargs -r chown -R {{ .Values.readReplicas.containerSecurityContext.runAsUser }}:{{ .Values.readReplicas.podSecurityContext.fsGroup }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
chmod -R 777 /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
cp /tmp/certs/* /opt/bitnami/postgresql/certs/
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
|
||||||
|
chown -R `id -u`:`id -G | cut -d " " -f2` /opt/bitnami/postgresql/certs/
|
||||||
|
{{- else }}
|
||||||
|
chown -R {{ .Values.readReplicas.containerSecurityContext.runAsUser }}:{{ .Values.readReplicas.podSecurityContext.fsGroup }} /opt/bitnami/postgresql/certs/
|
||||||
|
{{- end }}
|
||||||
|
chmod 600 {{ include "postgresql.tlsCertKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
|
||||||
|
securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }}
|
||||||
|
{{- else }}
|
||||||
|
securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{ if .Values.readReplicas.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
mountPath: {{ .Values.readReplicas.persistence.mountPath }}
|
||||||
|
{{- if .Values.readReplicas.persistence.subPath }}
|
||||||
|
subPath: {{ .Values.readReplicas.persistence.subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
mountPath: /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
- name: raw-certificates
|
||||||
|
mountPath: /tmp/certs
|
||||||
|
- name: postgresql-certificates
|
||||||
|
mountPath: /opt/bitnami/postgresql/certs
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.initContainers }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.initContainers "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: postgresql
|
||||||
|
image: {{ include "postgresql.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.readReplicas.containerSecurityContext.enabled }}
|
||||||
|
securityContext: {{- omit .Values.readReplicas.containerSecurityContext "enabled" | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.diagnosticMode.enabled }}
|
||||||
|
command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.readReplicas.command }}
|
||||||
|
command: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.command "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.diagnosticMode.enabled }}
|
||||||
|
args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.readReplicas.args }}
|
||||||
|
args: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.args "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
- name: BITNAMI_DEBUG
|
||||||
|
value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }}
|
||||||
|
- name: POSTGRESQL_PORT_NUMBER
|
||||||
|
value: {{ .Values.containerPorts.postgresql | quote }}
|
||||||
|
- name: POSTGRESQL_VOLUME_DIR
|
||||||
|
value: {{ .Values.readReplicas.persistence.mountPath | quote }}
|
||||||
|
{{- if .Values.readReplicas.persistence.mountPath }}
|
||||||
|
- name: PGDATA
|
||||||
|
value: {{ .Values.postgresqlDataDir | quote }}
|
||||||
|
{{- end }}
|
||||||
|
# Authentication
|
||||||
|
{{- if and (not (empty $customUser)) (ne $customUser "postgres") .Values.auth.enablePostgresUser }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: POSTGRES_POSTGRES_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/postgres-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_POSTGRES_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "postgresql.secretName" . }}
|
||||||
|
key: {{ include "postgresql.adminPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: POSTGRES_PASSWORD_FILE
|
||||||
|
value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (ternary "password" "postgres-password" (and (not (empty $customUser)) (ne $customUser "postgres"))) }}
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "postgresql.secretName" . }}
|
||||||
|
key: {{ include "postgresql.userPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
# Replication
|
||||||
|
- name: POSTGRES_REPLICATION_MODE
|
||||||
|
value: "slave"
|
||||||
|
- name: POSTGRES_REPLICATION_USER
|
||||||
|
value: {{ .Values.auth.replicationUsername | quote }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: POSTGRES_REPLICATION_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/replication-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_REPLICATION_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "postgresql.secretName" . }}
|
||||||
|
key: {{ include "postgresql.replicationPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRES_CLUSTER_APP_NAME
|
||||||
|
value: {{ .Values.replication.applicationName }}
|
||||||
|
- name: POSTGRES_MASTER_HOST
|
||||||
|
value: {{ include "postgresql.primary.fullname" . }}
|
||||||
|
- name: POSTGRES_MASTER_PORT_NUMBER
|
||||||
|
value: {{ include "postgresql.service.port" . | quote }}
|
||||||
|
# TLS
|
||||||
|
- name: POSTGRESQL_ENABLE_TLS
|
||||||
|
value: {{ ternary "yes" "no" .Values.tls.enabled | quote }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
- name: POSTGRESQL_TLS_PREFER_SERVER_CIPHERS
|
||||||
|
value: {{ ternary "yes" "no" .Values.tls.preferServerCiphers | quote }}
|
||||||
|
- name: POSTGRESQL_TLS_CERT_FILE
|
||||||
|
value: {{ include "postgresql.tlsCert" . }}
|
||||||
|
- name: POSTGRESQL_TLS_KEY_FILE
|
||||||
|
value: {{ include "postgresql.tlsCertKey" . }}
|
||||||
|
{{- if .Values.tls.certCAFilename }}
|
||||||
|
- name: POSTGRESQL_TLS_CA_FILE
|
||||||
|
value: {{ include "postgresql.tlsCACert" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.crlFilename }}
|
||||||
|
- name: POSTGRESQL_TLS_CRL_FILE
|
||||||
|
value: {{ include "postgresql.tlsCRL" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
# Audit
|
||||||
|
- name: POSTGRESQL_LOG_HOSTNAME
|
||||||
|
value: {{ .Values.audit.logHostname | quote }}
|
||||||
|
- name: POSTGRESQL_LOG_CONNECTIONS
|
||||||
|
value: {{ .Values.audit.logConnections | quote }}
|
||||||
|
- name: POSTGRESQL_LOG_DISCONNECTIONS
|
||||||
|
value: {{ .Values.audit.logDisconnections | quote }}
|
||||||
|
{{- if .Values.audit.logLinePrefix }}
|
||||||
|
- name: POSTGRESQL_LOG_LINE_PREFIX
|
||||||
|
value: {{ .Values.audit.logLinePrefix | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.audit.logTimezone }}
|
||||||
|
- name: POSTGRESQL_LOG_TIMEZONE
|
||||||
|
value: {{ .Values.audit.logTimezone | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.audit.pgAuditLog }}
|
||||||
|
- name: POSTGRESQL_PGAUDIT_LOG
|
||||||
|
value: {{ .Values.audit.pgAuditLog | quote }}
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRESQL_PGAUDIT_LOG_CATALOG
|
||||||
|
value: {{ .Values.audit.pgAuditLogCatalog | quote }}
|
||||||
|
# Others
|
||||||
|
- name: POSTGRESQL_CLIENT_MIN_MESSAGES
|
||||||
|
value: {{ .Values.audit.clientMinMessages | quote }}
|
||||||
|
- name: POSTGRESQL_SHARED_PRELOAD_LIBRARIES
|
||||||
|
value: {{ .Values.postgresqlSharedPreloadLibraries | quote }}
|
||||||
|
{{- if .Values.readReplicas.extraEnvVars }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.extraEnvVars "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.readReplicas.extraEnvVarsCM .Values.readReplicas.extraEnvVarsSecret }}
|
||||||
|
envFrom:
|
||||||
|
{{- if .Values.readReplicas.extraEnvVarsCM }}
|
||||||
|
- configMapRef:
|
||||||
|
name: {{ .Values.readReplicas.extraEnvVarsCM }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.extraEnvVarsSecret }}
|
||||||
|
- secretRef:
|
||||||
|
name: {{ .Values.readReplicas.extraEnvVarsSecret }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
containerPort: {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- if not .Values.diagnosticMode.enabled }}
|
||||||
|
{{- if .Values.readReplicas.customStartupProbe }}
|
||||||
|
startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.customStartupProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.readReplicas.startupProbe.enabled }}
|
||||||
|
startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readReplicas.startupProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
- exec pg_isready -U {{ default "postgres" $customUser| quote }} -d "dbname={{ include "postgresql.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- else }}
|
||||||
|
- exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.customLivenessProbe }}
|
||||||
|
livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.customLivenessProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.readReplicas.livenessProbe.enabled }}
|
||||||
|
livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readReplicas.livenessProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
- exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- else }}
|
||||||
|
- exec pg_isready -U {{default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.tlsCert" . }} sslkey={{ include "postgresql.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.customReadinessProbe }}
|
||||||
|
readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.customReadinessProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.readReplicas.readinessProbe.enabled }}
|
||||||
|
readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readReplicas.readinessProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- -e
|
||||||
|
{{- include "postgresql.readinessProbeCommand" . | nindent 16 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.resources }}
|
||||||
|
resources: {{- toYaml .Values.readReplicas.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.lifecycleHooks }}
|
||||||
|
lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.lifecycleHooks "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: postgresql-password
|
||||||
|
mountPath: /opt/bitnami/postgresql/secrets/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.extendedConfiguration }}
|
||||||
|
- name: postgresql-extended-config
|
||||||
|
mountPath: /bitnami/postgresql/conf/conf.d/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
- name: postgresql-certificates
|
||||||
|
mountPath: /opt/bitnami/postgresql/certs
|
||||||
|
readOnly: true
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
mountPath: /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
mountPath: {{ .Values.readReplicas.persistence.mountPath }}
|
||||||
|
{{- if .Values.readReplicas.persistence.subPath }}
|
||||||
|
subPath: {{ .Values.readReplicas.persistence.subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.extraVolumeMounts }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.extraVolumeMounts "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
- name: metrics
|
||||||
|
image: {{ include "postgresql.metrics.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.metrics.containerSecurityContext.enabled }}
|
||||||
|
securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.diagnosticMode.enabled }}
|
||||||
|
command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
|
||||||
|
args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.metrics.customMetrics }}
|
||||||
|
args: [ "--extend.query-path", "/conf/custom-metrics.yaml" ]
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
{{- $database := required "In order to enable metrics you need to specify a database (.Values.auth.database or .Values.global.postgresql.auth.database)" (include "postgresql.database" .) }}
|
||||||
|
- name: DATA_SOURCE_URI
|
||||||
|
value: {{ printf "127.0.0.1:%d/%s?sslmode=disable" (int (include "postgresql.service.port" .)) $database }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: DATA_SOURCE_PASS_FILE
|
||||||
|
value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (ternary "password" "postgres-password" (and (not (empty $customUser)) (ne $customUser "postgres"))) }}
|
||||||
|
{{- else }}
|
||||||
|
- name: DATA_SOURCE_PASS
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "postgresql.secretName" . }}
|
||||||
|
key: {{ include "postgresql.userPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
- name: DATA_SOURCE_USER
|
||||||
|
value: {{ default "postgres" $customUser | quote }}
|
||||||
|
{{- if .Values.metrics.extraEnvVars }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: http-metrics
|
||||||
|
containerPort: {{ .Values.metrics.containerPorts.metrics }}
|
||||||
|
{{- if not .Values.diagnosticMode.enabled }}
|
||||||
|
{{- if .Values.metrics.customStartupProbe }}
|
||||||
|
startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.metrics.startupProbe.enabled }}
|
||||||
|
startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
tcpSocket:
|
||||||
|
port: http-metrics
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.customLivenessProbe }}
|
||||||
|
livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.metrics.livenessProbe.enabled }}
|
||||||
|
livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http-metrics
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.customReadinessProbe }}
|
||||||
|
readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }}
|
||||||
|
{{- else if .Values.metrics.readinessProbe.enabled }}
|
||||||
|
readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }}
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http-metrics
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: postgresql-password
|
||||||
|
mountPath: /opt/bitnami/postgresql/secrets/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.customMetrics }}
|
||||||
|
- name: custom-metrics
|
||||||
|
mountPath: /conf
|
||||||
|
readOnly: true
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.resources }}
|
||||||
|
resources: {{- toYaml .Values.metrics.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.sidecars }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.sidecars "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
volumes:
|
||||||
|
{{- if .Values.readReplicas.extendedConfiguration }}
|
||||||
|
- name: postgresql-extended-config
|
||||||
|
configMap:
|
||||||
|
name: {{ include "postgresql.readReplicas.extendedConfigmapName" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.auth.usePasswordFiles }}
|
||||||
|
- name: postgresql-password
|
||||||
|
secret:
|
||||||
|
secretName: {{ include "postgresql.secretName" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tls.enabled }}
|
||||||
|
- name: raw-certificates
|
||||||
|
secret:
|
||||||
|
secretName: {{ include "postgresql.tlsSecretName" . }}
|
||||||
|
- name: postgresql-certificates
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.customMetrics }}
|
||||||
|
- name: custom-metrics
|
||||||
|
configMap:
|
||||||
|
name: {{ printf "%s-metrics" (include "common.names.fullname" .) }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
emptyDir:
|
||||||
|
medium: Memory
|
||||||
|
{{- if .Values.shmVolume.sizeLimit }}
|
||||||
|
sizeLimit: {{ .Values.shmVolume.sizeLimit }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.extraVolumes }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.extraVolumes "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.readReplicas.persistence.enabled .Values.readReplicas.persistence.existingClaim }}
|
||||||
|
- name: data
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ tpl .Values.readReplicas.persistence.existingClaim $ }}
|
||||||
|
{{- else if not .Values.readReplicas.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
emptyDir: {}
|
||||||
|
{{- else }}
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: data
|
||||||
|
{{- if .Values.readReplicas.persistence.annotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.annotations "context" $) | nindent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.persistence.labels }}
|
||||||
|
labels: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.labels "context" $) | nindent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
{{- range .Values.readReplicas.persistence.accessModes }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.persistence.dataSource }}
|
||||||
|
dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.dataSource "context" $) | nindent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.readReplicas.persistence.size | quote }}
|
||||||
|
{{- if .Values.readReplicas.persistence.selector }}
|
||||||
|
selector: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.selector "context" $) | nindent 10 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- include "common.storage.class" (dict "persistence" .Values.readReplicas.persistence "global" .Values.global) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,33 @@
|
|||||||
|
{{- if eq .Values.architecture "replication" }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.readReplica.svc.headless" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
# Use this annotation in addition to the actual publishNotReadyAddresses
|
||||||
|
# field below because the annotation will stop being respected soon but the
|
||||||
|
# field is broken in some versions of Kubernetes:
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/58662
|
||||||
|
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
clusterIP: None
|
||||||
|
# We want all pods in the StatefulSet to have their addresses published for
|
||||||
|
# the sake of the other Postgresql pods even before they're ready, since they
|
||||||
|
# have to be able to talk to each other in order to become ready.
|
||||||
|
publishNotReadyAddresses: true
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
port: {{ include "postgresql.readReplica.service.port" . }}
|
||||||
|
targetPort: tcp-postgresql
|
||||||
|
selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
{{- end }}
|
@ -0,0 +1,53 @@
|
|||||||
|
{{- if eq .Values.architecture "replication" }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.readReplica.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
annotations:
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.service.annotations }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.service.annotations "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.readReplicas.service.type }}
|
||||||
|
{{- if or (eq .Values.readReplicas.service.type "LoadBalancer") (eq .Values.readReplicas.service.type "NodePort") }}
|
||||||
|
externalTrafficPolicy: {{ .Values.readReplicas.service.externalTrafficPolicy | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq .Values.readReplicas.service.type "LoadBalancer") (not (empty .Values.readReplicas.service.loadBalancerSourceRanges)) }}
|
||||||
|
loadBalancerSourceRanges: {{ .Values.readReplicas.service.loadBalancerSourceRanges }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq .Values.readReplicas.service.type "LoadBalancer") (not (empty .Values.readReplicas.service.loadBalancerIP)) }}
|
||||||
|
loadBalancerIP: {{ .Values.readReplicas.service.loadBalancerIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.readReplicas.service.clusterIP (eq .Values.readReplicas.service.type "ClusterIP") }}
|
||||||
|
clusterIP: {{ .Values.readReplicas.service.clusterIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.service.sessionAffinity }}
|
||||||
|
sessionAffinity: {{ .Values.readReplicas.service.sessionAffinity }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.service.sessionAffinityConfig }}
|
||||||
|
sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.service.sessionAffinityConfig "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
port: {{ include "postgresql.readReplica.service.port" . }}
|
||||||
|
targetPort: tcp-postgresql
|
||||||
|
{{- if and (or (eq .Values.readReplicas.service.type "NodePort") (eq .Values.readReplicas.service.type "LoadBalancer")) (not (empty .Values.readReplicas.service.nodePorts.postgresql)) }}
|
||||||
|
nodePort: {{ .Values.readReplicas.service.nodePorts.postgresql }}
|
||||||
|
{{- else if eq .Values.readReplicas.service.type "ClusterIP" }}
|
||||||
|
nodePort: null
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readReplicas.service.extraPorts }}
|
||||||
|
{{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.service.extraPorts "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: read
|
||||||
|
{{- end }}
|
@ -0,0 +1,31 @@
|
|||||||
|
{{- if .Values.rbac.create }}
|
||||||
|
kind: Role
|
||||||
|
apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }}
|
||||||
|
metadata:
|
||||||
|
name: {{ include "common.names.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
# yamllint disable rule:indentation
|
||||||
|
rules:
|
||||||
|
{{- $pspAvailable := (semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .)) -}}
|
||||||
|
{{- if and $pspAvailable .Values.psp.create }}
|
||||||
|
- apiGroups:
|
||||||
|
- 'policy'
|
||||||
|
resources:
|
||||||
|
- 'podsecuritypolicies'
|
||||||
|
verbs:
|
||||||
|
- 'use'
|
||||||
|
resourceNames:
|
||||||
|
- {{ include "common.names.fullname" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.rbac.rules }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.rbac.rules "context" $ ) | nindent 2 }}
|
||||||
|
{{- end }}
|
||||||
|
# yamllint enable rule:indentation
|
||||||
|
{{- end }}
|
@ -0,0 +1,22 @@
|
|||||||
|
{{- if .Values.rbac.create }}
|
||||||
|
kind: RoleBinding
|
||||||
|
apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }}
|
||||||
|
metadata:
|
||||||
|
name: {{ include "common.names.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
roleRef:
|
||||||
|
kind: Role
|
||||||
|
name: {{ include "common.names.fullname" . }}
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: {{ include "postgresql.serviceAccountName" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,29 @@
|
|||||||
|
{{- if (include "postgresql.createSecret" .) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ include "common.names.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
{{- if .Values.auth.enablePostgresUser }}
|
||||||
|
postgres-password: {{ include "common.secrets.passwords.manage" (dict "secret" (include "common.names.fullname" .) "key" "postgres-password" "providedValues" (list "global.postgresql.auth.postgresPassword" "auth.postgresPassword") "context" $) }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if not (empty (include "postgresql.username" .)) }}
|
||||||
|
password: {{ include "common.secrets.passwords.manage" (dict "secret" (include "common.names.fullname" .) "key" "password" "providedValues" (list "global.postgresql.auth.password" "auth.password") "context" $) }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if eq .Values.architecture "replication" }}
|
||||||
|
replication-password: {{ include "common.secrets.passwords.manage" (dict "secret" (include "common.names.fullname" .) "key" "replication-password" "providedValues" (list "auth.replicationPassword") "context" $) }}
|
||||||
|
{{- end }}
|
||||||
|
# We don't auto-generate LDAP password when it's not provided as we do for other passwords
|
||||||
|
{{- if and .Values.ldap.enabled (or .Values.ldap.bind_password .Values.ldap.bindpw) }}
|
||||||
|
ldap-password: {{ coalesce .Values.ldap.bind_password .Values.ldap.bindpw | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
@ -0,0 +1,19 @@
|
|||||||
|
{{- if .Values.serviceAccount.create }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.serviceAccountName" . }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.serviceAccount.annotations }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.serviceAccount.annotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,27 @@
|
|||||||
|
{{- if (include "postgresql.createTlsSecret" . ) }}
|
||||||
|
{{- $ca := genCA "postgresql-ca" 365 }}
|
||||||
|
{{- $fullname := include "common.names.fullname" . }}
|
||||||
|
{{- $releaseNamespace := .Release.Namespace }}
|
||||||
|
{{- $clusterDomain := .Values.clusterDomain }}
|
||||||
|
{{- $primaryHeadlessServiceName := include "postgresql.primary.svc.headless" . }}
|
||||||
|
{{- $readHeadlessServiceName := include "postgresql.readReplica.svc.headless" . }}
|
||||||
|
{{- $altNames := list (printf "*.%s.%s.svc.%s" $fullname $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $fullname $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $primaryHeadlessServiceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $primaryHeadlessServiceName $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $readHeadlessServiceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $readHeadlessServiceName $releaseNamespace $clusterDomain) $fullname }}
|
||||||
|
{{- $crt := genSignedCert $fullname nil $altNames 365 $ca }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ printf "%s-crt" (include "common.names.fullname" .) }}
|
||||||
|
namespace: {{ .Release.Namespace | quote }}
|
||||||
|
labels: {{- include "common.labels.standard" . | nindent 4 }}
|
||||||
|
{{- if .Values.commonLabels }}
|
||||||
|
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.commonAnnotations }}
|
||||||
|
annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
type: kubernetes.io/tls
|
||||||
|
data:
|
||||||
|
ca.crt: {{ $ca.Cert | b64enc | quote }}
|
||||||
|
tls.crt: {{ $crt.Cert | b64enc | quote }}
|
||||||
|
tls.key: {{ $crt.Key | b64enc | quote }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,156 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/schema#",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"architecture": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "PostgreSQL architecture",
|
||||||
|
"form": true,
|
||||||
|
"description": "Allowed values: `standalone` or `replication`"
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Authentication configuration",
|
||||||
|
"form": true,
|
||||||
|
"properties": {
|
||||||
|
"enablePostgresUser": {
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Enable \"postgres\" admin user",
|
||||||
|
"description": "Assign a password to the \"postgres\" admin user. Otherwise, remote access will be blocked for this user",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"postgresPassword": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Password for the \"postgres\" admin user",
|
||||||
|
"description": "Defaults to a random 10-character alphanumeric string if not set",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"database": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "PostgreSQL custom database",
|
||||||
|
"description": "Name of the custom database to be created during the 1st initialization of PostgreSQL",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "PostgreSQL custom user",
|
||||||
|
"description": "Name of the custom user to be created during the 1st initialization of PostgreSQL. This user only has permissions on the PostgreSQL custom database",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Password for the custom user to create",
|
||||||
|
"description": "Defaults to a random 10-character alphanumeric string if not set",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"replicationUsername": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "PostgreSQL replication user",
|
||||||
|
"description": "Name of user used to manage replication.",
|
||||||
|
"form": true,
|
||||||
|
"hidden": {
|
||||||
|
"value": "standalone",
|
||||||
|
"path": "architecture"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"replicationPassword": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Password for PostgreSQL replication user",
|
||||||
|
"description": "Defaults to a random 10-character alphanumeric string if not set",
|
||||||
|
"form": true,
|
||||||
|
"hidden": {
|
||||||
|
"value": "standalone",
|
||||||
|
"path": "architecture"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"persistence": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"size": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Persistent Volume Size",
|
||||||
|
"form": true,
|
||||||
|
"render": "slider",
|
||||||
|
"sliderMin": 1,
|
||||||
|
"sliderMax": 100,
|
||||||
|
"sliderUnit": "Gi"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Required Resources",
|
||||||
|
"description": "Configure resource requests",
|
||||||
|
"form": true,
|
||||||
|
"properties": {
|
||||||
|
"requests": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"memory": {
|
||||||
|
"type": "string",
|
||||||
|
"form": true,
|
||||||
|
"render": "slider",
|
||||||
|
"title": "Memory Request",
|
||||||
|
"sliderMin": 10,
|
||||||
|
"sliderMax": 2048,
|
||||||
|
"sliderUnit": "Mi"
|
||||||
|
},
|
||||||
|
"cpu": {
|
||||||
|
"type": "string",
|
||||||
|
"form": true,
|
||||||
|
"render": "slider",
|
||||||
|
"title": "CPU Request",
|
||||||
|
"sliderMin": 10,
|
||||||
|
"sliderMax": 2000,
|
||||||
|
"sliderUnit": "m"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"replication": {
|
||||||
|
"type": "object",
|
||||||
|
"form": true,
|
||||||
|
"title": "Replication Details",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Enable Replication",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"readReplicas": {
|
||||||
|
"type": "integer",
|
||||||
|
"title": "read Replicas",
|
||||||
|
"form": true,
|
||||||
|
"hidden": {
|
||||||
|
"value": "standalone",
|
||||||
|
"path": "architecture"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"volumePermissions": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"form": true,
|
||||||
|
"title": "Enable Init Containers",
|
||||||
|
"description": "Change the owner of the persist volume mountpoint to RunAsUser:fsGroup"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"metrics": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Configure metrics exporter",
|
||||||
|
"form": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1399
build_system/charts/open-appsec-kong/charts/postgresql/values.yaml
Normal file
1399
build_system/charts/open-appsec-kong/charts/postgresql/values.yaml
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
# install chart with some extra labels
|
||||||
|
|
||||||
|
extraLabels:
|
||||||
|
acme.com/some-key: some-value
|
||||||
|
|
@ -0,0 +1,9 @@
|
|||||||
|
# install chart with default values
|
||||||
|
proxy:
|
||||||
|
type: NodePort
|
||||||
|
|
||||||
|
env:
|
||||||
|
anonymous_reports: "off"
|
||||||
|
ingressController:
|
||||||
|
env:
|
||||||
|
anonymous_reports: "false"
|
11
build_system/charts/open-appsec-kong/ci/service-account.yaml
Normal file
11
build_system/charts/open-appsec-kong/ci/service-account.yaml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
# install chart with a service account
|
||||||
|
deployment:
|
||||||
|
serviceAccount:
|
||||||
|
create: true
|
||||||
|
name: "my-kong-sa"
|
||||||
|
annotations: {}
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
serviceAccount:
|
||||||
|
create: false
|
@ -0,0 +1,15 @@
|
|||||||
|
# install chart with default values
|
||||||
|
# use single image strings instead of repository/tag
|
||||||
|
|
||||||
|
image:
|
||||||
|
unifiedRepoTag: kong:2.6
|
||||||
|
proxy:
|
||||||
|
type: NodePort
|
||||||
|
|
||||||
|
env:
|
||||||
|
anonymous_reports: "off"
|
||||||
|
ingressController:
|
||||||
|
env:
|
||||||
|
anonymous_reports: "false"
|
||||||
|
image:
|
||||||
|
unifiedRepoTag: kong/kubernetes-ingress-controller:2.0.2
|
74
build_system/charts/open-appsec-kong/ci/test1-values.yaml
Normal file
74
build_system/charts/open-appsec-kong/ci/test1-values.yaml
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# This tests the following unrelated aspects of Ingress Controller
|
||||||
|
# - HPA enabled
|
||||||
|
autoscaling:
|
||||||
|
enabled: true
|
||||||
|
args:
|
||||||
|
- --alsologtostderr
|
||||||
|
# - ingressController deploys without a database (default)
|
||||||
|
ingressController:
|
||||||
|
enabled: true
|
||||||
|
# - webhook is enabled and deploys
|
||||||
|
admissionWebhook:
|
||||||
|
enabled: true
|
||||||
|
# - environment variables can be injected into ingress controller container
|
||||||
|
env:
|
||||||
|
anonymous_reports: "false"
|
||||||
|
kong_admin_header: "foo:bar"
|
||||||
|
# - annotations can be injected for service account
|
||||||
|
serviceAccount:
|
||||||
|
annotations:
|
||||||
|
eks.amazonaws.com/role-arn: arn:aws:iam::AWS_ACCOUNT_ID:role/IAM_ROLE_NAME
|
||||||
|
userDefinedVolumeMounts:
|
||||||
|
- name: "tmpdir"
|
||||||
|
mountPath: "/tmp/foo"
|
||||||
|
readOnly: true
|
||||||
|
- name: "controllerdir"
|
||||||
|
mountPath: "/tmp/controller"
|
||||||
|
# - pod labels can be added to the deployment template
|
||||||
|
podLabels:
|
||||||
|
app: kong
|
||||||
|
environment: test
|
||||||
|
# - podSecurityPolicies are enabled
|
||||||
|
podSecurityPolicy:
|
||||||
|
enabled: true
|
||||||
|
# - ingress resources are created with hosts
|
||||||
|
admin:
|
||||||
|
type: NodePort
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
hostname: admin.kong.example
|
||||||
|
annotations: {}
|
||||||
|
path: /
|
||||||
|
proxy:
|
||||||
|
type: NodePort
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
hostname: proxy.kong.example
|
||||||
|
annotations: {}
|
||||||
|
path: /
|
||||||
|
env:
|
||||||
|
anonymous_reports: "off"
|
||||||
|
|
||||||
|
deployment:
|
||||||
|
initContainers:
|
||||||
|
- name: "bash"
|
||||||
|
image: "bash:latest"
|
||||||
|
command: ["/bin/sh", "-c", "true"]
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: "100m"
|
||||||
|
memory: "64Mi"
|
||||||
|
requests:
|
||||||
|
cpu: "100m"
|
||||||
|
memory: "64Mi"
|
||||||
|
volumeMounts:
|
||||||
|
- name: "tmpdir"
|
||||||
|
mountPath: "/tmp/foo"
|
||||||
|
userDefinedVolumes:
|
||||||
|
- name: "tmpdir"
|
||||||
|
emptyDir: {}
|
||||||
|
- name: "controllerdir"
|
||||||
|
emptyDir: {}
|
||||||
|
userDefinedVolumeMounts:
|
||||||
|
- name: "tmpdir"
|
||||||
|
mountPath: "/tmp/foo"
|
66
build_system/charts/open-appsec-kong/ci/test2-values.yaml
Normal file
66
build_system/charts/open-appsec-kong/ci/test2-values.yaml
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# This tests the following unrelated aspects of Ingress Controller
|
||||||
|
# - ingressController deploys with a database
|
||||||
|
# - stream listens work
|
||||||
|
# - a mixture of controller, Kong, and shared volumes successfully mount
|
||||||
|
# - watchNamespaces is set
|
||||||
|
ingressController:
|
||||||
|
enabled: true
|
||||||
|
env:
|
||||||
|
anonymous_reports: "false"
|
||||||
|
customEnv:
|
||||||
|
TZ: "Europe/Berlin"
|
||||||
|
watchNamespaces:
|
||||||
|
- default
|
||||||
|
postgresql:
|
||||||
|
enabled: true
|
||||||
|
auth:
|
||||||
|
username: kong
|
||||||
|
password: kong
|
||||||
|
env:
|
||||||
|
anonymous_reports: "off"
|
||||||
|
database: "postgres"
|
||||||
|
# - ingress resources are created without hosts
|
||||||
|
admin:
|
||||||
|
type: NodePort
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
hosts: []
|
||||||
|
path: /
|
||||||
|
proxy:
|
||||||
|
type: NodePort
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
hostname: proxy.kong.example
|
||||||
|
annotations: {}
|
||||||
|
path: /
|
||||||
|
# - add stream listens
|
||||||
|
stream:
|
||||||
|
- containerPort: 9000
|
||||||
|
servicePort: 9000
|
||||||
|
parameters: []
|
||||||
|
- containerPort: 9001
|
||||||
|
servicePort: 9001
|
||||||
|
parameters:
|
||||||
|
- ssl
|
||||||
|
|
||||||
|
# - PDB is enabled
|
||||||
|
podDisruptionBudget:
|
||||||
|
enabled: true
|
||||||
|
# update strategy
|
||||||
|
updateStrategy:
|
||||||
|
type: "RollingUpdate"
|
||||||
|
rollingUpdate:
|
||||||
|
maxSurge: 1
|
||||||
|
maxUnavailable: 0
|
||||||
|
deployment:
|
||||||
|
initContainers:
|
||||||
|
- name: "bash"
|
||||||
|
image: "bash:latest"
|
||||||
|
command: ["/bin/sh", "-c", "true"]
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: "100m"
|
||||||
|
memory: "64Mi"
|
||||||
|
requests:
|
||||||
|
cpu: "100m"
|
||||||
|
memory: "64Mi"
|
43
build_system/charts/open-appsec-kong/ci/test3-values.yaml
Normal file
43
build_system/charts/open-appsec-kong/ci/test3-values.yaml
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# CI test for testing dbless deployment without ingress controllers
|
||||||
|
# - disable ingress controller
|
||||||
|
ingressController:
|
||||||
|
enabled: false
|
||||||
|
# - disable DB for kong
|
||||||
|
env:
|
||||||
|
anonymous_reports: "off"
|
||||||
|
database: "off"
|
||||||
|
postgresql:
|
||||||
|
enabled: false
|
||||||
|
proxy:
|
||||||
|
type: NodePort
|
||||||
|
deployment:
|
||||||
|
initContainers:
|
||||||
|
- name: "bash"
|
||||||
|
image: "bash:latest"
|
||||||
|
command: ["/bin/sh", "-c", "true"]
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: "100m"
|
||||||
|
memory: "64Mi"
|
||||||
|
requests:
|
||||||
|
cpu: "100m"
|
||||||
|
memory: "64Mi"
|
||||||
|
volumeMounts:
|
||||||
|
- name: "tmpdir"
|
||||||
|
mountPath: "/opt/tmp"
|
||||||
|
userDefinedVolumes:
|
||||||
|
- name: "tmpdir"
|
||||||
|
emptyDir: {}
|
||||||
|
userDefinedVolumeMounts:
|
||||||
|
- name: "tmpdir"
|
||||||
|
mountPath: "/opt/tmp"
|
||||||
|
dblessConfig:
|
||||||
|
config: |
|
||||||
|
_format_version: "1.1"
|
||||||
|
services:
|
||||||
|
- name: example.com
|
||||||
|
url: http://example.com
|
||||||
|
routes:
|
||||||
|
- name: example
|
||||||
|
paths:
|
||||||
|
- "/example"
|
36
build_system/charts/open-appsec-kong/ci/test4-values.yaml
Normal file
36
build_system/charts/open-appsec-kong/ci/test4-values.yaml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# CI test for testing dbless deployment without ingress controllers using legacy admin listen and stream listens
|
||||||
|
# - disable ingress controller
|
||||||
|
ingressController:
|
||||||
|
enabled: false
|
||||||
|
env:
|
||||||
|
anonymous_reports: "false"
|
||||||
|
|
||||||
|
# - disable DB for kong
|
||||||
|
env:
|
||||||
|
anonymous_reports: "off"
|
||||||
|
database: "off"
|
||||||
|
postgresql:
|
||||||
|
enabled: false
|
||||||
|
proxy:
|
||||||
|
type: NodePort
|
||||||
|
# - add stream listens
|
||||||
|
stream:
|
||||||
|
- containerPort: 9000
|
||||||
|
servicePort: 9000
|
||||||
|
parameters: []
|
||||||
|
- containerPort: 9001
|
||||||
|
servicePort: 9001
|
||||||
|
parameters:
|
||||||
|
- ssl
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
dblessConfig:
|
||||||
|
config: |
|
||||||
|
_format_version: "1.1"
|
||||||
|
services:
|
||||||
|
- name: example.com
|
||||||
|
url: http://example.com
|
||||||
|
routes:
|
||||||
|
- name: example
|
||||||
|
paths:
|
||||||
|
- "/example"
|
50
build_system/charts/open-appsec-kong/ci/test5-values.yaml
Normal file
50
build_system/charts/open-appsec-kong/ci/test5-values.yaml
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# This tests the following unrelated aspects of Ingress Controller
|
||||||
|
# - ingressController deploys with a database
|
||||||
|
# - TODO remove this test when https://github.com/Kong/charts/issues/295 is solved
|
||||||
|
# and its associated wait-for-db workaround is removed.
|
||||||
|
# This test is similar to test2-values.yaml, but lacks a stream listen.
|
||||||
|
# wait-for-db will _not_ create a socket file. This test ensures the workaround
|
||||||
|
# does not interfere with startup when there is no file to remove.
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: true
|
||||||
|
env:
|
||||||
|
anonymous_reports: "false"
|
||||||
|
postgresql:
|
||||||
|
enabled: true
|
||||||
|
auth:
|
||||||
|
username: kong
|
||||||
|
password: kong
|
||||||
|
service:
|
||||||
|
ports:
|
||||||
|
postgresql: 5432
|
||||||
|
env:
|
||||||
|
anonymous_reports: "off"
|
||||||
|
database: "postgres"
|
||||||
|
# Added example for customEnv
|
||||||
|
customEnv:
|
||||||
|
client_id: "exampleId"
|
||||||
|
# - ingress resources are created without hosts
|
||||||
|
admin:
|
||||||
|
type: NodePort
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
hosts: []
|
||||||
|
path: /
|
||||||
|
proxy:
|
||||||
|
type: NodePort
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
hostname: proxy.kong.example
|
||||||
|
annotations: {}
|
||||||
|
path: /
|
||||||
|
|
||||||
|
# - PDB is enabled
|
||||||
|
podDisruptionBudget:
|
||||||
|
enabled: true
|
||||||
|
# update strategy
|
||||||
|
updateStrategy:
|
||||||
|
type: "RollingUpdate"
|
||||||
|
rollingUpdate:
|
||||||
|
maxSurge: 1
|
||||||
|
maxUnavailable: 0
|
34
build_system/charts/open-appsec-kong/ci/test6-values.yaml
Normal file
34
build_system/charts/open-appsec-kong/ci/test6-values.yaml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# CI test for testing dbless deployment without ingress controllers
|
||||||
|
# - disable ingress controller
|
||||||
|
# - no static config
|
||||||
|
ingressController:
|
||||||
|
enabled: false
|
||||||
|
# - disable DB for kong
|
||||||
|
env:
|
||||||
|
anonymous_reports: "off"
|
||||||
|
database: "off"
|
||||||
|
postgresql:
|
||||||
|
enabled: false
|
||||||
|
proxy:
|
||||||
|
type: NodePort
|
||||||
|
deployment:
|
||||||
|
initContainers:
|
||||||
|
- name: "bash"
|
||||||
|
image: "bash:latest"
|
||||||
|
command: ["/bin/sh", "-c", "true"]
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: "100m"
|
||||||
|
memory: "64Mi"
|
||||||
|
requests:
|
||||||
|
cpu: "100m"
|
||||||
|
memory: "64Mi"
|
||||||
|
volumeMounts:
|
||||||
|
- name: "tmpdir"
|
||||||
|
mountPath: "/opt/tmp"
|
||||||
|
userDefinedVolumes:
|
||||||
|
- name: "tmpdir"
|
||||||
|
emptyDir: {}
|
||||||
|
userDefinedVolumeMounts:
|
||||||
|
- name: "tmpdir"
|
||||||
|
mountPath: "/opt/tmp"
|
@ -0,0 +1,40 @@
|
|||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata :
|
||||||
|
name : customresponses.openappsec.io
|
||||||
|
|
||||||
|
spec:
|
||||||
|
group: openappsec.io
|
||||||
|
versions:
|
||||||
|
- name: v1beta1
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
mode:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- block-page
|
||||||
|
#- redirect
|
||||||
|
- response-code-only
|
||||||
|
message-title:
|
||||||
|
type: string
|
||||||
|
message-body:
|
||||||
|
type: string
|
||||||
|
http-response-code:
|
||||||
|
type: integer
|
||||||
|
minimum: 100
|
||||||
|
maximum: 599
|
||||||
|
|
||||||
|
scope: Cluster
|
||||||
|
names:
|
||||||
|
plural: customresponses
|
||||||
|
singular: customresponse
|
||||||
|
kind: CustomResponse
|
||||||
|
shortNames:
|
||||||
|
- customresponse
|
@ -0,0 +1,75 @@
|
|||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata:
|
||||||
|
name: exceptions.openappsec.io
|
||||||
|
|
||||||
|
spec:
|
||||||
|
group: openappsec.io
|
||||||
|
versions:
|
||||||
|
- name: v1beta1
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- action
|
||||||
|
properties:
|
||||||
|
action:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- skip
|
||||||
|
- accept
|
||||||
|
- drop
|
||||||
|
- suppressLog
|
||||||
|
sourceIp:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
url:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
sourceIdentifier:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
protectionName:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
paramValue:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
paramName:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
hostName:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
countryCode:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
countryName:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
comment:
|
||||||
|
type: string
|
||||||
|
|
||||||
|
scope: Cluster
|
||||||
|
names:
|
||||||
|
plural: exceptions
|
||||||
|
singular: exception
|
||||||
|
kind: Exception
|
||||||
|
shortNames:
|
||||||
|
- exception
|
@ -0,0 +1,107 @@
|
|||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata :
|
||||||
|
name : logtriggers.openappsec.io
|
||||||
|
|
||||||
|
spec:
|
||||||
|
group: openappsec.io
|
||||||
|
versions:
|
||||||
|
- name: v1beta1
|
||||||
|
# Each version can be enabled/disabled by Served flag.
|
||||||
|
served: true
|
||||||
|
# One and only one version must be marked as the storage version.
|
||||||
|
storage: true
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
access-control-logging:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
allow-events:
|
||||||
|
type: boolean
|
||||||
|
drop-events:
|
||||||
|
type: boolean
|
||||||
|
appsec-logging:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
detect-events:
|
||||||
|
type: boolean
|
||||||
|
prevent-events:
|
||||||
|
type: boolean
|
||||||
|
all-web-requests:
|
||||||
|
type: boolean
|
||||||
|
additional-suspicious-events-logging:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
enabled:
|
||||||
|
type: boolean
|
||||||
|
minimum-severity:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- high
|
||||||
|
- critical
|
||||||
|
response-body:
|
||||||
|
type: boolean
|
||||||
|
response-code:
|
||||||
|
type: boolean
|
||||||
|
extended-logging:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
url-path:
|
||||||
|
type: boolean
|
||||||
|
url-query:
|
||||||
|
type: boolean
|
||||||
|
http-headers:
|
||||||
|
type: boolean
|
||||||
|
request-body:
|
||||||
|
type: boolean
|
||||||
|
log-destination:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
cloud:
|
||||||
|
type: boolean
|
||||||
|
syslog-service: #change to object array
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
address:
|
||||||
|
type: string
|
||||||
|
port:
|
||||||
|
type: integer
|
||||||
|
file:
|
||||||
|
type: string
|
||||||
|
stdout:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
format:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- json
|
||||||
|
- json-formatted
|
||||||
|
cef-service:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
address:
|
||||||
|
type: string
|
||||||
|
port:
|
||||||
|
type: integer
|
||||||
|
proto:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- tcp
|
||||||
|
- udp
|
||||||
|
|
||||||
|
scope: Cluster
|
||||||
|
names:
|
||||||
|
plural: logtriggers
|
||||||
|
singular: logtrigger
|
||||||
|
kind: LogTrigger
|
||||||
|
shortNames:
|
||||||
|
- logtrigger
|
@ -0,0 +1,90 @@
|
|||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata :
|
||||||
|
name : policies.openappsec.io
|
||||||
|
|
||||||
|
spec:
|
||||||
|
group: openappsec.io
|
||||||
|
versions:
|
||||||
|
- name: v1beta1
|
||||||
|
# Each version can be enabled/disabled by Served flag.
|
||||||
|
served: true
|
||||||
|
# One and only one version must be marked as the storage version.
|
||||||
|
storage: true
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
default:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
mode:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- prevent-learn
|
||||||
|
- detect-learn
|
||||||
|
- prevent
|
||||||
|
- detect
|
||||||
|
- inactive
|
||||||
|
practices:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
triggers:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
custom-response:
|
||||||
|
type: string
|
||||||
|
source-identifiers:
|
||||||
|
type: string
|
||||||
|
trusted-sources:
|
||||||
|
type: string
|
||||||
|
exceptions:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
specific-rules:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
host:
|
||||||
|
type: string
|
||||||
|
mode:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- prevent-learn
|
||||||
|
- detect-learn
|
||||||
|
- prevent
|
||||||
|
- detect
|
||||||
|
- inactive
|
||||||
|
practices:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
triggers:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
custom-response:
|
||||||
|
type: string
|
||||||
|
source-identifiers:
|
||||||
|
type: string
|
||||||
|
trusted-sources:
|
||||||
|
type: string
|
||||||
|
exceptions:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
|
||||||
|
scope: Cluster
|
||||||
|
names:
|
||||||
|
plural: policies
|
||||||
|
singular: policy
|
||||||
|
kind: Policy
|
||||||
|
shortNames:
|
||||||
|
- policy
|
@ -0,0 +1,135 @@
|
|||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata :
|
||||||
|
name : practices.openappsec.io
|
||||||
|
|
||||||
|
spec:
|
||||||
|
group: openappsec.io
|
||||||
|
versions:
|
||||||
|
- name: v1beta1
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
web-attacks:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
override-mode:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- prevent-learn
|
||||||
|
- detect-learn
|
||||||
|
- prevent
|
||||||
|
- detect
|
||||||
|
- inactive
|
||||||
|
minimum-confidence:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- medium
|
||||||
|
- high
|
||||||
|
- critical
|
||||||
|
max-url-size-bytes:
|
||||||
|
type: integer
|
||||||
|
max-object-depth:
|
||||||
|
type: integer
|
||||||
|
max-body-size-kb:
|
||||||
|
type: integer
|
||||||
|
max-header-size-bytes:
|
||||||
|
type: integer
|
||||||
|
protections:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
csrf-enabled:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- prevent-learn
|
||||||
|
- detect-learn
|
||||||
|
- prevent
|
||||||
|
- detect
|
||||||
|
- inactive
|
||||||
|
error-disclosure-enabled:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- prevent-learn
|
||||||
|
- detect-learn
|
||||||
|
- prevent
|
||||||
|
- detect
|
||||||
|
- inactive
|
||||||
|
open-redirect-enabled:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- prevent-learn
|
||||||
|
- detect-learn
|
||||||
|
- prevent
|
||||||
|
- detect
|
||||||
|
- inactive
|
||||||
|
non-valid-http-methods:
|
||||||
|
type: boolean
|
||||||
|
anti-bot:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
override-mode:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- prevent-learn
|
||||||
|
- detect-learn
|
||||||
|
- prevent
|
||||||
|
- detect
|
||||||
|
- inactive
|
||||||
|
injected-URIs:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
uri:
|
||||||
|
type: string
|
||||||
|
validated-URIs:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
uri:
|
||||||
|
type: string
|
||||||
|
snort-signatures:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
override-mode:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- prevent-learn
|
||||||
|
- detect-learn
|
||||||
|
- prevent
|
||||||
|
- detect
|
||||||
|
- inactive
|
||||||
|
configmap:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
openapi-schema-validation:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
override-mode:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- prevent-learn
|
||||||
|
- detect-learn
|
||||||
|
- prevent
|
||||||
|
- detect
|
||||||
|
- inactive
|
||||||
|
configmap:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
|
||||||
|
scope: Cluster
|
||||||
|
names:
|
||||||
|
plural: practices
|
||||||
|
singular: practice
|
||||||
|
kind: Practice
|
||||||
|
shortNames:
|
||||||
|
- practice
|
@ -0,0 +1,40 @@
|
|||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata :
|
||||||
|
name : sourcesidentifiers.openappsec.io
|
||||||
|
|
||||||
|
spec:
|
||||||
|
group: openappsec.io
|
||||||
|
versions:
|
||||||
|
- name: v1beta1
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
sourceIdentifier:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- headerkey
|
||||||
|
- JWTKey
|
||||||
|
- cookie
|
||||||
|
- sourceip
|
||||||
|
- x-forwarded-for
|
||||||
|
value:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
|
||||||
|
scope: Cluster
|
||||||
|
names:
|
||||||
|
plural: sourcesidentifiers
|
||||||
|
singular: sourcesidentifier
|
||||||
|
kind: SourcesIdentifier
|
||||||
|
shortNames:
|
||||||
|
- sourcesidentifier
|
@ -0,0 +1,32 @@
|
|||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata :
|
||||||
|
name : trustedsources.openappsec.io
|
||||||
|
|
||||||
|
spec:
|
||||||
|
group: openappsec.io
|
||||||
|
versions:
|
||||||
|
- name: v1beta1
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
minNumOfSources:
|
||||||
|
type: integer
|
||||||
|
sourcesIdentifiers:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
|
||||||
|
scope: Cluster
|
||||||
|
names:
|
||||||
|
plural: trustedsources
|
||||||
|
singular: trustedsource
|
||||||
|
kind: TrustedSource
|
||||||
|
shortNames:
|
||||||
|
- trustedsource
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,56 @@
|
|||||||
|
# Example values.yaml configurations
|
||||||
|
|
||||||
|
The YAML files in this directory provide basic example configurations for
|
||||||
|
common Kong deployment scenarios on Kubernetes.
|
||||||
|
|
||||||
|
* [minimal-kong-controller.yaml](minimal-kong-controller.yaml) installs Kong
|
||||||
|
open source with the ingress controller in DB-less mode.
|
||||||
|
|
||||||
|
* [minimal-kong-standalone.yaml](minimal-kong-standalone.yaml) installs Kong
|
||||||
|
open source and Postgres with no controller.
|
||||||
|
|
||||||
|
* [minimal-kong-enterprise-dbless.yaml](minimal-kong-enterprise-dbless.yaml)
|
||||||
|
installs Kong for Kubernetes with Kong Enterprise with the ingress controller
|
||||||
|
in DB-less mode.
|
||||||
|
|
||||||
|
* [minimal-k4k8s-with-kong-enterprise.yaml](minimal-k4k8s-with-kong-enterprise.yaml)
|
||||||
|
installs Kong for Kubernetes with Kong Enterprise with the ingress controller
|
||||||
|
and PostgreSQL. It does not enable Enterprise features other than Kong
|
||||||
|
Manager, and does not expose it or the Admin API via a TLS-secured ingress.
|
||||||
|
|
||||||
|
* [full-k4k8s-with-kong-enterprise.yaml](full-k4k8s-with-kong-enterprise.yaml)
|
||||||
|
installs Kong for Kubernetes with Kong Enterprise with the ingress controller
|
||||||
|
in PostgreSQL. It enables all Enterprise services.
|
||||||
|
|
||||||
|
* [minimal-kong-hybrid-control.yaml](minimal-kong-hybrid-control.yaml) and
|
||||||
|
[minimal-kong-hybrid-data.yaml](minimal-kong-hybrid-data.yaml) install
|
||||||
|
separate releases for hybrid mode control and data plane nodes, using the
|
||||||
|
built-in PostgreSQL chart on the control plane release. They require some
|
||||||
|
pre-work to [create certificates](https://github.com/Kong/charts/blob/main/charts/kong/README.md#certificates)
|
||||||
|
and configure the control plane location. See comments in the file headers
|
||||||
|
for additional details.
|
||||||
|
|
||||||
|
Note that you should install the control plane release first if possible:
|
||||||
|
data planes must be able to talk with a control plane node before they can
|
||||||
|
come online. Starting control planes first is not strictly required (data
|
||||||
|
plane nodes will retry their connection for a while before Kubernetes
|
||||||
|
restarts them, so starting control planes second, but around the same time
|
||||||
|
will usually work), but is the smoothest option.
|
||||||
|
|
||||||
|
* [minimal-kong-enterprise-hybrid-control.yaml](minimal-kong-enterprise-hybrid-control.yaml) and
|
||||||
|
[minimal-kong-enterprise-hybrid-data.yaml](minimal-kong-enterprise-hybrid-data.yaml) install
|
||||||
|
separate releases of Kong Enterprise for hybrid mode control and data plane nodes, using the
|
||||||
|
built-in PostgreSQL chart on the control plane release. They require some
|
||||||
|
pre-work to [create certificates](https://github.com/Kong/charts/blob/main/charts/kong/README.md#certificates)
|
||||||
|
and configure the control plane location. See comments in the file headers
|
||||||
|
for additional details.
|
||||||
|
|
||||||
|
Note that you should install the control plane release first if possible:
|
||||||
|
data planes must be able to talk with a control plane node before they can
|
||||||
|
come online. Starting control planes first is not strictly required (data
|
||||||
|
plane nodes will retry their connection for a while before Kubernetes
|
||||||
|
restarts them, so starting control planes second, but around the same time
|
||||||
|
will usually work), but is the smoothest option.
|
||||||
|
|
||||||
|
All Enterprise examples require some level of additional user configuration to
|
||||||
|
install properly. Read the comments at the top of each file for instructions.
|
@ -0,0 +1,5 @@
|
|||||||
|
# Kong Gateway Helm Docs Samples
|
||||||
|
This directory contains sample values files written in support of official [docs.konghq.com](https://docs.konghq.com/gateway/3.0.x/install-and-run/) workflows.
|
||||||
|
|
||||||
|
## Disclaimer
|
||||||
|
The samples here are published for educational purposes and should not be considered production ready as-is.
|
@ -0,0 +1,285 @@
|
|||||||
|
admin:
|
||||||
|
annotations:
|
||||||
|
konghq.com/protocol: https
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
enabled: false
|
||||||
|
ingress:
|
||||||
|
annotations:
|
||||||
|
konghq.com/https-redirect-status-code: "301"
|
||||||
|
konghq.com/protocols: https
|
||||||
|
konghq.com/strip-path: "true"
|
||||||
|
kubernetes.io/ingress.class: default
|
||||||
|
nginx.ingress.kubernetes.io/app-root: /
|
||||||
|
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
|
||||||
|
nginx.ingress.kubernetes.io/permanent-redirect-code: "301"
|
||||||
|
enabled: true
|
||||||
|
hostname: kong.127-0-0-1.nip.io
|
||||||
|
path: /api
|
||||||
|
tls: quickstart-kong-admin-cert
|
||||||
|
tls:
|
||||||
|
containerPort: 8444
|
||||||
|
enabled: true
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
servicePort: 8444
|
||||||
|
type: ClusterIP
|
||||||
|
affinity:
|
||||||
|
podAntiAffinity:
|
||||||
|
preferredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- podAffinityTerm:
|
||||||
|
labelSelector:
|
||||||
|
matchExpressions:
|
||||||
|
- key: app.kubernetes.io/instance
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- dataplane
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
weight: 100
|
||||||
|
certificates:
|
||||||
|
enabled: true
|
||||||
|
issuer: quickstart-kong-selfsigned-issuer
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
admin:
|
||||||
|
enabled: true
|
||||||
|
commonName: kong.127-0-0-1.nip.io
|
||||||
|
portal:
|
||||||
|
enabled: true
|
||||||
|
commonName: developer.127-0-0-1.nip.io
|
||||||
|
proxy:
|
||||||
|
enabled: true
|
||||||
|
commonName: 127-0-0-1.nip.io
|
||||||
|
dnsNames:
|
||||||
|
- '*.127-0-0-1.nip.io'
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
labels:
|
||||||
|
konghq.com/service: cluster
|
||||||
|
tls:
|
||||||
|
containerPort: 8005
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8005
|
||||||
|
type: ClusterIP
|
||||||
|
clustertelemetry:
|
||||||
|
enabled: true
|
||||||
|
tls:
|
||||||
|
containerPort: 8006
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8006
|
||||||
|
type: ClusterIP
|
||||||
|
deployment:
|
||||||
|
kong:
|
||||||
|
daemonset: false
|
||||||
|
enabled: true
|
||||||
|
enterprise:
|
||||||
|
enabled: true
|
||||||
|
license_secret: kong-enterprise-license
|
||||||
|
portal:
|
||||||
|
enabled: true
|
||||||
|
rbac:
|
||||||
|
admin_api_auth: basic-auth
|
||||||
|
admin_gui_auth_conf_secret: kong-config-secret
|
||||||
|
enabled: true
|
||||||
|
session_conf_secret: kong-config-secret
|
||||||
|
smtp:
|
||||||
|
enabled: false
|
||||||
|
vitals:
|
||||||
|
enabled: true
|
||||||
|
env:
|
||||||
|
admin_access_log: /dev/stdout
|
||||||
|
admin_api_uri: https://kong.127-0-0-1.nip.io/api
|
||||||
|
admin_error_log: /dev/stdout
|
||||||
|
admin_gui_access_log: /dev/stdout
|
||||||
|
admin_gui_error_log: /dev/stdout
|
||||||
|
admin_gui_host: kong.127-0-0-1.nip.io
|
||||||
|
admin_gui_protocol: https
|
||||||
|
admin_gui_url: https://kong.127-0-0-1.nip.io/
|
||||||
|
cluster_data_plane_purge_delay: 60
|
||||||
|
cluster_listen: 0.0.0.0:8005
|
||||||
|
cluster_telemetry_listen: 0.0.0.0:8006
|
||||||
|
database: postgres
|
||||||
|
log_level: debug
|
||||||
|
lua_package_path: /opt/?.lua;;
|
||||||
|
nginx_worker_processes: "2"
|
||||||
|
password:
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
key: kong_admin_password
|
||||||
|
name: kong-config-secret
|
||||||
|
pg_database: kong
|
||||||
|
pg_host:
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
key: pg_host
|
||||||
|
name: kong-config-secret
|
||||||
|
pg_ssl: "off"
|
||||||
|
pg_ssl_verify: "off"
|
||||||
|
pg_user: kong
|
||||||
|
plugins: bundled,openid-connect
|
||||||
|
portal: true
|
||||||
|
portal_api_access_log: /dev/stdout
|
||||||
|
portal_api_error_log: /dev/stdout
|
||||||
|
portal_api_url: https://developer.127-0-0-1.nip.io/api
|
||||||
|
portal_auth: basic-auth
|
||||||
|
portal_cors_origins: '*'
|
||||||
|
portal_gui_access_log: /dev/stdout
|
||||||
|
portal_gui_error_log: /dev/stdout
|
||||||
|
portal_gui_host: developer.127-0-0-1.nip.io
|
||||||
|
portal_gui_protocol: https
|
||||||
|
portal_gui_url: https://developer.127-0-0-1.nip.io/
|
||||||
|
portal_session_conf:
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
key: portal_session_conf
|
||||||
|
name: kong-config-secret
|
||||||
|
prefix: /kong_prefix/
|
||||||
|
proxy_access_log: /dev/stdout
|
||||||
|
proxy_error_log: /dev/stdout
|
||||||
|
proxy_stream_access_log: /dev/stdout
|
||||||
|
proxy_stream_error_log: /dev/stdout
|
||||||
|
smtp_mock: "on"
|
||||||
|
status_listen: 0.0.0.0:8100
|
||||||
|
trusted_ips: 0.0.0.0/0,::/0
|
||||||
|
vitals: true
|
||||||
|
extraLabels:
|
||||||
|
konghq.com/component: quickstart
|
||||||
|
image:
|
||||||
|
repository: kong/kong-gateway
|
||||||
|
tag: "3.1"
|
||||||
|
ingressController:
|
||||||
|
enabled: true
|
||||||
|
env:
|
||||||
|
kong_admin_filter_tag: ingress_controller_default
|
||||||
|
kong_admin_tls_skip_verify: true
|
||||||
|
kong_admin_token:
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
key: password
|
||||||
|
name: kong-config-secret
|
||||||
|
kong_admin_url: https://localhost:8444
|
||||||
|
kong_workspace: default
|
||||||
|
publish_service: kong/quickstart-kong-proxy
|
||||||
|
image:
|
||||||
|
repository: docker.io/kong/kubernetes-ingress-controller
|
||||||
|
tag: "2.8"
|
||||||
|
ingressClass: default
|
||||||
|
installCRDs: false
|
||||||
|
manager:
|
||||||
|
annotations:
|
||||||
|
konghq.com/protocol: https
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
containerPort: 8002
|
||||||
|
enabled: false
|
||||||
|
servicePort: 8002
|
||||||
|
ingress:
|
||||||
|
annotations:
|
||||||
|
konghq.com/https-redirect-status-code: "301"
|
||||||
|
kubernetes.io/ingress.class: default
|
||||||
|
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
|
||||||
|
enabled: true
|
||||||
|
hostname: kong.127-0-0-1.nip.io
|
||||||
|
path: /
|
||||||
|
tls: quickstart-kong-admin-cert
|
||||||
|
tls:
|
||||||
|
containerPort: 8445
|
||||||
|
enabled: true
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
servicePort: 8445
|
||||||
|
type: ClusterIP
|
||||||
|
migrations:
|
||||||
|
enabled: true
|
||||||
|
postUpgrade: true
|
||||||
|
preUpgrade: true
|
||||||
|
namespace: kong
|
||||||
|
podAnnotations:
|
||||||
|
kuma.io/gateway: enabled
|
||||||
|
portal:
|
||||||
|
annotations:
|
||||||
|
konghq.com/protocol: https
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
containerPort: 8003
|
||||||
|
enabled: false
|
||||||
|
servicePort: 8003
|
||||||
|
ingress:
|
||||||
|
annotations:
|
||||||
|
konghq.com/https-redirect-status-code: "301"
|
||||||
|
konghq.com/protocols: https
|
||||||
|
konghq.com/strip-path: "false"
|
||||||
|
kubernetes.io/ingress.class: default
|
||||||
|
enabled: true
|
||||||
|
hostname: developer.127-0-0-1.nip.io
|
||||||
|
path: /
|
||||||
|
tls: quickstart-kong-portal-cert
|
||||||
|
tls:
|
||||||
|
containerPort: 8446
|
||||||
|
enabled: true
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
servicePort: 8446
|
||||||
|
type: ClusterIP
|
||||||
|
portalapi:
|
||||||
|
annotations:
|
||||||
|
konghq.com/protocol: https
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
enabled: false
|
||||||
|
ingress:
|
||||||
|
annotations:
|
||||||
|
konghq.com/https-redirect-status-code: "301"
|
||||||
|
konghq.com/protocols: https
|
||||||
|
konghq.com/strip-path: "true"
|
||||||
|
kubernetes.io/ingress.class: default
|
||||||
|
nginx.ingress.kubernetes.io/app-root: /
|
||||||
|
enabled: true
|
||||||
|
hostname: developer.127-0-0-1.nip.io
|
||||||
|
path: /api
|
||||||
|
tls: quickstart-kong-portal-cert
|
||||||
|
tls:
|
||||||
|
containerPort: 8447
|
||||||
|
enabled: true
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
servicePort: 8447
|
||||||
|
type: ClusterIP
|
||||||
|
postgresql:
|
||||||
|
enabled: true
|
||||||
|
auth:
|
||||||
|
database: kong
|
||||||
|
username: kong
|
||||||
|
proxy:
|
||||||
|
annotations:
|
||||||
|
prometheus.io/port: "9542"
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
containerPort: 8080
|
||||||
|
enabled: true
|
||||||
|
hostPort: 80
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
labels:
|
||||||
|
enable-metrics: true
|
||||||
|
tls:
|
||||||
|
containerPort: 8443
|
||||||
|
enabled: true
|
||||||
|
hostPort: 443
|
||||||
|
type: LoadBalancer
|
||||||
|
replicaCount: 1
|
||||||
|
secretVolumes: []
|
||||||
|
status:
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
containerPort: 8100
|
||||||
|
enabled: true
|
||||||
|
tls:
|
||||||
|
containerPort: 8543
|
||||||
|
enabled: false
|
||||||
|
updateStrategy:
|
||||||
|
rollingUpdate:
|
||||||
|
maxSurge: 100%
|
||||||
|
maxUnavailable: 100%
|
||||||
|
type: RollingUpdate
|
@ -0,0 +1,199 @@
|
|||||||
|
# Kong for Kubernetes with Kong Enterprise with Enterprise features enabled and
|
||||||
|
# exposed via TLS-enabled Ingresses. Before installing:
|
||||||
|
# * Several settings (search for the string "CHANGEME") require user-provided
|
||||||
|
# Secrets. These Secrets must be created before installation.
|
||||||
|
# * Ingresses reference example "<service>.kong.CHANGEME.example" hostnames. These must
|
||||||
|
# be changed to an actual hostname that resolve to your proxy.
|
||||||
|
# * Ensure that your session configurations create cookies that are usable
|
||||||
|
# across your services. The admin session configuration must create cookies
|
||||||
|
# that are sent to both the admin API and Kong Manager, and any Dev Portal
|
||||||
|
# instances with authentication must create cookies that are sent to both
|
||||||
|
# the Portal and Portal API.
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: kong/kong-gateway
|
||||||
|
tag: "3.1"
|
||||||
|
|
||||||
|
env:
|
||||||
|
prefix: /kong_prefix/
|
||||||
|
database: postgres
|
||||||
|
|
||||||
|
password:
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: kong-enterprise-superuser-password #CHANGEME
|
||||||
|
key: password #CHANGEME
|
||||||
|
|
||||||
|
admin:
|
||||||
|
enabled: true
|
||||||
|
annotations:
|
||||||
|
konghq.com/protocol: "https"
|
||||||
|
|
||||||
|
tls:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8444
|
||||||
|
containerPort: 8444
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
tls: CHANGEME-admin-tls-secret
|
||||||
|
hostname: admin.kong.CHANGEME.example
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: "kong"
|
||||||
|
path: /
|
||||||
|
|
||||||
|
proxy:
|
||||||
|
enabled: true
|
||||||
|
type: LoadBalancer
|
||||||
|
annotations: {}
|
||||||
|
|
||||||
|
http:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 80
|
||||||
|
containerPort: 8000
|
||||||
|
parameters: []
|
||||||
|
|
||||||
|
tls:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 443
|
||||||
|
containerPort: 8443
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
|
||||||
|
stream: {}
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
annotations: {}
|
||||||
|
path: /
|
||||||
|
|
||||||
|
externalIPs: []
|
||||||
|
|
||||||
|
enterprise:
|
||||||
|
enabled: true
|
||||||
|
# CHANGEME: https://github.com/Kong/charts/blob/main/charts/kong/README.md#kong-enterprise-license
|
||||||
|
license_secret: kong-enterprise-license
|
||||||
|
vitals:
|
||||||
|
enabled: true
|
||||||
|
portal:
|
||||||
|
enabled: true
|
||||||
|
rbac:
|
||||||
|
enabled: true
|
||||||
|
admin_gui_auth: basic-auth
|
||||||
|
session_conf_secret: kong-session-config
|
||||||
|
admin_gui_auth_conf_secret: CHANGEME-admin-gui-auth-conf-secret
|
||||||
|
smtp:
|
||||||
|
enabled: false
|
||||||
|
portal_emails_from: none@example.com
|
||||||
|
portal_emails_reply_to: none@example.com
|
||||||
|
admin_emails_from: none@example.com
|
||||||
|
admin_emails_reply_to: none@example.com
|
||||||
|
smtp_admin_emails: none@example.com
|
||||||
|
smtp_host: smtp.example.com
|
||||||
|
smtp_port: 587
|
||||||
|
smtp_auth_type: ''
|
||||||
|
smtp_ssl: nil
|
||||||
|
smtp_starttls: true
|
||||||
|
auth:
|
||||||
|
smtp_username: '' # e.g. postmaster@example.com
|
||||||
|
smtp_password_secret: CHANGEME-smtp-password
|
||||||
|
|
||||||
|
manager:
|
||||||
|
enabled: true
|
||||||
|
type: NodePort
|
||||||
|
annotations:
|
||||||
|
konghq.com/protocol: "https"
|
||||||
|
|
||||||
|
http:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
tls:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8445
|
||||||
|
containerPort: 8445
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
tls: CHANGEME-manager-tls-secret
|
||||||
|
hostname: manager.kong.CHANGEME.example
|
||||||
|
annotations: {}
|
||||||
|
path: /
|
||||||
|
|
||||||
|
externalIPs: []
|
||||||
|
|
||||||
|
portal:
|
||||||
|
enabled: true
|
||||||
|
type: NodePort
|
||||||
|
annotations:
|
||||||
|
konghq.com/protocol: "https"
|
||||||
|
|
||||||
|
http:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8003
|
||||||
|
containerPort: 8003
|
||||||
|
parameters: []
|
||||||
|
|
||||||
|
tls:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8446
|
||||||
|
containerPort: 8446
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
tls: CHANGEME-portal-tls-secret
|
||||||
|
hostname: portal.kong.CHANGEME.example
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: "kong"
|
||||||
|
path: /
|
||||||
|
|
||||||
|
externalIPs: []
|
||||||
|
|
||||||
|
portalapi:
|
||||||
|
enabled: true
|
||||||
|
type: NodePort
|
||||||
|
annotations:
|
||||||
|
konghq.com/protocol: "https"
|
||||||
|
|
||||||
|
http:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8004
|
||||||
|
containerPort: 8004
|
||||||
|
parameters: []
|
||||||
|
|
||||||
|
tls:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8447
|
||||||
|
containerPort: 8447
|
||||||
|
parameters:
|
||||||
|
- http2
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
tls: CHANGEME-portalapi-tls-secret
|
||||||
|
hostname: portalapi.kong.CHANGEME.example
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: "kong"
|
||||||
|
path: /
|
||||||
|
|
||||||
|
externalIPs: []
|
||||||
|
|
||||||
|
postgresql:
|
||||||
|
enabled: true
|
||||||
|
auth:
|
||||||
|
username: kong
|
||||||
|
database: kong
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: true
|
||||||
|
env:
|
||||||
|
kong_admin_token:
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: kong-enterprise-superuser-password #CHANGEME
|
||||||
|
key: password #CHANGEME
|
@ -0,0 +1,56 @@
|
|||||||
|
# Basic values.yaml for Kong for Kubernetes with Kong Enterprise
|
||||||
|
# Several settings (search for the string "CHANGEME") require user-provided
|
||||||
|
# Secrets. These Secrets must be created before installation.
|
||||||
|
#
|
||||||
|
# This installation does not create an Ingress or LoadBalancer Service for
|
||||||
|
# the Admin API or Kong Manager. They require port-forwards to access without
|
||||||
|
# further configuration to add them:
|
||||||
|
# kubectl port-forward deploy/your-deployment-kong 8001:8001 8002:8002
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: kong/kong-gateway
|
||||||
|
tag: "3.1"
|
||||||
|
|
||||||
|
admin:
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8001
|
||||||
|
containerPort: 8001
|
||||||
|
|
||||||
|
enterprise:
|
||||||
|
enabled: true
|
||||||
|
# CHANGEME: https://github.com/Kong/charts/blob/main/charts/kong/README.md#kong-enterprise-license
|
||||||
|
license_secret: kong-enterprise-license
|
||||||
|
vitals:
|
||||||
|
enabled: false
|
||||||
|
portal:
|
||||||
|
enabled: false
|
||||||
|
rbac:
|
||||||
|
enabled: false
|
||||||
|
smtp:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
portal:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
portalapi:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
env:
|
||||||
|
prefix: /kong_prefix/
|
||||||
|
database: postgres
|
||||||
|
password:
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: kong-enterprise-superuser-password #CHANGEME
|
||||||
|
key: password #CHANGEME
|
||||||
|
|
||||||
|
postgresql:
|
||||||
|
enabled: true
|
||||||
|
auth:
|
||||||
|
username: kong
|
||||||
|
database: kong
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: true
|
@ -0,0 +1,12 @@
|
|||||||
|
# Basic values.yaml configuration for Kong for Kubernetes (with the ingress controller)
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: kong
|
||||||
|
tag: "3.1"
|
||||||
|
|
||||||
|
env:
|
||||||
|
prefix: /kong_prefix/
|
||||||
|
database: "off"
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: true
|
@ -0,0 +1,38 @@
|
|||||||
|
# Basic values.yaml for Kong for Kubernetes with Kong Enterprise (DB-less)
|
||||||
|
# Several settings (search for the string "CHANGEME") require user-provided
|
||||||
|
# Secrets. These Secrets must be created before installation.
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: kong/kong-gateway
|
||||||
|
tag: "3.1"
|
||||||
|
|
||||||
|
enterprise:
|
||||||
|
enabled: true
|
||||||
|
# See instructions regarding enterprise licenses at https://github.com/Kong/charts/blob/master/charts/kong/README.md#kong-enterprise-license
|
||||||
|
license_secret: kong-enterprise-license # CHANGEME
|
||||||
|
vitals:
|
||||||
|
enabled: false
|
||||||
|
portal:
|
||||||
|
enabled: false
|
||||||
|
rbac:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
manager:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
portal:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
portalapi:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
env:
|
||||||
|
database: "off"
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
proxy:
|
||||||
|
# Enable creating a Kubernetes service for the proxy
|
||||||
|
enabled: true
|
||||||
|
type: NodePort
|
@ -0,0 +1,66 @@
|
|||||||
|
# Basic configuration for Kong Enterprise without the ingress controller, using the Postgres subchart
|
||||||
|
# This installation does not create an Ingress or LoadBalancer Service for
|
||||||
|
# the Admin API. It requires port-forwards to access without further
|
||||||
|
# configuration to add them, e.g.:
|
||||||
|
# kubectl port-forward deploy/your-deployment-kong 8001:8001
|
||||||
|
# Before installing:
|
||||||
|
# * Several settings (search for the string "CHANGEME") require user-provided
|
||||||
|
# Secrets. These Secrets must be created before installation.
|
||||||
|
# * Ensure that your session configurations create cookies that are usable
|
||||||
|
# across your services. The admin session configuration must create cookies
|
||||||
|
# that are sent to both the admin API and Kong Manager, and any Dev Portal
|
||||||
|
# instances with authentication must create cookies that are sent to both
|
||||||
|
# the Portal and Portal API.
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: kong/kong-gateway
|
||||||
|
tag: "3.1"
|
||||||
|
|
||||||
|
env:
|
||||||
|
database: postgres
|
||||||
|
role: control_plane
|
||||||
|
cluster_cert: /etc/secrets/kong-cluster-cert/tls.crt
|
||||||
|
cluster_cert_key: /etc/secrets/kong-cluster-cert/tls.key
|
||||||
|
|
||||||
|
admin:
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
tls:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
clustertelemetry:
|
||||||
|
enabled: true
|
||||||
|
tls:
|
||||||
|
containerPort: 8006
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8006
|
||||||
|
type: ClusterIP
|
||||||
|
|
||||||
|
proxy:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
secretVolumes:
|
||||||
|
- kong-cluster-cert
|
||||||
|
|
||||||
|
postgresql:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
enterprise:
|
||||||
|
enabled: true
|
||||||
|
# See instructions regarding enterprise licenses at https://github.com/Kong/charts/blob/master/charts/kong/README.md#kong-enterprise-license
|
||||||
|
license_secret: kong-enterprise-license # CHANGEME
|
||||||
|
vitals:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
portal:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
portalapi:
|
||||||
|
enabled: false
|
@ -0,0 +1,46 @@
|
|||||||
|
# Basic configuration for Kong Enterprise as a hybrid mode data plane node.
|
||||||
|
# It depends on the presence of a control plane release, as shown in
|
||||||
|
# https://github.com/Kong/charts/blob/main/charts/kong/example-values/minimal-kong-enterprise-hybrid-control.yaml
|
||||||
|
#
|
||||||
|
# The "env.cluster_control_plane" value must be changed to your control plane
|
||||||
|
# instance's cluster Service hostname. Search "CHANGEME" to find it in this
|
||||||
|
# example.
|
||||||
|
#
|
||||||
|
# Hybrid mode requires a certificate. See https://github.com/Kong/charts/blob/main/charts/kong/README.md#certificates
|
||||||
|
# to create one.
|
||||||
|
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: kong/kong-gateway
|
||||||
|
tag: "3.1"
|
||||||
|
|
||||||
|
env:
|
||||||
|
role: data_plane
|
||||||
|
cluster_control_plane: CHANGEME-control-service.CHANGEME-namespace.svc.cluster.local:8005
|
||||||
|
cluster_telemetry_endpoint: CHANGEME-cluster-telemetry-service.CHANGEME-namespace.svc.cluster.local:8006
|
||||||
|
lua_ssl_trusted_certificate: /etc/secrets/kong-cluster-cert/tls.crt
|
||||||
|
cluster_cert: /etc/secrets/kong-cluster-cert/tls.crt
|
||||||
|
cluster_cert_key: /etc/secrets/kong-cluster-cert/tls.key
|
||||||
|
|
||||||
|
secretVolumes:
|
||||||
|
- kong-cluster-cert
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
enterprise:
|
||||||
|
enabled: true
|
||||||
|
# See instructions regarding enterprise licenses at https://github.com/Kong/charts/blob/master/charts/kong/README.md#kong-enterprise-license
|
||||||
|
license_secret: kong-enterprise-license # CHANGEME
|
||||||
|
vitals:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
manager:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
portal:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
portalapi:
|
||||||
|
enabled: false
|
||||||
|
|
@ -0,0 +1,45 @@
|
|||||||
|
# Basic configuration for Kong without the ingress controller, using the Postgres subchart
|
||||||
|
# This installation does not create an Ingress or LoadBalancer Service for
|
||||||
|
# the Admin API. It requires port-forwards to access without further
|
||||||
|
# configuration to add them, e.g.:
|
||||||
|
# kubectl port-forward deploy/your-deployment-kong 8001:8001
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: kong
|
||||||
|
tag: "3.1"
|
||||||
|
|
||||||
|
env:
|
||||||
|
prefix: /kong_prefix/
|
||||||
|
database: postgres
|
||||||
|
role: control_plane
|
||||||
|
cluster_cert: /etc/secrets/kong-cluster-cert/tls.crt
|
||||||
|
cluster_cert_key: /etc/secrets/kong-cluster-cert/tls.key
|
||||||
|
|
||||||
|
admin:
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8001
|
||||||
|
containerPort: 8001
|
||||||
|
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
tls:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8005
|
||||||
|
containerPort: 8005
|
||||||
|
|
||||||
|
proxy:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
secretVolumes:
|
||||||
|
- kong-cluster-cert
|
||||||
|
|
||||||
|
postgresql:
|
||||||
|
enabled: true
|
||||||
|
auth:
|
||||||
|
username: kong
|
||||||
|
database: kong
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: false
|
@ -0,0 +1,32 @@
|
|||||||
|
# Basic configuration for Kong as a hybrid mode data plane node.
|
||||||
|
# It depends on the presence of a control plane release, as shown in
|
||||||
|
# https://github.com/Kong/charts/blob/main/charts/kong/example-values/minimal-kong-hybrid-control.yaml
|
||||||
|
#
|
||||||
|
# The "env.cluster_control_plane" value must be changed to your control plane
|
||||||
|
# instance's cluster Service hostname. Search "CHANGEME" to find it in this
|
||||||
|
# example.
|
||||||
|
#
|
||||||
|
# Hybrid mode requires a certificate. See https://github.com/Kong/charts/blob/main/charts/kong/README.md#certificates
|
||||||
|
# to create one.
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: kong
|
||||||
|
tag: "3.1"
|
||||||
|
|
||||||
|
env:
|
||||||
|
prefix: /kong_prefix/
|
||||||
|
database: "off"
|
||||||
|
role: data_plane
|
||||||
|
cluster_control_plane: CHANGEME-control-service.CHANGEME-namespace.svc.cluster.local:8005
|
||||||
|
lua_ssl_trusted_certificate: /etc/secrets/kong-cluster-cert/tls.crt
|
||||||
|
cluster_cert: /etc/secrets/kong-cluster-cert/tls.crt
|
||||||
|
cluster_cert_key: /etc/secrets/kong-cluster-cert/tls.key
|
||||||
|
|
||||||
|
admin:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
secretVolumes:
|
||||||
|
- kong-cluster-cert
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: false
|
@ -0,0 +1,29 @@
|
|||||||
|
# Basic configuration for Kong without the ingress controller, using the Postgres subchart
|
||||||
|
# This installation does not create an Ingress or LoadBalancer Service for
|
||||||
|
# the Admin API. It requires port-forwards to access without further
|
||||||
|
# configuration to add them, e.g.:
|
||||||
|
# kubectl port-forward deploy/your-deployment-kong 8001:8001
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: kong
|
||||||
|
tag: "3.1"
|
||||||
|
|
||||||
|
env:
|
||||||
|
prefix: /kong_prefix/
|
||||||
|
database: postgres
|
||||||
|
|
||||||
|
admin:
|
||||||
|
enabled: true
|
||||||
|
http:
|
||||||
|
enabled: true
|
||||||
|
servicePort: 8001
|
||||||
|
containerPort: 8001
|
||||||
|
|
||||||
|
postgresql:
|
||||||
|
enabled: true
|
||||||
|
auth:
|
||||||
|
username: kong
|
||||||
|
database: kong
|
||||||
|
|
||||||
|
ingressController:
|
||||||
|
enabled: false
|
21
build_system/charts/open-appsec-kong/templates/NOTES.txt
Normal file
21
build_system/charts/open-appsec-kong/templates/NOTES.txt
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
To connect to Kong, please execute the following commands:
|
||||||
|
{{ if contains "LoadBalancer" .Values.proxy.type }}
|
||||||
|
HOST=$(kubectl get svc --namespace {{ template "kong.namespace" . }} {{ template "kong.fullname" . }}-proxy -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
|
||||||
|
PORT=$(kubectl get svc --namespace {{ template "kong.namespace" . }} {{ template "kong.fullname" . }}-proxy -o jsonpath='{.spec.ports[0].port}')
|
||||||
|
{{ else if contains "NodePort" .Values.proxy.type }}HOST=$(kubectl get nodes --namespace {{ template "kong.namespace" . }} -o jsonpath='{.items[0].status.addresses[0].address}')
|
||||||
|
PORT=$(kubectl get svc --namespace {{ template "kong.namespace" . }} {{ template "kong.fullname" . }}-proxy -o jsonpath='{.spec.ports[0].nodePort}')
|
||||||
|
{{ end -}}
|
||||||
|
export PROXY_IP=${HOST}:${PORT}
|
||||||
|
curl $PROXY_IP
|
||||||
|
|
||||||
|
Once installed, please follow along the getting started guide to start using
|
||||||
|
Kong: https://docs.konghq.com/kubernetes-ingress-controller/latest/guides/getting-started/
|
||||||
|
|
||||||
|
{{ $warnings := list -}}
|
||||||
|
{{- if (hasKey .Values.ingressController "serviceAccount") -}}
|
||||||
|
{{- if (or (hasKey .Values.ingressController.serviceAccount "name") (hasKey .Values.ingressController.serviceAccount "annotations")) -}}
|
||||||
|
{{- $warnings = append $warnings "you have set either .ingressController.serviceAccount.name or .ingressController.serviceAccount.annotations. These settings have moved to .deployment.serviceAccount.name and .deployment.serviceAccount.annotations. You must move your configuration to the new location in values.yaml" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- include "kong.deprecation-warnings" $warnings -}}
|
1421
build_system/charts/open-appsec-kong/templates/_helpers.tpl
Normal file
1421
build_system/charts/open-appsec-kong/templates/_helpers.tpl
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,127 @@
|
|||||||
|
{{- if .Values.ingressController.admissionWebhook.enabled }}
|
||||||
|
{{- $certCert := "" -}}
|
||||||
|
{{- $certKey := "" -}}
|
||||||
|
{{- $caCert := "" -}}
|
||||||
|
{{- $caKey := "" -}}
|
||||||
|
{{- if not .Values.ingressController.admissionWebhook.certificate.provided }}
|
||||||
|
{{- $cn := printf "%s.%s.svc" ( include "kong.service.validationWebhook" . ) ( include "kong.namespace" . ) -}}
|
||||||
|
{{- $ca := genCA "kong-admission-ca" 3650 -}}
|
||||||
|
{{- $cert := genSignedCert $cn nil (list $cn) 3650 $ca -}}
|
||||||
|
{{- $certCert = $cert.Cert -}}
|
||||||
|
{{- $certKey = $cert.Key -}}
|
||||||
|
{{- $caCert = $ca.Cert -}}
|
||||||
|
{{- $caKey = $ca.Key -}}
|
||||||
|
|
||||||
|
{{- $caSecret := (lookup "v1" "Secret" (include "kong.namespace" .) (printf "%s-validation-webhook-ca-keypair" (include "kong.fullname" .))) -}}
|
||||||
|
{{- $certSecret := (lookup "v1" "Secret" (include "kong.namespace" .) (printf "%s-validation-webhook-keypair" (include "kong.fullname" .))) -}}
|
||||||
|
{{- if $certSecret }}
|
||||||
|
{{- $certCert = (b64dec (get $certSecret.data "tls.crt")) -}}
|
||||||
|
{{- $certKey = (b64dec (get $certSecret.data "tls.key")) -}}
|
||||||
|
{{- end }}
|
||||||
|
{{- if $caSecret }}
|
||||||
|
{{- $caCert = (b64dec (get $caSecret.data "tls.crt")) -}}
|
||||||
|
{{- $caKey = (b64dec (get $caSecret.data "tls.key")) -}}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
kind: ValidatingWebhookConfiguration
|
||||||
|
{{- if .Capabilities.APIVersions.Has "admissionregistration.k8s.io/v1" }}
|
||||||
|
apiVersion: admissionregistration.k8s.io/v1
|
||||||
|
{{- else }}
|
||||||
|
apiVersion: admissionregistration.k8s.io/v1beta1
|
||||||
|
{{- end }}
|
||||||
|
metadata:
|
||||||
|
name: {{ template "kong.fullname" . }}-validations
|
||||||
|
namespace: {{ template "kong.namespace" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "kong.metaLabels" . | nindent 4 }}
|
||||||
|
webhooks:
|
||||||
|
- name: validations.kong.konghq.com
|
||||||
|
objectSelector:
|
||||||
|
matchExpressions:
|
||||||
|
- key: owner
|
||||||
|
operator: NotIn
|
||||||
|
values:
|
||||||
|
- helm
|
||||||
|
failurePolicy: {{ .Values.ingressController.admissionWebhook.failurePolicy }}
|
||||||
|
sideEffects: None
|
||||||
|
admissionReviewVersions: ["v1beta1"]
|
||||||
|
rules:
|
||||||
|
- apiGroups:
|
||||||
|
- configuration.konghq.com
|
||||||
|
apiVersions:
|
||||||
|
- '*'
|
||||||
|
operations:
|
||||||
|
- CREATE
|
||||||
|
- UPDATE
|
||||||
|
resources:
|
||||||
|
- kongconsumers
|
||||||
|
- kongplugins
|
||||||
|
{{- if (semverCompare ">= 2.0.4" (include "kong.effectiveVersion" .Values.ingressController.image)) }}
|
||||||
|
- kongclusterplugins
|
||||||
|
{{- end }}
|
||||||
|
{{- if (semverCompare ">= 2.8.0" (include "kong.effectiveVersion" .Values.ingressController.image)) }}
|
||||||
|
- kongingresses
|
||||||
|
{{- end }}
|
||||||
|
- apiGroups:
|
||||||
|
- ''
|
||||||
|
apiVersions:
|
||||||
|
- 'v1'
|
||||||
|
operations:
|
||||||
|
- UPDATE
|
||||||
|
resources:
|
||||||
|
- secrets
|
||||||
|
clientConfig:
|
||||||
|
{{- if not .Values.ingressController.admissionWebhook.certificate.provided }}
|
||||||
|
caBundle: {{ b64enc $caCert }}
|
||||||
|
{{- else }}
|
||||||
|
{{- if .Values.ingressController.admissionWebhook.certificate.caBundle }}
|
||||||
|
caBundle: {{ b64enc .Values.ingressController.admissionWebhook.certificate.caBundle }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
service:
|
||||||
|
name: {{ template "kong.service.validationWebhook" . }}
|
||||||
|
namespace: {{ template "kong.namespace" . }}
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "kong.service.validationWebhook" . }}
|
||||||
|
namespace: {{ template "kong.namespace" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "kong.metaLabels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: webhook
|
||||||
|
port: 443
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: webhook
|
||||||
|
selector:
|
||||||
|
{{- include "kong.metaLabels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: app
|
||||||
|
{{- if not .Values.ingressController.admissionWebhook.certificate.provided }}
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ template "kong.fullname" . }}-validation-webhook-ca-keypair
|
||||||
|
namespace: {{ template "kong.namespace" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "kong.metaLabels" . | nindent 4 }}
|
||||||
|
type: kubernetes.io/tls
|
||||||
|
data:
|
||||||
|
tls.crt: {{ b64enc $caCert }}
|
||||||
|
tls.key: {{ b64enc $caKey }}
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ template "kong.fullname" . }}-validation-webhook-keypair
|
||||||
|
namespace: {{ template "kong.namespace" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "kong.metaLabels" . | nindent 4 }}
|
||||||
|
type: kubernetes.io/tls
|
||||||
|
data:
|
||||||
|
tls.crt: {{ b64enc $certCert }}
|
||||||
|
tls.key: {{ b64enc $certKey }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
@ -0,0 +1,20 @@
|
|||||||
|
{{- if and (eq "standalone" .Values.appsec.mode) (eq .Values.appsec.persistence.enabled true) -}}
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: {{ .Values.appsec.name }}-storage
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
annotations:
|
||||||
|
"helm.sh/resource-policy": keep
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- {{ .Values.appsec.persistence.learning.storageClass.accessModes }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.appsec.persistence.learning.size | quote }}
|
||||||
|
{{- if .Values.appsec.persistence.learning.storageClass.name }}
|
||||||
|
storageClassName: "{{ .Values.appsec.persistence.learning.storageClass.name }}"
|
||||||
|
{{- else }}
|
||||||
|
storageClassName: {{ required "A storage class for learning data is required" .Values.appsec.persistence.learning.storageClass.name }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
@ -0,0 +1,51 @@
|
|||||||
|
{{- if (eq .Values.kind "AppSecStateful") -}}
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: {{ .Values.appsec.name }}-conf
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
{{- include "appsec.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: open-appsec
|
||||||
|
{{- with .Values.appsec.labels }}
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.appsec.persistence.conf.size | quote }}
|
||||||
|
{{- if .Values.appsec.persistence.storageClass }}
|
||||||
|
{{- if (eq "-" .Values.appsec.persistence.storageClass) }}
|
||||||
|
storageClassName: ""
|
||||||
|
{{- else }}
|
||||||
|
storageClassName: "{{ .Values.appsec.persistence.storageClass }}"
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
---
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: {{ .Values.appsec.name }}-data
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
{{- include "appsec.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: open-appsec
|
||||||
|
{{- with .Values.appsec.labels }}
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.appsec.persistence.data.size | quote }}
|
||||||
|
{{- if .Values.appsec.persistence.storageClass }}
|
||||||
|
{{- if (eq "-" .Values.appsec.persistence.storageClass) }}
|
||||||
|
storageClassName: ""
|
||||||
|
{{- else }}
|
||||||
|
storageClassName: "{{ .Values.appsec.persistence.storageClass }}"
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user