mirror of
https://github.com/ZwareBear/JFrog-Cloud-Installers.git
synced 2026-01-21 03:06:57 -06:00
JFrog Pipelines v1.8.0 as Openshift helm and operator
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
# JFrog Openshift Pipelines Chart Changelog
|
# JFrog Openshift Pipelines Chart Changelog
|
||||||
All changes to this chart will be documented in this file.
|
All changes to this chart will be documented in this file.
|
||||||
|
|
||||||
|
## [1.5.4] Oct 7, 2020
|
||||||
|
* Adding Openshift Pipelines helm chart version 1.5.4 app version 1.8.0
|
||||||
|
|
||||||
## [1.4.5] Sept 21, 2020
|
## [1.4.5] Sept 21, 2020
|
||||||
* Adding Openshift Pipelines helm chart version 1.4.5 app version 1.7.2
|
* Adding Openshift Pipelines helm chart version 1.4.5 app version 1.7.2
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
appVersion: 1.7.2
|
appVersion: 1.8.0
|
||||||
description: A Helm chart for JFrog Pipelines
|
description: A Helm chart for JFrog Pipelines
|
||||||
home: https://jfrog.com/pipelines/
|
home: https://jfrog.com/pipelines/
|
||||||
icon: https://raw.githubusercontent.com/jfrog/charts/master/stable/pipelines/icon/pipelines-logo.png
|
icon: https://raw.githubusercontent.com/jfrog/charts/master/stable/pipelines/icon/pipelines-logo.png
|
||||||
@@ -13,4 +13,4 @@ maintainers:
|
|||||||
- email: johnp@jfrog.com
|
- email: johnp@jfrog.com
|
||||||
name: John Peterson
|
name: John Peterson
|
||||||
name: openshift-pipelines
|
name: openshift-pipelines
|
||||||
version: 1.4.5
|
version: 1.5.4
|
||||||
|
|||||||
@@ -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,176 @@
|
|||||||
|
# JFrog Pipelines Chart Changelog
|
||||||
|
All changes to this chart to be documented in this file
|
||||||
|
|
||||||
|
## [1.5.4] Oct 8, 2020
|
||||||
|
* Changed customInitBeginContainer to customInitContainerBegin to match other charts
|
||||||
|
* Added examples in values.yaml for .Values.pipelines.customInitContainerBegin
|
||||||
|
|
||||||
|
## [1.5.3] Oct 7, 2020
|
||||||
|
* Adding custom init begin container to pipelines statefulset and vault statefulset
|
||||||
|
* Moved custom init container in vault statefulset from first to last position
|
||||||
|
|
||||||
|
## [1.5.2] Oct 5, 2020
|
||||||
|
* increasing liveness and readiness probe settings for api and www
|
||||||
|
* source above configs from values.yaml
|
||||||
|
|
||||||
|
## [1.5.1] Oct 5, 2020
|
||||||
|
* adding a healthcheck configuration within pipelines chart for artifactory
|
||||||
|
|
||||||
|
## [1.5.0] Oct 1, 2020
|
||||||
|
* Pipelines v1.8.0
|
||||||
|
* Added support for resources in init containers
|
||||||
|
|
||||||
|
## [1.4.9] September 30, 2020
|
||||||
|
* Supports router configuration to set internal artifactory endpoint for saas
|
||||||
|
|
||||||
|
## [1.4.8] September 29, 2020
|
||||||
|
* Hardcodes routers refresh interval for pipelines
|
||||||
|
|
||||||
|
## [1.4.7] September 25, 2020
|
||||||
|
* Changed init container to use linux capabilities CAP_CHOWN instead of runAsUser: 0
|
||||||
|
|
||||||
|
## [1.4.6] September 23, 2020
|
||||||
|
* Escalated privileges to init container only for pipelines-installer to work with pipelines images as non-root based for Openshift.
|
||||||
|
|
||||||
|
## [1.4.5] September 18, 2020
|
||||||
|
* Removed external Vault support as Pipelines does not support external vault until version 1.9.0
|
||||||
|
* Added disablemlock flag to enable users to set to false for production grade system security requirements.
|
||||||
|
|
||||||
|
## [1.4.4] September 17, 2020
|
||||||
|
* Change jfrogUrl and jfrogUrlUI default values
|
||||||
|
* Rename ci/test-values.yaml to ci/default-values.yaml
|
||||||
|
|
||||||
|
## [1.4.3] September 2, 2020
|
||||||
|
* Add external Vault support
|
||||||
|
|
||||||
|
## [1.4.2] - August 27, 2020
|
||||||
|
* Adds support for making api rabbitmq health check interval configurable
|
||||||
|
* Cleanup system.yaml
|
||||||
|
* Add RBAC rules for Pipelines Statefulset
|
||||||
|
|
||||||
|
## [1.4.1] - August 19, 2020
|
||||||
|
* Add support for external rabbitmq and redis
|
||||||
|
|
||||||
|
## [1.4.0] - Aug 8, 2020
|
||||||
|
* Pipelines v1.7.2
|
||||||
|
* Adds support for k8s build plane config
|
||||||
|
* Adds support for ssl enabled postgresql
|
||||||
|
* Support an existing secret for buildPlanes
|
||||||
|
* Add checksum for all secrets and configmaps
|
||||||
|
|
||||||
|
## [1.3.11] - August 6, 2020
|
||||||
|
* Fix external PG port
|
||||||
|
|
||||||
|
## [1.3.10] - August 5, 2020
|
||||||
|
* have controlplane and buildplane pull versions from global version override as specified in 1.3.7
|
||||||
|
|
||||||
|
## [1.3.9] - July 31, 2020
|
||||||
|
* Added support for customVolumes, configMaps and customInitcontainers for Vault
|
||||||
|
* Added tpl for resolving jfrogUrl
|
||||||
|
|
||||||
|
## [1.3.8] - July 30, 2020
|
||||||
|
* Fix customSideCar container bug for configMaps
|
||||||
|
|
||||||
|
## [1.3.7] - July 29, 2020
|
||||||
|
* Allow overriding default version of pipelines tags with a single value in values.yml
|
||||||
|
* add `# version:` to pipelines:
|
||||||
|
|
||||||
|
## [1.3.6] - Jul 23, 2020
|
||||||
|
* Added support for customSidecarContainers, customVolumes, customInitcontainers and configMaps
|
||||||
|
* Update alpine version to 3.12
|
||||||
|
|
||||||
|
## [1.3.5] - July 20th, 2020
|
||||||
|
* Remove 'NodeType' option from pipelines-services-headless
|
||||||
|
|
||||||
|
## [1.3.4] - July 6th, 2020
|
||||||
|
* Fixes callHomeUrl
|
||||||
|
|
||||||
|
## [1.3.3] - June 30th, 2020
|
||||||
|
* Pipelines v1.6.2
|
||||||
|
|
||||||
|
## [1.3.2] - June 30, 2020
|
||||||
|
* Enable extensionSync microservice
|
||||||
|
|
||||||
|
## [1.3.1] - June 29, 2020
|
||||||
|
* Pipelines v1.6.1
|
||||||
|
|
||||||
|
## [1.3.0] - June 25, 2020
|
||||||
|
* Pipelines v1.6.0
|
||||||
|
* Adds a new configuration accessControlAllowOrigins
|
||||||
|
* Use ChartCenter as helm repo
|
||||||
|
|
||||||
|
## [1.2.0] - June 2, 2020
|
||||||
|
* Pipelines v1.5.1
|
||||||
|
* Update Postgres image to 9.6.18-debian-10-r7
|
||||||
|
* Disable Vault HA
|
||||||
|
* Bump alpine to v3.11
|
||||||
|
|
||||||
|
## [1.1.5] - May 13, 2020
|
||||||
|
* Pipelines v1.4.7
|
||||||
|
|
||||||
|
## [1.1.4] - April 30, 2020
|
||||||
|
* In readme fix helm template examples
|
||||||
|
|
||||||
|
## [1.1.3] - April 23, 2020
|
||||||
|
* Fix filebeat resources
|
||||||
|
|
||||||
|
## [1.1.2] - April 23, 2020
|
||||||
|
* Pipelines v1.4.6
|
||||||
|
* Removes subnetId and nat fields from buildplane config which are not supported from 1.4.x
|
||||||
|
|
||||||
|
## [1.1.1] - April 16, 2020
|
||||||
|
* Hardcode docker.bintray.io for build images
|
||||||
|
|
||||||
|
## [1.1.0] - April 15, 2020
|
||||||
|
* Pipelines v1.4.2
|
||||||
|
* Remove experimental k8s build plane support
|
||||||
|
|
||||||
|
## [1.0.36] - April 9, 2020
|
||||||
|
* Bump Redis chart to 10.6.3
|
||||||
|
* Bump RabbitMQ chart to 6.25.0
|
||||||
|
* Bump PostgreSQL chart to 8.7.3
|
||||||
|
* Bump Vault version to 1.3.4
|
||||||
|
* Fix k8s node compute resources
|
||||||
|
|
||||||
|
## [1.0.35] - April 3, 2020
|
||||||
|
* Update readme
|
||||||
|
* Disable Pipelines StatefulSet replicas if HPA is enabled
|
||||||
|
|
||||||
|
## [1.0.34] - March 24, 2020
|
||||||
|
* Update docs urls
|
||||||
|
* Fix filebeat compute resources
|
||||||
|
|
||||||
|
## [1.0.33] - March 24, 2020
|
||||||
|
* Add HPA for Pipelines services statefulset
|
||||||
|
* Add Runtime Override
|
||||||
|
|
||||||
|
## [1.0.32] - March 19, 2020
|
||||||
|
* Pipelines v1.3.3
|
||||||
|
|
||||||
|
## [1.0.31] - Mar 17, 2020
|
||||||
|
* Changed all single quotes to double quotes in values files
|
||||||
|
|
||||||
|
## [1.0.30] - Mar 11, 2020
|
||||||
|
* Unified charts public release
|
||||||
|
|
||||||
|
## [1.0.29] - March 10, 2020
|
||||||
|
* Fix CI test
|
||||||
|
|
||||||
|
## [1.0.28] - March 10, 2020
|
||||||
|
* Add CI test
|
||||||
|
|
||||||
|
## [1.0.27] - March 5, 2020
|
||||||
|
* Pipelines v1.3.2
|
||||||
|
* Bump Postgres to v9.6.17-debian-10-r21
|
||||||
|
* Update readme with `joinKey` instructions
|
||||||
|
|
||||||
|
## [1.0.26] - March 1, 2020
|
||||||
|
* Pipelines v1.3.1
|
||||||
|
|
||||||
|
## [1.0.25] - Feb 27, 2020
|
||||||
|
* Initial public release
|
||||||
|
|
||||||
|
## [1.0.24] - Feb 26, 2020
|
||||||
|
* Bump Redis chart to 10.5.6
|
||||||
|
* Bump RabbitMQ chart to 6.17.5
|
||||||
|
* Bump PostgreSQL chart to 8.4.2
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
appVersion: 1.8.0
|
||||||
|
description: A Helm chart for JFrog Pipelines
|
||||||
|
home: https://jfrog.com/pipelines/
|
||||||
|
icon: https://raw.githubusercontent.com/jfrog/charts/master/stable/pipelines/icon/pipelines-logo.png
|
||||||
|
keywords:
|
||||||
|
- pipelines
|
||||||
|
- jfrog
|
||||||
|
- devops
|
||||||
|
maintainers:
|
||||||
|
- email: rimasm@jfrog.com
|
||||||
|
name: rimusz
|
||||||
|
- email: daniele@jfrog.com
|
||||||
|
name: danielezer
|
||||||
|
- email: eldada@jfrog.com
|
||||||
|
name: eldada
|
||||||
|
name: pipelines
|
||||||
|
sources:
|
||||||
|
- https://github.com/jfrog/charts/pipelines
|
||||||
|
- https://bintray.com/jfrog/pipelines
|
||||||
|
version: 1.5.4
|
||||||
202
Openshift4/helm/openshift-pipelines/charts/pipelines/LICENSE
Normal file
202
Openshift4/helm/openshift-pipelines/charts/pipelines/LICENSE
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright {yyyy} {name of copyright owner}
|
||||||
|
|
||||||
|
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,8 @@
|
|||||||
|
approvers:
|
||||||
|
- rimusz
|
||||||
|
- danielezer
|
||||||
|
- eldada
|
||||||
|
reviewers:
|
||||||
|
- rimusz
|
||||||
|
- danielezer
|
||||||
|
- eldada
|
||||||
220
Openshift4/helm/openshift-pipelines/charts/pipelines/README.md
Normal file
220
Openshift4/helm/openshift-pipelines/charts/pipelines/README.md
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
# JFrog Pipelines on Kubernetes Helm Chart
|
||||||
|
|
||||||
|
[JFrog Pipelines](https://jfrog.com/pipelines/)
|
||||||
|
|
||||||
|
## Prerequisites Details
|
||||||
|
|
||||||
|
* Kubernetes 1.12+
|
||||||
|
|
||||||
|
## Chart Details
|
||||||
|
|
||||||
|
This chart will do the following:
|
||||||
|
|
||||||
|
- Deploy PostgreSQL (optionally with an external PostgreSQL instance)
|
||||||
|
- Deploy RabbitMQ (optionally as an HA cluster)
|
||||||
|
- Deploy Redis (optionally as an HA cluster)
|
||||||
|
- Deploy Vault (optionally as an HA cluster)
|
||||||
|
- Deploy JFrog Pipelines
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- A running Kubernetes cluster
|
||||||
|
- Dynamic storage provisioning enabled
|
||||||
|
- Default StorageClass set to allow services using the default StorageClass for persistent storage
|
||||||
|
- A running Artifactory 7.7.x with Enterprise+ License
|
||||||
|
- Precreated repository `jfrogpipelines` in Artifactory type `Generic` with layout `maven-2-default`
|
||||||
|
- [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) installed and setup to use the cluster
|
||||||
|
- [Helm](https://helm.sh/) v2 or v3 installed
|
||||||
|
|
||||||
|
|
||||||
|
## Install JFrog Pipelines
|
||||||
|
|
||||||
|
### Add ChartCenter Helm repository
|
||||||
|
|
||||||
|
Before installing JFrog helm charts, you need to add the [ChartCenter helm repository](https://chartcenter.io) to your helm client
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add center https://repo.chartcenter.io
|
||||||
|
helm repo update
|
||||||
|
```
|
||||||
|
|
||||||
|
### Artifactory Connection Details
|
||||||
|
|
||||||
|
In order to connect Pipelines to your Artifactory installation, you have to use a Join Key, hence it is *MANDATORY* to provide a Join Key and Jfrog Url to your Pipelines installation. Here's how you do that:
|
||||||
|
|
||||||
|
Retrieve the connection details of your Artifactory installation, from the UI - https://www.jfrog.com/confluence/display/JFROG/General+Security+Settings#GeneralSecuritySettings-ViewingtheJoinKey.
|
||||||
|
|
||||||
|
### Install Pipelines Chart with Ingress
|
||||||
|
|
||||||
|
#### Pre-requisites
|
||||||
|
|
||||||
|
Before deploying Pipelines you need to have the following
|
||||||
|
- A running Kubernetes cluster
|
||||||
|
- An [Artifactory ](https://hub.helm.sh/charts/jfrog/artifactory) or [Artifactory HA](https://hub.helm.sh/charts/jfrog/artifactory-ha) with Enterprise+ License
|
||||||
|
- Precreated repository `jfrogpipelines` in Artifactiry type `Generic` with layout `maven-2-default`
|
||||||
|
- Deployed [Nginx-ingress controller](https://hub.helm.sh/charts/stable/nginx-ingress)
|
||||||
|
- [Optional] Deployed [Cert-manager](https://hub.helm.sh/charts/jetstack/cert-manager) for automatic management of TLS certificates with [Lets Encrypt](https://letsencrypt.org/)
|
||||||
|
- [Optional] TLS secret needed for https access
|
||||||
|
|
||||||
|
#### Prepare configurations
|
||||||
|
|
||||||
|
Fetch the JFrog Pipelines helm chart to get the needed configuration files
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm fetch center/jfrog/pipelines --untar
|
||||||
|
```
|
||||||
|
|
||||||
|
Edit local copies of `values-ingress.yaml`, `values-ingress-passwords.yaml` and `values-ingress-external-secret.yaml` with the needed configuration values
|
||||||
|
|
||||||
|
- URLs in `values-ingress.yaml`
|
||||||
|
- Artifactory URL
|
||||||
|
- Ingress hosts
|
||||||
|
- Ingress tls secrets
|
||||||
|
- Passwords `uiUserPassword`, `postgresqlPassword` and `rabbitmq.password` must be set, and same for `masterKey` and `joinKey` in `values-ingress-passwords.yaml`
|
||||||
|
|
||||||
|
#### Install JFrog Pipelines
|
||||||
|
|
||||||
|
Install JFrog Pipelines
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create ns pipelines
|
||||||
|
helm upgrade --install pipelines --namespace pipelines center/jfrog/pipelines -f pipelines/values-ingress.yaml -f pipelines/values-ingress-passwords.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Use external secret
|
||||||
|
|
||||||
|
**Note:** Best practice is to use external secrets instead of storing passwords in `values.yaml` files.
|
||||||
|
|
||||||
|
Don't forget to **update** URLs in `values-ingress-external-secret.yaml` file.
|
||||||
|
|
||||||
|
Fill in all required passwords, `masterKey` and `joinKey` in `values-ingress-passwords.yaml` and then create and install the external secret.
|
||||||
|
|
||||||
|
**Note:** Helm release name for secrets generation and `helm install` must be set the same, in this case it is `pipelines`.
|
||||||
|
|
||||||
|
With Helm v2:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
## Generate pipelines-system-yaml secret
|
||||||
|
helm template --name-template pipelines pipelines/ -x templates/pipelines-system-yaml.yaml \
|
||||||
|
-f pipelines/values-ingress-external-secret.yaml -f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f -
|
||||||
|
|
||||||
|
## Generate pipelines-database secret
|
||||||
|
helm template --name-template pipelines pipelines/ -x templates/database-secret.yaml \
|
||||||
|
-f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f -
|
||||||
|
|
||||||
|
## Generate pipelines-rabbitmq-secret secret
|
||||||
|
helm template --name-template pipelines pipelines/ -x templates/rabbitmq-secret.yaml \
|
||||||
|
-f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f -
|
||||||
|
```
|
||||||
|
|
||||||
|
With Helm v3:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
## Generate pipelines-system-yaml secret
|
||||||
|
helm template --name-template pipelines pipelines/ -s templates/pipelines-system-yaml.yaml \
|
||||||
|
-f pipelines/values-ingress-external-secret.yaml -f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f -
|
||||||
|
|
||||||
|
## Generate pipelines-database secret
|
||||||
|
helm template --name-template pipelines pipelines/ -s templates/database-secret.yaml \
|
||||||
|
-f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f -
|
||||||
|
|
||||||
|
## Generate pipelines-rabbitmq-secret secret
|
||||||
|
helm template --name-template pipelines pipelines/ -s templates/rabbitmq-secret.yaml \
|
||||||
|
-f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f -
|
||||||
|
```
|
||||||
|
|
||||||
|
Install JFrog Pipelines:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm upgrade --install pipelines --namespace pipelines center/jfrog/pipelines -f values-ingress-external-secret.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using external Rabbitmq
|
||||||
|
|
||||||
|
If you want to use external Rabbitmq, set `rabbitmq.enabled=false` and create `values-external-rabbitmq.yaml` with below yaml configuration
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
rabbitmq:
|
||||||
|
enabled: false
|
||||||
|
internal_ip: "{{ .Release.Name }}-rabbitmq"
|
||||||
|
msg_hostname: "{{ .Release.Name }}-rabbitmq"
|
||||||
|
port: 5672
|
||||||
|
manager_port: 15672
|
||||||
|
ms_username: admin
|
||||||
|
ms_password: password
|
||||||
|
cp_username: admin
|
||||||
|
cp_password: password
|
||||||
|
build_username: admin
|
||||||
|
build_password: password
|
||||||
|
root_vhost_exchange_name: rootvhost
|
||||||
|
erlang_cookie: secretcookie
|
||||||
|
build_vhost_name: pipelines
|
||||||
|
root_vhost_name: pipelinesRoot
|
||||||
|
protocol: amqp
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm upgrade --install pipelines --namespace pipelines center/jfrog/pipelines -f values-external-rabbitmq.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using Vault in Production environments
|
||||||
|
To use vault securely you must set the disablemlock setting in the values.yaml to false as per the Hashicorp Vault recommendations here:
|
||||||
|
|
||||||
|
https://www.vaultproject.io/docs/configuration#disable_mlock
|
||||||
|
|
||||||
|
For non-prod environments it is acceptable to leave this value set to true.
|
||||||
|
|
||||||
|
Note however this does enable a potential security issue where encrypted credentials could potentially be swapped onto an unencrypted disk.
|
||||||
|
|
||||||
|
For this reason we recommend you always set this value to false to ensure mlock is enabled.
|
||||||
|
|
||||||
|
Non-Prod environments:
|
||||||
|
|
||||||
|
````
|
||||||
|
vault:
|
||||||
|
disablemlock: true
|
||||||
|
````
|
||||||
|
|
||||||
|
Production environments:
|
||||||
|
|
||||||
|
````
|
||||||
|
vault:
|
||||||
|
disablemlock: false
|
||||||
|
````
|
||||||
|
|
||||||
|
### Status
|
||||||
|
|
||||||
|
See the status of deployed **helm** release:
|
||||||
|
|
||||||
|
With Helm v2:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm status pipelines
|
||||||
|
```
|
||||||
|
|
||||||
|
With Helm v3:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm status pipelines --namespace pipelines
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pipelines Version
|
||||||
|
- By default, the pipelines images will use the value `appVersion` in the Chart.yml. This can be over-ridden by adding `version` to the pipelines section of the values.yml
|
||||||
|
|
||||||
|
### Build Plane
|
||||||
|
|
||||||
|
#### Build Plane with static and dynamic node-pool VMs
|
||||||
|
|
||||||
|
To start using Pipelines you need to setup a Build Plane:
|
||||||
|
- For Static VMs Node-pool setup, please read [Managing Node Pools](https://www.jfrog.com/confluence/display/JFROG/Managing+Pipelines+Node+Pools#ManagingPipelinesNodePools-static-node-poolsAdministeringStaticNodePools).
|
||||||
|
|
||||||
|
- For Dynamic VMs Node-pool setup, please read [Managing Dynamic Node Pools](https://www.jfrog.com/confluence/display/JFROG/Managing+Pipelines+Node+Pools#ManagingPipelinesNodePools-dynamic-node-poolsAdministeringDynamicNodePools).
|
||||||
|
|
||||||
|
- For Kubernetes Node-pool setup, please read [Managing Dynamic Node Pools](https://www.jfrog.com/confluence/display/JFROG/Managing+Pipelines+Node+Pools#ManagingPipelinesNodePools-dynamic-node-poolsAdministeringDynamicNodePools).
|
||||||
|
|
||||||
|
|
||||||
|
## Useful links
|
||||||
|
|
||||||
|
- https://www.jfrog.com/confluence/display/JFROG/Pipelines+Quickstart
|
||||||
|
- https://www.jfrog.com/confluence/display/JFROG/Using+Pipelines
|
||||||
|
- https://www.jfrog.com/confluence/display/JFROG/Managing+Runtimes
|
||||||
@@ -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,22 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
appVersion: 11.7.0
|
||||||
|
description: Chart for PostgreSQL, an object-relational database management system
|
||||||
|
(ORDBMS) with an emphasis on extensibility and on standards-compliance.
|
||||||
|
home: https://www.postgresql.org/
|
||||||
|
icon: https://bitnami.com/assets/stacks/postgresql/img/postgresql-stack-110x117.png
|
||||||
|
keywords:
|
||||||
|
- postgresql
|
||||||
|
- postgres
|
||||||
|
- database
|
||||||
|
- sql
|
||||||
|
- replication
|
||||||
|
- cluster
|
||||||
|
maintainers:
|
||||||
|
- email: containers@bitnami.com
|
||||||
|
name: Bitnami
|
||||||
|
- email: cedric@desaintmartin.fr
|
||||||
|
name: desaintmartin
|
||||||
|
name: postgresql
|
||||||
|
sources:
|
||||||
|
- https://github.com/bitnami/bitnami-docker-postgresql
|
||||||
|
version: 8.7.3
|
||||||
@@ -0,0 +1,576 @@
|
|||||||
|
# PostgreSQL
|
||||||
|
|
||||||
|
[PostgreSQL](https://www.postgresql.org/) is an object-relational database management system (ORDBMS) with an emphasis on extensibility and on standards-compliance.
|
||||||
|
|
||||||
|
For HA, please see [this repo](https://github.com/bitnami/charts/tree/master/bitnami/postgresql-ha)
|
||||||
|
|
||||||
|
## TL;DR;
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||||
|
$ helm install my-release bitnami/postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This chart bootstraps a [PostgreSQL](https://github.com/bitnami/bitnami-docker-postgresql) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
|
||||||
|
|
||||||
|
Bitnami charts can be used with [Kubeapps](https://kubeapps.com/) for deployment and management of Helm Charts in clusters. This chart has been tested to work with NGINX Ingress, cert-manager, fluentd and Prometheus on top of the [BKPR](https://kubeprod.io/).
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Kubernetes 1.12+
|
||||||
|
- Helm 2.11+ or Helm 3.0-beta3+
|
||||||
|
- PV provisioner support in the underlying infrastructure
|
||||||
|
|
||||||
|
## Installing the Chart
|
||||||
|
To install the chart with the release name `my-release`:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm install my-release bitnami/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 associated with the chart and deletes the release.
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
The following tables lists the configurable parameters of the PostgreSQL chart and their default values.
|
||||||
|
|
||||||
|
| Parameter | Description | Default |
|
||||||
|
|-----------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------|
|
||||||
|
| `global.imageRegistry` | Global Docker Image registry | `nil` |
|
||||||
|
| `global.postgresql.postgresqlDatabase` | PostgreSQL database (overrides `postgresqlDatabase`) | `nil` |
|
||||||
|
| `global.postgresql.postgresqlUsername` | PostgreSQL username (overrides `postgresqlUsername`) | `nil` |
|
||||||
|
| `global.postgresql.existingSecret` | Name of existing secret to use for PostgreSQL passwords (overrides `existingSecret`) | `nil` |
|
||||||
|
| `global.postgresql.postgresqlPassword` | PostgreSQL admin password (overrides `postgresqlPassword`) | `nil` |
|
||||||
|
| `global.postgresql.servicePort` | PostgreSQL port (overrides `service.port`) | `nil` |
|
||||||
|
| `global.postgresql.replicationPassword` | Replication user password (overrides `replication.password`) | `nil` |
|
||||||
|
| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` (does not add image pull secrets to deployed pods) |
|
||||||
|
| `global.storageClass` | Global storage class for dynamic provisioning | `nil` |
|
||||||
|
| `image.registry` | PostgreSQL Image registry | `docker.io` |
|
||||||
|
| `image.repository` | PostgreSQL Image name | `bitnami/postgresql` |
|
||||||
|
| `image.tag` | PostgreSQL Image tag | `{TAG_NAME}` |
|
||||||
|
| `image.pullPolicy` | PostgreSQL Image pull policy | `IfNotPresent` |
|
||||||
|
| `image.pullSecrets` | Specify Image pull secrets | `nil` (does not add image pull secrets to deployed pods) |
|
||||||
|
| `image.debug` | Specify if debug values should be set | `false` |
|
||||||
|
| `nameOverride` | String to partially override postgresql.fullname template with a string (will prepend the release name) | `nil` |
|
||||||
|
| `fullnameOverride` | String to fully override postgresql.fullname template with a string | `nil` |
|
||||||
|
| `volumePermissions.enabled` | Enable init container that changes volume permissions in the data directory (for cases where the default k8s `runAsUser` and `fsUser` values do not work) | `false` |
|
||||||
|
| `volumePermissions.image.registry` | Init container volume-permissions image registry | `docker.io` |
|
||||||
|
| `volumePermissions.image.repository` | Init container volume-permissions image name | `bitnami/minideb` |
|
||||||
|
| `volumePermissions.image.tag` | Init container volume-permissions image tag | `buster` |
|
||||||
|
| `volumePermissions.image.pullPolicy` | Init container volume-permissions image pull policy | `Always` |
|
||||||
|
| `volumePermissions.securityContext.runAsUser` | User ID for the init container (when facing issues in OpenShift or uid unknown, try value "auto") | `0` |
|
||||||
|
| `usePasswordFile` | Have the secrets mounted as a file instead of env vars | `false` |
|
||||||
|
| `ldap.enabled` | Enable LDAP support | `false` |
|
||||||
|
| `ldap.existingSecret` | Name of existing secret to use for LDAP passwords | `nil` |
|
||||||
|
| `ldap.url` | LDAP URL beginning in the form `ldap[s]://host[:port]/basedn[?[attribute][?[scope][?[filter]]]]` | `nil` |
|
||||||
|
| `ldap.server` | IP address or name of the LDAP server. | `nil` |
|
||||||
|
| `ldap.port` | Port number on the LDAP server to connect to | `nil` |
|
||||||
|
| `ldap.scheme` | Set to `ldaps` to use LDAPS. | `nil` |
|
||||||
|
| `ldap.tls` | Set to `1` to use TLS encryption | `nil` |
|
||||||
|
| `ldap.prefix` | String to prepend to the user name when forming the DN to bind | `nil` |
|
||||||
|
| `ldap.suffix` | String to append to the user name when forming the DN to bind | `nil` |
|
||||||
|
| `ldap.search_attr` | Attribute to match agains the user name in the search | `nil` |
|
||||||
|
| `ldap.search_filter` | The search filter to use when doing search+bind authentication | `nil` |
|
||||||
|
| `ldap.baseDN` | Root DN to begin the search for the user in | `nil` |
|
||||||
|
| `ldap.bindDN` | DN of user to bind to LDAP | `nil` |
|
||||||
|
| `ldap.bind_password` | Password for the user to bind to LDAP | `nil` |
|
||||||
|
| `replication.enabled` | Enable replication | `false` |
|
||||||
|
| `replication.user` | Replication user | `repl_user` |
|
||||||
|
| `replication.password` | Replication user password | `repl_password` |
|
||||||
|
| `replication.slaveReplicas` | Number of slaves replicas | `1` |
|
||||||
|
| `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 `replication.slaveReplicas`. | `0` |
|
||||||
|
| `replication.applicationName` | Cluster application name. Useful for advanced replication settings | `my_application` |
|
||||||
|
| `existingSecret` | Name of existing secret to use for PostgreSQL passwords. The secret has to contain the keys `postgresql-postgres-password` which is the password for `postgresqlUsername` when it is different of `postgres`, `postgresql-password` which will override `postgresqlPassword`, `postgresql-replication-password` which will override `replication.password` and `postgresql-ldap-password` which will be sed to authenticate on LDAP. The value is evaluated as a template. | `nil` |
|
||||||
|
| `postgresqlPostgresPassword` | PostgreSQL admin password (used when `postgresqlUsername` is not `postgres`) | _random 10 character alphanumeric string_ |
|
||||||
|
| `postgresqlUsername` | PostgreSQL admin user | `postgres` |
|
||||||
|
| `postgresqlPassword` | PostgreSQL admin password | _random 10 character alphanumeric string_ |
|
||||||
|
| `postgresqlDatabase` | PostgreSQL database | `nil` |
|
||||||
|
| `postgresqlDataDir` | PostgreSQL data dir folder | `/bitnami/postgresql` (same value as persistence.mountPath) |
|
||||||
|
| `extraEnv` | Any extra environment variables you would like to pass on to the pod. The value is evaluated as a template. | `[]` |
|
||||||
|
| `extraEnvVarsCM` | Name of a Config Map containing extra environment variables you would like to pass on to the pod. The value is evaluated as a template. | `nil` |
|
||||||
|
| `postgresqlInitdbArgs` | PostgreSQL initdb extra arguments | `nil` |
|
||||||
|
| `postgresqlInitdbWalDir` | PostgreSQL location for transaction log | `nil` |
|
||||||
|
| `postgresqlConfiguration` | Runtime Config Parameters | `nil` |
|
||||||
|
| `postgresqlExtendedConf` | Extended Runtime Config Parameters (appended to main or default configuration) | `nil` |
|
||||||
|
| `pgHbaConfiguration` | Content of pg_hba.conf | `nil (do not create pg_hba.conf)` |
|
||||||
|
| `configurationConfigMap` | ConfigMap with the PostgreSQL configuration files (Note: Overrides `postgresqlConfiguration` and `pgHbaConfiguration`). The value is evaluated as a template. | `nil` |
|
||||||
|
| `extendedConfConfigMap` | ConfigMap with the extended PostgreSQL configuration files. The value is evaluated as a template. | `nil` |
|
||||||
|
| `initdbScripts` | Dictionary of initdb scripts | `nil` |
|
||||||
|
| `initdbUser` | PostgreSQL user to execute the .sql and sql.gz scripts | `nil` |
|
||||||
|
| `initdbPassword` | Password for the user specified in `initdbUser` | `nil` |
|
||||||
|
| `initdbScriptsConfigMap` | ConfigMap with the initdb scripts (Note: Overrides `initdbScripts`). The value is evaluated as a template. | `nil` |
|
||||||
|
| `initdbScriptsSecret` | Secret with initdb scripts that contain sensitive information (Note: can be used with `initdbScriptsConfigMap` or `initdbScripts`). The value is evaluated as a template. | `nil` |
|
||||||
|
| `service.type` | Kubernetes Service type | `ClusterIP` |
|
||||||
|
| `service.port` | PostgreSQL port | `5432` |
|
||||||
|
| `service.nodePort` | Kubernetes Service nodePort | `nil` |
|
||||||
|
| `service.annotations` | Annotations for PostgreSQL service | `{}` (evaluated as a template) |
|
||||||
|
| `service.loadBalancerIP` | loadBalancerIP if service type is `LoadBalancer` | `nil` |
|
||||||
|
| `service.loadBalancerSourceRanges` | Address that are allowed when svc is LoadBalancer | `[]` (evaluated as a template) |
|
||||||
|
| `schedulerName` | Name of the k8s scheduler (other than default) | `nil` |
|
||||||
|
| `shmVolume.enabled` | Enable emptyDir volume for /dev/shm for master and slave(s) Pod(s) | `true` |
|
||||||
|
| `shmVolume.chmod.enabled` | Run at init chmod 777 of the /dev/shm (ignored if `volumePermissions.enabled` is `false`) | `true` |
|
||||||
|
| `persistence.enabled` | Enable persistence using PVC | `true` |
|
||||||
|
| `persistence.existingClaim` | Provide an existing `PersistentVolumeClaim`, the value is evaluated as a template. | `nil` |
|
||||||
|
| `persistence.mountPath` | Path to mount the volume at | `/bitnami/postgresql` |
|
||||||
|
| `persistence.subPath` | Subdirectory of the volume to mount at | `""` |
|
||||||
|
| `persistence.storageClass` | PVC Storage Class for PostgreSQL volume | `nil` |
|
||||||
|
| `persistence.accessModes` | PVC Access Mode for PostgreSQL volume | `[ReadWriteOnce]` |
|
||||||
|
| `persistence.size` | PVC Storage Request for PostgreSQL volume | `8Gi` |
|
||||||
|
| `persistence.annotations` | Annotations for the PVC | `{}` |
|
||||||
|
| `master.nodeSelector` | Node labels for pod assignment (postgresql master) | `{}` |
|
||||||
|
| `master.affinity` | Affinity labels for pod assignment (postgresql master) | `{}` |
|
||||||
|
| `master.tolerations` | Toleration labels for pod assignment (postgresql master) | `[]` |
|
||||||
|
| `master.anotations` | Map of annotations to add to the statefulset (postgresql master) | `{}` |
|
||||||
|
| `master.labels` | Map of labels to add to the statefulset (postgresql master) | `{}` |
|
||||||
|
| `master.podAnnotations` | Map of annotations to add to the pods (postgresql master) | `{}` |
|
||||||
|
| `master.podLabels` | Map of labels to add to the pods (postgresql master) | `{}` |
|
||||||
|
| `master.priorityClassName` | Priority Class to use for each pod (postgresql master) | `nil` |
|
||||||
|
| `master.extraInitContainers` | Additional init containers to add to the pods (postgresql master) | `[]` |
|
||||||
|
| `master.extraVolumeMounts` | Additional volume mounts to add to the pods (postgresql master) | `[]` |
|
||||||
|
| `master.extraVolumes` | Additional volumes to add to the pods (postgresql master) | `[]` |
|
||||||
|
| `master.sidecars` | Add additional containers to the pod | `[]` |
|
||||||
|
| `master.service.type` | Allows using a different service type for Master | `nil` |
|
||||||
|
| `master.service.nodePort` | Allows using a different nodePort for Master | `nil` |
|
||||||
|
| `master.service.clusterIP` | Allows using a different clusterIP for Master | `nil` |
|
||||||
|
| `slave.nodeSelector` | Node labels for pod assignment (postgresql slave) | `{}` |
|
||||||
|
| `slave.affinity` | Affinity labels for pod assignment (postgresql slave) | `{}` |
|
||||||
|
| `slave.tolerations` | Toleration labels for pod assignment (postgresql slave) | `[]` |
|
||||||
|
| `slave.anotations` | Map of annotations to add to the statefulsets (postgresql slave) | `{}` |
|
||||||
|
| `slave.labels` | Map of labels to add to the statefulsets (postgresql slave) | `{}` |
|
||||||
|
| `slave.podAnnotations` | Map of annotations to add to the pods (postgresql slave) | `{}` |
|
||||||
|
| `slave.podLabels` | Map of labels to add to the pods (postgresql slave) | `{}` |
|
||||||
|
| `slave.priorityClassName` | Priority Class to use for each pod (postgresql slave) | `nil` |
|
||||||
|
| `slave.extraInitContainers` | Additional init containers to add to the pods (postgresql slave) | `[]` |
|
||||||
|
| `slave.extraVolumeMounts` | Additional volume mounts to add to the pods (postgresql slave) | `[]` |
|
||||||
|
| `slave.extraVolumes` | Additional volumes to add to the pods (postgresql slave) | `[]` |
|
||||||
|
| `slave.sidecars` | Add additional containers to the pod | `[]` |
|
||||||
|
| `slave.service.type` | Allows using a different service type for Slave | `nil` |
|
||||||
|
| `slave.service.nodePort` | Allows using a different nodePort for Slave | `nil` |
|
||||||
|
| `slave.service.clusterIP` | Allows using a different clusterIP for Slave | `nil` |
|
||||||
|
| `terminationGracePeriodSeconds` | Seconds the pod needs to terminate gracefully | `nil` |
|
||||||
|
| `resources` | CPU/Memory resource requests/limits | Memory: `256Mi`, CPU: `250m` |
|
||||||
|
| `securityContext.enabled` | Enable security context | `true` |
|
||||||
|
| `securityContext.fsGroup` | Group ID for the container | `1001` |
|
||||||
|
| `securityContext.runAsUser` | User ID for the container | `1001` |
|
||||||
|
| `serviceAccount.enabled` | Enable service account (Note: Service Account will only be automatically created if `serviceAccount.name` is not set) | `false` |
|
||||||
|
| `serviceAcccount.name` | Name of existing service account | `nil` |
|
||||||
|
| `livenessProbe.enabled` | Would you like a livenessProbe to be enabled | `true` |
|
||||||
|
| `networkPolicy.enabled` | Enable NetworkPolicy | `false` |
|
||||||
|
| `networkPolicy.allowExternal` | Don't require client label for connections | `true` |
|
||||||
|
| `networkPolicy.explicitNamespacesSelector` | A Kubernetes LabelSelector to explicitly select namespaces from which ingress traffic could be allowed | `{}` |
|
||||||
|
| `livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | 30 |
|
||||||
|
| `livenessProbe.periodSeconds` | How often to perform the probe | 10 |
|
||||||
|
| `livenessProbe.timeoutSeconds` | When the probe times out | 5 |
|
||||||
|
| `livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 6 |
|
||||||
|
| `livenessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed | 1 |
|
||||||
|
| `readinessProbe.enabled` | would you like a readinessProbe to be enabled | `true` |
|
||||||
|
| `readinessProbe.initialDelaySeconds` | Delay before readiness probe is initiated | 5 |
|
||||||
|
| `readinessProbe.periodSeconds` | How often to perform the probe | 10 |
|
||||||
|
| `readinessProbe.timeoutSeconds` | When the probe times out | 5 |
|
||||||
|
| `readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 6 |
|
||||||
|
| `readinessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed | 1 |
|
||||||
|
| `metrics.enabled` | Start a prometheus exporter | `false` |
|
||||||
|
| `metrics.service.type` | Kubernetes Service type | `ClusterIP` |
|
||||||
|
| `service.clusterIP` | Static clusterIP or None for headless services | `nil` |
|
||||||
|
| `metrics.service.annotations` | Additional annotations for metrics exporter pod | `{ prometheus.io/scrape: "true", prometheus.io/port: "9187"}` |
|
||||||
|
| `metrics.service.loadBalancerIP` | loadBalancerIP if redis metrics service type is `LoadBalancer` | `nil` |
|
||||||
|
| `metrics.serviceMonitor.enabled` | Set this to `true` to create ServiceMonitor for Prometheus operator | `false` |
|
||||||
|
| `metrics.serviceMonitor.additionalLabels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}` |
|
||||||
|
| `metrics.serviceMonitor.namespace` | Optional namespace in which to create ServiceMonitor | `nil` |
|
||||||
|
| `metrics.serviceMonitor.interval` | Scrape interval. If not set, the Prometheus default scrape interval is used | `nil` |
|
||||||
|
| `metrics.serviceMonitor.scrapeTimeout` | Scrape timeout. If not set, the Prometheus default scrape timeout is used | `nil` |
|
||||||
|
| `metrics.prometheusRule.enabled` | Set this to true to create prometheusRules for Prometheus operator | `false` |
|
||||||
|
| `metrics.prometheusRule.additionalLabels` | Additional labels that can be used so prometheusRules will be discovered by Prometheus | `{}` |
|
||||||
|
| `metrics.prometheusRule.namespace` | namespace where prometheusRules resource should be created | the same namespace as postgresql |
|
||||||
|
| `metrics.prometheusRule.rules` | [rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) to be created, check values for an example. | `[]` |
|
||||||
|
| `metrics.image.registry` | PostgreSQL Image registry | `docker.io` |
|
||||||
|
| `metrics.image.repository` | PostgreSQL Image name | `bitnami/postgres-exporter` |
|
||||||
|
| `metrics.image.tag` | PostgreSQL Image tag | `{TAG_NAME}` |
|
||||||
|
| `metrics.image.pullPolicy` | PostgreSQL Image pull policy | `IfNotPresent` |
|
||||||
|
| `metrics.image.pullSecrets` | Specify Image pull secrets | `nil` (does not add image pull secrets to deployed pods) |
|
||||||
|
| `metrics.customMetrics` | Additional custom metrics | `nil` |
|
||||||
|
| `metrics.securityContext.enabled` | Enable security context for metrics | `false` |
|
||||||
|
| `metrics.securityContext.runAsUser` | User ID for the container for metrics | `1001` |
|
||||||
|
| `metrics.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | 30 |
|
||||||
|
| `metrics.livenessProbe.periodSeconds` | How often to perform the probe | 10 |
|
||||||
|
| `metrics.livenessProbe.timeoutSeconds` | When the probe times out | 5 |
|
||||||
|
| `metrics.livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 6 |
|
||||||
|
| `metrics.livenessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed | 1 |
|
||||||
|
| `metrics.readinessProbe.enabled` | would you like a readinessProbe to be enabled | `true` |
|
||||||
|
| `metrics.readinessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | 5 |
|
||||||
|
| `metrics.readinessProbe.periodSeconds` | How often to perform the probe | 10 |
|
||||||
|
| `metrics.readinessProbe.timeoutSeconds` | When the probe times out | 5 |
|
||||||
|
| `metrics.readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 6 |
|
||||||
|
| `metrics.readinessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed | 1 |
|
||||||
|
| `updateStrategy` | Update strategy policy | `{type: "RollingUpdate"}` |
|
||||||
|
|
||||||
|
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm install my-release \
|
||||||
|
--set postgresqlPassword=secretpassword,postgresqlDatabase=my-database \
|
||||||
|
bitnami/postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
The above command sets the PostgreSQL `postgres` account password to `secretpassword`. Additionally it creates a database named `my-database`.
|
||||||
|
|
||||||
|
Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm install my-release -f values.yaml bitnami/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.
|
||||||
|
|
||||||
|
### Production configuration and horizontal scaling
|
||||||
|
|
||||||
|
This chart includes a `values-production.yaml` file where you can find some parameters oriented to production configuration in comparison to the regular `values.yaml`. You can use this file instead of the default one.
|
||||||
|
|
||||||
|
- Enable replication:
|
||||||
|
```diff
|
||||||
|
- replication.enabled: false
|
||||||
|
+ replication.enabled: true
|
||||||
|
```
|
||||||
|
|
||||||
|
- Number of slaves replicas:
|
||||||
|
```diff
|
||||||
|
- replication.slaveReplicas: 1
|
||||||
|
+ replication.slaveReplicas: 2
|
||||||
|
```
|
||||||
|
|
||||||
|
- Set synchronous commit mode:
|
||||||
|
```diff
|
||||||
|
- replication.synchronousCommit: "off"
|
||||||
|
+ replication.synchronousCommit: "on"
|
||||||
|
```
|
||||||
|
|
||||||
|
- Number of replicas that will have synchronous replication:
|
||||||
|
```diff
|
||||||
|
- replication.numSynchronousReplicas: 0
|
||||||
|
+ replication.numSynchronousReplicas: 1
|
||||||
|
```
|
||||||
|
|
||||||
|
- Start a prometheus exporter:
|
||||||
|
```diff
|
||||||
|
- metrics.enabled: false
|
||||||
|
+ metrics.enabled: true
|
||||||
|
```
|
||||||
|
|
||||||
|
To horizontally scale this chart, you can use the `--replicas` flag to modify the number of nodes in your PostgreSQL deployment. Also you can use the `values-production.yaml` file or modify the parameters shown above.
|
||||||
|
|
||||||
|
### Customizing Master and Slave services in a replicated configuration
|
||||||
|
|
||||||
|
At the top level, there is a service object which defines the services for both master and slave. For deeper customization, there are service objects for both the master and slave types individually. This allows you to override the values in the top level service object so that the master and slave can be of different service types and with different clusterIPs / nodePorts. Also in the case you want the master and slave 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 master.service or slave.service objects will take precedence over the top level service object.
|
||||||
|
|
||||||
|
### Change PostgreSQL version
|
||||||
|
|
||||||
|
To modify the PostgreSQL version used in this chart you can specify a [valid image tag](https://hub.docker.com/r/bitnami/postgresql/tags/) using the `image.tag` parameter. For example, `image.tag=12.0.0`
|
||||||
|
|
||||||
|
### postgresql.conf / pg_hba.conf files as configMap
|
||||||
|
|
||||||
|
This helm chart also supports to customize the whole configuration file.
|
||||||
|
|
||||||
|
Add your custom file to "files/postgresql.conf" in your working directory. This file will be mounted as configMap to the containers and it will be used for configuring the PostgreSQL server.
|
||||||
|
|
||||||
|
Alternatively, you can specify PostgreSQL configuration parameters using the `postgresqlConfiguration` parameter as a dict, using camelCase, e.g. {"sharedBuffers": "500MB"}.
|
||||||
|
|
||||||
|
In addition to these options, you can also set an external ConfigMap with all the configuration files. This is done by setting the `configurationConfigMap` parameter. Note that this will override the two previous options.
|
||||||
|
|
||||||
|
### Allow settings to be loaded from files other than the default `postgresql.conf`
|
||||||
|
|
||||||
|
If you don't want to provide the whole PostgreSQL configuration file and only specify certain parameters, you can add your extended `.conf` files to "files/conf.d/" in your working directory.
|
||||||
|
Those files will be mounted as configMap to the containers adding/overwriting the default configuration using the `include_dir` directive that allows settings to be loaded from files other than the default `postgresql.conf`.
|
||||||
|
|
||||||
|
Alternatively, you can also set an external ConfigMap with all the extra configuration files. This is done by setting the `extendedConfConfigMap` parameter. Note that this will override the previous option.
|
||||||
|
|
||||||
|
### Initialize a fresh instance
|
||||||
|
|
||||||
|
The [Bitnami PostgreSQL](https://github.com/bitnami/bitnami-docker-postgresql) image allows you to use your custom scripts to initialize a fresh instance. In order to execute the scripts, they must be located inside the chart folder `files/docker-entrypoint-initdb.d` so they can be consumed as a ConfigMap.
|
||||||
|
|
||||||
|
Alternatively, you can specify custom scripts using the `initdbScripts` parameter as dict.
|
||||||
|
|
||||||
|
In addition to these options, you can also set an external ConfigMap with all the initialization scripts. This is done by setting the `initdbScriptsConfigMap` 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 `initdbScriptsSecret` parameter.
|
||||||
|
|
||||||
|
The allowed extensions are `.sh`, `.sql` and `.sql.gz`.
|
||||||
|
|
||||||
|
### 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 master
|
||||||
|
master:
|
||||||
|
sidecars:
|
||||||
|
- name: your-image-name
|
||||||
|
image: your-image
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- name: portname
|
||||||
|
containerPort: 1234
|
||||||
|
# For the PostgreSQL replicas
|
||||||
|
slave:
|
||||||
|
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.postgresqlPassword=testtest
|
||||||
|
subchart1.postgresql.postgresqlPassword=testtest
|
||||||
|
subchart2.postgresql.postgresqlPassword=testtest
|
||||||
|
postgresql.postgresqlDatabase=db1
|
||||||
|
subchart1.postgresql.postgresqlDatabase=db1
|
||||||
|
subchart2.postgresql.postgresqlDatabase=db1
|
||||||
|
```
|
||||||
|
|
||||||
|
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.postgresqlPassword=testtest
|
||||||
|
global.postgresql.postgresqlDatabase=db1
|
||||||
|
```
|
||||||
|
|
||||||
|
This way, the credentials will be available in all of the subcharts.
|
||||||
|
|
||||||
|
## Persistence
|
||||||
|
|
||||||
|
The [Bitnami PostgreSQL](https://github.com/bitnami/bitnami-docker-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 [code](https://github.com/bitnami/bitnami-docker-postgresql/blob/8725fe1d7d30ebe8d9a16e9175d05f7ad9260c93/9.6/debian-9/rootfs/libpostgresql.sh#L518-L556). 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:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ 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,shmVolume.chmod.enabled=false
|
||||||
|
|
||||||
|
### Deploy chart using Docker Official PostgreSQL Image
|
||||||
|
|
||||||
|
From chart version 4.0.0, it is possible to use this chart with the Docker Official PostgreSQL image.
|
||||||
|
Besides specifying the new Docker repository and tag, it is important to modify the PostgreSQL data directory and volume mount point. Basically, the PostgreSQL data dir cannot be the mount point directly, it has to be a subdirectory.
|
||||||
|
|
||||||
|
```
|
||||||
|
image.repository=postgres
|
||||||
|
image.tag=10.6
|
||||||
|
postgresqlDataDir=/data/pgdata
|
||||||
|
persistence.mountPath=/data/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Upgrade
|
||||||
|
|
||||||
|
It's necessary to specify the existing passwords while performing an upgrade to ensure the secrets are not updated with invalid randomly generated passwords. Remember to specify the existing values of the `postgresqlPassword` and `replication.password` parameters when upgrading the chart:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm upgrade my-release stable/postgresql \
|
||||||
|
--set postgresqlPassword=[POSTGRESQL_PASSWORD] \
|
||||||
|
--set replication.password=[REPLICATION_PASSWORD]
|
||||||
|
```
|
||||||
|
|
||||||
|
> Note: you need to substitute the placeholders _[POSTGRESQL_PASSWORD]_, and _[REPLICATION_PASSWORD]_ with the values obtained from instructions in the installation notes.
|
||||||
|
|
||||||
|
## 8.0.0
|
||||||
|
|
||||||
|
Prefixes the port names with their protocols to comply with Istio conventions.
|
||||||
|
|
||||||
|
If you depend on the port names in your setup, make sure to update them to reflect this change.
|
||||||
|
|
||||||
|
## 7.1.0
|
||||||
|
|
||||||
|
Adds support for LDAP configuration.
|
||||||
|
|
||||||
|
## 7.0.0
|
||||||
|
|
||||||
|
Helm performs a lookup for the object based on its group (apps), version (v1), and kind (Deployment). Also known as its GroupVersionKind, or GVK. Changing the GVK is considered a compatibility breaker from Kubernetes' point of view, so you cannot "upgrade" those objects to the new GVK in-place. Earlier versions of Helm 3 did not perform the lookup correctly which has since been fixed to match the spec.
|
||||||
|
|
||||||
|
In https://github.com/helm/charts/pull/17281 the `apiVersion` of the statefulset resources was updated to `apps/v1` in tune with the api's deprecated, resulting in compatibility breakage.
|
||||||
|
|
||||||
|
This major version bump signifies this change.
|
||||||
|
|
||||||
|
## 6.5.7
|
||||||
|
|
||||||
|
In this version, the chart will use PostgreSQL with the Postgis extension included. The version used with Postgresql version 10, 11 and 12 is Postgis 2.5. It has been compiled with the following dependencies:
|
||||||
|
|
||||||
|
- protobuf
|
||||||
|
- protobuf-c
|
||||||
|
- json-c
|
||||||
|
- geos
|
||||||
|
- proj
|
||||||
|
|
||||||
|
## 5.0.0
|
||||||
|
|
||||||
|
In this version, the **chart is using PostgreSQL 11 instead of PostgreSQL 10**. You can find the main difference and notable changes in the following links: [https://www.postgresql.org/about/news/1894/](https://www.postgresql.org/about/news/1894/) and [https://www.postgresql.org/about/featurematrix/](https://www.postgresql.org/about/featurematrix/).
|
||||||
|
|
||||||
|
For major releases of PostgreSQL, the internal data storage format is subject to change, thus complicating upgrades, you can see some errors like the following one in the logs:
|
||||||
|
|
||||||
|
```console
|
||||||
|
Welcome to the Bitnami postgresql container
|
||||||
|
Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-postgresql
|
||||||
|
Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-postgresql/issues
|
||||||
|
Send us your feedback at containers@bitnami.com
|
||||||
|
|
||||||
|
INFO ==> ** Starting PostgreSQL setup **
|
||||||
|
NFO ==> Validating settings in POSTGRESQL_* env vars..
|
||||||
|
INFO ==> Initializing PostgreSQL database...
|
||||||
|
INFO ==> postgresql.conf file not detected. Generating it...
|
||||||
|
INFO ==> pg_hba.conf file not detected. Generating it...
|
||||||
|
INFO ==> Deploying PostgreSQL with persisted data...
|
||||||
|
INFO ==> Configuring replication parameters
|
||||||
|
INFO ==> Loading custom scripts...
|
||||||
|
INFO ==> Enabling remote connections
|
||||||
|
INFO ==> Stopping PostgreSQL...
|
||||||
|
INFO ==> ** PostgreSQL setup finished! **
|
||||||
|
|
||||||
|
INFO ==> ** Starting PostgreSQL **
|
||||||
|
[1] FATAL: database files are incompatible with server
|
||||||
|
[1] DETAIL: The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 11.3.
|
||||||
|
```
|
||||||
|
|
||||||
|
In this case, you should migrate the data from the old chart to the new one following an approach similar to that described in [this section](https://www.postgresql.org/docs/current/upgrading.html#UPGRADING-VIA-PGDUMPALL) from the official documentation. Basically, create a database dump in the old chart, move and restore it in the new one.
|
||||||
|
|
||||||
|
### 4.0.0
|
||||||
|
|
||||||
|
This chart will use by default the Bitnami PostgreSQL container starting from version `10.7.0-r68`. This version moves the initialization logic from node.js to bash. This new version of the chart requires setting the `POSTGRES_PASSWORD` in the slaves as well, in order to properly configure the `pg_hba.conf` file. Users from previous versions of the chart are advised to upgrade immediately.
|
||||||
|
|
||||||
|
IMPORTANT: If you do not want to upgrade the chart version then make sure you use the `10.7.0-r68` version of the container. Otherwise, you will get this error
|
||||||
|
|
||||||
|
```
|
||||||
|
The POSTGRESQL_PASSWORD environment variable is empty or not set. Set the environment variable ALLOW_EMPTY_PASSWORD=yes to allow the container to be started with blank passwords. This is recommended only for development
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.0.0
|
||||||
|
|
||||||
|
This releases make it possible to specify different nodeSelector, affinity and tolerations for master and slave pods.
|
||||||
|
It also fixes an issue with `postgresql.master.fullname` helper template not obeying fullnameOverride.
|
||||||
|
|
||||||
|
#### Breaking changes
|
||||||
|
|
||||||
|
- `affinty` has been renamed to `master.affinity` and `slave.affinity`.
|
||||||
|
- `tolerations` has been renamed to `master.tolerations` and `slave.tolerations`.
|
||||||
|
- `nodeSelector` has been renamed to `master.nodeSelector` and `slave.nodeSelector`.
|
||||||
|
|
||||||
|
### 2.0.0
|
||||||
|
|
||||||
|
In order to upgrade from the `0.X.X` branch to `1.X.X`, you should follow the below steps:
|
||||||
|
|
||||||
|
- Obtain the service name (`SERVICE_NAME`) and password (`OLD_PASSWORD`) of the existing postgresql chart. You can find the instructions to obtain the password in the NOTES.txt, the service name can be obtained by running
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ kubectl get svc
|
||||||
|
```
|
||||||
|
|
||||||
|
- Install (not upgrade) the new version
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ helm repo update
|
||||||
|
$ helm install my-release bitnami/postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
- Connect to the new pod (you can obtain the name by running `kubectl get pods`):
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ kubectl exec -it NAME bash
|
||||||
|
```
|
||||||
|
|
||||||
|
- Once logged in, create a dump file from the previous database using `pg_dump`, for that we should connect to the previous postgresql chart:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ pg_dump -h SERVICE_NAME -U postgres DATABASE_NAME > /tmp/backup.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
After run above command you should be prompted for a password, this password is the previous chart password (`OLD_PASSWORD`).
|
||||||
|
This operation could take some time depending on the database size.
|
||||||
|
|
||||||
|
- Once you have the backup file, you can restore it with a command like the one below:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ psql -U postgres DATABASE_NAME < /tmp/backup.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
In this case, you are accessing to the local postgresql, so the password should be the new one (you can find it in NOTES.txt).
|
||||||
|
|
||||||
|
If you want to restore the database and the database schema does not exist, it is necessary to first follow the steps described below.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ psql -U postgres
|
||||||
|
postgres=# drop database DATABASE_NAME;
|
||||||
|
postgres=# create database DATABASE_NAME;
|
||||||
|
postgres=# create user USER_NAME;
|
||||||
|
postgres=# alter role USER_NAME with password 'BITNAMI_USER_PASSWORD';
|
||||||
|
postgres=# grant all privileges on database DATABASE_NAME to USER_NAME;
|
||||||
|
postgres=# alter database DATABASE_NAME owner to USER_NAME;
|
||||||
|
```
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Leave this file empty to ensure that CI runs builds against the default configuration in values.yaml.
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
shmVolume:
|
||||||
|
enabled: false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Copy here your postgresql.conf and/or pg_hba.conf files to use it as a config map.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
If you don't want to provide the whole configuration file and only specify certain parameters, you can copy here your extended `.conf` files.
|
||||||
|
These files will be injected as a config maps and add/overwrite the default configuration using the `include_dir` directive that allows settings to be loaded from files other than the default `postgresql.conf`.
|
||||||
|
|
||||||
|
More info in the [bitnami-docker-postgresql README](https://github.com/bitnami/bitnami-docker-postgresql#configuration-file).
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
You can copy here your custom `.sh`, `.sql` or `.sql.gz` file so they are executed during the first boot of the image.
|
||||||
|
|
||||||
|
More info in the [bitnami-docker-postgresql](https://github.com/bitnami/bitnami-docker-postgresql#initializing-a-new-instance) repository.
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
** Please be patient while the chart is being deployed **
|
||||||
|
|
||||||
|
PostgreSQL can be accessed via port {{ template "postgresql.port" . }} on the following DNS name from within your cluster:
|
||||||
|
|
||||||
|
{{ template "postgresql.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - Read/Write connection
|
||||||
|
{{- if .Values.replication.enabled }}
|
||||||
|
{{ template "postgresql.fullname" . }}-read.{{ .Release.Namespace }}.svc.cluster.local - Read only connection
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if and .Values.postgresqlPostgresPassword (not (eq .Values.postgresqlUsername "postgres")) }}
|
||||||
|
|
||||||
|
To get the password for "postgres" run:
|
||||||
|
|
||||||
|
export POSTGRES_ADMIN_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "postgresql.secretName" . }} -o jsonpath="{.data.postgresql-postgres-password}" | base64 --decode)
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
To get the password for "{{ template "postgresql.username" . }}" run:
|
||||||
|
|
||||||
|
export POSTGRES_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "postgresql.secretName" . }} -o jsonpath="{.data.postgresql-password}" | base64 --decode)
|
||||||
|
|
||||||
|
To connect to your database run the following command:
|
||||||
|
|
||||||
|
kubectl run {{ template "postgresql.fullname" . }}-client --rm --tty -i --restart='Never' --namespace {{ .Release.Namespace }} --image {{ template "postgresql.image" . }} --env="PGPASSWORD=$POSTGRES_PASSWORD" {{- if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }}
|
||||||
|
--labels="{{ template "postgresql.fullname" . }}-client=true" {{- end }} --command -- psql --host {{ template "postgresql.fullname" . }} -U {{ .Values.postgresqlUsername }} -d {{- if .Values.postgresqlDatabase }} {{ .Values.postgresqlDatabase }}{{- else }} postgres{{- end }} -p {{ template "postgresql.port" . }}
|
||||||
|
|
||||||
|
{{ if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }}
|
||||||
|
Note: Since NetworkPolicy is enabled, only pods with label {{ template "postgresql.fullname" . }}-client=true" will be able to connect to this PostgreSQL cluster.
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
To connect to your database from outside the cluster execute the following commands:
|
||||||
|
|
||||||
|
{{- if contains "NodePort" .Values.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 {{ template "postgresql.fullname" . }})
|
||||||
|
{{ if (include "postgresql.password" . ) }}PGPASSWORD="$POSTGRES_PASSWORD" {{ end }}psql --host $NODE_IP --port $NODE_PORT -U {{ .Values.postgresqlUsername }} -d {{- if .Values.postgresqlDatabase }} {{ .Values.postgresqlDatabase }}{{- else }} postgres{{- end }}
|
||||||
|
|
||||||
|
{{- else if contains "LoadBalancer" .Values.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 {{ template "postgresql.fullname" . }}'
|
||||||
|
|
||||||
|
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "postgresql.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||||
|
{{ if (include "postgresql.password" . ) }}PGPASSWORD="$POSTGRES_PASSWORD" {{ end }}psql --host $SERVICE_IP --port {{ template "postgresql.port" . }} -U {{ .Values.postgresqlUsername }} -d {{- if .Values.postgresqlDatabase }} {{ .Values.postgresqlDatabase }}{{- else }} postgres{{- end }}
|
||||||
|
|
||||||
|
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||||
|
|
||||||
|
kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ template "postgresql.fullname" . }} {{ template "postgresql.port" . }}:{{ template "postgresql.port" . }} &
|
||||||
|
{{ if (include "postgresql.password" . ) }}PGPASSWORD="$POSTGRES_PASSWORD" {{ end }}psql --host 127.0.0.1 -U {{ .Values.postgresqlUsername }} -d {{- if .Values.postgresqlDatabase }} {{ .Values.postgresqlDatabase }}{{- else }} postgres{{- end }} -p {{ template "postgresql.port" . }}
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- include "postgresql.validateValues" . -}}
|
||||||
|
|
||||||
|
{{- if and (contains "bitnami/" .Values.image.repository) (not (.Values.image.tag | toString | regexFind "-r\\d+$|sha256:")) }}
|
||||||
|
|
||||||
|
WARNING: Rolling tag detected ({{ .Values.image.repository }}:{{ .Values.image.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 }}
|
||||||
@@ -0,0 +1,420 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.name" -}}
|
||||||
|
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.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 app name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.master.fullname" -}}
|
||||||
|
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
||||||
|
{{- $fullname := default (printf "%s-%s" .Release.Name $name) .Values.fullnameOverride -}}
|
||||||
|
{{- if .Values.replication.enabled -}}
|
||||||
|
{{- printf "%s-%s" $fullname "master" | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s" $fullname | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for networkpolicy.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.networkPolicy.apiVersion" -}}
|
||||||
|
{{- if semverCompare ">=1.4-0, <1.7-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
"extensions/v1beta1"
|
||||||
|
{{- else if semverCompare "^1.7-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
"networking.k8s.io/v1"
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create chart name and version as used by the chart label.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.chart" -}}
|
||||||
|
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper PostgreSQL image name
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.image" -}}
|
||||||
|
{{- $registryName := .Values.image.registry -}}
|
||||||
|
{{- $repositoryName := .Values.image.repository -}}
|
||||||
|
{{- $tag := .Values.image.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return PostgreSQL postgres user password
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.postgres.password" -}}
|
||||||
|
{{- if .Values.global.postgresql.postgresqlPostgresPassword }}
|
||||||
|
{{- .Values.global.postgresql.postgresqlPostgresPassword -}}
|
||||||
|
{{- else if .Values.postgresqlPostgresPassword -}}
|
||||||
|
{{- .Values.postgresqlPostgresPassword -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- randAlphaNum 10 -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return PostgreSQL password
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.password" -}}
|
||||||
|
{{- if .Values.global.postgresql.postgresqlPassword }}
|
||||||
|
{{- .Values.global.postgresql.postgresqlPassword -}}
|
||||||
|
{{- else if .Values.postgresqlPassword -}}
|
||||||
|
{{- .Values.postgresqlPassword -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- randAlphaNum 10 -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return PostgreSQL replication password
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.replication.password" -}}
|
||||||
|
{{- if .Values.global.postgresql.replicationPassword }}
|
||||||
|
{{- .Values.global.postgresql.replicationPassword -}}
|
||||||
|
{{- else if .Values.replication.password -}}
|
||||||
|
{{- .Values.replication.password -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- randAlphaNum 10 -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return PostgreSQL username
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.username" -}}
|
||||||
|
{{- if .Values.global.postgresql.postgresqlUsername }}
|
||||||
|
{{- .Values.global.postgresql.postgresqlUsername -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .Values.postgresqlUsername -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return PostgreSQL replication username
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.replication.username" -}}
|
||||||
|
{{- if .Values.global.postgresql.replicationUser }}
|
||||||
|
{{- .Values.global.postgresql.replicationUser -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .Values.replication.user -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return PostgreSQL port
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.port" -}}
|
||||||
|
{{- if .Values.global.postgresql.servicePort }}
|
||||||
|
{{- .Values.global.postgresql.servicePort -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- .Values.service.port -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return PostgreSQL created database
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.database" -}}
|
||||||
|
{{- if .Values.global.postgresql.postgresqlDatabase }}
|
||||||
|
{{- .Values.global.postgresql.postgresqlDatabase -}}
|
||||||
|
{{- else if .Values.postgresqlDatabase -}}
|
||||||
|
{{- .Values.postgresqlDatabase -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper image name to change the volume permissions
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.volumePermissions.image" -}}
|
||||||
|
{{- $registryName := .Values.volumePermissions.image.registry -}}
|
||||||
|
{{- $repositoryName := .Values.volumePermissions.image.repository -}}
|
||||||
|
{{- $tag := .Values.volumePermissions.image.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper PostgreSQL metrics image name
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.metrics.image" -}}
|
||||||
|
{{- $registryName := default "docker.io" .Values.metrics.image.registry -}}
|
||||||
|
{{- $repositoryName := .Values.metrics.image.repository -}}
|
||||||
|
{{- $tag := default "latest" .Values.metrics.image.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the password secret.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.secretName" -}}
|
||||||
|
{{- if .Values.global.postgresql.existingSecret }}
|
||||||
|
{{- printf "%s" (tpl .Values.global.postgresql.existingSecret $) -}}
|
||||||
|
{{- else if .Values.existingSecret -}}
|
||||||
|
{{- printf "%s" (tpl .Values.existingSecret $) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s" (include "postgresql.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return true if a secret object should be created
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.createSecret" -}}
|
||||||
|
{{- if .Values.global.postgresql.existingSecret }}
|
||||||
|
{{- else if .Values.existingSecret -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- true -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the configuration ConfigMap name.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.configurationCM" -}}
|
||||||
|
{{- if .Values.configurationConfigMap -}}
|
||||||
|
{{- printf "%s" (tpl .Values.configurationConfigMap $) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s-configuration" (include "postgresql.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the extended configuration ConfigMap name.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.extendedConfigurationCM" -}}
|
||||||
|
{{- if .Values.extendedConfConfigMap -}}
|
||||||
|
{{- printf "%s" (tpl .Values.extendedConfConfigMap $) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s-extended-configuration" (include "postgresql.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the initialization scripts ConfigMap name.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.initdbScriptsCM" -}}
|
||||||
|
{{- if .Values.initdbScriptsConfigMap -}}
|
||||||
|
{{- printf "%s" (tpl .Values.initdbScriptsConfigMap $) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s-init-scripts" (include "postgresql.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the initialization scripts Secret name.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.initdbScriptsSecret" -}}
|
||||||
|
{{- printf "%s" (tpl .Values.initdbScriptsSecret $) -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the metrics ConfigMap name.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.metricsCM" -}}
|
||||||
|
{{- printf "%s-metrics" (include "postgresql.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Docker Image Registry Secret Names
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.imagePullSecrets" -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can not use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range .Values.global.imagePullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else if or .Values.image.pullSecrets .Values.metrics.image.pullSecrets .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range .Values.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.metrics.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else if or .Values.image.pullSecrets .Values.metrics.image.pullSecrets .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range .Values.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.metrics.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the readiness probe command
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.readinessProbeCommand" -}}
|
||||||
|
- |
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
exec pg_isready -U {{ include "postgresql.username" . | quote }} -d {{ (include "postgresql.database" .) | quote }} -h 127.0.0.1 -p {{ template "postgresql.port" . }}
|
||||||
|
{{- else }}
|
||||||
|
exec pg_isready -U {{ include "postgresql.username" . | quote }} -h 127.0.0.1 -p {{ template "postgresql.port" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if contains "bitnami/" .Values.image.repository }}
|
||||||
|
[ -f /opt/bitnami/postgresql/tmp/.initialized ] || [ -f /bitnami/postgresql/.initialized ]
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Storage Class
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.storageClass" -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global -}}
|
||||||
|
{{- if .Values.global.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.global.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.global.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- if .Values.persistence.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.persistence.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.persistence.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- if .Values.persistence.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.persistence.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.persistence.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Renders a value that contains template.
|
||||||
|
Usage:
|
||||||
|
{{ include "postgresql.tplValue" ( dict "value" .Values.path.to.the.Value "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.tplValue" -}}
|
||||||
|
{{- if typeIs "string" .value }}
|
||||||
|
{{- tpl .value .context }}
|
||||||
|
{{- else }}
|
||||||
|
{{- tpl (.value | toYaml) .context }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for statefulset.
|
||||||
|
*/}}
|
||||||
|
{{- define "postgresql.statefulset.apiVersion" -}}
|
||||||
|
{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
{{- print "apps/v1beta2" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "apps/v1" -}}
|
||||||
|
{{- 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 := 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 -}}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
{{ if and (or (.Files.Glob "files/postgresql.conf") (.Files.Glob "files/pg_hba.conf") .Values.postgresqlConfiguration .Values.pgHbaConfiguration) (not .Values.configurationConfigMap) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}-configuration
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
data:
|
||||||
|
{{- if (.Files.Glob "files/postgresql.conf") }}
|
||||||
|
{{ (.Files.Glob "files/postgresql.conf").AsConfig | indent 2 }}
|
||||||
|
{{- else if .Values.postgresqlConfiguration }}
|
||||||
|
postgresql.conf: |
|
||||||
|
{{- range $key, $value := default dict .Values.postgresqlConfiguration }}
|
||||||
|
{{ $key | snakecase }}={{ $value }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if (.Files.Glob "files/pg_hba.conf") }}
|
||||||
|
{{ (.Files.Glob "files/pg_hba.conf").AsConfig | indent 2 }}
|
||||||
|
{{- else if .Values.pgHbaConfiguration }}
|
||||||
|
pg_hba.conf: |
|
||||||
|
{{ .Values.pgHbaConfiguration | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{ end }}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{{- if and (or (.Files.Glob "files/conf.d/*.conf") .Values.postgresqlExtendedConf) (not .Values.extendedConfConfigMap)}}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}-extended-configuration
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
data:
|
||||||
|
{{- with .Files.Glob "files/conf.d/*.conf" }}
|
||||||
|
{{ .AsConfig | indent 2 }}
|
||||||
|
{{- end }}
|
||||||
|
{{ with .Values.postgresqlExtendedConf }}
|
||||||
|
override.conf: |
|
||||||
|
{{- range $key, $value := . }}
|
||||||
|
{{ $key | snakecase }}={{ $value }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{{- if and (or (.Files.Glob "files/docker-entrypoint-initdb.d/*.{sh,sql,sql.gz}") .Values.initdbScripts) (not .Values.initdbScriptsConfigMap) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}-init-scripts
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
{{- with .Files.Glob "files/docker-entrypoint-initdb.d/*.sql.gz" }}
|
||||||
|
binaryData:
|
||||||
|
{{- range $path, $bytes := . }}
|
||||||
|
{{ base $path }}: {{ $.Files.Get $path | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
data:
|
||||||
|
{{- with .Files.Glob "files/docker-entrypoint-initdb.d/*.{sh,sql}" }}
|
||||||
|
{{ .AsConfig | indent 2 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.initdbScripts }}
|
||||||
|
{{ toYaml . | indent 2 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.customMetrics }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.metricsCM" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
data:
|
||||||
|
custom-metrics.yaml: {{ toYaml .Values.metrics.customMetrics | quote }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}-metrics
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
annotations:
|
||||||
|
{{ toYaml .Values.metrics.service.annotations | indent 4 }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.metrics.service.type }}
|
||||||
|
{{- if and (eq .Values.metrics.service.type "LoadBalancer") .Values.metrics.service.loadBalancerIP }}
|
||||||
|
loadBalancerIP: {{ .Values.metrics.service.loadBalancerIP }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: http-metrics
|
||||||
|
port: 9187
|
||||||
|
targetPort: http-metrics
|
||||||
|
selector:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
role: master
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{{- if .Values.networkPolicy.enabled }}
|
||||||
|
kind: NetworkPolicy
|
||||||
|
apiVersion: {{ template "postgresql.networkPolicy.apiVersion" . }}
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
spec:
|
||||||
|
podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
ingress:
|
||||||
|
# Allow inbound connections
|
||||||
|
- ports:
|
||||||
|
- port: {{ template "postgresql.port" . }}
|
||||||
|
{{- if not .Values.networkPolicy.allowExternal }}
|
||||||
|
from:
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
{{ template "postgresql.fullname" . }}-client: "true"
|
||||||
|
{{- if .Values.networkPolicy.explicitNamespacesSelector }}
|
||||||
|
namespaceSelector:
|
||||||
|
{{ toYaml .Values.networkPolicy.explicitNamespacesSelector | indent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
role: slave
|
||||||
|
{{- end }}
|
||||||
|
# Allow prometheus scrapes
|
||||||
|
- ports:
|
||||||
|
- port: 9187
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }}
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: PrometheusRule
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}
|
||||||
|
{{- with .Values.metrics.prometheusRule.namespace }}
|
||||||
|
namespace: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
{{- with .Values.metrics.prometheusRule.additionalLabels }}
|
||||||
|
{{ toYaml . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.metrics.prometheusRule.rules }}
|
||||||
|
groups:
|
||||||
|
- name: {{ template "postgresql.name" $ }}
|
||||||
|
rules: {{ tpl (toYaml .) $ | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{{- if (include "postgresql.createSecret" .) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
{{- if and .Values.postgresqlPostgresPassword (not (eq .Values.postgresqlUsername "postgres")) }}
|
||||||
|
postgresql-postgres-password: {{ include "postgresql.postgres.password" . | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
postgresql-password: {{ include "postgresql.password" . | b64enc | quote }}
|
||||||
|
{{- if .Values.replication.enabled }}
|
||||||
|
postgresql-replication-password: {{ include "postgresql.replication.password" . | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if (and .Values.ldap.enabled .Values.ldap.bind_password)}}
|
||||||
|
postgresql-ldap-password: {{ .Values.ldap.bind_password | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{{- if and (.Values.serviceAccount.enabled) (not .Values.serviceAccount.name) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
name: {{ template "postgresql.fullname" . }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: ServiceMonitor
|
||||||
|
metadata:
|
||||||
|
name: {{ include "postgresql.fullname" . }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.namespace }}
|
||||||
|
namespace: {{ .Values.metrics.serviceMonitor.namespace }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.additionalLabels }}
|
||||||
|
{{ toYaml .Values.metrics.serviceMonitor.additionalLabels | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
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 }}
|
||||||
|
namespaceSelector:
|
||||||
|
matchNames:
|
||||||
|
- {{ .Release.Namespace }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,299 @@
|
|||||||
|
{{- if .Values.replication.enabled }}
|
||||||
|
apiVersion: {{ template "postgresql.statefulset.apiVersion" . }}
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: "{{ template "postgresql.fullname" . }}-slave"
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
{{- with .Values.slave.labels }}
|
||||||
|
{{ toYaml . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.slave.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{ toYaml . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
serviceName: {{ template "postgresql.fullname" . }}-headless
|
||||||
|
replicas: {{ .Values.replication.slaveReplicas }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
role: slave
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
role: slave
|
||||||
|
{{- with .Values.slave.podLabels }}
|
||||||
|
{{ toYaml . | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.slave.podAnnotations }}
|
||||||
|
annotations:
|
||||||
|
{{ toYaml . | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if .Values.schedulerName }}
|
||||||
|
schedulerName: "{{ .Values.schedulerName }}"
|
||||||
|
{{- end }}
|
||||||
|
{{- include "postgresql.imagePullSecrets" . | indent 6 }}
|
||||||
|
{{- if .Values.slave.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{ toYaml .Values.slave.nodeSelector | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{ toYaml .Values.slave.affinity | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{ toYaml .Values.slave.tolerations | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.terminationGracePeriodSeconds }}
|
||||||
|
terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
fsGroup: {{ .Values.securityContext.fsGroup }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.serviceAccount.enabled }}
|
||||||
|
serviceAccountName: {{ default (include "postgresql.fullname" . ) .Values.serviceAccount.name}}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.slave.extraInitContainers (and .Values.volumePermissions.enabled (or .Values.persistence.enabled (and .Values.shmVolume.enabled .Values.shmVolume.chmod.enabled))) }}
|
||||||
|
initContainers:
|
||||||
|
{{- if and .Values.volumePermissions.enabled (or .Values.persistence.enabled (and .Values.shmVolume.enabled .Values.shmVolume.chmod.enabled)) }}
|
||||||
|
- name: init-chmod-data
|
||||||
|
image: {{ template "postgresql.volumePermissions.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.resources }}
|
||||||
|
resources: {{- toYaml .Values.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -cx
|
||||||
|
- |
|
||||||
|
{{ if .Values.persistence.enabled }}
|
||||||
|
mkdir -p {{ .Values.persistence.mountPath }}/conf {{ .Values.persistence.mountPath }}/data
|
||||||
|
chmod 700 {{ .Values.persistence.mountPath }}/conf {{ .Values.persistence.mountPath }}/data
|
||||||
|
find {{ .Values.persistence.mountPath }} -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | \
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.securityContext.runAsUser )) "auto" }}
|
||||||
|
xargs chown -R `id -u`:`id -G | cut -d " " -f2`
|
||||||
|
{{- else }}
|
||||||
|
xargs chown -R {{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.fsGroup }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.shmVolume.enabled .Values.shmVolume.chmod.enabled }}
|
||||||
|
chmod -R 777 /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.securityContext.runAsUser )) "auto" }}
|
||||||
|
securityContext:
|
||||||
|
{{- else }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: {{ .Values.volumePermissions.securityContext.runAsUser }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{ if .Values.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
mountPath: {{ .Values.persistence.mountPath }}
|
||||||
|
subPath: {{ .Values.persistence.subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
mountPath: /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.extraInitContainers }}
|
||||||
|
{{ tpl .Values.slave.extraInitContainers . | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.priorityClassName }}
|
||||||
|
priorityClassName: {{ .Values.slave.priorityClassName }}
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: {{ template "postgresql.fullname" . }}
|
||||||
|
image: {{ template "postgresql.image" . }}
|
||||||
|
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
|
||||||
|
{{- if .Values.resources }}
|
||||||
|
resources: {{- toYaml .Values.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
- name: BITNAMI_DEBUG
|
||||||
|
value: {{ ternary "true" "false" .Values.image.debug | quote }}
|
||||||
|
- name: POSTGRESQL_VOLUME_DIR
|
||||||
|
value: "{{ .Values.persistence.mountPath }}"
|
||||||
|
- name: POSTGRESQL_PORT_NUMBER
|
||||||
|
value: "{{ template "postgresql.port" . }}"
|
||||||
|
{{- if .Values.persistence.mountPath }}
|
||||||
|
- name: PGDATA
|
||||||
|
value: {{ .Values.postgresqlDataDir | quote }}
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRES_REPLICATION_MODE
|
||||||
|
value: "slave"
|
||||||
|
- name: POSTGRES_REPLICATION_USER
|
||||||
|
value: {{ include "postgresql.replication.username" . | quote }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: POSTGRES_REPLICATION_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/postgresql-replication-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_REPLICATION_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "postgresql.secretName" . }}
|
||||||
|
key: postgresql-replication-password
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRES_CLUSTER_APP_NAME
|
||||||
|
value: {{ .Values.replication.applicationName }}
|
||||||
|
- name: POSTGRES_MASTER_HOST
|
||||||
|
value: {{ template "postgresql.fullname" . }}
|
||||||
|
- name: POSTGRES_MASTER_PORT_NUMBER
|
||||||
|
value: {{ include "postgresql.port" . | quote }}
|
||||||
|
{{- if and .Values.postgresqlPostgresPassword (not (eq .Values.postgresqlUsername "postgres")) }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: POSTGRES_POSTGRES_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/postgresql-postgres-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_POSTGRES_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "postgresql.secretName" . }}
|
||||||
|
key: postgresql-postgres-password
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: POSTGRES_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/postgresql-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "postgresql.secretName" . }}
|
||||||
|
key: postgresql-password
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
containerPort: {{ template "postgresql.port" . }}
|
||||||
|
{{- if .Values.livenessProbe.enabled }}
|
||||||
|
livenessProbe:
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
- exec pg_isready -U {{ include "postgresql.username" . | quote }} -d {{ (include "postgresql.database" .) | quote }} -h 127.0.0.1 -p {{ template "postgresql.port" . }}
|
||||||
|
{{- else }}
|
||||||
|
- exec pg_isready -U {{ include "postgresql.username" . | quote }} -h 127.0.0.1 -p {{ template "postgresql.port" . }}
|
||||||
|
{{- end }}
|
||||||
|
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readinessProbe.enabled }}
|
||||||
|
readinessProbe:
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- -e
|
||||||
|
{{- include "postgresql.readinessProbeCommand" . | nindent 16 }}
|
||||||
|
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: postgresql-password
|
||||||
|
mountPath: /opt/bitnami/postgresql/secrets/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
mountPath: /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
mountPath: {{ .Values.persistence.mountPath }}
|
||||||
|
subPath: {{ .Values.persistence.subPath }}
|
||||||
|
{{ end }}
|
||||||
|
{{- if or (.Files.Glob "files/conf.d/*.conf") .Values.postgresqlExtendedConf .Values.extendedConfConfigMap }}
|
||||||
|
- name: postgresql-extended-config
|
||||||
|
mountPath: /bitnami/postgresql/conf/conf.d/
|
||||||
|
{{- end }}
|
||||||
|
{{- if or (.Files.Glob "files/postgresql.conf") (.Files.Glob "files/pg_hba.conf") .Values.postgresqlConfiguration .Values.pgHbaConfiguration .Values.configurationConfigMap }}
|
||||||
|
- name: postgresql-config
|
||||||
|
mountPath: /bitnami/postgresql/conf
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.extraVolumeMounts }}
|
||||||
|
{{- toYaml .Values.slave.extraVolumeMounts | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.sidecars }}
|
||||||
|
{{- include "postgresql.tplValue" ( dict "value" .Values.slave.sidecars "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
volumes:
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: postgresql-password
|
||||||
|
secret:
|
||||||
|
secretName: {{ template "postgresql.secretName" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or (.Files.Glob "files/postgresql.conf") (.Files.Glob "files/pg_hba.conf") .Values.postgresqlConfiguration .Values.pgHbaConfiguration .Values.configurationConfigMap}}
|
||||||
|
- name: postgresql-config
|
||||||
|
configMap:
|
||||||
|
name: {{ template "postgresql.configurationCM" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or (.Files.Glob "files/conf.d/*.conf") .Values.postgresqlExtendedConf .Values.extendedConfConfigMap }}
|
||||||
|
- name: postgresql-extended-config
|
||||||
|
configMap:
|
||||||
|
name: {{ template "postgresql.extendedConfigurationCM" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
emptyDir:
|
||||||
|
medium: Memory
|
||||||
|
sizeLimit: 1Gi
|
||||||
|
{{- end }}
|
||||||
|
{{- if not .Values.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.extraVolumes }}
|
||||||
|
{{- toYaml .Values.slave.extraVolumes | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
updateStrategy:
|
||||||
|
type: {{ .Values.updateStrategy.type }}
|
||||||
|
{{- if (eq "Recreate" .Values.updateStrategy.type) }}
|
||||||
|
rollingUpdate: null
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.persistence.enabled }}
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: data
|
||||||
|
{{- with .Values.persistence.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- range $key, $value := . }}
|
||||||
|
{{ $key }}: {{ $value }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
{{- range .Values.persistence.accessModes }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.persistence.size | quote }}
|
||||||
|
{{ include "postgresql.storageClass" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,453 @@
|
|||||||
|
apiVersion: {{ template "postgresql.statefulset.apiVersion" . }}
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.master.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
{{- with .Values.master.labels }}
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.master.annotations }}
|
||||||
|
annotations: {{ toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
serviceName: {{ template "postgresql.fullname" . }}-headless
|
||||||
|
replicas: 1
|
||||||
|
updateStrategy:
|
||||||
|
type: {{ .Values.updateStrategy.type }}
|
||||||
|
{{- if (eq "Recreate" .Values.updateStrategy.type) }}
|
||||||
|
rollingUpdate: null
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
role: master
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
role: master
|
||||||
|
{{- with .Values.master.podLabels }}
|
||||||
|
{{- toYaml . | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.master.podAnnotations }}
|
||||||
|
annotations: {{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if .Values.schedulerName }}
|
||||||
|
schedulerName: "{{ .Values.schedulerName }}"
|
||||||
|
{{- end }}
|
||||||
|
{{- include "postgresql.imagePullSecrets" . | indent 6 }}
|
||||||
|
{{- if .Values.master.nodeSelector }}
|
||||||
|
nodeSelector: {{- toYaml .Values.master.nodeSelector | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.affinity }}
|
||||||
|
affinity: {{- toYaml .Values.master.affinity | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.tolerations }}
|
||||||
|
tolerations: {{- toYaml .Values.master.tolerations | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.terminationGracePeriodSeconds }}
|
||||||
|
terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
fsGroup: {{ .Values.securityContext.fsGroup }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.serviceAccount.enabled }}
|
||||||
|
serviceAccountName: {{ default (include "postgresql.fullname" . ) .Values.serviceAccount.name }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.master.extraInitContainers (and .Values.volumePermissions.enabled (or .Values.persistence.enabled (and .Values.shmVolume.enabled .Values.shmVolume.chmod.enabled))) }}
|
||||||
|
initContainers:
|
||||||
|
{{- if and .Values.volumePermissions.enabled (or .Values.persistence.enabled (and .Values.shmVolume.enabled .Values.shmVolume.chmod.enabled)) }}
|
||||||
|
- name: init-chmod-data
|
||||||
|
image: {{ template "postgresql.volumePermissions.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.resources }}
|
||||||
|
resources: {{- toYaml .Values.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -cx
|
||||||
|
- |
|
||||||
|
{{- if .Values.persistence.enabled }}
|
||||||
|
mkdir -p {{ .Values.persistence.mountPath }}/conf {{ .Values.persistence.mountPath }}/data
|
||||||
|
chmod 700 {{ .Values.persistence.mountPath }}/conf {{ .Values.persistence.mountPath }}/data
|
||||||
|
find {{ .Values.persistence.mountPath }} -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | \
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.securityContext.runAsUser )) "auto" }}
|
||||||
|
xargs chown -R `id -u`:`id -G | cut -d " " -f2`
|
||||||
|
{{- else }}
|
||||||
|
xargs chown -R {{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.fsGroup }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.shmVolume.enabled .Values.shmVolume.chmod.enabled }}
|
||||||
|
chmod -R 777 /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if eq ( toString ( .Values.volumePermissions.securityContext.runAsUser )) "auto" }}
|
||||||
|
securityContext:
|
||||||
|
{{- else }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: {{ .Values.volumePermissions.securityContext.runAsUser }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
mountPath: {{ .Values.persistence.mountPath }}
|
||||||
|
subPath: {{ .Values.persistence.subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
mountPath: /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.extraInitContainers }}
|
||||||
|
{{- tpl .Values.master.extraInitContainers . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.priorityClassName }}
|
||||||
|
priorityClassName: {{ .Values.master.priorityClassName }}
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: {{ template "postgresql.fullname" . }}
|
||||||
|
image: {{ template "postgresql.image" . }}
|
||||||
|
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
|
||||||
|
{{- if .Values.resources }}
|
||||||
|
resources: {{- toYaml .Values.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
- name: BITNAMI_DEBUG
|
||||||
|
value: {{ ternary "true" "false" .Values.image.debug | quote }}
|
||||||
|
- name: POSTGRESQL_PORT_NUMBER
|
||||||
|
value: "{{ template "postgresql.port" . }}"
|
||||||
|
- name: POSTGRESQL_VOLUME_DIR
|
||||||
|
value: "{{ .Values.persistence.mountPath }}"
|
||||||
|
{{- if .Values.postgresqlInitdbArgs }}
|
||||||
|
- name: POSTGRES_INITDB_ARGS
|
||||||
|
value: {{ .Values.postgresqlInitdbArgs | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.postgresqlInitdbWalDir }}
|
||||||
|
- name: POSTGRES_INITDB_WALDIR
|
||||||
|
value: {{ .Values.postgresqlInitdbWalDir | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.initdbUser }}
|
||||||
|
- name: POSTGRESQL_INITSCRIPTS_USERNAME
|
||||||
|
value: {{ .Values.initdbUser }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.initdbPassword }}
|
||||||
|
- name: POSTGRESQL_INITSCRIPTS_PASSWORD
|
||||||
|
value: {{ .Values.initdbPassword }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.persistence.mountPath }}
|
||||||
|
- name: PGDATA
|
||||||
|
value: {{ .Values.postgresqlDataDir | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.replication.enabled }}
|
||||||
|
- name: POSTGRES_REPLICATION_MODE
|
||||||
|
value: "master"
|
||||||
|
- name: POSTGRES_REPLICATION_USER
|
||||||
|
value: {{ include "postgresql.replication.username" . | quote }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: POSTGRES_REPLICATION_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/postgresql-replication-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_REPLICATION_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "postgresql.secretName" . }}
|
||||||
|
key: postgresql-replication-password
|
||||||
|
{{- 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 }}
|
||||||
|
{{- if and .Values.postgresqlPostgresPassword (not (eq .Values.postgresqlUsername "postgres")) }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: POSTGRES_POSTGRES_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/postgresql-postgres-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_POSTGRES_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "postgresql.secretName" . }}
|
||||||
|
key: postgresql-postgres-password
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRES_USER
|
||||||
|
value: {{ include "postgresql.username" . | quote }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: POSTGRES_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/postgresql-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: POSTGRES_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "postgresql.secretName" . }}
|
||||||
|
key: postgresql-password
|
||||||
|
{{- end }}
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
- name: POSTGRES_DB
|
||||||
|
value: {{ (include "postgresql.database" .) | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.extraEnv }}
|
||||||
|
{{- include "postgresql.tplValue" (dict "value" .Values.extraEnv "context" $) | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
- name: POSTGRESQL_ENABLE_LDAP
|
||||||
|
value: {{ ternary "yes" "no" .Values.ldap.enabled | quote }}
|
||||||
|
{{- if .Values.ldap.enabled }}
|
||||||
|
- 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 .Values.ldap.tls }}
|
||||||
|
- 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: {{ .Values.ldap.baseDN }}
|
||||||
|
- name: POSTGRESQL_LDAP_BIND_DN
|
||||||
|
value: {{ .Values.ldap.bindDN }}
|
||||||
|
{{- if (not (empty .Values.ldap.bind_password)) }}
|
||||||
|
- name: POSTGRESQL_LDAP_BIND_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "postgresql.secretName" . }}
|
||||||
|
key: postgresql-ldap-password
|
||||||
|
{{- end}}
|
||||||
|
- name: POSTGRESQL_LDAP_SEARCH_ATTR
|
||||||
|
value: {{ .Values.ldap.search_attr }}
|
||||||
|
- name: POSTGRESQL_LDAP_SEARCH_FILTER
|
||||||
|
value: {{ .Values.ldap.search_filter }}
|
||||||
|
- name: POSTGRESQL_LDAP_URL
|
||||||
|
value: {{ .Values.ldap.url }}
|
||||||
|
{{- end}}
|
||||||
|
{{- if .Values.extraEnvVarsCM }}
|
||||||
|
envFrom:
|
||||||
|
- configMapRef:
|
||||||
|
name: {{ tpl .Values.extraEnvVarsCM . }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
containerPort: {{ template "postgresql.port" . }}
|
||||||
|
{{- if .Values.livenessProbe.enabled }}
|
||||||
|
livenessProbe:
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
{{- if (include "postgresql.database" .) }}
|
||||||
|
- exec pg_isready -U {{ include "postgresql.username" . | quote }} -d {{ (include "postgresql.database" .) | quote }} -h 127.0.0.1 -p {{ template "postgresql.port" . }}
|
||||||
|
{{- else }}
|
||||||
|
- exec pg_isready -U {{ include "postgresql.username" . | quote }} -h 127.0.0.1 -p {{ template "postgresql.port" . }}
|
||||||
|
{{- end }}
|
||||||
|
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readinessProbe.enabled }}
|
||||||
|
readinessProbe:
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- -e
|
||||||
|
{{- include "postgresql.readinessProbeCommand" . | nindent 16 }}
|
||||||
|
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if or (.Files.Glob "files/docker-entrypoint-initdb.d/*.{sh,sql,sql.gz}") .Values.initdbScriptsConfigMap .Values.initdbScripts }}
|
||||||
|
- name: custom-init-scripts
|
||||||
|
mountPath: /docker-entrypoint-initdb.d/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.initdbScriptsSecret }}
|
||||||
|
- name: custom-init-scripts-secret
|
||||||
|
mountPath: /docker-entrypoint-initdb.d/secret
|
||||||
|
{{- end }}
|
||||||
|
{{- if or (.Files.Glob "files/conf.d/*.conf") .Values.postgresqlExtendedConf .Values.extendedConfConfigMap }}
|
||||||
|
- name: postgresql-extended-config
|
||||||
|
mountPath: /bitnami/postgresql/conf/conf.d/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: postgresql-password
|
||||||
|
mountPath: /opt/bitnami/postgresql/secrets/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
mountPath: /dev/shm
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
mountPath: {{ .Values.persistence.mountPath }}
|
||||||
|
subPath: {{ .Values.persistence.subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or (.Files.Glob "files/postgresql.conf") (.Files.Glob "files/pg_hba.conf") .Values.postgresqlConfiguration .Values.pgHbaConfiguration .Values.configurationConfigMap }}
|
||||||
|
- name: postgresql-config
|
||||||
|
mountPath: /bitnami/postgresql/conf
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.extraVolumeMounts }}
|
||||||
|
{{- toYaml .Values.master.extraVolumeMounts | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.sidecars }}
|
||||||
|
{{- include "postgresql.tplValue" ( dict "value" .Values.master.sidecars "context" $ ) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
- name: metrics
|
||||||
|
image: {{ template "postgresql.metrics.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.metrics.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: {{ .Values.metrics.securityContext.runAsUser }}
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
{{- $database := required "In order to enable metrics you need to specify a database (.Values.postgresqlDatabase or .Values.global.postgresql.postgresqlDatabase)" (include "postgresql.database" .) }}
|
||||||
|
- name: DATA_SOURCE_URI
|
||||||
|
value: {{ printf "127.0.0.1:%d/%s?sslmode=disable" (int (include "postgresql.port" .)) $database | quote }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: DATA_SOURCE_PASS_FILE
|
||||||
|
value: "/opt/bitnami/postgresql/secrets/postgresql-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: DATA_SOURCE_PASS
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "postgresql.secretName" . }}
|
||||||
|
key: postgresql-password
|
||||||
|
{{- end }}
|
||||||
|
- name: DATA_SOURCE_USER
|
||||||
|
value: {{ template "postgresql.username" . }}
|
||||||
|
{{- if .Values.livenessProbe.enabled }}
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http-metrics
|
||||||
|
initialDelaySeconds: {{ .Values.metrics.livenessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.metrics.livenessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.metrics.livenessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.metrics.livenessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.metrics.livenessProbe.failureThreshold }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readinessProbe.enabled }}
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http-metrics
|
||||||
|
initialDelaySeconds: {{ .Values.metrics.readinessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.metrics.readinessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.metrics.readinessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.metrics.readinessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.metrics.readinessProbe.failureThreshold }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: postgresql-password
|
||||||
|
mountPath: /opt/bitnami/postgresql/secrets/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.customMetrics }}
|
||||||
|
- name: custom-metrics
|
||||||
|
mountPath: /conf
|
||||||
|
readOnly: true
|
||||||
|
args: ["--extend.query-path", "/conf/custom-metrics.yaml"]
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: http-metrics
|
||||||
|
containerPort: 9187
|
||||||
|
{{- if .Values.metrics.resources }}
|
||||||
|
resources: {{- toYaml .Values.metrics.resources | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
volumes:
|
||||||
|
{{- if or (.Files.Glob "files/postgresql.conf") (.Files.Glob "files/pg_hba.conf") .Values.postgresqlConfiguration .Values.pgHbaConfiguration .Values.configurationConfigMap}}
|
||||||
|
- name: postgresql-config
|
||||||
|
configMap:
|
||||||
|
name: {{ template "postgresql.configurationCM" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or (.Files.Glob "files/conf.d/*.conf") .Values.postgresqlExtendedConf .Values.extendedConfConfigMap }}
|
||||||
|
- name: postgresql-extended-config
|
||||||
|
configMap:
|
||||||
|
name: {{ template "postgresql.extendedConfigurationCM" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: postgresql-password
|
||||||
|
secret:
|
||||||
|
secretName: {{ template "postgresql.secretName" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or (.Files.Glob "files/docker-entrypoint-initdb.d/*.{sh,sql,sql.gz}") .Values.initdbScriptsConfigMap .Values.initdbScripts }}
|
||||||
|
- name: custom-init-scripts
|
||||||
|
configMap:
|
||||||
|
name: {{ template "postgresql.initdbScriptsCM" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.initdbScriptsSecret }}
|
||||||
|
- name: custom-init-scripts-secret
|
||||||
|
secret:
|
||||||
|
secretName: {{ template "postgresql.initdbScriptsSecret" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.extraVolumes }}
|
||||||
|
{{- toYaml .Values.master.extraVolumes | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.customMetrics }}
|
||||||
|
- name: custom-metrics
|
||||||
|
configMap:
|
||||||
|
name: {{ template "postgresql.metricsCM" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.shmVolume.enabled }}
|
||||||
|
- name: dshm
|
||||||
|
emptyDir:
|
||||||
|
medium: Memory
|
||||||
|
sizeLimit: 1Gi
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.persistence.enabled .Values.persistence.existingClaim }}
|
||||||
|
- name: data
|
||||||
|
persistentVolumeClaim:
|
||||||
|
{{- with .Values.persistence.existingClaim }}
|
||||||
|
claimName: {{ tpl . $ }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else if not .Values.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
emptyDir: {}
|
||||||
|
{{- else if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: data
|
||||||
|
{{- with .Values.persistence.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- range $key, $value := . }}
|
||||||
|
{{ $key }}: {{ $value }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
{{- range .Values.persistence.accessModes }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.persistence.size | quote }}
|
||||||
|
{{ include "postgresql.storageClass" . }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}-headless
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
clusterIP: None
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
port: {{ template "postgresql.port" . }}
|
||||||
|
targetPort: tcp-postgresql
|
||||||
|
selector:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
{{- if .Values.replication.enabled }}
|
||||||
|
{{- $serviceAnnotations := coalesce .Values.slave.service.annotations .Values.service.annotations -}}
|
||||||
|
{{- $serviceType := coalesce .Values.slave.service.type .Values.service.type -}}
|
||||||
|
{{- $serviceLoadBalancerIP := coalesce .Values.slave.service.loadBalancerIP .Values.service.loadBalancerIP -}}
|
||||||
|
{{- $serviceLoadBalancerSourceRanges := coalesce .Values.slave.service.loadBalancerSourceRanges .Values.service.loadBalancerSourceRanges -}}
|
||||||
|
{{- $serviceClusterIP := coalesce .Values.slave.service.clusterIP .Values.service.clusterIP -}}
|
||||||
|
{{- $serviceNodePort := coalesce .Values.slave.service.nodePort .Values.service.nodePort -}}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}-read
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
{{- if $serviceAnnotations }}
|
||||||
|
annotations: {{- include "postgresql.tplValue" (dict "value" $serviceAnnotations "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: {{ $serviceType }}
|
||||||
|
{{- if and $serviceLoadBalancerIP (eq $serviceType "LoadBalancer") }}
|
||||||
|
loadBalancerIP: {{ $serviceLoadBalancerIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq $serviceType "LoadBalancer") $serviceLoadBalancerSourceRanges }}
|
||||||
|
loadBalancerSourceRanges: {{- include "postgresql.tplValue" (dict "value" $serviceLoadBalancerSourceRanges "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq $serviceType "ClusterIP") $serviceClusterIP }}
|
||||||
|
clusterIP: {{ $serviceClusterIP }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
port: {{ template "postgresql.port" . }}
|
||||||
|
targetPort: tcp-postgresql
|
||||||
|
{{- if $serviceNodePort }}
|
||||||
|
nodePort: {{ $serviceNodePort }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
role: slave
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{{- $serviceAnnotations := coalesce .Values.master.service.annotations .Values.service.annotations -}}
|
||||||
|
{{- $serviceType := coalesce .Values.master.service.type .Values.service.type -}}
|
||||||
|
{{- $serviceLoadBalancerIP := coalesce .Values.master.service.loadBalancerIP .Values.service.loadBalancerIP -}}
|
||||||
|
{{- $serviceLoadBalancerSourceRanges := coalesce .Values.master.service.loadBalancerSourceRanges .Values.service.loadBalancerSourceRanges -}}
|
||||||
|
{{- $serviceClusterIP := coalesce .Values.master.service.clusterIP .Values.service.clusterIP -}}
|
||||||
|
{{- $serviceNodePort := coalesce .Values.master.service.nodePort .Values.service.nodePort -}}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "postgresql.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
chart: {{ template "postgresql.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
{{- if $serviceAnnotations }}
|
||||||
|
annotations: {{- include "postgresql.tplValue" (dict "value" $serviceAnnotations "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: {{ $serviceType }}
|
||||||
|
{{- if and $serviceLoadBalancerIP (eq $serviceType "LoadBalancer") }}
|
||||||
|
loadBalancerIP: {{ $serviceLoadBalancerIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq $serviceType "LoadBalancer") $serviceLoadBalancerSourceRanges }}
|
||||||
|
loadBalancerSourceRanges: {{- include "postgresql.tplValue" (dict "value" $serviceLoadBalancerSourceRanges "context" $) | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq $serviceType "ClusterIP") $serviceClusterIP }}
|
||||||
|
clusterIP: {{ $serviceClusterIP }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: tcp-postgresql
|
||||||
|
port: {{ template "postgresql.port" . }}
|
||||||
|
targetPort: tcp-postgresql
|
||||||
|
{{- if $serviceNodePort }}
|
||||||
|
nodePort: {{ $serviceNodePort }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
app: {{ template "postgresql.name" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
role: master
|
||||||
@@ -0,0 +1,542 @@
|
|||||||
|
## Global Docker image parameters
|
||||||
|
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
|
||||||
|
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
|
||||||
|
##
|
||||||
|
global:
|
||||||
|
postgresql: {}
|
||||||
|
# imageRegistry: myRegistryName
|
||||||
|
# imagePullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
# storageClass: myStorageClass
|
||||||
|
|
||||||
|
## Bitnami PostgreSQL image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/postgresql/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/postgresql
|
||||||
|
tag: 11.7.0-debian-10-r65
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Set to true if you would like to see extra information on logs
|
||||||
|
## It turns BASH and NAMI debugging in minideb
|
||||||
|
## ref: https://github.com/bitnami/minideb-extras/#turn-on-bash-debugging
|
||||||
|
debug: false
|
||||||
|
|
||||||
|
## String to partially override postgresql.fullname template (will maintain the release name)
|
||||||
|
##
|
||||||
|
# nameOverride:
|
||||||
|
|
||||||
|
## String to fully override postgresql.fullname template
|
||||||
|
##
|
||||||
|
# fullnameOverride:
|
||||||
|
|
||||||
|
##
|
||||||
|
## Init containers parameters:
|
||||||
|
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||||
|
##
|
||||||
|
volumePermissions:
|
||||||
|
enabled: false
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
## Init container Security Context
|
||||||
|
## Note: the chown of the data folder is done to securityContext.runAsUser
|
||||||
|
## and not the below volumePermissions.securityContext.runAsUser
|
||||||
|
## When runAsUser is set to special value "auto", init container will try to chwon the
|
||||||
|
## data folder to autodetermined user&group, using commands: `id -u`:`id -G | cut -d" " -f2`
|
||||||
|
## "auto" is especially useful for OpenShift which has scc with dynamic userids (and 0 is not allowed).
|
||||||
|
## You may want to use this volumePermissions.securityContext.runAsUser="auto" in combination with
|
||||||
|
## pod securityContext.enabled=false and shmVolume.chmod.enabled=false
|
||||||
|
##
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 0
|
||||||
|
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Pod Security Context
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||||||
|
##
|
||||||
|
securityContext:
|
||||||
|
enabled: true
|
||||||
|
fsGroup: 1001
|
||||||
|
runAsUser: 1001
|
||||||
|
|
||||||
|
## Pod Service Account
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
|
||||||
|
serviceAccount:
|
||||||
|
enabled: false
|
||||||
|
## Name of an already existing service account. Setting this value disables the automatic service account creation.
|
||||||
|
# name:
|
||||||
|
|
||||||
|
replication:
|
||||||
|
enabled: true
|
||||||
|
user: repl_user
|
||||||
|
password: repl_password
|
||||||
|
slaveReplicas: 2
|
||||||
|
## Set synchronous commit mode: on, off, remote_apply, remote_write and local
|
||||||
|
## ref: https://www.postgresql.org/docs/9.6/runtime-config-wal.html#GUC-WAL-LEVEL
|
||||||
|
synchronousCommit: "on"
|
||||||
|
## From the number of `slaveReplicas` defined above, set the number of those that will have synchronous replication
|
||||||
|
## NOTE: It cannot be > slaveReplicas
|
||||||
|
numSynchronousReplicas: 1
|
||||||
|
## Replication Cluster application name. Useful for defining multiple replication policies
|
||||||
|
applicationName: my_application
|
||||||
|
|
||||||
|
## PostgreSQL admin password (used when `postgresqlUsername` is not `postgres`)
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md#creating-a-database-user-on-first-run (see note!)
|
||||||
|
# postgresqlPostgresPassword:
|
||||||
|
|
||||||
|
## PostgreSQL user (has superuser privileges if username is `postgres`)
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md#setting-the-root-password-on-first-run
|
||||||
|
postgresqlUsername: postgres
|
||||||
|
|
||||||
|
## PostgreSQL password
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md#setting-the-root-password-on-first-run
|
||||||
|
##
|
||||||
|
# postgresqlPassword:
|
||||||
|
|
||||||
|
## PostgreSQL password using existing secret
|
||||||
|
## existingSecret: secret
|
||||||
|
|
||||||
|
## Mount PostgreSQL secret as a file instead of passing environment variable
|
||||||
|
# usePasswordFile: false
|
||||||
|
|
||||||
|
## Create a database
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md#creating-a-database-on-first-run
|
||||||
|
##
|
||||||
|
# postgresqlDatabase:
|
||||||
|
|
||||||
|
## PostgreSQL data dir
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md
|
||||||
|
##
|
||||||
|
postgresqlDataDir: /bitnami/postgresql/data
|
||||||
|
|
||||||
|
## An array to add extra environment variables
|
||||||
|
## For example:
|
||||||
|
## extraEnv:
|
||||||
|
## - name: FOO
|
||||||
|
## value: "bar"
|
||||||
|
##
|
||||||
|
# extraEnv:
|
||||||
|
extraEnv: []
|
||||||
|
|
||||||
|
## Name of a ConfigMap containing extra env vars
|
||||||
|
##
|
||||||
|
# extraEnvVarsCM:
|
||||||
|
|
||||||
|
## Specify extra initdb args
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md
|
||||||
|
##
|
||||||
|
# postgresqlInitdbArgs:
|
||||||
|
|
||||||
|
## Specify a custom location for the PostgreSQL transaction log
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md
|
||||||
|
##
|
||||||
|
# postgresqlInitdbWalDir:
|
||||||
|
|
||||||
|
## PostgreSQL configuration
|
||||||
|
## Specify runtime configuration parameters as a dict, using camelCase, e.g.
|
||||||
|
## {"sharedBuffers": "500MB"}
|
||||||
|
## Alternatively, you can put your postgresql.conf under the files/ directory
|
||||||
|
## ref: https://www.postgresql.org/docs/current/static/runtime-config.html
|
||||||
|
##
|
||||||
|
# postgresqlConfiguration:
|
||||||
|
|
||||||
|
## PostgreSQL extended configuration
|
||||||
|
## As above, but _appended_ to the main configuration
|
||||||
|
## Alternatively, you can put your *.conf under the files/conf.d/ directory
|
||||||
|
## https://github.com/bitnami/bitnami-docker-postgresql#allow-settings-to-be-loaded-from-files-other-than-the-default-postgresqlconf
|
||||||
|
##
|
||||||
|
# postgresqlExtendedConf:
|
||||||
|
|
||||||
|
## PostgreSQL client authentication configuration
|
||||||
|
## Specify content for pg_hba.conf
|
||||||
|
## Default: do not create pg_hba.conf
|
||||||
|
## Alternatively, you can put your pg_hba.conf under the files/ directory
|
||||||
|
# pgHbaConfiguration: |-
|
||||||
|
# local all all trust
|
||||||
|
# host all all localhost trust
|
||||||
|
# host mydatabase mysuser 192.168.0.0/24 md5
|
||||||
|
|
||||||
|
## ConfigMap with PostgreSQL configuration
|
||||||
|
## NOTE: This will override postgresqlConfiguration and pgHbaConfiguration
|
||||||
|
# configurationConfigMap:
|
||||||
|
|
||||||
|
## ConfigMap with PostgreSQL extended configuration
|
||||||
|
# extendedConfConfigMap:
|
||||||
|
|
||||||
|
## initdb scripts
|
||||||
|
## Specify dictionary of scripts to be run at first boot
|
||||||
|
## Alternatively, you can put your scripts under the files/docker-entrypoint-initdb.d directory
|
||||||
|
##
|
||||||
|
# initdbScripts:
|
||||||
|
# my_init_script.sh: |
|
||||||
|
# #!/bin/sh
|
||||||
|
# echo "Do something."
|
||||||
|
|
||||||
|
## Specify the PostgreSQL username and password to execute the initdb scripts
|
||||||
|
# initdbUser:
|
||||||
|
# initdbPassword:
|
||||||
|
|
||||||
|
## ConfigMap with scripts to be run at first boot
|
||||||
|
## NOTE: This will override initdbScripts
|
||||||
|
# initdbScriptsConfigMap:
|
||||||
|
|
||||||
|
## Secret with scripts to be run at first boot (in case it contains sensitive information)
|
||||||
|
## NOTE: This can work along initdbScripts or initdbScriptsConfigMap
|
||||||
|
# initdbScriptsSecret:
|
||||||
|
|
||||||
|
## Optional duration in seconds the pod needs to terminate gracefully.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods
|
||||||
|
##
|
||||||
|
# terminationGracePeriodSeconds: 30
|
||||||
|
|
||||||
|
## LDAP configuration
|
||||||
|
##
|
||||||
|
ldap:
|
||||||
|
enabled: false
|
||||||
|
url: ""
|
||||||
|
server: ""
|
||||||
|
port: ""
|
||||||
|
prefix: ""
|
||||||
|
suffix: ""
|
||||||
|
baseDN: ""
|
||||||
|
bindDN: ""
|
||||||
|
bind_password:
|
||||||
|
search_attr: ""
|
||||||
|
search_filter: ""
|
||||||
|
scheme: ""
|
||||||
|
tls: false
|
||||||
|
|
||||||
|
## PostgreSQL service configuration
|
||||||
|
service:
|
||||||
|
## PosgresSQL service type
|
||||||
|
type: ClusterIP
|
||||||
|
# clusterIP: None
|
||||||
|
port: 5432
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. Evaluated as a template.
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
## Set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
# loadBalancerIP:
|
||||||
|
|
||||||
|
## Load Balancer sources. Evaluated as a template.
|
||||||
|
## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
|
||||||
|
##
|
||||||
|
# loadBalancerSourceRanges:
|
||||||
|
# - 10.10.10.0/24
|
||||||
|
|
||||||
|
## Start master and slave(s) pod(s) without limitations on shm memory.
|
||||||
|
## By default docker and containerd (and possibly other container runtimes)
|
||||||
|
## limit `/dev/shm` to `64M` (see e.g. the
|
||||||
|
## [docker issue](https://github.com/docker-library/postgres/issues/416) and the
|
||||||
|
## [containerd issue](https://github.com/containerd/containerd/issues/3654),
|
||||||
|
## which could be not enough if PostgreSQL uses parallel workers heavily.
|
||||||
|
##
|
||||||
|
shmVolume:
|
||||||
|
## Set `shmVolume.enabled` to `true` to mount a new tmpfs volume to remove
|
||||||
|
## this limitation.
|
||||||
|
##
|
||||||
|
enabled: true
|
||||||
|
## Set to `true` to `chmod 777 /dev/shm` on a initContainer.
|
||||||
|
## This option is ingored if `volumePermissions.enabled` is `false`
|
||||||
|
##
|
||||||
|
chmod:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
## PostgreSQL data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## A manually managed Persistent Volume and Claim
|
||||||
|
## If defined, PVC must be created manually before volume will be bound
|
||||||
|
## The value is evaluated as a template, so, for example, the name can depend on .Release or .Chart
|
||||||
|
##
|
||||||
|
# existingClaim:
|
||||||
|
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## PostgreSQL images.
|
||||||
|
##
|
||||||
|
mountPath: /bitnami/postgresql
|
||||||
|
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
##
|
||||||
|
subPath: ""
|
||||||
|
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
annotations: {}
|
||||||
|
|
||||||
|
## updateStrategy for PostgreSQL StatefulSet and its slaves StatefulSets
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
|
||||||
|
updateStrategy:
|
||||||
|
type: RollingUpdate
|
||||||
|
|
||||||
|
##
|
||||||
|
## PostgreSQL Master parameters
|
||||||
|
##
|
||||||
|
master:
|
||||||
|
## Node, affinity, tolerations, and priorityclass settings for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption
|
||||||
|
nodeSelector: {}
|
||||||
|
affinity: {}
|
||||||
|
tolerations: []
|
||||||
|
labels: {}
|
||||||
|
annotations: {}
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
priorityClassName: ""
|
||||||
|
## Additional PostgreSQL Master Volume mounts
|
||||||
|
##
|
||||||
|
extraVolumeMounts: []
|
||||||
|
## Additional PostgreSQL Master Volumes
|
||||||
|
##
|
||||||
|
extraVolumes: []
|
||||||
|
## Add sidecars to the pod
|
||||||
|
##
|
||||||
|
## For example:
|
||||||
|
## sidecars:
|
||||||
|
## - name: your-image-name
|
||||||
|
## image: your-image
|
||||||
|
## imagePullPolicy: Always
|
||||||
|
## ports:
|
||||||
|
## - name: portname
|
||||||
|
## containerPort: 1234
|
||||||
|
sidecars: []
|
||||||
|
|
||||||
|
## Override the service configuration for master
|
||||||
|
##
|
||||||
|
service: {}
|
||||||
|
# type:
|
||||||
|
# nodePort:
|
||||||
|
# clusterIP:
|
||||||
|
|
||||||
|
##
|
||||||
|
## PostgreSQL Slave parameters
|
||||||
|
##
|
||||||
|
slave:
|
||||||
|
## Node, affinity, tolerations, and priorityclass settings for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption
|
||||||
|
nodeSelector: {}
|
||||||
|
affinity: {}
|
||||||
|
tolerations: []
|
||||||
|
labels: {}
|
||||||
|
annotations: {}
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
priorityClassName: ""
|
||||||
|
## Extra init containers
|
||||||
|
## Example
|
||||||
|
##
|
||||||
|
## extraInitContainers:
|
||||||
|
## - name: do-something
|
||||||
|
## image: busybox
|
||||||
|
## command: ['do', 'something']
|
||||||
|
extraInitContainers: []
|
||||||
|
## Additional PostgreSQL Slave Volume mounts
|
||||||
|
##
|
||||||
|
extraVolumeMounts: []
|
||||||
|
## Additional PostgreSQL Slave Volumes
|
||||||
|
##
|
||||||
|
extraVolumes: []
|
||||||
|
## Add sidecars to the pod
|
||||||
|
##
|
||||||
|
## For example:
|
||||||
|
## sidecars:
|
||||||
|
## - name: your-image-name
|
||||||
|
## image: your-image
|
||||||
|
## imagePullPolicy: Always
|
||||||
|
## ports:
|
||||||
|
## - name: portname
|
||||||
|
## containerPort: 1234
|
||||||
|
sidecars: []
|
||||||
|
|
||||||
|
## Override the service configuration for slave
|
||||||
|
##
|
||||||
|
service: {}
|
||||||
|
# type:
|
||||||
|
# nodePort:
|
||||||
|
# clusterIP:
|
||||||
|
|
||||||
|
## Configure resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
##
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 256Mi
|
||||||
|
cpu: 250m
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
## Enable creation of NetworkPolicy resources. Only Ingress traffic is filtered for now.
|
||||||
|
##
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## The Policy model to apply. When set to false, only pods with the correct
|
||||||
|
## client label will have network access to the port PostgreSQL is listening
|
||||||
|
## on. When true, PostgreSQL will accept connections from any source
|
||||||
|
## (with the correct destination port).
|
||||||
|
##
|
||||||
|
allowExternal: true
|
||||||
|
|
||||||
|
## if explicitNamespacesSelector is missing or set to {}, only client Pods that are in the networkPolicy's namespace
|
||||||
|
## and that match other criteria, the ones that have the good label, can reach the DB.
|
||||||
|
## But sometimes, we want the DB to be accessible to clients from other namespaces, in this case, we can use this
|
||||||
|
## LabelSelector to select these namespaces, note that the networkPolicy's namespace should also be explicitly added.
|
||||||
|
##
|
||||||
|
## Example:
|
||||||
|
## explicitNamespacesSelector:
|
||||||
|
## matchLabels:
|
||||||
|
## role: frontend
|
||||||
|
## matchExpressions:
|
||||||
|
## - {key: role, operator: In, values: [frontend]}
|
||||||
|
explicitNamespacesSelector: {}
|
||||||
|
|
||||||
|
## Configure extra options for liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
|
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
|
|
||||||
|
## Configure metrics exporter
|
||||||
|
##
|
||||||
|
metrics:
|
||||||
|
enabled: true
|
||||||
|
# resources: {}
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
annotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "9187"
|
||||||
|
loadBalancerIP:
|
||||||
|
serviceMonitor:
|
||||||
|
enabled: false
|
||||||
|
additionalLabels: {}
|
||||||
|
# namespace: monitoring
|
||||||
|
# interval: 30s
|
||||||
|
# scrapeTimeout: 10s
|
||||||
|
## Custom PrometheusRule to be defined
|
||||||
|
## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions
|
||||||
|
prometheusRule:
|
||||||
|
enabled: false
|
||||||
|
additionalLabels: {}
|
||||||
|
namespace: ""
|
||||||
|
## These are just examples rules, please adapt them to your needs.
|
||||||
|
## Make sure to constraint the rules to the current postgresql service.
|
||||||
|
## rules:
|
||||||
|
## - alert: HugeReplicationLag
|
||||||
|
## expr: pg_replication_lag{service="{{ template "postgresql.fullname" . }}-metrics"} / 3600 > 1
|
||||||
|
## for: 1m
|
||||||
|
## labels:
|
||||||
|
## severity: critical
|
||||||
|
## annotations:
|
||||||
|
## description: replication for {{ template "postgresql.fullname" . }} PostgreSQL is lagging by {{ "{{ $value }}" }} hour(s).
|
||||||
|
## summary: PostgreSQL replication is lagging by {{ "{{ $value }}" }} hour(s).
|
||||||
|
rules: []
|
||||||
|
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/postgres-exporter
|
||||||
|
tag: 0.8.0-debian-10-r72
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
## Define additional custom metrics
|
||||||
|
## ref: https://github.com/wrouesnel/postgres_exporter#adding-new-metrics-via-a-config-file
|
||||||
|
# customMetrics:
|
||||||
|
# pg_database:
|
||||||
|
# query: "SELECT d.datname AS name, CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT') THEN pg_catalog.pg_database_size(d.datname) ELSE 0 END AS size FROM pg_catalog.pg_database d where datname not in ('template0', 'template1', 'postgres')"
|
||||||
|
# metrics:
|
||||||
|
# - name:
|
||||||
|
# usage: "LABEL"
|
||||||
|
# description: "Name of the database"
|
||||||
|
# - size_bytes:
|
||||||
|
# usage: "GAUGE"
|
||||||
|
# description: "Size of the database in bytes"
|
||||||
|
## Pod Security Context
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||||||
|
##
|
||||||
|
securityContext:
|
||||||
|
enabled: false
|
||||||
|
runAsUser: 1001
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
## Configure extra options for liveness and readiness probes
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
|
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/schema#",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"postgresqlUsername": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Admin user",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"postgresqlPassword": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Password",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"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
|
||||||
|
},
|
||||||
|
"slaveReplicas": {
|
||||||
|
"type": "integer",
|
||||||
|
"title": "Slave Replicas",
|
||||||
|
"form": true,
|
||||||
|
"hidden": {
|
||||||
|
"condition": false,
|
||||||
|
"value": "replication.enabled"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,548 @@
|
|||||||
|
## Global Docker image parameters
|
||||||
|
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
|
||||||
|
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
|
||||||
|
##
|
||||||
|
global:
|
||||||
|
postgresql: {}
|
||||||
|
# imageRegistry: myRegistryName
|
||||||
|
# imagePullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
# storageClass: myStorageClass
|
||||||
|
|
||||||
|
## Bitnami PostgreSQL image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/postgresql/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/postgresql
|
||||||
|
tag: 11.7.0-debian-10-r65
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Set to true if you would like to see extra information on logs
|
||||||
|
## It turns BASH and NAMI debugging in minideb
|
||||||
|
## ref: https://github.com/bitnami/minideb-extras/#turn-on-bash-debugging
|
||||||
|
debug: false
|
||||||
|
|
||||||
|
## String to partially override postgresql.fullname template (will maintain the release name)
|
||||||
|
##
|
||||||
|
# nameOverride:
|
||||||
|
|
||||||
|
## String to fully override postgresql.fullname template
|
||||||
|
##
|
||||||
|
# fullnameOverride:
|
||||||
|
|
||||||
|
##
|
||||||
|
## Init containers parameters:
|
||||||
|
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||||
|
##
|
||||||
|
volumePermissions:
|
||||||
|
enabled: false
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
## Init container Security Context
|
||||||
|
## Note: the chown of the data folder is done to securityContext.runAsUser
|
||||||
|
## and not the below volumePermissions.securityContext.runAsUser
|
||||||
|
## When runAsUser is set to special value "auto", init container will try to chwon the
|
||||||
|
## data folder to autodetermined user&group, using commands: `id -u`:`id -G | cut -d" " -f2`
|
||||||
|
## "auto" is especially useful for OpenShift which has scc with dynamic userids (and 0 is not allowed).
|
||||||
|
## You may want to use this volumePermissions.securityContext.runAsUser="auto" in combination with
|
||||||
|
## pod securityContext.enabled=false and shmVolume.chmod.enabled=false
|
||||||
|
##
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 0
|
||||||
|
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
|
||||||
|
## Pod Security Context
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||||||
|
##
|
||||||
|
securityContext:
|
||||||
|
enabled: true
|
||||||
|
fsGroup: 1001
|
||||||
|
runAsUser: 1001
|
||||||
|
|
||||||
|
## Pod Service Account
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
|
||||||
|
serviceAccount:
|
||||||
|
enabled: false
|
||||||
|
## Name of an already existing service account. Setting this value disables the automatic service account creation.
|
||||||
|
# name:
|
||||||
|
|
||||||
|
replication:
|
||||||
|
enabled: false
|
||||||
|
user: repl_user
|
||||||
|
password: repl_password
|
||||||
|
slaveReplicas: 1
|
||||||
|
## Set synchronous commit mode: on, off, remote_apply, remote_write and local
|
||||||
|
## ref: https://www.postgresql.org/docs/9.6/runtime-config-wal.html#GUC-WAL-LEVEL
|
||||||
|
synchronousCommit: "off"
|
||||||
|
## From the number of `slaveReplicas` defined above, set the number of those that will have synchronous replication
|
||||||
|
## NOTE: It cannot be > slaveReplicas
|
||||||
|
numSynchronousReplicas: 0
|
||||||
|
## Replication Cluster application name. Useful for defining multiple replication policies
|
||||||
|
applicationName: my_application
|
||||||
|
|
||||||
|
## PostgreSQL admin password (used when `postgresqlUsername` is not `postgres`)
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md#creating-a-database-user-on-first-run (see note!)
|
||||||
|
# postgresqlPostgresPassword:
|
||||||
|
|
||||||
|
## PostgreSQL user (has superuser privileges if username is `postgres`)
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md#setting-the-root-password-on-first-run
|
||||||
|
postgresqlUsername: postgres
|
||||||
|
|
||||||
|
## PostgreSQL password
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md#setting-the-root-password-on-first-run
|
||||||
|
##
|
||||||
|
# postgresqlPassword:
|
||||||
|
|
||||||
|
## PostgreSQL password using existing secret
|
||||||
|
## existingSecret: secret
|
||||||
|
|
||||||
|
## Mount PostgreSQL secret as a file instead of passing environment variable
|
||||||
|
# usePasswordFile: false
|
||||||
|
|
||||||
|
## Create a database
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md#creating-a-database-on-first-run
|
||||||
|
##
|
||||||
|
# postgresqlDatabase:
|
||||||
|
|
||||||
|
## PostgreSQL data dir
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md
|
||||||
|
##
|
||||||
|
postgresqlDataDir: /bitnami/postgresql/data
|
||||||
|
|
||||||
|
## An array to add extra environment variables
|
||||||
|
## For example:
|
||||||
|
## extraEnv:
|
||||||
|
## - name: FOO
|
||||||
|
## value: "bar"
|
||||||
|
##
|
||||||
|
# extraEnv:
|
||||||
|
extraEnv: []
|
||||||
|
|
||||||
|
## Name of a ConfigMap containing extra env vars
|
||||||
|
##
|
||||||
|
# extraEnvVarsCM:
|
||||||
|
|
||||||
|
## Specify extra initdb args
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md
|
||||||
|
##
|
||||||
|
# postgresqlInitdbArgs:
|
||||||
|
|
||||||
|
## Specify a custom location for the PostgreSQL transaction log
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-postgresql/blob/master/README.md
|
||||||
|
##
|
||||||
|
# postgresqlInitdbWalDir:
|
||||||
|
|
||||||
|
## PostgreSQL configuration
|
||||||
|
## Specify runtime configuration parameters as a dict, using camelCase, e.g.
|
||||||
|
## {"sharedBuffers": "500MB"}
|
||||||
|
## Alternatively, you can put your postgresql.conf under the files/ directory
|
||||||
|
## ref: https://www.postgresql.org/docs/current/static/runtime-config.html
|
||||||
|
##
|
||||||
|
# postgresqlConfiguration:
|
||||||
|
|
||||||
|
## PostgreSQL extended configuration
|
||||||
|
## As above, but _appended_ to the main configuration
|
||||||
|
## Alternatively, you can put your *.conf under the files/conf.d/ directory
|
||||||
|
## https://github.com/bitnami/bitnami-docker-postgresql#allow-settings-to-be-loaded-from-files-other-than-the-default-postgresqlconf
|
||||||
|
##
|
||||||
|
# postgresqlExtendedConf:
|
||||||
|
|
||||||
|
## PostgreSQL client authentication configuration
|
||||||
|
## Specify content for pg_hba.conf
|
||||||
|
## Default: do not create pg_hba.conf
|
||||||
|
## Alternatively, you can put your pg_hba.conf under the files/ directory
|
||||||
|
# pgHbaConfiguration: |-
|
||||||
|
# local all all trust
|
||||||
|
# host all all localhost trust
|
||||||
|
# host mydatabase mysuser 192.168.0.0/24 md5
|
||||||
|
|
||||||
|
## ConfigMap with PostgreSQL configuration
|
||||||
|
## NOTE: This will override postgresqlConfiguration and pgHbaConfiguration
|
||||||
|
# configurationConfigMap:
|
||||||
|
|
||||||
|
## ConfigMap with PostgreSQL extended configuration
|
||||||
|
# extendedConfConfigMap:
|
||||||
|
|
||||||
|
## initdb scripts
|
||||||
|
## Specify dictionary of scripts to be run at first boot
|
||||||
|
## Alternatively, you can put your scripts under the files/docker-entrypoint-initdb.d directory
|
||||||
|
##
|
||||||
|
# initdbScripts:
|
||||||
|
# my_init_script.sh: |
|
||||||
|
# #!/bin/sh
|
||||||
|
# echo "Do something."
|
||||||
|
|
||||||
|
## ConfigMap with scripts to be run at first boot
|
||||||
|
## NOTE: This will override initdbScripts
|
||||||
|
# initdbScriptsConfigMap:
|
||||||
|
|
||||||
|
## Secret with scripts to be run at first boot (in case it contains sensitive information)
|
||||||
|
## NOTE: This can work along initdbScripts or initdbScriptsConfigMap
|
||||||
|
# initdbScriptsSecret:
|
||||||
|
|
||||||
|
## Specify the PostgreSQL username and password to execute the initdb scripts
|
||||||
|
# initdbUser:
|
||||||
|
# initdbPassword:
|
||||||
|
|
||||||
|
## Optional duration in seconds the pod needs to terminate gracefully.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods
|
||||||
|
##
|
||||||
|
# terminationGracePeriodSeconds: 30
|
||||||
|
|
||||||
|
## LDAP configuration
|
||||||
|
##
|
||||||
|
ldap:
|
||||||
|
enabled: false
|
||||||
|
url: ""
|
||||||
|
server: ""
|
||||||
|
port: ""
|
||||||
|
prefix: ""
|
||||||
|
suffix: ""
|
||||||
|
baseDN: ""
|
||||||
|
bindDN: ""
|
||||||
|
bind_password:
|
||||||
|
search_attr: ""
|
||||||
|
search_filter: ""
|
||||||
|
scheme: ""
|
||||||
|
tls: false
|
||||||
|
|
||||||
|
## PostgreSQL service configuration
|
||||||
|
service:
|
||||||
|
## PosgresSQL service type
|
||||||
|
type: ClusterIP
|
||||||
|
# clusterIP: None
|
||||||
|
port: 5432
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. Evaluated as a template.
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
## Set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
# loadBalancerIP:
|
||||||
|
|
||||||
|
## Load Balancer sources. Evaluated as a template.
|
||||||
|
## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
|
||||||
|
##
|
||||||
|
# loadBalancerSourceRanges:
|
||||||
|
# - 10.10.10.0/24
|
||||||
|
|
||||||
|
## Start master and slave(s) pod(s) without limitations on shm memory.
|
||||||
|
## By default docker and containerd (and possibly other container runtimes)
|
||||||
|
## limit `/dev/shm` to `64M` (see e.g. the
|
||||||
|
## [docker issue](https://github.com/docker-library/postgres/issues/416) and the
|
||||||
|
## [containerd issue](https://github.com/containerd/containerd/issues/3654),
|
||||||
|
## which could be not enough if PostgreSQL uses parallel workers heavily.
|
||||||
|
##
|
||||||
|
shmVolume:
|
||||||
|
## Set `shmVolume.enabled` to `true` to mount a new tmpfs volume to remove
|
||||||
|
## this limitation.
|
||||||
|
##
|
||||||
|
enabled: true
|
||||||
|
## Set to `true` to `chmod 777 /dev/shm` on a initContainer.
|
||||||
|
## This option is ingored if `volumePermissions.enabled` is `false`
|
||||||
|
##
|
||||||
|
chmod:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
## PostgreSQL data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## A manually managed Persistent Volume and Claim
|
||||||
|
## If defined, PVC must be created manually before volume will be bound
|
||||||
|
## The value is evaluated as a template, so, for example, the name can depend on .Release or .Chart
|
||||||
|
##
|
||||||
|
# existingClaim:
|
||||||
|
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## PostgreSQL images.
|
||||||
|
##
|
||||||
|
mountPath: /bitnami/postgresql
|
||||||
|
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
##
|
||||||
|
subPath: ""
|
||||||
|
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
annotations: {}
|
||||||
|
|
||||||
|
## updateStrategy for PostgreSQL StatefulSet and its slaves StatefulSets
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
|
||||||
|
updateStrategy:
|
||||||
|
type: RollingUpdate
|
||||||
|
|
||||||
|
##
|
||||||
|
## PostgreSQL Master parameters
|
||||||
|
##
|
||||||
|
master:
|
||||||
|
## Node, affinity, tolerations, and priorityclass settings for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption
|
||||||
|
nodeSelector: {}
|
||||||
|
affinity: {}
|
||||||
|
tolerations: []
|
||||||
|
labels: {}
|
||||||
|
annotations: {}
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
priorityClassName: ""
|
||||||
|
## Extra init containers
|
||||||
|
## Example
|
||||||
|
##
|
||||||
|
## extraInitContainers:
|
||||||
|
## - name: do-something
|
||||||
|
## image: busybox
|
||||||
|
## command: ['do', 'something']
|
||||||
|
extraInitContainers: []
|
||||||
|
|
||||||
|
## Additional PostgreSQL Master Volume mounts
|
||||||
|
##
|
||||||
|
extraVolumeMounts: []
|
||||||
|
## Additional PostgreSQL Master Volumes
|
||||||
|
##
|
||||||
|
extraVolumes: []
|
||||||
|
## Add sidecars to the pod
|
||||||
|
##
|
||||||
|
## For example:
|
||||||
|
## sidecars:
|
||||||
|
## - name: your-image-name
|
||||||
|
## image: your-image
|
||||||
|
## imagePullPolicy: Always
|
||||||
|
## ports:
|
||||||
|
## - name: portname
|
||||||
|
## containerPort: 1234
|
||||||
|
sidecars: []
|
||||||
|
|
||||||
|
## Override the service configuration for master
|
||||||
|
##
|
||||||
|
service: {}
|
||||||
|
# type:
|
||||||
|
# nodePort:
|
||||||
|
# clusterIP:
|
||||||
|
|
||||||
|
##
|
||||||
|
## PostgreSQL Slave parameters
|
||||||
|
##
|
||||||
|
slave:
|
||||||
|
## Node, affinity, tolerations, and priorityclass settings for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption
|
||||||
|
nodeSelector: {}
|
||||||
|
affinity: {}
|
||||||
|
tolerations: []
|
||||||
|
labels: {}
|
||||||
|
annotations: {}
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
priorityClassName: ""
|
||||||
|
extraInitContainers: |
|
||||||
|
# - name: do-something
|
||||||
|
# image: busybox
|
||||||
|
# command: ['do', 'something']
|
||||||
|
## Additional PostgreSQL Slave Volume mounts
|
||||||
|
##
|
||||||
|
extraVolumeMounts: []
|
||||||
|
## Additional PostgreSQL Slave Volumes
|
||||||
|
##
|
||||||
|
extraVolumes: []
|
||||||
|
## Add sidecars to the pod
|
||||||
|
##
|
||||||
|
## For example:
|
||||||
|
## sidecars:
|
||||||
|
## - name: your-image-name
|
||||||
|
## image: your-image
|
||||||
|
## imagePullPolicy: Always
|
||||||
|
## ports:
|
||||||
|
## - name: portname
|
||||||
|
## containerPort: 1234
|
||||||
|
sidecars: []
|
||||||
|
|
||||||
|
## Override the service configuration for slave
|
||||||
|
##
|
||||||
|
service: {}
|
||||||
|
# type:
|
||||||
|
# nodePort:
|
||||||
|
# clusterIP:
|
||||||
|
|
||||||
|
## Configure resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
##
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 256Mi
|
||||||
|
cpu: 250m
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
## Enable creation of NetworkPolicy resources. Only Ingress traffic is filtered for now.
|
||||||
|
##
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## The Policy model to apply. When set to false, only pods with the correct
|
||||||
|
## client label will have network access to the port PostgreSQL is listening
|
||||||
|
## on. When true, PostgreSQL will accept connections from any source
|
||||||
|
## (with the correct destination port).
|
||||||
|
##
|
||||||
|
allowExternal: true
|
||||||
|
|
||||||
|
## if explicitNamespacesSelector is missing or set to {}, only client Pods that are in the networkPolicy's namespace
|
||||||
|
## and that match other criteria, the ones that have the good label, can reach the DB.
|
||||||
|
## But sometimes, we want the DB to be accessible to clients from other namespaces, in this case, we can use this
|
||||||
|
## LabelSelector to select these namespaces, note that the networkPolicy's namespace should also be explicitly added.
|
||||||
|
##
|
||||||
|
## Example:
|
||||||
|
## explicitNamespacesSelector:
|
||||||
|
## matchLabels:
|
||||||
|
## role: frontend
|
||||||
|
## matchExpressions:
|
||||||
|
## - {key: role, operator: In, values: [frontend]}
|
||||||
|
explicitNamespacesSelector: {}
|
||||||
|
|
||||||
|
## Configure extra options for liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
|
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
|
|
||||||
|
## Configure metrics exporter
|
||||||
|
##
|
||||||
|
metrics:
|
||||||
|
enabled: false
|
||||||
|
# resources: {}
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
annotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "9187"
|
||||||
|
loadBalancerIP:
|
||||||
|
serviceMonitor:
|
||||||
|
enabled: false
|
||||||
|
additionalLabels: {}
|
||||||
|
# namespace: monitoring
|
||||||
|
# interval: 30s
|
||||||
|
# scrapeTimeout: 10s
|
||||||
|
## Custom PrometheusRule to be defined
|
||||||
|
## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions
|
||||||
|
prometheusRule:
|
||||||
|
enabled: false
|
||||||
|
additionalLabels: {}
|
||||||
|
namespace: ""
|
||||||
|
## These are just examples rules, please adapt them to your needs.
|
||||||
|
## Make sure to constraint the rules to the current postgresql service.
|
||||||
|
## rules:
|
||||||
|
## - alert: HugeReplicationLag
|
||||||
|
## expr: pg_replication_lag{service="{{ template "postgresql.fullname" . }}-metrics"} / 3600 > 1
|
||||||
|
## for: 1m
|
||||||
|
## labels:
|
||||||
|
## severity: critical
|
||||||
|
## annotations:
|
||||||
|
## description: replication for {{ template "postgresql.fullname" . }} PostgreSQL is lagging by {{ "{{ $value }}" }} hour(s).
|
||||||
|
## summary: PostgreSQL replication is lagging by {{ "{{ $value }}" }} hour(s).
|
||||||
|
rules: []
|
||||||
|
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/postgres-exporter
|
||||||
|
tag: 0.8.0-debian-10-r72
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
## Define additional custom metrics
|
||||||
|
## ref: https://github.com/wrouesnel/postgres_exporter#adding-new-metrics-via-a-config-file
|
||||||
|
# customMetrics:
|
||||||
|
# pg_database:
|
||||||
|
# query: "SELECT d.datname AS name, CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT') THEN pg_catalog.pg_database_size(d.datname) ELSE 0 END AS size FROM pg_catalog.pg_database d where datname not in ('template0', 'template1', 'postgres')"
|
||||||
|
# metrics:
|
||||||
|
# - name:
|
||||||
|
# usage: "LABEL"
|
||||||
|
# description: "Name of the database"
|
||||||
|
# - size_bytes:
|
||||||
|
# usage: "GAUGE"
|
||||||
|
# description: "Size of the database in bytes"
|
||||||
|
## Pod Security Context
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||||||
|
##
|
||||||
|
securityContext:
|
||||||
|
enabled: false
|
||||||
|
runAsUser: 1001
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
## Configure extra options for liveness and readiness probes
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
|
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
@@ -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,17 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
appVersion: 3.8.3
|
||||||
|
description: Open source message broker software that implements the Advanced Message
|
||||||
|
Queuing Protocol (AMQP)
|
||||||
|
home: https://www.rabbitmq.com
|
||||||
|
icon: https://bitnami.com/assets/stacks/rabbitmq/img/rabbitmq-stack-220x234.png
|
||||||
|
keywords:
|
||||||
|
- rabbitmq
|
||||||
|
- message queue
|
||||||
|
- AMQP
|
||||||
|
maintainers:
|
||||||
|
- email: containers@bitnami.com
|
||||||
|
name: Bitnami
|
||||||
|
name: rabbitmq
|
||||||
|
sources:
|
||||||
|
- https://github.com/bitnami/bitnami-docker-rabbitmq
|
||||||
|
version: 6.25.0
|
||||||
@@ -0,0 +1,410 @@
|
|||||||
|
# RabbitMQ
|
||||||
|
|
||||||
|
[RabbitMQ](https://www.rabbitmq.com/) is an open source message broker software that implements the Advanced Message Queuing Protocol (AMQP).
|
||||||
|
|
||||||
|
## TL;DR;
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||||
|
$ helm install my-release bitnami/rabbitmq
|
||||||
|
```
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This chart bootstraps a [RabbitMQ](https://github.com/bitnami/bitnami-docker-rabbitmq) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
|
||||||
|
|
||||||
|
Bitnami charts can be used with [Kubeapps](https://kubeapps.com/) for deployment and management of Helm Charts in clusters. This chart has been tested to work with NGINX Ingress, cert-manager, fluentd and Prometheus on top of the [BKPR](https://kubeprod.io/).
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Kubernetes 1.12+
|
||||||
|
- Helm 2.11+ or Helm 3.0-beta3+
|
||||||
|
- 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 bitnami/rabbitmq
|
||||||
|
```
|
||||||
|
|
||||||
|
The command deploys RabbitMQ 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm delete my-release
|
||||||
|
```
|
||||||
|
|
||||||
|
The command removes all the Kubernetes components associated with the chart and deletes the release.
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
The following table lists the configurable parameters of the RabbitMQ chart and their default values.
|
||||||
|
|
||||||
|
| Parameter | Description | Default |
|
||||||
|
| -------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------- |
|
||||||
|
| `global.imageRegistry` | Global Docker image registry | `nil` |
|
||||||
|
| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` (does not add image pull secrets to deployed pods) |
|
||||||
|
| `global.storageClass` | Global storage class for dynamic provisioning | `nil` |
|
||||||
|
| `image.registry` | Rabbitmq Image registry | `docker.io` |
|
||||||
|
| `image.repository` | Rabbitmq Image name | `bitnami/rabbitmq` |
|
||||||
|
| `image.tag` | Rabbitmq Image tag | `{TAG_NAME}` |
|
||||||
|
| `image.pullPolicy` | Image pull policy | `IfNotPresent` |
|
||||||
|
| `image.pullSecrets` | Specify docker-registry secret names as an array | `nil` |
|
||||||
|
| `image.debug` | Specify if debug values should be set | `false` |
|
||||||
|
| `nameOverride` | String to partially override rabbitmq.fullname template with a string (will prepend the release name) | `nil` |
|
||||||
|
| `fullnameOverride` | String to fully override rabbitmq.fullname template with a string | `nil` |
|
||||||
|
| `rbacEnabled` | Specify if rbac is enabled in your cluster | `true` |
|
||||||
|
| `podManagementPolicy` | Pod management policy | `OrderedReady` |
|
||||||
|
| `rabbitmq.username` | RabbitMQ application username | `user` |
|
||||||
|
| `rabbitmq.password` | RabbitMQ application password | _random 10 character long alphanumeric string_ |
|
||||||
|
| `rabbitmq.existingPasswordSecret` | Existing secret with RabbitMQ credentials | `nil` |
|
||||||
|
| `rabbitmq.erlangCookie` | Erlang cookie | _random 32 character long alphanumeric string_ |
|
||||||
|
| `rabbitmq.existingErlangSecret` | Existing secret with RabbitMQ Erlang cookie | `nil` |
|
||||||
|
| `rabbitmq.plugins` | List of plugins to enable | `rabbitmq_management rabbitmq_peer_discovery_k8s` |
|
||||||
|
| `rabbitmq.extraPlugins` | Extra plugings to enable | `nil` |
|
||||||
|
| `rabbitmq.clustering.address_type` | Switch clustering mode | `ip` or `hostname` |
|
||||||
|
| `rabbitmq.clustering.k8s_domain` | Customize internal k8s cluster domain | `cluster.local` |
|
||||||
|
| `rabbitmq.clustering.rebalance` | Rebalance master for queues in cluster when new replica is created | `false` |
|
||||||
|
| `rabbitmq.logs` | Value for the RABBITMQ_LOGS environment variable | `-` |
|
||||||
|
| `rabbitmq.setUlimitNofiles` | Specify if max file descriptor limit should be set | `true` |
|
||||||
|
| `rabbitmq.ulimitNofiles` | Max File Descriptor limit | `65536` |
|
||||||
|
| `rabbitmq.maxAvailableSchedulers` | RabbitMQ maximum available scheduler threads | `2` |
|
||||||
|
| `rabbitmq.onlineSchedulers` | RabbitMQ online scheduler threads | `1` |
|
||||||
|
| `rabbitmq.env` | RabbitMQ [environment variables](https://www.rabbitmq.com/configure.html#customise-environment) | `{}` |
|
||||||
|
| `rabbitmq.configuration` | Required cluster configuration | See values.yaml |
|
||||||
|
| `rabbitmq.extraConfiguration` | Extra configuration to add to rabbitmq.conf | See values.yaml |
|
||||||
|
| `rabbitmq.advancedConfiguration` | Extra configuration (in classic format) to add to advanced.config | See values.yaml |
|
||||||
|
| `rabbitmq.tls.enabled` | Enable TLS support to rabbitmq | `false` |
|
||||||
|
| `rabbitmq.tls.failIfNoPeerCert` | When set to true, TLS connection will be rejected if client fails to provide a certificate | `true` |
|
||||||
|
| `rabbitmq.tls.sslOptionsVerify` | `verify_peer` | Should [peer verification](https://www.rabbitmq.com/ssl.html#peer-verification) be enabled? |
|
||||||
|
| `rabbitmq.tls.caCertificate` | Ca certificate | Certificate Authority (CA) bundle content |
|
||||||
|
| `rabbitmq.tls.serverCertificate` | Server certificate | Server certificate content |
|
||||||
|
| `rabbitmq.tls.serverKey` | Server Key | Server private key content |
|
||||||
|
| `rabbitmq.tls.existingSecret` | Existing secret with certificate content to rabbitmq credentials | `nil` |
|
||||||
|
| `ldap.enabled` | Enable LDAP support | `false` |
|
||||||
|
| `ldap.server` | LDAP server | `""` |
|
||||||
|
| `ldap.port` | LDAP port | `389` |
|
||||||
|
| `ldap.user_dn_pattern` | DN used to bind to LDAP | `cn=${username},dc=example,dc=org` |
|
||||||
|
| `ldap.tls.enabled` | Enable TLS for LDAP connections | `false` (if set to true, check advancedConfiguration parameter in values.yml) |
|
||||||
|
| `service.type` | Kubernetes Service type | `ClusterIP` |
|
||||||
|
| `service.port` | Amqp port | `5672` |
|
||||||
|
| `service.loadBalancerIP` | LoadBalancerIP for the service | `nil` |
|
||||||
|
| `service.tlsPort` | Amqp TLS port | `5671` |
|
||||||
|
| `service.distPort` | Erlang distribution server port | `25672` |
|
||||||
|
| `service.nodePort` | Node port override, if serviceType NodePort | _random available between 30000-32767_ |
|
||||||
|
| `service.nodeTlsPort` | Node port override, if serviceType NodePort | _random available between 30000-32767_ |
|
||||||
|
| `service.managerPort` | RabbitMQ Manager port | `15672` |
|
||||||
|
| `service.extraPorts` | Extra ports to expose in the service | `nil` |
|
||||||
|
| `service.extraContainerPorts` | Extra ports to be included in container spec, primarily informational | `nil` |
|
||||||
|
| `persistence.enabled` | Use a PVC to persist data | `true` |
|
||||||
|
| `service.annotations` | service annotations | {} |
|
||||||
|
| `schedulerName` | Name of the k8s service (other than default) | `nil` |
|
||||||
|
| `persistence.storageClass` | Storage class of backing PVC | `nil` (uses alpha storage class annotation) |
|
||||||
|
| `persistence.existingClaim` | RabbitMQ data Persistent Volume existing claim name, evaluated as a template | "" |
|
||||||
|
| `persistence.selector` | Selector to match an existing Persistent Volume | `nil` |
|
||||||
|
| `persistence.accessMode` | Use volume as ReadOnly or ReadWrite | `ReadWriteOnce` |
|
||||||
|
| `persistence.size` | Size of data volume | `8Gi` |
|
||||||
|
| `persistence.path` | Mount path of the data volume | `/opt/bitnami/rabbitmq/var/lib/rabbitmq` |
|
||||||
|
| `securityContext.enabled` | Enable security context | `true` |
|
||||||
|
| `securityContext.fsGroup` | Group ID for the container | `1001` |
|
||||||
|
| `securityContext.runAsUser` | User ID for the container | `1001` |
|
||||||
|
| `resources` | resource needs and limits to apply to the pod | {} |
|
||||||
|
| `replicas` | Replica count | `1` |
|
||||||
|
| `priorityClassName` | Pod priority class name | `` |
|
||||||
|
| `networkPolicy.enabled` | Enable NetworkPolicy | `false` |
|
||||||
|
| `networkPolicy.allowExternal` | Don't require client label for connections | `true` |
|
||||||
|
| `networkPolicy.additionalRules` | Additional NetworkPolicy rules | `nil` |
|
||||||
|
| `nodeSelector` | Node labels for pod assignment | {} |
|
||||||
|
| `affinity` | Affinity settings for pod assignment | {} |
|
||||||
|
| `tolerations` | Toleration labels for pod assignment | [] |
|
||||||
|
| `updateStrategy` | Statefulset update strategy policy | `RollingUpdate` |
|
||||||
|
| `ingress.enabled` | Enable ingress resource for Management console | `false` |
|
||||||
|
| `ingress.hostName` | Hostname to your RabbitMQ installation | `nil` |
|
||||||
|
| `ingress.path` | Path within the url structure | `/` |
|
||||||
|
| `ingress.tls` | enable ingress with tls | `false` |
|
||||||
|
| `ingress.tlsSecret` | tls type secret to be used | `myTlsSecret` |
|
||||||
|
| `ingress.annotations` | ingress annotations as an array | [] |
|
||||||
|
| `livenessProbe.enabled` | would you like a livenessProbed to be enabled | `true` |
|
||||||
|
| `livenessProbe.initialDelaySeconds` | number of seconds | 120 |
|
||||||
|
| `livenessProbe.timeoutSeconds` | number of seconds | 20 |
|
||||||
|
| `livenessProbe.periodSeconds` | number of seconds | 30 |
|
||||||
|
| `livenessProbe.failureThreshold` | number of failures | 6 |
|
||||||
|
| `livenessProbe.successThreshold` | number of successes | 1 |
|
||||||
|
| `livenessProbe.commandOverride` | Custom command for liveness probe | [] |
|
||||||
|
| `podDisruptionBudget` | Pod Disruption Budget settings | {} |
|
||||||
|
| `readinessProbe.enabled` | would you like a readinessProbe to be enabled | `true` |
|
||||||
|
| `readinessProbe.initialDelaySeconds` | number of seconds | 10 |
|
||||||
|
| `readinessProbe.timeoutSeconds` | number of seconds | 20 |
|
||||||
|
| `readinessProbe.periodSeconds` | number of seconds | 30 |
|
||||||
|
| `readinessProbe.failureThreshold` | number of failures | 3 |
|
||||||
|
| `readinessProbe.successThreshold` | number of successes | 1 |
|
||||||
|
| `readinessProbe.commandOverride` | Custom command for readiness probe | [] |
|
||||||
|
| `metrics.enabled` | Enable prometheus to access rabbitmq metrics | `false` |
|
||||||
|
| `metrics.port` | Port where the server will expose Prometheus metrics | `9419` |
|
||||||
|
| `metrics.plugins` | Plugins to enable prometheus metrics in rabbitmq | `rabbitmq_prometheus` |
|
||||||
|
| `metrics.podAnnotations` | Annotations for enabling prometheus to access the metrics endpoint | `{prometheus.io/scrape: "true", prometheus.io/port: "9419"}` |
|
||||||
|
| `metrics.serviceMonitor.enabled` | Create ServiceMonitor Resource for scraping metrics using PrometheusOperator | `false` |
|
||||||
|
| `metrics.serviceMonitor.namespace` | Namespace where servicemonitor resource should be created | `nil` |
|
||||||
|
| `metrics.serviceMonitor.interval` | Specify the interval at which metrics should be scraped | `30s` |
|
||||||
|
| `metrics.serviceMonitor.scrapeTimeout` | Specify the timeout after which the scrape is ended | `nil` |
|
||||||
|
| `metrics.serviceMonitor.relabellings` | Specify Metric Relabellings to add to the scrape endpoint | `nil` |
|
||||||
|
| `metrics.serviceMonitor.honorLabels` | honorLabels chooses the metric's labels on collisions with target labels. | `false` |
|
||||||
|
| `metrics.serviceMonitor.additionalLabels` | Used to pass Labels that are required by the Installed Prometheus Operator | `{}` |
|
||||||
|
| `metrics.serviceMonitor.release` | Used to pass Labels release that sometimes should be custom for Prometheus Operator | `nil` |
|
||||||
|
| `metrics.prometheusRule.enabled` | Set this to true to create prometheusRules for Prometheus operator | `false` |
|
||||||
|
| `metrics.prometheusRule.additionalLabels` | Additional labels that can be used so prometheusRules will be discovered by Prometheus | `{}` |
|
||||||
|
| `metrics.prometheusRule.namespace` | namespace where prometheusRules resource should be created | Same namespace as rabbitmq |
|
||||||
|
| `metrics.prometheusRule.rules` | [rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) to be created, check values for an example. | `[]` |
|
||||||
|
| `podLabels` | Additional labels for the statefulset pod(s). | {} |
|
||||||
|
| `volumePermissions.enabled` | Enable init container that changes volume permissions in the data directory (for cases where the default k8s `runAsUser` and `fsUser` values do not work) | `false |
|
||||||
|
| `volumePermissions.image.registry` | Init container volume-permissions image registry | `docker.io` |
|
||||||
|
| `volumePermissions.image.repository` | Init container volume-permissions image name | `bitnami/minideb` |
|
||||||
|
| `volumePermissions.image.tag` | Init container volume-permissions image tag | `buster` |
|
||||||
|
| `volumePermissions.image.pullPolicy` | Init container volume-permissions image pull policy | `Always` |
|
||||||
|
| `volumePermissions.resources` | Init container resource requests/limit | `nil` |
|
||||||
|
| `forceBoot.enabled` | Executes 'rabbitmqctl force_boot' to force boot cluster shut down unexpectedly in an unknown order. Use it only if you prefer availability over integrity. | `false` |
|
||||||
|
| `extraSecrets` | Optionally specify extra secrets to be created by the chart. | `{}` |
|
||||||
|
| `extraVolumeMounts` | Optionally specify extra list of additional volumeMounts . | `{}` |
|
||||||
|
| `extraVolumes` | Optionally specify extra list of additional volumes . | `{}` |
|
||||||
|
|
||||||
|
The above parameters map to the env variables defined in [bitnami/rabbitmq](http://github.com/bitnami/bitnami-docker-rabbitmq). For more information please refer to the [bitnami/rabbitmq](http://github.com/bitnami/bitnami-docker-rabbitmq) image documentation.
|
||||||
|
|
||||||
|
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm install my-release \
|
||||||
|
--set rabbitmq.username=admin,rabbitmq.password=secretpassword,rabbitmq.erlangCookie=secretcookie \
|
||||||
|
bitnami/rabbitmq
|
||||||
|
```
|
||||||
|
|
||||||
|
The above command sets the RabbitMQ admin username and password to `admin` and `secretpassword` respectively. Additionally the secure erlang cookie is set to `secretcookie`.
|
||||||
|
|
||||||
|
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 bitnami/rabbitmq
|
||||||
|
```
|
||||||
|
|
||||||
|
> **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.
|
||||||
|
|
||||||
|
### Production configuration and horizontal scaling
|
||||||
|
|
||||||
|
This chart includes a `values-production.yaml` file where you can find some parameters oriented to production configuration in comparison to the regular `values.yaml`. You can use this file instead of the default one.
|
||||||
|
|
||||||
|
- Resource needs and limits to apply to the pod:
|
||||||
|
```diff
|
||||||
|
- resources: {}
|
||||||
|
+ resources:
|
||||||
|
+ requests:
|
||||||
|
+ memory: 256Mi
|
||||||
|
+ cpu: 100m
|
||||||
|
```
|
||||||
|
|
||||||
|
- Replica count:
|
||||||
|
```diff
|
||||||
|
- replicas: 1
|
||||||
|
+ replicas: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
- Node labels for pod assignment:
|
||||||
|
```diff
|
||||||
|
- nodeSelector: {}
|
||||||
|
+ nodeSelector:
|
||||||
|
+ beta.kubernetes.io/arch: amd64
|
||||||
|
```
|
||||||
|
|
||||||
|
- Enable ingress with TLS:
|
||||||
|
```diff
|
||||||
|
- ingress.tls: false
|
||||||
|
+ ingress.tls: true
|
||||||
|
```
|
||||||
|
|
||||||
|
- Enable prometheus metrics:
|
||||||
|
```diff
|
||||||
|
- metrics.enabled: false
|
||||||
|
+ metrics.enabled: true
|
||||||
|
```
|
||||||
|
|
||||||
|
- Enable init container that changes volume permissions in the data directory:
|
||||||
|
```diff
|
||||||
|
- volumePermissions.enabled: false
|
||||||
|
+ volumePermissions.enabled: true
|
||||||
|
```
|
||||||
|
|
||||||
|
To horizontally scale this chart once it has been deployed you have two options:
|
||||||
|
|
||||||
|
- Use `kubectl scale` command
|
||||||
|
|
||||||
|
- Upgrading the chart with the following parameters:
|
||||||
|
|
||||||
|
```console
|
||||||
|
replicas=3
|
||||||
|
rabbitmq.password="$RABBITMQ_PASSWORD"
|
||||||
|
rabbitmq.erlangCookie="$RABBITMQ_ERLANG_COOKIE"
|
||||||
|
```
|
||||||
|
|
||||||
|
> Note: please note it's mandatory to indicate the password and erlangCookie that was set the first time the chart was installed to upgrade the chart. Otherwise, new pods won't be able to join the cluster.
|
||||||
|
|
||||||
|
### Load Definitions
|
||||||
|
It is possible to [load a RabbitMQ definitions file to configure RabbitMQ](http://www.rabbitmq.com/management.html#load-definitions). Because definitions may contain RabbitMQ credentials, [store the JSON as a Kubernetes secret](https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod). Within the secret's data, choose a key name that corresponds with the desired load definitions filename (i.e. `load_definition.json`) and use the JSON object as the value. For example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq-load-definition
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
load_definition.json: |-
|
||||||
|
{
|
||||||
|
"vhosts": [
|
||||||
|
{
|
||||||
|
"name": "/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, specify the `management.load_definitions` property as an `extraConfiguration` pointing to the load definition file path within the container (i.e. `/app/load_definition.json`) and set `loadDefinition.enable` to `true`.
|
||||||
|
|
||||||
|
Any load definitions specified will be available within in the container at `/app`.
|
||||||
|
|
||||||
|
> Loading a definition will take precedence over any configuration done through [Helm values](#parameters).
|
||||||
|
|
||||||
|
If needed, you can use `extraSecrets` to let the chart create the secret for you. This way, you don't need to manually create it before deploying a release. For example :
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
extraSecrets:
|
||||||
|
load-definition:
|
||||||
|
load_definition.json: |
|
||||||
|
{
|
||||||
|
"vhosts": [
|
||||||
|
{
|
||||||
|
"name": "/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
rabbitmq:
|
||||||
|
loadDefinition:
|
||||||
|
enabled: true
|
||||||
|
secretName: load-definition
|
||||||
|
extraConfiguration: |
|
||||||
|
management.load_definitions = /app/load_definition.json
|
||||||
|
```
|
||||||
|
|
||||||
|
### Enabling TLS support
|
||||||
|
|
||||||
|
To enable TLS support you must generate the certificates using RabbitMQ [documentation](https://www.rabbitmq.com/ssl.html#automated-certificate-generation).
|
||||||
|
|
||||||
|
You must include in your values.yaml the caCertificate, serverCertificate and serverKey files.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
caCertificate: |-
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDRTCCAi2gAwIBAgIJAJPh+paO6a3cMA0GCSqGSIb3DQEBCwUAMDExIDAeBgNV
|
||||||
|
...
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
serverCertificate: |-
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDqjCCApKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAxMSAwHgYDVQQDDBdUTFNH
|
||||||
|
...
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
serverKey: |-
|
||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEA2iX3M4d3LHrRAoVUbeFZN3EaGzKhyBsz7GWwTgETiNj+AL7p
|
||||||
|
....
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
|
```
|
||||||
|
|
||||||
|
This will be generate a secret with the certs, but is possible specify an existing secret using `existingSecret: name-of-existing-secret-to-rabbitmq`. The secret is of type `kubernetes.io/tls`.
|
||||||
|
|
||||||
|
Disabling [failIfNoPeerCert](https://www.rabbitmq.com/ssl.html#peer-verification-configuration) allows a TLS connection if client fails to provide a certificate
|
||||||
|
|
||||||
|
[sslOptionsVerify](https://www.rabbitmq.com/ssl.html#peer-verification-configuration): When the sslOptionsVerify option is set to verify_peer, the client does send us a certificate, the node must perform peer verification. When set to verify_none, peer verification will be disabled and certificate exchange won't be performed.
|
||||||
|
|
||||||
|
### LDAP
|
||||||
|
|
||||||
|
LDAP support can be enabled in the chart by specifying the `ldap.` parameters while creating a release. The following parameters should be configured to properly enable the LDAP support in the chart.
|
||||||
|
|
||||||
|
- `ldap.enabled`: Enable LDAP support. Defaults to `false`.
|
||||||
|
- `ldap.server`: LDAP server host. No defaults.
|
||||||
|
- `ldap.port`: LDAP server port. `389`.
|
||||||
|
- `ldap.user_dn_pattern`: DN used to bind to LDAP. `cn=${username},dc=example,dc=org`.
|
||||||
|
- `ldap.tls.enabled`: Enable TLS for LDAP connections. Defaults to `false`.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```console
|
||||||
|
ldap.enabled="true"
|
||||||
|
ldap.server="my-ldap-server"
|
||||||
|
ldap.port="389"
|
||||||
|
ldap.user_dn_pattern="cn=${username},dc=example,dc=org"
|
||||||
|
```
|
||||||
|
|
||||||
|
If `ldap.tls.enabled` is set to true, consider using `ldap.port=636` and checking the settings in the advancedConfiguration.
|
||||||
|
|
||||||
|
### Common issues
|
||||||
|
|
||||||
|
- Changing the password through RabbitMQ's UI can make the pod fail due to the default liveness probes. If you do so, remember to make the chart aware of the new password. Updating the default secret with the password you set through RabbitMQ's UI will automatically recreate the pods. If you are using your own secret, you may have to manually recreate the pods.
|
||||||
|
|
||||||
|
## Persistence
|
||||||
|
|
||||||
|
The [Bitnami RabbitMQ](https://github.com/bitnami/bitnami-docker-rabbitmq) image stores the RabbitMQ data and configurations at the `/opt/bitnami/rabbitmq/var/lib/rabbitmq/` path of the container.
|
||||||
|
|
||||||
|
The chart mounts a [Persistent Volume](http://kubernetes.io/docs/user-guide/persistent-volumes/) at this location. By default, the volume is created using dynamic volume provisioning. An existing PersistentVolumeClaim can also be defined.
|
||||||
|
|
||||||
|
### Existing PersistentVolumeClaims
|
||||||
|
|
||||||
|
1. Create the PersistentVolume
|
||||||
|
1. Create the PersistentVolumeClaim
|
||||||
|
1. Install the chart
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm install my-release --set persistence.existingClaim=PVC_NAME bitnami/rabbitmq
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adjust permissions of the persistence volume mountpoint
|
||||||
|
|
||||||
|
As the image runs as non-root by default, it is necessary to adjust the ownership of the persistent volume so that the container can write data into it.
|
||||||
|
|
||||||
|
By default, the chart is configured to use Kubernetes Security Context to automatically change the ownership of the volume. However, this feature does not work in all Kubernetes distributions.
|
||||||
|
As an alternative, this chart supports using an `initContainer` to change the ownership of the volume before mounting it in the final destination.
|
||||||
|
|
||||||
|
You can enable this `initContainer` by setting `volumePermissions.enabled` to `true`.
|
||||||
|
|
||||||
|
## Upgrading
|
||||||
|
|
||||||
|
### To 6.0.0
|
||||||
|
|
||||||
|
This new version updates the RabbitMQ image to a [new version based on bash instead of node.js](https://github.com/bitnami/bitnami-docker-rabbitmq#3715-r18-3715-ol-7-r19). However, since this Chart overwrites the container's command, the changes to the container shouldn't affect the Chart. To upgrade, it may be needed to enable the `fastBoot` option, as it is already the case from upgrading from 5.X to 5.Y.
|
||||||
|
|
||||||
|
### To 5.0.0
|
||||||
|
|
||||||
|
This major release changes the clustering method from `ip` to `hostname`.
|
||||||
|
This change is needed to fix the persistence. The data dir will now depend on the hostname which is stable instead of the pod IP that might change.
|
||||||
|
|
||||||
|
> IMPORTANT: Note that if you upgrade from a previous version you will lose your data.
|
||||||
|
|
||||||
|
### To 3.0.0
|
||||||
|
|
||||||
|
Backwards compatibility is not guaranteed unless you modify the labels used on the chart's deployments.
|
||||||
|
Use the workaround below to upgrade from versions previous to 3.0.0. The following example assumes that the release name is rabbitmq:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ kubectl delete statefulset rabbitmq --cascade=false
|
||||||
|
```
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
tolerations:
|
||||||
|
- key: foo
|
||||||
|
operator: "Equal"
|
||||||
|
value: bar
|
||||||
|
affinity:
|
||||||
|
nodeAffinity:
|
||||||
|
preferredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- weight: 100
|
||||||
|
preference:
|
||||||
|
matchExpressions:
|
||||||
|
- key: foo
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- bar
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Leave this file empty to ensure that CI runs builds against the default configuration in values.yaml.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
networkPolicy:
|
||||||
|
enable: true
|
||||||
|
allowExternal: false
|
||||||
|
additionalRules:
|
||||||
|
- matchLabels:
|
||||||
|
- role: foo
|
||||||
|
- matchExpressions:
|
||||||
|
- key: role
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- bar
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
|
||||||
|
** Please be patient while the chart is being deployed **
|
||||||
|
|
||||||
|
Credentials:
|
||||||
|
|
||||||
|
echo "Username : {{ .Values.rabbitmq.username }}"
|
||||||
|
echo "Password : $(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "rabbitmq.fullname" . }} -o jsonpath="{.data.rabbitmq-password}" | base64 --decode)"
|
||||||
|
echo "ErLang Cookie : $(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "rabbitmq.fullname" . }} -o jsonpath="{.data.rabbitmq-erlang-cookie}" | base64 --decode)"
|
||||||
|
|
||||||
|
RabbitMQ can be accessed within the cluster on port {{ .Values.service.nodePort }} at {{ template "rabbitmq.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.rabbitmq.clustering.k8s_domain }}
|
||||||
|
|
||||||
|
To access for outside the cluster, perform the following steps:
|
||||||
|
|
||||||
|
{{- if contains "NodePort" .Values.service.type }}
|
||||||
|
|
||||||
|
Obtain the NodePort IP and ports:
|
||||||
|
|
||||||
|
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||||
|
export NODE_PORT_AMQP=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[1].nodePort}" services {{ template "rabbitmq.fullname" . }})
|
||||||
|
export NODE_PORT_STATS=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[3].nodePort}" services {{ template "rabbitmq.fullname" . }})
|
||||||
|
|
||||||
|
To Access the RabbitMQ AMQP port:
|
||||||
|
|
||||||
|
echo "URL : amqp://$NODE_IP:$NODE_PORT_AMQP/"
|
||||||
|
|
||||||
|
To Access the RabbitMQ Management interface:
|
||||||
|
|
||||||
|
echo "URL : http://$NODE_IP:$NODE_PORT_STATS/"
|
||||||
|
|
||||||
|
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||||
|
|
||||||
|
Obtain the LoadBalancer IP:
|
||||||
|
|
||||||
|
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 {{ template "rabbitmq.fullname" . }}'
|
||||||
|
|
||||||
|
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "rabbitmq.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||||
|
|
||||||
|
To Access the RabbitMQ AMQP port:
|
||||||
|
|
||||||
|
echo "URL : amqp://$SERVICE_IP:{{ .Values.service.port }}/"
|
||||||
|
|
||||||
|
To Access the RabbitMQ Management interface:
|
||||||
|
|
||||||
|
echo "URL : http://$SERVICE_IP:{{ .Values.service.managerPort }}/"
|
||||||
|
|
||||||
|
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||||
|
|
||||||
|
To Access the RabbitMQ AMQP port:
|
||||||
|
|
||||||
|
echo "URL : amqp://127.0.0.1:{{ .Values.service.port }}/"
|
||||||
|
kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ template "rabbitmq.fullname" . }} {{ .Values.service.port }}:{{ .Values.service.port }}
|
||||||
|
|
||||||
|
To Access the RabbitMQ Management interface:
|
||||||
|
|
||||||
|
echo "URL : http://127.0.0.1:{{ .Values.service.managerPort }}/"
|
||||||
|
kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ template "rabbitmq.fullname" . }} {{ .Values.service.managerPort }}:{{ .Values.service.managerPort }}
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
|
||||||
|
To access the RabbitMQ Prometheus metrics, get the RabbitMQ Prometheus URL by running:
|
||||||
|
|
||||||
|
echo "Prometheus Metrics URL: http://127.0.0.1:{{ .Values.metrics.port }}/metrics"
|
||||||
|
kubectl port-forward --namespace {{ .Release.Namespace }} {{ template "rabbitmq.fullname" . }}-0 {{ .Values.metrics.port }}:{{ .Values.metrics.port }}
|
||||||
|
|
||||||
|
Then, open the URL obtained in a browser.
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- include "rabbitmq.validateValues" . -}}
|
||||||
|
|
||||||
|
{{- if and (contains "bitnami/" .Values.image.repository) (not (.Values.image.tag | toString | regexFind "-r\\d+$|sha256:")) }}
|
||||||
|
|
||||||
|
WARNING: Rolling tag detected ({{ .Values.image.repository }}:{{ .Values.image.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 }}
|
||||||
@@ -0,0 +1,242 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.name" -}}
|
||||||
|
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
If release name contains chart name it will be used as a full name.
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.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 chart name and version as used by the chart label.
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.chart" -}}
|
||||||
|
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper RabbitMQ plugin list
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.plugins" -}}
|
||||||
|
{{- $plugins := .Values.rabbitmq.plugins -}}
|
||||||
|
{{- if .Values.rabbitmq.extraPlugins -}}
|
||||||
|
{{- $plugins = printf "%s %s" $plugins .Values.rabbitmq.extraPlugins -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if .Values.metrics.enabled -}}
|
||||||
|
{{- $plugins = printf "%s %s" $plugins .Values.metrics.plugins -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- printf "[%s]." $plugins | replace " " ", " | indent 4 -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper RabbitMQ image name
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.image" -}}
|
||||||
|
{{- $registryName := .Values.image.registry -}}
|
||||||
|
{{- $repositoryName := .Values.image.repository -}}
|
||||||
|
{{- $tag := .Values.image.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the password secret.
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.secretPasswordName" -}}
|
||||||
|
{{- if .Values.rabbitmq.existingPasswordSecret -}}
|
||||||
|
{{- printf "%s" .Values.rabbitmq.existingPasswordSecret -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s" (include "rabbitmq.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the erlang secret.
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.secretErlangName" -}}
|
||||||
|
{{- if .Values.rabbitmq.existingErlangSecret -}}
|
||||||
|
{{- printf "%s" .Values.rabbitmq.existingErlangSecret -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s" (include "rabbitmq.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Docker Image Registry Secret Names
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.imagePullSecrets" -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can not use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range .Values.global.imagePullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range .Values.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range .Values.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper image name (for the init container volume-permissions image)
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.volumePermissions.image" -}}
|
||||||
|
{{- $registryName := .Values.volumePermissions.image.registry -}}
|
||||||
|
{{- $repositoryName := .Values.volumePermissions.image.repository -}}
|
||||||
|
{{- $tag := .Values.volumePermissions.image.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Storage Class
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.storageClass" -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global -}}
|
||||||
|
{{- if .Values.global.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.global.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.global.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- if .Values.persistence.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.persistence.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.persistence.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- if .Values.persistence.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.persistence.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.persistence.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Compile all warnings into a single message, and call fail.
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.validateValues" -}}
|
||||||
|
{{- $messages := list -}}
|
||||||
|
{{- $messages := append $messages (include "rabbitmq.validateValues.ldap" .) -}}
|
||||||
|
{{- $messages := without $messages "" -}}
|
||||||
|
{{- $message := join "\n" $messages -}}
|
||||||
|
|
||||||
|
{{- if $message -}}
|
||||||
|
{{- printf "\nVALUES VALIDATION:\n%s" $message | fail -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Validate values of rabbitmq - LDAP support
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.validateValues.ldap" -}}
|
||||||
|
{{- if .Values.ldap.enabled }}
|
||||||
|
{{- if not (and .Values.ldap.server .Values.ldap.port .Values.ldap.user_dn_pattern) }}
|
||||||
|
rabbitmq: LDAP
|
||||||
|
Invalid LDAP configuration. When enabling LDAP support, the parameters "ldap.server",
|
||||||
|
"ldap.port", and "ldap. user_dn_pattern" are mandatory. Please provide them:
|
||||||
|
|
||||||
|
$ helm install {{ .Release.Name }} bitnami/rabbitmq \
|
||||||
|
--set ldap.enabled=true \
|
||||||
|
--set ldap.server="lmy-ldap-server" \
|
||||||
|
--set ldap.port="389" \
|
||||||
|
--set user_dn_pattern="cn=${username},dc=example,dc=org"
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Renders a value that contains template.
|
||||||
|
Usage:
|
||||||
|
{{ include "rabbitmq.tplValue" (dict "value" .Values.path.to.the.Value "context" $) }}
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.tplValue" -}}
|
||||||
|
{{- if typeIs "string" .value }}
|
||||||
|
{{- tpl .value .context }}
|
||||||
|
{{- else }}
|
||||||
|
{{- tpl (.value | toYaml) .context }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return podAnnotations
|
||||||
|
*/}}
|
||||||
|
{{- define "rabbitmq.podAnnotations" -}}
|
||||||
|
{{- if .Values.podAnnotations }}
|
||||||
|
{{- toYaml .Values.podAnnotations }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
{{- include "rabbitmq.tplValue" ( dict "value" .Values.metrics.podAnnotations "context" $) }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{{- if and (not .Values.rabbitmq.tls.existingSecret) ( .Values.rabbitmq.tls.enabled) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}-certs
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
type: kubernetes.io/tls
|
||||||
|
data:
|
||||||
|
ca.crt:
|
||||||
|
{{ required "A valid .Values.rabbitmq.tls.caCertificate entry required!" .Values.rabbitmq.tls.caCertificate | b64enc | quote }}
|
||||||
|
tls.crt:
|
||||||
|
{{ required "A valid .Values.rabbitmq.tls.serverCertificate entry required!" .Values.rabbitmq.tls.serverCertificate| b64enc | quote }}
|
||||||
|
tls.key:
|
||||||
|
{{ required "A valid .Values.rabbitmq.tls.serverKey entry required!" .Values.rabbitmq.tls.serverKey | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}-config
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
data:
|
||||||
|
enabled_plugins: |-
|
||||||
|
{{ template "rabbitmq.plugins" . }}
|
||||||
|
rabbitmq.conf: |-
|
||||||
|
##username and password
|
||||||
|
default_user={{.Values.rabbitmq.username}}
|
||||||
|
default_pass=CHANGEME
|
||||||
|
{{ .Values.rabbitmq.configuration | indent 4 }}
|
||||||
|
{{ .Values.rabbitmq.extraConfiguration | indent 4 }}
|
||||||
|
{{- if .Values.rabbitmq.tls.enabled }}
|
||||||
|
ssl_options.verify={{ .Values.rabbitmq.tls.sslOptionsVerify }}
|
||||||
|
listeners.ssl.default={{ .Values.service.tlsPort }}
|
||||||
|
ssl_options.fail_if_no_peer_cert={{ .Values.rabbitmq.tls.failIfNoPeerCert }}
|
||||||
|
ssl_options.cacertfile = /opt/bitnami/rabbitmq/certs/ca_certificate.pem
|
||||||
|
ssl_options.certfile = /opt/bitnami/rabbitmq/certs/server_certificate.pem
|
||||||
|
ssl_options.keyfile = /opt/bitnami/rabbitmq/certs/server_key.pem
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.ldap.enabled }}
|
||||||
|
auth_backends.1 = rabbit_auth_backend_ldap
|
||||||
|
auth_backends.2 = internal
|
||||||
|
auth_ldap.servers.1 = {{ .Values.ldap.server }}
|
||||||
|
auth_ldap.port = {{ .Values.ldap.port }}
|
||||||
|
auth_ldap.user_dn_pattern = {{ .Values.ldap.user_dn_pattern }}
|
||||||
|
{{- if .Values.ldap.tls.enabled }}
|
||||||
|
auth_ldap.use_ssl = true
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
prometheus.tcp.port = {{ .Values.metrics.port }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{ if .Values.rabbitmq.advancedConfiguration}}
|
||||||
|
advanced.config: |-
|
||||||
|
{{ .Values.rabbitmq.advancedConfiguration | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}-healthchecks
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
data:
|
||||||
|
rabbitmq-health-check: |-
|
||||||
|
#!/bin/sh
|
||||||
|
START_FLAG=/opt/bitnami/rabbitmq/var/lib/rabbitmq/.start
|
||||||
|
if [ -f ${START_FLAG} ]; then
|
||||||
|
rabbitmqctl node_health_check
|
||||||
|
RESULT=$?
|
||||||
|
if [ $RESULT -ne 0 ]; then
|
||||||
|
rabbitmqctl status
|
||||||
|
exit $?
|
||||||
|
fi
|
||||||
|
rm -f ${START_FLAG}
|
||||||
|
exit ${RESULT}
|
||||||
|
fi
|
||||||
|
rabbitmq-api-check $1 $2
|
||||||
|
rabbitmq-api-check: |-
|
||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
URL=$1
|
||||||
|
EXPECTED=$2
|
||||||
|
ACTUAL=$(curl --silent --show-error --fail "${URL}")
|
||||||
|
echo "${ACTUAL}"
|
||||||
|
test "${EXPECTED}" = "${ACTUAL}"
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
{{- if .Values.ingress.enabled }}
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: "{{ template "rabbitmq.fullname" . }}"
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: "{{ template "rabbitmq.name" . }}"
|
||||||
|
chart: "{{ template "rabbitmq.chart" . }}"
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
annotations:
|
||||||
|
{{- if .Values.ingress.tls }}
|
||||||
|
ingress.kubernetes.io/secure-backends: "true"
|
||||||
|
{{- end }}
|
||||||
|
{{- range $key, $value := .Values.ingress.annotations }}
|
||||||
|
{{ $key }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
{{- if .Values.ingress.hostName }}
|
||||||
|
- host: {{ .Values.ingress.hostName }}
|
||||||
|
http:
|
||||||
|
{{- else }}
|
||||||
|
- http:
|
||||||
|
{{- end }}
|
||||||
|
paths:
|
||||||
|
- path: {{ .Values.ingress.path }}
|
||||||
|
backend:
|
||||||
|
serviceName: {{ template "rabbitmq.fullname" . }}
|
||||||
|
servicePort: {{ .Values.service.managerPort }}
|
||||||
|
{{- if .Values.ingress.tls }}
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
{{- if .Values.ingress.hostName }}
|
||||||
|
- {{ .Values.ingress.hostName }}
|
||||||
|
secretName: {{ .Values.ingress.tlsSecret }}
|
||||||
|
{{- else}}
|
||||||
|
- secretName: {{ .Values.ingress.tlsSecret }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{{- if .Values.networkPolicy.enabled }}
|
||||||
|
kind: NetworkPolicy
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
spec:
|
||||||
|
podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
ingress:
|
||||||
|
# Allow inbound connections
|
||||||
|
|
||||||
|
- ports:
|
||||||
|
- port: 4369 # EPMD
|
||||||
|
- port: {{ .Values.service.port }}
|
||||||
|
- port: {{ .Values.service.tlsPort }}
|
||||||
|
- port: {{ .Values.service.distPort }}
|
||||||
|
- port: {{ .Values.service.managerPort }}
|
||||||
|
|
||||||
|
{{- if not .Values.networkPolicy.allowExternal }}
|
||||||
|
from:
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
{{ template "rabbitmq.fullname" . }}-client: "true"
|
||||||
|
{{- with .Values.networkPolicy.additionalRules }}
|
||||||
|
{{ toYaml . | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
# Allow prometheus scrapes
|
||||||
|
- ports:
|
||||||
|
- port: {{ .Values.metrics.port }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{{- if .Values.podDisruptionBudget -}}
|
||||||
|
apiVersion: policy/v1beta1
|
||||||
|
kind: PodDisruptionBudget
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
{{ toYaml .Values.podDisruptionBudget | indent 2 }}
|
||||||
|
{{- end -}}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }}
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: PrometheusRule
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}
|
||||||
|
{{- if .Values.metrics.prometheusRule.namespace }}
|
||||||
|
namespace: {{ .Values.metrics.prometheusRule.namespace }}
|
||||||
|
{{- else }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
{{- with .Values.metrics.prometheusRule.additionalLabels }}
|
||||||
|
{{ toYaml . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.metrics.prometheusRule.rules }}
|
||||||
|
groups:
|
||||||
|
- name: {{ template "rabbitmq.name" $ }}
|
||||||
|
rules: {{ tpl (toYaml .) $ | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
{{- if .Values.rbacEnabled }}
|
||||||
|
kind: Role
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}-endpoint-reader
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
rules:
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["endpoints"]
|
||||||
|
verbs: ["get"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["events"]
|
||||||
|
verbs: ["create"]
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
{{- if .Values.rbacEnabled }}
|
||||||
|
kind: RoleBinding
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}-endpoint-reader
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: Role
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}-endpoint-reader
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{{- if or (not .Values.rabbitmq.existingErlangSecret) (not .Values.rabbitmq.existingPasswordSecret) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
{{ if not .Values.rabbitmq.existingPasswordSecret }}{{ if .Values.rabbitmq.password }}
|
||||||
|
rabbitmq-password: {{ .Values.rabbitmq.password | b64enc | quote }}
|
||||||
|
{{ else }}
|
||||||
|
rabbitmq-password: {{ randAlphaNum 10 | b64enc | quote }}
|
||||||
|
{{ end }}{{ end }}
|
||||||
|
{{ if not .Values.rabbitmq.existingErlangSecret }}{{ if .Values.rabbitmq.erlangCookie }}
|
||||||
|
rabbitmq-erlang-cookie: {{ .Values.rabbitmq.erlangCookie | b64enc | quote }}
|
||||||
|
{{ else }}
|
||||||
|
rabbitmq-erlang-cookie: {{ randAlphaNum 32 | b64enc | quote }}
|
||||||
|
{{ end }}{{ end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range $key, $value := .Values.extraSecrets }}
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ $key }}
|
||||||
|
namespace: {{ $.Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" $ }}
|
||||||
|
chart: {{ template "rabbitmq.chart" $ }}
|
||||||
|
release: "{{ $.Release.Name }}"
|
||||||
|
heritage: "{{ $.Release.Service }}"
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
{{ $value | toYaml | nindent 2 }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{{- if .Values.rbacEnabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
secrets:
|
||||||
|
- name: "{{ template "rabbitmq.fullname" . }}"
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: ServiceMonitor
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.namespace }}
|
||||||
|
namespace: {{ .Values.metrics.serviceMonitor.namespace }}
|
||||||
|
{{- else }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
release: {{ if .Values.metrics.serviceMonitor.release }}"{{ .Values.metrics.serviceMonitor.release }}"{{ else }}"{{ .Release.Name }}"{{ end }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.additionalLabels }}
|
||||||
|
{{ toYaml .Values.metrics.serviceMonitor.additionalLabels | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
endpoints:
|
||||||
|
- port: metrics
|
||||||
|
interval: {{ .Values.metrics.serviceMonitor.interval }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
|
||||||
|
scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
|
||||||
|
{{- end }}
|
||||||
|
honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.relabellings }}
|
||||||
|
metricRelabelings:
|
||||||
|
{{ toYaml .Values.metrics.serviceMonitor.relabellings | indent 6 }}
|
||||||
|
{{- end }}
|
||||||
|
namespaceSelector:
|
||||||
|
matchNames:
|
||||||
|
- {{ .Release.Namespace }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,345 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
spec:
|
||||||
|
serviceName: {{ template "rabbitmq.fullname" . }}-headless
|
||||||
|
podManagementPolicy: {{ .Values.podManagementPolicy }}
|
||||||
|
replicas: {{ .Values.replicas }}
|
||||||
|
updateStrategy:
|
||||||
|
type: {{ .Values.updateStrategy.type }}
|
||||||
|
{{- if (eq "Recreate" .Values.updateStrategy.type) }}
|
||||||
|
rollingUpdate: null
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
{{- if .Values.podLabels }}
|
||||||
|
{{ toYaml .Values.podLabels | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
{{- if or (not .Values.rabbitmq.existingErlangSecret) (not .Values.rabbitmq.existingPasswordSecret) }}
|
||||||
|
checksum/secret: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.podAnnotations .Values.metrics.enabled }}
|
||||||
|
{{- include "rabbitmq.podAnnotations" . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if .Values.schedulerName }}
|
||||||
|
schedulerName: "{{ .Values.schedulerName }}"
|
||||||
|
{{- end }}
|
||||||
|
{{- include "rabbitmq.imagePullSecrets" . | indent 6 }}
|
||||||
|
{{- if .Values.rbacEnabled}}
|
||||||
|
serviceAccountName: {{ template "rabbitmq.fullname" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.affinity }}
|
||||||
|
affinity: {{- include "rabbitmq.tplValue" (dict "value" .Values.affinity "context" .) | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.priorityClassName }}
|
||||||
|
priorityClassName: {{ .Values.priorityClassName }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{ toYaml .Values.nodeSelector | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{ toYaml .Values.tolerations | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
terminationGracePeriodSeconds: 10
|
||||||
|
{{- if and .Values.volumePermissions.enabled .Values.persistence.enabled .Values.securityContext.enabled }}
|
||||||
|
initContainers:
|
||||||
|
- name: volume-permissions
|
||||||
|
image: "{{ template "rabbitmq.volumePermissions.image" . }}"
|
||||||
|
imagePullPolicy: {{ default "" .Values.volumePermissions.image.pullPolicy | quote }}
|
||||||
|
command: ["/bin/chown", "-R", "{{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.fsGroup }}", "{{ .Values.persistence.path }}"]
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 0
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.volumePermissions.resources | indent 10 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: data
|
||||||
|
mountPath: "{{ .Values.persistence.path }}"
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: rabbitmq
|
||||||
|
image: {{ template "rabbitmq.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
|
||||||
|
command:
|
||||||
|
- bash
|
||||||
|
- -ec
|
||||||
|
- |
|
||||||
|
mkdir -p /opt/bitnami/rabbitmq/.rabbitmq/
|
||||||
|
mkdir -p /opt/bitnami/rabbitmq/etc/rabbitmq/
|
||||||
|
touch /opt/bitnami/rabbitmq/var/lib/rabbitmq/.start
|
||||||
|
#persist the erlang cookie in both places for server and cli tools
|
||||||
|
echo $RABBITMQ_ERL_COOKIE > /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie
|
||||||
|
cp /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie /opt/bitnami/rabbitmq/.rabbitmq/
|
||||||
|
#change permission so only the user has access to the cookie file
|
||||||
|
chmod 600 /opt/bitnami/rabbitmq/.rabbitmq/.erlang.cookie /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie
|
||||||
|
#copy the mounted configuration to both places
|
||||||
|
cp /opt/bitnami/rabbitmq/conf/* /opt/bitnami/rabbitmq/etc/rabbitmq
|
||||||
|
# Apply resources limits
|
||||||
|
{{- if .Values.rabbitmq.setUlimitNofiles }}
|
||||||
|
ulimit -n "${RABBITMQ_ULIMIT_NOFILES}"
|
||||||
|
{{- end }}
|
||||||
|
#replace the default password that is generated
|
||||||
|
sed -i "/CHANGEME/cdefault_pass=${RABBITMQ_PASSWORD//\\/\\\\}" /opt/bitnami/rabbitmq/etc/rabbitmq/rabbitmq.conf
|
||||||
|
{{- if and .Values.persistence.enabled .Values.forceBoot.enabled }}
|
||||||
|
if [ -d "{{ .Values.persistence.path }}/mnesia/${RABBITMQ_NODENAME}" ]; then rabbitmqctl force_boot; fi
|
||||||
|
{{- end }}
|
||||||
|
exec rabbitmq-server
|
||||||
|
{{- if .Values.resources }}
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.resources | indent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.extraVolumeMounts }}
|
||||||
|
{{ toYaml .Values.extraVolumeMounts | indent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
- name: config-volume
|
||||||
|
mountPath: /opt/bitnami/rabbitmq/conf
|
||||||
|
- name: healthchecks
|
||||||
|
mountPath: /usr/local/sbin/rabbitmq-api-check
|
||||||
|
subPath: rabbitmq-api-check
|
||||||
|
- name: healthchecks
|
||||||
|
mountPath: /usr/local/sbin/rabbitmq-health-check
|
||||||
|
subPath: rabbitmq-health-check
|
||||||
|
{{- if .Values.rabbitmq.tls.enabled }}
|
||||||
|
- name: {{ template "rabbitmq.fullname" . }}-certs
|
||||||
|
mountPath: /opt/bitnami/rabbitmq/certs
|
||||||
|
{{- end }}
|
||||||
|
- name: data
|
||||||
|
mountPath: "{{ .Values.persistence.path }}"
|
||||||
|
{{- if .Values.rabbitmq.loadDefinition.enabled }}
|
||||||
|
- name: load-definition-volume
|
||||||
|
mountPath: /app
|
||||||
|
readOnly: true
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: epmd
|
||||||
|
containerPort: 4369
|
||||||
|
- name: amqp
|
||||||
|
containerPort: {{ .Values.service.port }}
|
||||||
|
{{- if .Values.rabbitmq.tls.enabled }}
|
||||||
|
- name: amqp-ssl
|
||||||
|
containerPort: {{ .Values.service.tlsPort }}
|
||||||
|
{{- end }}
|
||||||
|
- name: dist
|
||||||
|
containerPort: {{ .Values.service.distPort }}
|
||||||
|
- name: stats
|
||||||
|
containerPort: {{ .Values.service.managerPort }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
- name: metrics
|
||||||
|
containerPort: {{ .Values.metrics.port }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.service.extraContainerPorts }}
|
||||||
|
{{ toYaml .Values.service.extraContainerPorts | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.livenessProbe.enabled }}
|
||||||
|
livenessProbe:
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
{{- if .Values.livenessProbe.commandOverride }}
|
||||||
|
{{ toYaml .Values.livenessProbe.commandOverride | indent 14 }}
|
||||||
|
{{- else }}
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- rabbitmq-api-check "http://{{ .Values.rabbitmq.username }}:$RABBITMQ_PASSWORD@127.0.0.1:{{ .Values.service.managerPort }}/api/healthchecks/node" '{"status":"ok"}'
|
||||||
|
{{- end }}
|
||||||
|
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||||
|
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||||
|
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||||
|
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.readinessProbe.enabled }}
|
||||||
|
readinessProbe:
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
{{- if .Values.readinessProbe.commandOverride }}
|
||||||
|
{{ toYaml .Values.readinessProbe.commandOverride | indent 14 }}
|
||||||
|
{{- else }}
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- rabbitmq-health-check "http://{{ .Values.rabbitmq.username }}:$RABBITMQ_PASSWORD@127.0.0.1:{{ .Values.service.managerPort }}/api/healthchecks/node" '{"status":"ok"}'
|
||||||
|
{{- end }}
|
||||||
|
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||||
|
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||||
|
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||||
|
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (gt (.Values.replicas | int) 1) ( eq .Values.rabbitmq.clustering.rebalance true) }}
|
||||||
|
lifecycle:
|
||||||
|
postStart:
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- until rabbitmqctl cluster_status >/dev/null; do echo Waiting for
|
||||||
|
cluster readiness...; sleep 5 ; done; rabbitmq-queues rebalance "all"
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
- name: BITNAMI_DEBUG
|
||||||
|
value: {{ ternary "true" "false" .Values.image.debug | quote }}
|
||||||
|
- name: MY_POD_IP
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: status.podIP
|
||||||
|
- name: MY_POD_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: MY_POD_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
- name: K8S_SERVICE_NAME
|
||||||
|
value: "{{ template "rabbitmq.fullname" . }}-headless"
|
||||||
|
- name: K8S_ADDRESS_TYPE
|
||||||
|
value: {{ .Values.rabbitmq.clustering.address_type }}
|
||||||
|
{{- if (eq "hostname" .Values.rabbitmq.clustering.address_type) }}
|
||||||
|
- name: RABBITMQ_NODENAME
|
||||||
|
value: "rabbit@$(MY_POD_NAME).$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.{{ .Values.rabbitmq.clustering.k8s_domain }}"
|
||||||
|
- name: K8S_HOSTNAME_SUFFIX
|
||||||
|
value: ".$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.{{ .Values.rabbitmq.clustering.k8s_domain }}"
|
||||||
|
{{- else }}
|
||||||
|
- name: RABBITMQ_NODENAME
|
||||||
|
{{- if .Values.rabbitmq.rabbitmqClusterNodeName }}
|
||||||
|
value: {{ .Values.rabbitmq.rabbitmqClusterNodeName | quote }}
|
||||||
|
{{- else }}
|
||||||
|
value: "rabbit@$(MY_POD_NAME)"
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.ldap.enabled }}
|
||||||
|
- name: RABBITMQ_LDAP_ENABLE
|
||||||
|
value: "yes"
|
||||||
|
- name: RABBITMQ_LDAP_TLS
|
||||||
|
value: {{ ternary "yes" "no" .Values.ldap.tls.enabled | quote }}
|
||||||
|
- name: RABBITMQ_LDAP_SERVER
|
||||||
|
value: {{ .Values.ldap.server }}
|
||||||
|
- name: RABBITMQ_LDAP_SERVER_PORT
|
||||||
|
value: {{ .Values.ldap.port | quote }}
|
||||||
|
- name: RABBITMQ_LDAP_USER_DN_PATTERN
|
||||||
|
value: {{ .Values.ldap.user_dn_pattern }}
|
||||||
|
{{- end }}
|
||||||
|
- name: RABBITMQ_LOGS
|
||||||
|
value: {{ .Values.rabbitmq.logs | quote }}
|
||||||
|
- name: RABBITMQ_ULIMIT_NOFILES
|
||||||
|
value: {{ .Values.rabbitmq.ulimitNofiles | quote }}
|
||||||
|
{{- if and .Values.rabbitmq.maxAvailableSchedulers }}
|
||||||
|
- name: RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS
|
||||||
|
value: {{ printf "+S %s:%s" (toString .Values.rabbitmq.maxAvailableSchedulers) (toString .Values.rabbitmq.onlineSchedulers) -}}
|
||||||
|
{{- end }}
|
||||||
|
- name: RABBITMQ_USE_LONGNAME
|
||||||
|
value: "true"
|
||||||
|
- name: RABBITMQ_ERL_COOKIE
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "rabbitmq.secretErlangName" . }}
|
||||||
|
key: rabbitmq-erlang-cookie
|
||||||
|
- name: RABBITMQ_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "rabbitmq.secretPasswordName" . }}
|
||||||
|
key: rabbitmq-password
|
||||||
|
{{- range $key, $value := .Values.rabbitmq.env }}
|
||||||
|
- name: {{ $key }}
|
||||||
|
value: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
fsGroup: {{ .Values.securityContext.fsGroup }}
|
||||||
|
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||||
|
{{- if .Values.securityContext.extra }}
|
||||||
|
{{- toYaml .Values.securityContext.extra | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
volumes:
|
||||||
|
{{- if .Values.rabbitmq.tls.enabled }}
|
||||||
|
- name: {{ template "rabbitmq.fullname" . }}-certs
|
||||||
|
secret:
|
||||||
|
secretName: {{ if .Values.rabbitmq.tls.existingSecret }}{{ .Values.rabbitmq.tls.existingSecret }}{{- else }}{{ template "rabbitmq.fullname" . }}-certs{{- end }}
|
||||||
|
items:
|
||||||
|
- key: ca.crt
|
||||||
|
path: ca_certificate.pem
|
||||||
|
- key: tls.crt
|
||||||
|
path: server_certificate.pem
|
||||||
|
- key: tls.key
|
||||||
|
path: server_key.pem
|
||||||
|
{{- end }}
|
||||||
|
- name: config-volume
|
||||||
|
configMap:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}-config
|
||||||
|
items:
|
||||||
|
- key: rabbitmq.conf
|
||||||
|
path: rabbitmq.conf
|
||||||
|
{{- if .Values.rabbitmq.advancedConfiguration}}
|
||||||
|
- key: advanced.config
|
||||||
|
path: advanced.config
|
||||||
|
{{- end }}
|
||||||
|
- key: enabled_plugins
|
||||||
|
path: enabled_plugins
|
||||||
|
- name: healthchecks
|
||||||
|
configMap:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}-healthchecks
|
||||||
|
items:
|
||||||
|
- key: rabbitmq-health-check
|
||||||
|
path: rabbitmq-health-check
|
||||||
|
mode: 111
|
||||||
|
- key: rabbitmq-api-check
|
||||||
|
path: rabbitmq-api-check
|
||||||
|
mode: 111
|
||||||
|
{{- if .Values.rabbitmq.loadDefinition.enabled }}
|
||||||
|
- name: load-definition-volume
|
||||||
|
secret:
|
||||||
|
secretName: {{ .Values.rabbitmq.loadDefinition.secretName | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.extraVolumes }}
|
||||||
|
{{ toYaml .Values.extraVolumes | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if not .Values.persistence.enabled }}
|
||||||
|
- name: data
|
||||||
|
emptyDir: {}
|
||||||
|
{{- else if .Values.persistence.existingClaim }}
|
||||||
|
- name: data
|
||||||
|
persistentVolumeClaim:
|
||||||
|
{{- with .Values.persistence.existingClaim }}
|
||||||
|
claimName: {{ tpl . $ }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: data
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- {{ .Values.persistence.accessMode | quote }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.persistence.size | quote }}
|
||||||
|
{{ include "rabbitmq.storageClass" . }}
|
||||||
|
{{- if .Values.persistence.selector }}
|
||||||
|
selector:
|
||||||
|
{{- with .Values.persistence.selector -}}
|
||||||
|
{{ toYaml . | nindent 10 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}-headless
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
spec:
|
||||||
|
clusterIP: None
|
||||||
|
ports:
|
||||||
|
- name: epmd
|
||||||
|
port: 4369
|
||||||
|
targetPort: epmd
|
||||||
|
- name: amqp
|
||||||
|
port: {{ .Values.service.port }}
|
||||||
|
targetPort: amqp
|
||||||
|
{{- if .Values.rabbitmq.tls.enabled }}
|
||||||
|
- name: amqp-tls
|
||||||
|
port: {{ .Values.service.tlsPort }}
|
||||||
|
targetPort: amqp-tls
|
||||||
|
{{- end }}
|
||||||
|
- name: dist
|
||||||
|
port: {{ .Values.service.distPort }}
|
||||||
|
targetPort: dist
|
||||||
|
- name: stats
|
||||||
|
port: {{ .Values.service.managerPort }}
|
||||||
|
targetPort: stats
|
||||||
|
selector:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "rabbitmq.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
chart: {{ template "rabbitmq.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
{{- if .Values.service.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{ toYaml .Values.service.annotations | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.service.type }}
|
||||||
|
{{- if and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges }}
|
||||||
|
loadBalancerSourceRanges:
|
||||||
|
{{ with .Values.service.loadBalancerSourceRanges }}
|
||||||
|
{{ toYaml . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if (and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP))) }}
|
||||||
|
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: epmd
|
||||||
|
port: 4369
|
||||||
|
targetPort: epmd
|
||||||
|
{{- if (eq .Values.service.type "ClusterIP") }}
|
||||||
|
nodePort: null
|
||||||
|
{{- end }}
|
||||||
|
- name: amqp
|
||||||
|
port: {{ .Values.service.port }}
|
||||||
|
targetPort: amqp
|
||||||
|
{{- if (eq .Values.service.type "ClusterIP") }}
|
||||||
|
nodePort: null
|
||||||
|
{{- else if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }}
|
||||||
|
nodePort: {{ .Values.service.nodePort }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.rabbitmq.tls.enabled }}
|
||||||
|
- name: amqp-ssl
|
||||||
|
port: {{ .Values.service.tlsPort }}
|
||||||
|
targetPort: amqp-ssl
|
||||||
|
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodeTlsPort))) }}
|
||||||
|
nodePort: {{ .Values.service.nodeTlsPort }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
- name: dist
|
||||||
|
port: {{ .Values.service.distPort }}
|
||||||
|
targetPort: dist
|
||||||
|
{{- if (eq .Values.service.type "ClusterIP") }}
|
||||||
|
nodePort: null
|
||||||
|
{{- end }}
|
||||||
|
- name: stats
|
||||||
|
port: {{ .Values.service.managerPort }}
|
||||||
|
targetPort: stats
|
||||||
|
{{- if (eq .Values.service.type "ClusterIP") }}
|
||||||
|
nodePort: null
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
- name: metrics
|
||||||
|
port: {{ .Values.metrics.port }}
|
||||||
|
targetPort: metrics
|
||||||
|
{{- if (eq .Values.service.type "ClusterIP") }}
|
||||||
|
nodePort: null
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.service.extraPorts }}
|
||||||
|
{{ toYaml .Values.service.extraPorts | indent 2 }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
app: {{ template "rabbitmq.name" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
@@ -0,0 +1,583 @@
|
|||||||
|
## Global Docker image parameters
|
||||||
|
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
|
||||||
|
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
|
||||||
|
##
|
||||||
|
# global:
|
||||||
|
# imageRegistry: myRegistryName
|
||||||
|
# imagePullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
# storageClass: myStorageClass
|
||||||
|
|
||||||
|
## Bitnami RabbitMQ image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/rabbitmq/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/rabbitmq
|
||||||
|
tag: 3.8.3-debian-10-r40
|
||||||
|
|
||||||
|
## set to true if you would like to see extra information on logs
|
||||||
|
## it turns BASH and NAMI debugging in minideb
|
||||||
|
## ref: https://github.com/bitnami/minideb-extras/#turn-on-bash-debugging
|
||||||
|
debug: false
|
||||||
|
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## String to partially override rabbitmq.fullname template (will maintain the release name)
|
||||||
|
##
|
||||||
|
# nameOverride:
|
||||||
|
|
||||||
|
## String to fully override rabbitmq.fullname template
|
||||||
|
##
|
||||||
|
# fullnameOverride:
|
||||||
|
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## does your cluster have rbac enabled? assume yes by default
|
||||||
|
rbacEnabled: true
|
||||||
|
|
||||||
|
## RabbitMQ should be initialized one by one when building cluster for the first time.
|
||||||
|
## Therefore, the default value of podManagementPolicy is 'OrderedReady'
|
||||||
|
## Once the RabbitMQ participates in the cluster, it waits for a response from another
|
||||||
|
## RabbitMQ in the same cluster at reboot, except the last RabbitMQ of the same cluster.
|
||||||
|
## If the cluster exits gracefully, you do not need to change the podManagementPolicy
|
||||||
|
## because the first RabbitMQ of the statefulset always will be last of the cluster.
|
||||||
|
## However if the last RabbitMQ of the cluster is not the first RabbitMQ due to a failure,
|
||||||
|
## you must change podManagementPolicy to 'Parallel'.
|
||||||
|
## ref : https://www.rabbitmq.com/clustering.html#restarting
|
||||||
|
##
|
||||||
|
podManagementPolicy: OrderedReady
|
||||||
|
|
||||||
|
## section of specific values for rabbitmq
|
||||||
|
rabbitmq:
|
||||||
|
## RabbitMQ application username
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
username: user
|
||||||
|
|
||||||
|
## RabbitMQ application password
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
# password:
|
||||||
|
# existingPasswordSecret: name-of-existing-secret
|
||||||
|
|
||||||
|
## Erlang cookie to determine whether different nodes are allowed to communicate with each other
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
# erlangCookie:
|
||||||
|
# existingErlangSecret: name-of-existing-secret
|
||||||
|
|
||||||
|
## Node name to cluster with. e.g.: `clusternode@hostname`
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
# rabbitmqClusterNodeName:
|
||||||
|
|
||||||
|
## Value for the RABBITMQ_LOGS environment variable
|
||||||
|
## ref: https://www.rabbitmq.com/logging.html#log-file-location
|
||||||
|
##
|
||||||
|
logs: '-'
|
||||||
|
|
||||||
|
## RabbitMQ Max File Descriptors
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
## ref: https://www.rabbitmq.com/install-debian.html#kernel-resource-limits
|
||||||
|
##
|
||||||
|
setUlimitNofiles: true
|
||||||
|
ulimitNofiles: '65536'
|
||||||
|
|
||||||
|
## RabbitMQ maximum available scheduler threads and online scheduler threads
|
||||||
|
## ref: https://hamidreza-s.github.io/erlang/scheduling/real-time/preemptive/migration/2016/02/09/erlang-scheduler-details.html#scheduler-threads
|
||||||
|
##
|
||||||
|
maxAvailableSchedulers: 2
|
||||||
|
onlineSchedulers: 1
|
||||||
|
|
||||||
|
## Plugins to enable
|
||||||
|
plugins: "rabbitmq_management rabbitmq_peer_discovery_k8s rabbitmq_prometheus"
|
||||||
|
|
||||||
|
## Extra plugins to enable
|
||||||
|
## Use this instead of `plugins` to add new plugins
|
||||||
|
extraPlugins: "rabbitmq_auth_backend_ldap"
|
||||||
|
|
||||||
|
## Clustering settings
|
||||||
|
clustering:
|
||||||
|
address_type: hostname
|
||||||
|
k8s_domain: cluster.local
|
||||||
|
## Rebalance master for queues in cluster when new replica is created
|
||||||
|
## ref: https://www.rabbitmq.com/rabbitmq-queues.8.html#rebalance
|
||||||
|
rebalance: false
|
||||||
|
|
||||||
|
loadDefinition:
|
||||||
|
enabled: false
|
||||||
|
secretName: load-definition
|
||||||
|
|
||||||
|
## environment variables to configure rabbitmq
|
||||||
|
## ref: https://www.rabbitmq.com/configure.html#customise-environment
|
||||||
|
env: {}
|
||||||
|
|
||||||
|
## Configuration file content: required cluster configuration
|
||||||
|
## Do not override unless you know what you are doing. To add more configuration, use `extraConfiguration` of `advancedConfiguration` instead
|
||||||
|
configuration: |-
|
||||||
|
## Clustering
|
||||||
|
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
|
||||||
|
cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
|
||||||
|
cluster_formation.node_cleanup.interval = 10
|
||||||
|
cluster_formation.node_cleanup.only_log_warning = true
|
||||||
|
cluster_partition_handling = autoheal
|
||||||
|
# queue master locator
|
||||||
|
queue_master_locator=min-masters
|
||||||
|
# enable guest user
|
||||||
|
loopback_users.guest = false
|
||||||
|
|
||||||
|
## Configuration file content: extra configuration
|
||||||
|
## Use this instead of `configuration` to add more configuration
|
||||||
|
extraConfiguration: |-
|
||||||
|
#disk_free_limit.absolute = 50MB
|
||||||
|
#management.load_definitions = /app/load_definition.json
|
||||||
|
|
||||||
|
## Configuration file content: advanced configuration
|
||||||
|
## Use this as additional configuraton in classic config format (Erlang term configuration format)
|
||||||
|
## If you set LDAP with TLS/SSL enabled and you are using self-signed certificates, uncomment these lines.
|
||||||
|
## advancedConfiguration: |-
|
||||||
|
## [{
|
||||||
|
## rabbitmq_auth_backend_ldap,
|
||||||
|
## [{
|
||||||
|
## ssl_options,
|
||||||
|
## [{
|
||||||
|
## verify, verify_none
|
||||||
|
## }, {
|
||||||
|
## fail_if_no_peer_cert,
|
||||||
|
## false
|
||||||
|
## }]
|
||||||
|
## ]}
|
||||||
|
## }].
|
||||||
|
##
|
||||||
|
advancedConfiguration: |-
|
||||||
|
|
||||||
|
## Enable encryption to rabbitmq
|
||||||
|
## ref: https://www.rabbitmq.com/ssl.html
|
||||||
|
##
|
||||||
|
tls:
|
||||||
|
enabled: false
|
||||||
|
failIfNoPeerCert: true
|
||||||
|
sslOptionsVerify: verify_peer
|
||||||
|
caCertificate: |-
|
||||||
|
serverCertificate: |-
|
||||||
|
serverKey: |-
|
||||||
|
# existingSecret: name-of-existing-secret-to-rabbitmq
|
||||||
|
|
||||||
|
## LDAP configuration
|
||||||
|
##
|
||||||
|
ldap:
|
||||||
|
enabled: false
|
||||||
|
server: ""
|
||||||
|
port: "389"
|
||||||
|
user_dn_pattern: cn=${username},dc=example,dc=org
|
||||||
|
tls:
|
||||||
|
# If you enabled TLS/SSL you can set advaced options using the advancedConfiguration parameter.
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## Kubernetes service type
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
## Node port
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
# nodePort: 30672
|
||||||
|
|
||||||
|
## Set the LoadBalancerIP
|
||||||
|
##
|
||||||
|
# loadBalancerIP:
|
||||||
|
|
||||||
|
## Node port Tls
|
||||||
|
##
|
||||||
|
# nodeTlsPort: 30671
|
||||||
|
|
||||||
|
## Amqp port
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
port: 5672
|
||||||
|
|
||||||
|
## Amqp Tls port
|
||||||
|
##
|
||||||
|
tlsPort: 5671
|
||||||
|
|
||||||
|
## Dist port
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
distPort: 25672
|
||||||
|
|
||||||
|
## RabbitMQ Manager port
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
managerPort: 15672
|
||||||
|
|
||||||
|
## Service annotations
|
||||||
|
annotations: {}
|
||||||
|
# service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
|
||||||
|
|
||||||
|
## Load Balancer sources
|
||||||
|
## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
|
||||||
|
##
|
||||||
|
# loadBalancerSourceRanges:
|
||||||
|
# - 10.10.10.0/24
|
||||||
|
|
||||||
|
## Extra ports to expose
|
||||||
|
# extraPorts:
|
||||||
|
# - name: new_svc_name
|
||||||
|
# port: 1234
|
||||||
|
# targetPort: 1234
|
||||||
|
|
||||||
|
## Extra ports to be included in container spec, primarily informational
|
||||||
|
# extraContainerPorts:
|
||||||
|
# - name: new_svc_name
|
||||||
|
# port: 1234
|
||||||
|
# targetPort: 1234
|
||||||
|
|
||||||
|
# Additional pod labels to apply
|
||||||
|
podLabels: {}
|
||||||
|
|
||||||
|
## Pod Security Context
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||||||
|
##
|
||||||
|
securityContext:
|
||||||
|
enabled: true
|
||||||
|
fsGroup: 1001
|
||||||
|
runAsUser: 1001
|
||||||
|
extra: {}
|
||||||
|
|
||||||
|
persistence:
|
||||||
|
## this enables PVC templates that will create one per pod
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
## rabbitmq data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
## selector can be used to match an existing PersistentVolume
|
||||||
|
# selector:
|
||||||
|
# matchLabels:
|
||||||
|
# app: my-app
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
|
||||||
|
## Existing PersistentVolumeClaims
|
||||||
|
## The value is evaluated as a template
|
||||||
|
## So, for example, the name can depend on .Release or .Chart
|
||||||
|
# existingClaim: ""
|
||||||
|
|
||||||
|
# If you change this value, you might have to adjust `rabbitmq.diskFreeLimit` as well.
|
||||||
|
size: 8Gi
|
||||||
|
|
||||||
|
# persistence directory, maps to the rabbitmq data directory
|
||||||
|
path: /opt/bitnami/rabbitmq/var/lib/rabbitmq
|
||||||
|
|
||||||
|
## Configure resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
##
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 256Mi
|
||||||
|
cpu: 100m
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
## Enable creation of NetworkPolicy resources. Only Ingress traffic is filtered for now.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/network-policies/
|
||||||
|
##
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## The Policy model to apply. When set to false, only pods with the correct
|
||||||
|
## client label will have network access to the port RabbitMQ is listening
|
||||||
|
## on. When true, RabbitMQ will accept connections from any source
|
||||||
|
## (with the correct destination port).
|
||||||
|
##
|
||||||
|
allowExternal: true
|
||||||
|
|
||||||
|
## Additional NetworkPolicy Ingress "from" rules to set. Note that all rules are OR-ed.
|
||||||
|
##
|
||||||
|
# additionalRules:
|
||||||
|
# - matchLabels:
|
||||||
|
# - role: frontend
|
||||||
|
# - matchExpressions:
|
||||||
|
# - key: role
|
||||||
|
# operator: In
|
||||||
|
# values:
|
||||||
|
# - frontend
|
||||||
|
|
||||||
|
## Replica count, set to 3 to provide a default available cluster
|
||||||
|
replicas: 3
|
||||||
|
|
||||||
|
## Pod priority
|
||||||
|
## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
|
||||||
|
# priorityClassName: ""
|
||||||
|
|
||||||
|
## updateStrategy for RabbitMQ statefulset
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
|
||||||
|
updateStrategy:
|
||||||
|
type: RollingUpdate
|
||||||
|
|
||||||
|
## Node labels and tolerations for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
nodeSelector:
|
||||||
|
beta.kubernetes.io/arch: amd64
|
||||||
|
tolerations: []
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## affinity: |
|
||||||
|
## podAntiAffinity:
|
||||||
|
## requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
## - labelSelector:
|
||||||
|
## matchLabels:
|
||||||
|
## app: {{ template "rabbitmq.name" . }}
|
||||||
|
## release: {{ .Release.Name | quote }}
|
||||||
|
## topologyKey: kubernetes.io/hostname
|
||||||
|
## preferredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
## - weight: 100
|
||||||
|
## podAffinityTerm:
|
||||||
|
## labelSelector:
|
||||||
|
## matchLabels:
|
||||||
|
## app: {{ template "rabbitmq.name" . }}
|
||||||
|
## release: {{ .Release.Name | quote }}
|
||||||
|
## topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||||
|
|
||||||
|
## annotations for rabbitmq pods
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Configure the podDisruptionBudget
|
||||||
|
podDisruptionBudget: {}
|
||||||
|
# maxUnavailable: 1
|
||||||
|
# minAvailable: 1
|
||||||
|
|
||||||
|
## Configure the ingress resource that allows you to access the
|
||||||
|
## Wordpress installation. Set up the URL
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/ingress/
|
||||||
|
##
|
||||||
|
ingress:
|
||||||
|
## Set to true to enable ingress record generation
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## The list of hostnames to be covered with this ingress record.
|
||||||
|
## Most likely this will be just one host, but in the event more hosts are needed, this is an array
|
||||||
|
## hostName: foo.bar.com
|
||||||
|
path: /
|
||||||
|
|
||||||
|
## Set this to true in order to enable TLS on the ingress record
|
||||||
|
## A side effect of this will be that the backend wordpress service will be connected at port 443
|
||||||
|
tls: true
|
||||||
|
|
||||||
|
## If TLS is set to true, you must declare what secret will store the key/certificate for TLS
|
||||||
|
tlsSecret: myTlsSecret
|
||||||
|
|
||||||
|
## Ingress annotations done as key:value pairs
|
||||||
|
## If you're using kube-lego, you will want to add:
|
||||||
|
## kubernetes.io/tls-acme: true
|
||||||
|
##
|
||||||
|
## For a full list of possible ingress annotations, please see
|
||||||
|
## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
|
||||||
|
##
|
||||||
|
## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: "true" will automatically be set
|
||||||
|
annotations: {}
|
||||||
|
# kubernetes.io/ingress.class: nginx
|
||||||
|
# kubernetes.io/tls-acme: true
|
||||||
|
|
||||||
|
## The following settings are to configure the frequency of the lifeness and readiness probes
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 120
|
||||||
|
timeoutSeconds: 20
|
||||||
|
periodSeconds: 30
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
|
commandOverride: []
|
||||||
|
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
timeoutSeconds: 20
|
||||||
|
periodSeconds: 30
|
||||||
|
failureThreshold: 3
|
||||||
|
successThreshold: 1
|
||||||
|
commandOverride: []
|
||||||
|
|
||||||
|
## Prometheus Metrics
|
||||||
|
##
|
||||||
|
metrics:
|
||||||
|
enabled: true
|
||||||
|
port: 9419
|
||||||
|
plugins: "rabbitmq_prometheus"
|
||||||
|
## Prometheus pod annotations
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
|
||||||
|
##
|
||||||
|
podAnnotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "{{ .Values.metrics.port }}"
|
||||||
|
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 15
|
||||||
|
timeoutSeconds: 5
|
||||||
|
periodSeconds: 30
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
|
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
periodSeconds: 30
|
||||||
|
failureThreshold: 3
|
||||||
|
successThreshold: 1
|
||||||
|
|
||||||
|
## Prometheus Service Monitor
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator
|
||||||
|
## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint
|
||||||
|
serviceMonitor:
|
||||||
|
## If the operator is installed in your cluster, set to true to create a Service Monitor Entry
|
||||||
|
enabled: false
|
||||||
|
## Specify the namespace in which the serviceMonitor resource will be created
|
||||||
|
# namespace: ""
|
||||||
|
## Specify the interval at which metrics should be scraped
|
||||||
|
interval: 30s
|
||||||
|
## Specify the timeout after which the scrape is ended
|
||||||
|
# scrapeTimeout: 30s
|
||||||
|
## Specify Metric Relabellings to add to the scrape endpoint
|
||||||
|
# relabellings:
|
||||||
|
## Specify honorLabels parameter to add the scrape endpoint
|
||||||
|
honorLabels: false
|
||||||
|
## Specify the release for ServiceMonitor. Sometimes it should be custom for prometheus operator to work
|
||||||
|
# release: ""
|
||||||
|
## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec
|
||||||
|
additionalLabels: {}
|
||||||
|
|
||||||
|
## Custom PrometheusRule to be defined
|
||||||
|
## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions
|
||||||
|
prometheusRule:
|
||||||
|
enabled: false
|
||||||
|
additionalLabels: {}
|
||||||
|
namespace: ""
|
||||||
|
rules: []
|
||||||
|
## List of reules, used as template by Helm.
|
||||||
|
## These are just examples rules inspired from https://awesome-prometheus-alerts.grep.to/rules.html
|
||||||
|
## Please adapt them to your needs.
|
||||||
|
## Make sure to constraint the rules to the current rabbitmq service.
|
||||||
|
## Also make sure to escape what looks like helm template.
|
||||||
|
# - alert: RabbitmqDown
|
||||||
|
# expr: rabbitmq_up{service="{{ template "rabbitmq.fullname" . }}"} == 0
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Rabbitmq down (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: RabbitMQ node down
|
||||||
|
|
||||||
|
# - alert: ClusterDown
|
||||||
|
# expr: |
|
||||||
|
# sum(rabbitmq_running{service="{{ template "rabbitmq.fullname" . }}"})
|
||||||
|
# < {{ .Values.replicas }}
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Cluster down (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: |
|
||||||
|
# Less than {{ .Values.replicas }} nodes running in RabbitMQ cluster
|
||||||
|
# VALUE = {{ "{{ $value }}" }}
|
||||||
|
|
||||||
|
# - alert: ClusterPartition
|
||||||
|
# expr: rabbitmq_partitions{service="{{ template "rabbitmq.fullname" . }}"} > 0
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Cluster partition (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: |
|
||||||
|
# Cluster partition
|
||||||
|
# VALUE = {{ "{{ $value }}" }}
|
||||||
|
|
||||||
|
# - alert: OutOfMemory
|
||||||
|
# expr: |
|
||||||
|
# rabbitmq_node_mem_used{service="{{ template "rabbitmq.fullname" . }}"}
|
||||||
|
# / rabbitmq_node_mem_limit{service="{{ template "rabbitmq.fullname" . }}"}
|
||||||
|
# * 100 > 90
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: warning
|
||||||
|
# annotations:
|
||||||
|
# summary: Out of memory (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: |
|
||||||
|
# Memory available for RabbmitMQ is low (< 10%)\n VALUE = {{ "{{ $value }}" }}
|
||||||
|
# LABELS: {{ "{{ $labels }}" }}
|
||||||
|
|
||||||
|
# - alert: TooManyConnections
|
||||||
|
# expr: rabbitmq_connectionsTotal{service="{{ template "rabbitmq.fullname" . }}"} > 1000
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: warning
|
||||||
|
# annotations:
|
||||||
|
# summary: Too many connections (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: |
|
||||||
|
# RabbitMQ instance has too many connections (> 1000)
|
||||||
|
# VALUE = {{ "{{ $value }}" }}\n LABELS: {{ "{{ $labels }}" }}
|
||||||
|
|
||||||
|
##
|
||||||
|
## Init containers parameters:
|
||||||
|
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||||
|
##
|
||||||
|
volumePermissions:
|
||||||
|
enabled: true
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
resources: {}
|
||||||
|
|
||||||
|
## forceBoot: executes 'rabbitmqctl force_boot' to force boot cluster shut down unexpectedly in an
|
||||||
|
## unknown order.
|
||||||
|
## ref: https://www.rabbitmq.com/rabbitmqctl.8.html#force_boot
|
||||||
|
##
|
||||||
|
forceBoot:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## Optionally specify extra secrets to be created by the chart.
|
||||||
|
## This can be useful when combined with load_definitions to automatically create the secret containing the definitions to be loaded.
|
||||||
|
##
|
||||||
|
extraSecrets: {}
|
||||||
|
# load-definition:
|
||||||
|
# load_definition.json: |
|
||||||
|
# {
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
|
||||||
|
## Adding optionals volumeMount
|
||||||
|
extraVolumeMounts: []
|
||||||
|
# - name: extras
|
||||||
|
# mountPath: /usr/share/extras
|
||||||
|
# readOnly: true
|
||||||
|
|
||||||
|
extraVolumes: []
|
||||||
|
# - name: extras
|
||||||
|
# emptyDir: {}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/schema#",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"rabbitmq": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"username": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "RabbitMQ user",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "RabbitMQ password",
|
||||||
|
"form": true,
|
||||||
|
"description": "Defaults to a random 10-character alphanumeric string if not set"
|
||||||
|
},
|
||||||
|
"extraConfiguration": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Extra RabbitMQ Configuration",
|
||||||
|
"form": true,
|
||||||
|
"render": "textArea",
|
||||||
|
"description": "Extra configuration to be appended to RabbitMQ Configuration"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"replicas": {
|
||||||
|
"type": "integer",
|
||||||
|
"form": true,
|
||||||
|
"title": "Number of replicas",
|
||||||
|
"description": "Number of replicas to deploy"
|
||||||
|
},
|
||||||
|
"persistence": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Persistence configuration",
|
||||||
|
"form": true,
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"form": true,
|
||||||
|
"title": "Enable persistence",
|
||||||
|
"description": "Enable persistence using Persistent Volume Claims"
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Persistent Volume Size",
|
||||||
|
"form": true,
|
||||||
|
"render": "slider",
|
||||||
|
"sliderMin": 1,
|
||||||
|
"sliderMax": 100,
|
||||||
|
"sliderUnit": "Gi",
|
||||||
|
"hidden": {
|
||||||
|
"condition": false,
|
||||||
|
"value": "persistence.enabled"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"volumePermissions": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"form": true,
|
||||||
|
"title": "Enable Init Containers",
|
||||||
|
"description": "Use an init container to set required folder permissions on the data volume before mounting it in the final destination"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"metrics": {
|
||||||
|
"type": "object",
|
||||||
|
"form": true,
|
||||||
|
"title": "Prometheus metrics details",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Enable Prometheus metrics for RabbitMQ",
|
||||||
|
"description": "Install Prometheus plugin in the RabbitMQ container",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"serviceMonitor": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Create Prometheus Operator ServiceMonitor",
|
||||||
|
"description": "Create a ServiceMonitor to track metrics using Prometheus Operator",
|
||||||
|
"form": true,
|
||||||
|
"hidden": {
|
||||||
|
"condition": false,
|
||||||
|
"value": "metrics.enabled"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,544 @@
|
|||||||
|
## Global Docker image parameters
|
||||||
|
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
|
||||||
|
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
|
||||||
|
##
|
||||||
|
# global:
|
||||||
|
# imageRegistry: myRegistryName
|
||||||
|
# imagePullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
# storageClass: myStorageClass
|
||||||
|
|
||||||
|
## Bitnami RabbitMQ image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/rabbitmq/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/rabbitmq
|
||||||
|
tag: 3.8.3-debian-10-r40
|
||||||
|
|
||||||
|
## set to true if you would like to see extra information on logs
|
||||||
|
## it turns BASH and NAMI debugging in minideb
|
||||||
|
## ref: https://github.com/bitnami/minideb-extras/#turn-on-bash-debugging
|
||||||
|
debug: false
|
||||||
|
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## String to partially override rabbitmq.fullname template (will maintain the release name)
|
||||||
|
##
|
||||||
|
# nameOverride:
|
||||||
|
|
||||||
|
## String to fully override rabbitmq.fullname template
|
||||||
|
##
|
||||||
|
# fullnameOverride:
|
||||||
|
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## does your cluster have rbac enabled? assume yes by default
|
||||||
|
rbacEnabled: true
|
||||||
|
|
||||||
|
## RabbitMQ should be initialized one by one when building cluster for the first time.
|
||||||
|
## Therefore, the default value of podManagementPolicy is 'OrderedReady'
|
||||||
|
## Once the RabbitMQ participates in the cluster, it waits for a response from another
|
||||||
|
## RabbitMQ in the same cluster at reboot, except the last RabbitMQ of the same cluster.
|
||||||
|
## If the cluster exits gracefully, you do not need to change the podManagementPolicy
|
||||||
|
## because the first RabbitMQ of the statefulset always will be last of the cluster.
|
||||||
|
## However if the last RabbitMQ of the cluster is not the first RabbitMQ due to a failure,
|
||||||
|
## you must change podManagementPolicy to 'Parallel'.
|
||||||
|
## ref : https://www.rabbitmq.com/clustering.html#restarting
|
||||||
|
##
|
||||||
|
podManagementPolicy: OrderedReady
|
||||||
|
|
||||||
|
## section of specific values for rabbitmq
|
||||||
|
rabbitmq:
|
||||||
|
## RabbitMQ application username
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
username: user
|
||||||
|
|
||||||
|
## RabbitMQ application password
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
# password:
|
||||||
|
# existingPasswordSecret: name-of-existing-secret
|
||||||
|
|
||||||
|
## Erlang cookie to determine whether different nodes are allowed to communicate with each other
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
# erlangCookie:
|
||||||
|
# existingErlangSecret: name-of-existing-secret
|
||||||
|
|
||||||
|
## Node name to cluster with. e.g.: `clusternode@hostname`
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
# rabbitmqClusterNodeName:
|
||||||
|
|
||||||
|
## Value for the RABBITMQ_LOGS environment variable
|
||||||
|
## ref: https://www.rabbitmq.com/logging.html#log-file-location
|
||||||
|
##
|
||||||
|
logs: '-'
|
||||||
|
|
||||||
|
## RabbitMQ Max File Descriptors
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
## ref: https://www.rabbitmq.com/install-debian.html#kernel-resource-limits
|
||||||
|
##
|
||||||
|
setUlimitNofiles: true
|
||||||
|
ulimitNofiles: '65536'
|
||||||
|
|
||||||
|
## RabbitMQ maximum available scheduler threads and online scheduler threads
|
||||||
|
## ref: https://hamidreza-s.github.io/erlang/scheduling/real-time/preemptive/migration/2016/02/09/erlang-scheduler-details.html#scheduler-threads
|
||||||
|
##
|
||||||
|
maxAvailableSchedulers: 2
|
||||||
|
onlineSchedulers: 1
|
||||||
|
|
||||||
|
## Plugins to enable
|
||||||
|
plugins: "rabbitmq_management rabbitmq_peer_discovery_k8s"
|
||||||
|
|
||||||
|
## Extra plugins to enable
|
||||||
|
## Use this instead of `plugins` to add new plugins
|
||||||
|
extraPlugins: "rabbitmq_auth_backend_ldap"
|
||||||
|
|
||||||
|
## Clustering settings
|
||||||
|
clustering:
|
||||||
|
address_type: hostname
|
||||||
|
k8s_domain: cluster.local
|
||||||
|
## Rebalance master for queues in cluster when new replica is created
|
||||||
|
## ref: https://www.rabbitmq.com/rabbitmq-queues.8.html#rebalance
|
||||||
|
rebalance: false
|
||||||
|
|
||||||
|
loadDefinition:
|
||||||
|
enabled: false
|
||||||
|
secretName: load-definition
|
||||||
|
|
||||||
|
## environment variables to configure rabbitmq
|
||||||
|
## ref: https://www.rabbitmq.com/configure.html#customise-environment
|
||||||
|
env: {}
|
||||||
|
|
||||||
|
## Configuration file content: required cluster configuration
|
||||||
|
## Do not override unless you know what you are doing. To add more configuration, use `extraConfiguration` of `advancedConfiguration` instead
|
||||||
|
configuration: |-
|
||||||
|
## Clustering
|
||||||
|
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
|
||||||
|
cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
|
||||||
|
cluster_formation.node_cleanup.interval = 10
|
||||||
|
cluster_formation.node_cleanup.only_log_warning = true
|
||||||
|
cluster_partition_handling = autoheal
|
||||||
|
# queue master locator
|
||||||
|
queue_master_locator=min-masters
|
||||||
|
# enable guest user
|
||||||
|
loopback_users.guest = false
|
||||||
|
|
||||||
|
## Configuration file content: extra configuration
|
||||||
|
## Use this instead of `configuration` to add more configuration
|
||||||
|
extraConfiguration: |-
|
||||||
|
#disk_free_limit.absolute = 50MB
|
||||||
|
#management.load_definitions = /app/load_definition.json
|
||||||
|
|
||||||
|
## Configuration file content: advanced configuration
|
||||||
|
## Use this as additional configuraton in classic config format (Erlang term configuration format)
|
||||||
|
##
|
||||||
|
## If you set LDAP with TLS/SSL enabled and you are using self-signed certificates, uncomment these lines.
|
||||||
|
## advancedConfiguration: |-
|
||||||
|
## [{
|
||||||
|
## rabbitmq_auth_backend_ldap,
|
||||||
|
## [{
|
||||||
|
## ssl_options,
|
||||||
|
## [{
|
||||||
|
## verify, verify_none
|
||||||
|
## }, {
|
||||||
|
## fail_if_no_peer_cert,
|
||||||
|
## false
|
||||||
|
## }]
|
||||||
|
## ]}
|
||||||
|
## }].
|
||||||
|
##
|
||||||
|
advancedConfiguration: |-
|
||||||
|
|
||||||
|
## Enable encryption to rabbitmq
|
||||||
|
## ref: https://www.rabbitmq.com/ssl.html
|
||||||
|
##
|
||||||
|
tls:
|
||||||
|
enabled: false
|
||||||
|
failIfNoPeerCert: true
|
||||||
|
sslOptionsVerify: verify_peer
|
||||||
|
caCertificate: |-
|
||||||
|
serverCertificate: |-
|
||||||
|
serverKey: |-
|
||||||
|
# existingSecret: name-of-existing-secret-to-rabbitmq
|
||||||
|
|
||||||
|
## LDAP configuration
|
||||||
|
##
|
||||||
|
ldap:
|
||||||
|
enabled: false
|
||||||
|
server: ""
|
||||||
|
port: "389"
|
||||||
|
user_dn_pattern: cn=${username},dc=example,dc=org
|
||||||
|
tls:
|
||||||
|
# If you enabled TLS/SSL you can set advaced options using the advancedConfiguration parameter.
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## Kubernetes service type
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
## Node port
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
# nodePort: 30672
|
||||||
|
|
||||||
|
## Set the LoadBalancerIP
|
||||||
|
##
|
||||||
|
# loadBalancerIP:
|
||||||
|
|
||||||
|
## Node port Tls
|
||||||
|
##
|
||||||
|
# nodeTlsPort: 30671
|
||||||
|
|
||||||
|
## Amqp port
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
port: 5672
|
||||||
|
|
||||||
|
## Amqp Tls port
|
||||||
|
##
|
||||||
|
tlsPort: 5671
|
||||||
|
|
||||||
|
## Dist port
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
distPort: 25672
|
||||||
|
|
||||||
|
## RabbitMQ Manager port
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-rabbitmq#environment-variables
|
||||||
|
##
|
||||||
|
managerPort: 15672
|
||||||
|
|
||||||
|
## Service annotations
|
||||||
|
annotations: {}
|
||||||
|
# service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
|
||||||
|
|
||||||
|
## Load Balancer sources
|
||||||
|
## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
|
||||||
|
##
|
||||||
|
# loadBalancerSourceRanges:
|
||||||
|
# - 10.10.10.0/24
|
||||||
|
|
||||||
|
## Extra ports to expose
|
||||||
|
# extraPorts:
|
||||||
|
# - name: new_svc_name
|
||||||
|
# port: 1234
|
||||||
|
# targetPort: 1234
|
||||||
|
|
||||||
|
## Extra ports to be included in container spec, primarily informational
|
||||||
|
# extraContainerPorts:
|
||||||
|
# - name: new_svc_name
|
||||||
|
# port: 1234
|
||||||
|
# targetPort: 1234
|
||||||
|
|
||||||
|
# Additional pod labels to apply
|
||||||
|
podLabels: {}
|
||||||
|
|
||||||
|
## Pod Security Context
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||||||
|
##
|
||||||
|
securityContext:
|
||||||
|
enabled: true
|
||||||
|
fsGroup: 1001
|
||||||
|
runAsUser: 1001
|
||||||
|
extra: {}
|
||||||
|
|
||||||
|
persistence:
|
||||||
|
## this enables PVC templates that will create one per pod
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
## rabbitmq data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
## selector can be used to match an existing PersistentVolume
|
||||||
|
# selector:
|
||||||
|
# matchLabels:
|
||||||
|
# app: my-app
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
|
||||||
|
## Existing PersistentVolumeClaims
|
||||||
|
## The value is evaluated as a template
|
||||||
|
## So, for example, the name can depend on .Release or .Chart
|
||||||
|
# existingClaim: ""
|
||||||
|
|
||||||
|
# If you change this value, you might have to adjust `rabbitmq.diskFreeLimit` as well.
|
||||||
|
size: 8Gi
|
||||||
|
|
||||||
|
# persistence directory, maps to the rabbitmq data directory
|
||||||
|
path: /opt/bitnami/rabbitmq/var/lib/rabbitmq
|
||||||
|
|
||||||
|
## Configure resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
##
|
||||||
|
resources: {}
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
## Enable creation of NetworkPolicy resources. Only Ingress traffic is filtered for now.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/network-policies/
|
||||||
|
##
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## The Policy model to apply. When set to false, only pods with the correct
|
||||||
|
## client label will have network access to the ports RabbitMQ is listening
|
||||||
|
## on. When true, RabbitMQ will accept connections from any source
|
||||||
|
## (with the correct destination port).
|
||||||
|
##
|
||||||
|
allowExternal: true
|
||||||
|
|
||||||
|
## Additional NetworkPolicy Ingress "from" rules to set. Note that all rules are OR-ed.
|
||||||
|
##
|
||||||
|
# additionalRules:
|
||||||
|
# - matchLabels:
|
||||||
|
# - role: frontend
|
||||||
|
# - matchExpressions:
|
||||||
|
# - key: role
|
||||||
|
# operator: In
|
||||||
|
# values:
|
||||||
|
# - frontend
|
||||||
|
|
||||||
|
## Replica count, set to 1 to provide a default available cluster
|
||||||
|
replicas: 1
|
||||||
|
|
||||||
|
## Pod priority
|
||||||
|
## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
|
||||||
|
# priorityClassName: ""
|
||||||
|
|
||||||
|
## updateStrategy for RabbitMQ statefulset
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
|
||||||
|
updateStrategy:
|
||||||
|
type: RollingUpdate
|
||||||
|
|
||||||
|
## Node labels and tolerations for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
nodeSelector: {}
|
||||||
|
tolerations: []
|
||||||
|
affinity: {}
|
||||||
|
podDisruptionBudget: {}
|
||||||
|
# maxUnavailable: 1
|
||||||
|
# minAvailable: 1
|
||||||
|
## annotations for rabbitmq pods
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Configure the ingress resource that allows you to access the
|
||||||
|
## Wordpress installation. Set up the URL
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/ingress/
|
||||||
|
##
|
||||||
|
ingress:
|
||||||
|
## Set to true to enable ingress record generation
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## The list of hostnames to be covered with this ingress record.
|
||||||
|
## Most likely this will be just one host, but in the event more hosts are needed, this is an array
|
||||||
|
## hostName: foo.bar.com
|
||||||
|
path: /
|
||||||
|
|
||||||
|
## Set this to true in order to enable TLS on the ingress record
|
||||||
|
## A side effect of this will be that the backend wordpress service will be connected at port 443
|
||||||
|
tls: false
|
||||||
|
|
||||||
|
## If TLS is set to true, you must declare what secret will store the key/certificate for TLS
|
||||||
|
tlsSecret: myTlsSecret
|
||||||
|
|
||||||
|
## Ingress annotations done as key:value pairs
|
||||||
|
## If you're using kube-lego, you will want to add:
|
||||||
|
## kubernetes.io/tls-acme: true
|
||||||
|
##
|
||||||
|
## For a full list of possible ingress annotations, please see
|
||||||
|
## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
|
||||||
|
##
|
||||||
|
## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: "true" will automatically be set
|
||||||
|
annotations: {}
|
||||||
|
# kubernetes.io/ingress.class: nginx
|
||||||
|
# kubernetes.io/tls-acme: true
|
||||||
|
|
||||||
|
## The following settings are to configure the frequency of the lifeness and readiness probes
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 120
|
||||||
|
timeoutSeconds: 20
|
||||||
|
periodSeconds: 30
|
||||||
|
failureThreshold: 6
|
||||||
|
successThreshold: 1
|
||||||
|
commandOverride: []
|
||||||
|
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
timeoutSeconds: 20
|
||||||
|
periodSeconds: 30
|
||||||
|
failureThreshold: 3
|
||||||
|
successThreshold: 1
|
||||||
|
commandOverride: []
|
||||||
|
|
||||||
|
## Prometheus Metrics
|
||||||
|
##
|
||||||
|
metrics:
|
||||||
|
enabled: false
|
||||||
|
port: 9419
|
||||||
|
plugins: "rabbitmq_prometheus"
|
||||||
|
## Prometheus pod annotations
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
|
||||||
|
##
|
||||||
|
podAnnotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "{{ .Values.metrics.port }}"
|
||||||
|
|
||||||
|
## Prometheus Service Monitor
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator
|
||||||
|
## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint
|
||||||
|
serviceMonitor:
|
||||||
|
## If the operator is installed in your cluster, set to true to create a Service Monitor Entry
|
||||||
|
enabled: false
|
||||||
|
## Specify the namespace in which the serviceMonitor resource will be created
|
||||||
|
# namespace: ""
|
||||||
|
## Specify the interval at which metrics should be scraped
|
||||||
|
interval: 30s
|
||||||
|
## Specify the timeout after which the scrape is ended
|
||||||
|
# scrapeTimeout: 30s
|
||||||
|
## Specify Metric Relabellings to add to the scrape endpoint
|
||||||
|
# relabellings:
|
||||||
|
## Specify honorLabels parameter to add the scrape endpoint
|
||||||
|
honorLabels: false
|
||||||
|
## Specify the release for ServiceMonitor. Sometimes it should be custom for prometheus operator to work
|
||||||
|
# release: ""
|
||||||
|
## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec
|
||||||
|
additionalLabels: {}
|
||||||
|
|
||||||
|
## Custom PrometheusRule to be defined
|
||||||
|
## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions
|
||||||
|
prometheusRule:
|
||||||
|
enabled: false
|
||||||
|
additionalLabels: {}
|
||||||
|
namespace: ""
|
||||||
|
rules: []
|
||||||
|
## List of reules, used as template by Helm.
|
||||||
|
## These are just examples rules inspired from https://awesome-prometheus-alerts.grep.to/rules.html
|
||||||
|
## Please adapt them to your needs.
|
||||||
|
## Make sure to constraint the rules to the current rabbitmq service.
|
||||||
|
## Also make sure to escape what looks like helm template.
|
||||||
|
# - alert: RabbitmqDown
|
||||||
|
# expr: rabbitmq_up{service="{{ template "rabbitmq.fullname" . }}"} == 0
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Rabbitmq down (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: RabbitMQ node down
|
||||||
|
|
||||||
|
# - alert: ClusterDown
|
||||||
|
# expr: |
|
||||||
|
# sum(rabbitmq_running{service="{{ template "rabbitmq.fullname" . }}"})
|
||||||
|
# < {{ .Values.replicas }}
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Cluster down (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: |
|
||||||
|
# Less than {{ .Values.replicas }} nodes running in RabbitMQ cluster
|
||||||
|
# VALUE = {{ "{{ $value }}" }}
|
||||||
|
|
||||||
|
# - alert: ClusterPartition
|
||||||
|
# expr: rabbitmq_partitions{service="{{ template "rabbitmq.fullname" . }}"} > 0
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Cluster partition (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: |
|
||||||
|
# Cluster partition
|
||||||
|
# VALUE = {{ "{{ $value }}" }}
|
||||||
|
|
||||||
|
# - alert: OutOfMemory
|
||||||
|
# expr: |
|
||||||
|
# rabbitmq_node_mem_used{service="{{ template "rabbitmq.fullname" . }}"}
|
||||||
|
# / rabbitmq_node_mem_limit{service="{{ template "rabbitmq.fullname" . }}"}
|
||||||
|
# * 100 > 90
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: warning
|
||||||
|
# annotations:
|
||||||
|
# summary: Out of memory (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: |
|
||||||
|
# Memory available for RabbmitMQ is low (< 10%)\n VALUE = {{ "{{ $value }}" }}
|
||||||
|
# LABELS: {{ "{{ $labels }}" }}
|
||||||
|
|
||||||
|
# - alert: TooManyConnections
|
||||||
|
# expr: rabbitmq_connectionsTotal{service="{{ template "rabbitmq.fullname" . }}"} > 1000
|
||||||
|
# for: 5m
|
||||||
|
# labels:
|
||||||
|
# severity: warning
|
||||||
|
# annotations:
|
||||||
|
# summary: Too many connections (instance {{ "{{ $labels.instance }}" }})
|
||||||
|
# description: |
|
||||||
|
# RabbitMQ instance has too many connections (> 1000)
|
||||||
|
# VALUE = {{ "{{ $value }}" }}\n LABELS: {{ "{{ $labels }}" }}
|
||||||
|
|
||||||
|
##
|
||||||
|
## Init containers parameters:
|
||||||
|
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||||
|
##
|
||||||
|
volumePermissions:
|
||||||
|
enabled: false
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
resources: {}
|
||||||
|
|
||||||
|
## forceBoot: executes 'rabbitmqctl force_boot' to force boot cluster shut down unexpectedly in an
|
||||||
|
## unknown order.
|
||||||
|
## ref: https://www.rabbitmq.com/rabbitmqctl.8.html#force_boot
|
||||||
|
##
|
||||||
|
forceBoot:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## Optionally specify extra secrets to be created by the chart.
|
||||||
|
## This can be useful when combined with load_definitions to automatically create the secret containing the definitions to be loaded.
|
||||||
|
##
|
||||||
|
extraSecrets: {}
|
||||||
|
# load-definition:
|
||||||
|
# load_definition.json: |
|
||||||
|
# {
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
|
||||||
|
## Adding optionals volumeMount
|
||||||
|
extraVolumeMounts: []
|
||||||
|
# - name: extras
|
||||||
|
# mountPath: /usr/share/extras
|
||||||
|
# readOnly: true
|
||||||
|
|
||||||
|
extraVolumes: []
|
||||||
|
# - name: extras
|
||||||
|
# emptyDir: {}
|
||||||
@@ -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,20 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
appVersion: 5.0.8
|
||||||
|
description: Open source, advanced key-value store. It is often referred to as a data
|
||||||
|
structure server since keys can contain strings, hashes, lists, sets and sorted
|
||||||
|
sets.
|
||||||
|
home: http://redis.io/
|
||||||
|
icon: https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png
|
||||||
|
keywords:
|
||||||
|
- redis
|
||||||
|
- keyvalue
|
||||||
|
- database
|
||||||
|
maintainers:
|
||||||
|
- email: containers@bitnami.com
|
||||||
|
name: Bitnami
|
||||||
|
- email: cedric@desaintmartin.fr
|
||||||
|
name: desaintmartin
|
||||||
|
name: redis
|
||||||
|
sources:
|
||||||
|
- https://github.com/bitnami/bitnami-docker-redis
|
||||||
|
version: 10.6.3
|
||||||
@@ -0,0 +1,499 @@
|
|||||||
|
|
||||||
|
# Redis
|
||||||
|
|
||||||
|
[Redis](http://redis.io/) is an advanced key-value cache and store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets, sorted sets, bitmaps and hyperloglogs.
|
||||||
|
|
||||||
|
## TL;DR;
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Testing configuration
|
||||||
|
$ helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||||
|
$ helm install my-release bitnami/redis
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Production configuration
|
||||||
|
$ helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||||
|
$ helm install my-release bitnami/redis --values values-production.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This chart bootstraps a [Redis](https://github.com/bitnami/bitnami-docker-redis) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
|
||||||
|
|
||||||
|
Bitnami charts can be used with [Kubeapps](https://kubeapps.com/) for deployment and management of Helm Charts in clusters. This chart has been tested to work with NGINX Ingress, cert-manager, fluentd and Prometheus on top of the [BKPR](https://kubeprod.io/).
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Kubernetes 1.12+
|
||||||
|
- Helm 2.11+ or Helm 3.0-beta3+
|
||||||
|
- 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 bitnami/redis
|
||||||
|
```
|
||||||
|
|
||||||
|
The command deploys Redis 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm delete my-release
|
||||||
|
```
|
||||||
|
|
||||||
|
The command removes all the Kubernetes components associated with the chart and deletes the release.
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
The following table lists the configurable parameters of the Redis chart and their default values.
|
||||||
|
|
||||||
|
| Parameter | Description | Default |
|
||||||
|
| --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
|
||||||
|
| `global.imageRegistry` | Global Docker image registry | `nil` |
|
||||||
|
| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` (does not add image pull secrets to deployed pods) |
|
||||||
|
| `global.storageClass` | Global storage class for dynamic provisioning | `nil` |
|
||||||
|
| `global.redis.password` | Redis password (overrides `password`) | `nil` |
|
||||||
|
| `image.registry` | Redis Image registry | `docker.io` |
|
||||||
|
| `image.repository` | Redis Image name | `bitnami/redis` |
|
||||||
|
| `image.tag` | Redis Image tag | `{TAG_NAME}` |
|
||||||
|
| `image.pullPolicy` | Image pull policy | `IfNotPresent` |
|
||||||
|
| `image.pullSecrets` | Specify docker-registry secret names as an array | `nil` |
|
||||||
|
| `nameOverride` | String to partially override redis.fullname template with a string (will prepend the release name) | `nil` |
|
||||||
|
| `fullnameOverride` | String to fully override redis.fullname template with a string | `nil` |
|
||||||
|
| `cluster.enabled` | Use master-slave topology | `true` |
|
||||||
|
| `cluster.slaveCount` | Number of slaves | `2` |
|
||||||
|
| `existingSecret` | Name of existing secret object (for password authentication) | `nil` |
|
||||||
|
| `existingSecretPasswordKey` | Name of key containing password to be retrieved from the existing secret | `nil` |
|
||||||
|
| `usePassword` | Use password | `true` |
|
||||||
|
| `usePasswordFile` | Mount passwords as files instead of environment variables | `false` |
|
||||||
|
| `password` | Redis password (ignored if existingSecret set) | Randomly generated |
|
||||||
|
| `configmap` | Additional common Redis node configuration (this value is evaluated as a template) | See values.yaml |
|
||||||
|
| `clusterDomain` | Kubernetes DNS Domain name to use | `cluster.local` |
|
||||||
|
| `networkPolicy.enabled` | Enable NetworkPolicy | `false` |
|
||||||
|
| `networkPolicy.allowExternal` | Don't require client label for connections | `true` |
|
||||||
|
| `networkPolicy.ingressNSMatchLabels` | Allow connections from other namespaces | `{}` |
|
||||||
|
| `networkPolicy.ingressNSPodMatchLabels` | For other namespaces match by pod labels and namespace labels | `{}` |
|
||||||
|
| `securityContext.enabled` | Enable security context (both redis master and slave pods) | `true` |
|
||||||
|
| `securityContext.fsGroup` | Group ID for the container (both redis master and slave pods) | `1001` |
|
||||||
|
| `securityContext.runAsUser` | User ID for the container (both redis master and slave pods) | `1001` |
|
||||||
|
| `securityContext.sysctls` | Set namespaced sysctls for the container (both redis master and slave pods) | `nil` |
|
||||||
|
| `serviceAccount.create` | Specifies whether a ServiceAccount should be created | `false` |
|
||||||
|
| `serviceAccount.name` | The name of the ServiceAccount to create | Generated using the fullname template |
|
||||||
|
| `rbac.create` | Specifies whether RBAC resources should be created | `false` |
|
||||||
|
| `rbac.role.rules` | Rules to create | `[]` |
|
||||||
|
| `metrics.enabled` | Start a side-car prometheus exporter | `false` |
|
||||||
|
| `metrics.image.registry` | Redis exporter image registry | `docker.io` |
|
||||||
|
| `metrics.image.repository` | Redis exporter image name | `bitnami/redis-exporter` |
|
||||||
|
| `metrics.image.tag` | Redis exporter image tag | `{TAG_NAME}` |
|
||||||
|
| `metrics.image.pullPolicy` | Image pull policy | `IfNotPresent` |
|
||||||
|
| `metrics.image.pullSecrets` | Specify docker-registry secret names as an array | `nil` |
|
||||||
|
| `metrics.extraArgs` | Extra arguments for the binary; possible values [here](https://github.com/oliver006/redis_exporter#flags) | {} |
|
||||||
|
| `metrics.podLabels` | Additional labels for Metrics exporter pod | {} |
|
||||||
|
| `metrics.podAnnotations` | Additional annotations for Metrics exporter pod | {} |
|
||||||
|
| `metrics.resources` | Exporter resource requests/limit | Memory: `256Mi`, CPU: `100m` |
|
||||||
|
| `metrics.serviceMonitor.enabled` | if `true`, creates a Prometheus Operator ServiceMonitor (also requires `metrics.enabled` to be `true`) | `false` |
|
||||||
|
| `metrics.serviceMonitor.namespace` | Optional namespace which Prometheus is running in | `nil` |
|
||||||
|
| `metrics.serviceMonitor.interval` | How frequently to scrape metrics (use by default, falling back to Prometheus' default) | `nil` |
|
||||||
|
| `metrics.serviceMonitor.selector` | Default to kube-prometheus install (CoreOS recommended), but should be set according to Prometheus install | `{ prometheus: kube-prometheus }` |
|
||||||
|
| `metrics.service.type` | Kubernetes Service type (redis metrics) | `ClusterIP` |
|
||||||
|
| `metrics.service.annotations` | Annotations for the services to monitor (redis master and redis slave service) | {} |
|
||||||
|
| `metrics.service.labels` | Additional labels for the metrics service | {} |
|
||||||
|
| `metrics.service.loadBalancerIP` | loadBalancerIP if redis metrics service type is `LoadBalancer` | `nil` |
|
||||||
|
| `metrics.priorityClassName` | Metrics exporter pod priorityClassName | {} |
|
||||||
|
| `metrics.prometheusRule.enabled` | Set this to true to create prometheusRules for Prometheus operator | `false` |
|
||||||
|
| `metrics.prometheusRule.additionalLabels` | Additional labels that can be used so prometheusRules will be discovered by Prometheus | `{}` |
|
||||||
|
| `metrics.prometheusRule.namespace` | namespace where prometheusRules resource should be created | Same namespace as redis |
|
||||||
|
| `metrics.prometheusRule.rules` | [rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) to be created, check values for an example. | `[]` |
|
||||||
|
| `persistence.existingClaim` | Provide an existing PersistentVolumeClaim | `nil` |
|
||||||
|
| `master.persistence.enabled` | Use a PVC to persist data (master node) | `true` |
|
||||||
|
| `master.persistence.path` | Path to mount the volume at, to use other images | `/data` |
|
||||||
|
| `master.persistence.subPath` | Subdirectory of the volume to mount at | `""` |
|
||||||
|
| `master.persistence.storageClass` | Storage class of backing PVC | `generic` |
|
||||||
|
| `master.persistence.accessModes` | Persistent Volume Access Modes | `[ReadWriteOnce]` |
|
||||||
|
| `master.persistence.size` | Size of data volume | `8Gi` |
|
||||||
|
| `master.persistence.matchLabels` | matchLabels persistent volume selector | `{}` |
|
||||||
|
| `master.persistence.matchExpressions` | matchExpressions persistent volume selector | `{}` |
|
||||||
|
| `master.statefulset.updateStrategy` | Update strategy for StatefulSet | onDelete |
|
||||||
|
| `master.statefulset.rollingUpdatePartition` | Partition update strategy | `nil` |
|
||||||
|
| `master.podLabels` | Additional labels for Redis master pod | {} |
|
||||||
|
| `master.podAnnotations` | Additional annotations for Redis master pod | {} |
|
||||||
|
| `redisPort` | Redis port (in both master and slaves) | `6379` |
|
||||||
|
| `master.command` | Redis master entrypoint string. The command `redis-server` is executed if this is not provided. | `/run.sh` |
|
||||||
|
| `master.configmap` | Additional Redis configuration for the master nodes (this value is evaluated as a template) | `nil` |
|
||||||
|
| `master.disableCommands` | Array of Redis commands to disable (master) | `["FLUSHDB", "FLUSHALL"]` |
|
||||||
|
| `master.extraFlags` | Redis master additional command line flags | [] |
|
||||||
|
| `master.nodeSelector` | Redis master Node labels for pod assignment | {"beta.kubernetes.io/arch": "amd64"} |
|
||||||
|
| `master.tolerations` | Toleration labels for Redis master pod assignment | [] |
|
||||||
|
| `master.affinity` | Affinity settings for Redis master pod assignment | {} |
|
||||||
|
| `master.schedulerName` | Name of an alternate scheduler | `nil` |
|
||||||
|
| `master.service.type` | Kubernetes Service type (redis master) | `ClusterIP` |
|
||||||
|
| `master.service.port` | Kubernetes Service port (redis master) | `6379` |
|
||||||
|
| `master.service.nodePort` | Kubernetes Service nodePort (redis master) | `nil` |
|
||||||
|
| `master.service.annotations` | annotations for redis master service | {} |
|
||||||
|
| `master.service.labels` | Additional labels for redis master service | {} |
|
||||||
|
| `master.service.loadBalancerIP` | loadBalancerIP if redis master service type is `LoadBalancer` | `nil` |
|
||||||
|
| `master.service.loadBalancerSourceRanges` | loadBalancerSourceRanges if redis master service type is `LoadBalancer` | `nil` |
|
||||||
|
| `master.resources` | Redis master CPU/Memory resource requests/limits | Memory: `256Mi`, CPU: `100m` |
|
||||||
|
| `master.livenessProbe.enabled` | Turn on and off liveness probe (redis master pod) | `true` |
|
||||||
|
| `master.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated (redis master pod) | `30` |
|
||||||
|
| `master.livenessProbe.periodSeconds` | How often to perform the probe (redis master pod) | `30` |
|
||||||
|
| `master.livenessProbe.timeoutSeconds` | When the probe times out (redis master pod) | `5` |
|
||||||
|
| `master.livenessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed (redis master pod) | `1` |
|
||||||
|
| `master.livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | `5` |
|
||||||
|
| `master.readinessProbe.enabled` | Turn on and off readiness probe (redis master pod) | `true` |
|
||||||
|
| `master.readinessProbe.initialDelaySeconds` | Delay before readiness probe is initiated (redis master pod) | `5` |
|
||||||
|
| `master.readinessProbe.periodSeconds` | How often to perform the probe (redis master pod) | `10` |
|
||||||
|
| `master.readinessProbe.timeoutSeconds` | When the probe times out (redis master pod) | `1` |
|
||||||
|
| `master.readinessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed (redis master pod) | `1` |
|
||||||
|
| `master.readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | `5` |
|
||||||
|
| `master.priorityClassName` | Redis Master pod priorityClassName | {} |
|
||||||
|
| `volumePermissions.enabled` | Enable init container that changes volume permissions in the registry (for cases where the default k8s `runAsUser` and `fsUser` values do not work) | `false` |
|
||||||
|
| `volumePermissions.image.registry` | Init container volume-permissions image registry | `docker.io` |
|
||||||
|
| `volumePermissions.image.repository` | Init container volume-permissions image name | `bitnami/minideb` |
|
||||||
|
| `volumePermissions.image.tag` | Init container volume-permissions image tag | `buster` |
|
||||||
|
| `volumePermissions.image.pullPolicy` | Init container volume-permissions image pull policy | `Always` |
|
||||||
|
| `volumePermissions.resources ` | Init container volume-permissions CPU/Memory resource requests/limits | {} |
|
||||||
|
| `slave.service.type` | Kubernetes Service type (redis slave) | `ClusterIP` |
|
||||||
|
| `slave.service.nodePort` | Kubernetes Service nodePort (redis slave) | `nil` |
|
||||||
|
| `slave.service.annotations` | annotations for redis slave service | {} |
|
||||||
|
| `slave.service.labels` | Additional labels for redis slave service | {} |
|
||||||
|
| `slave.service.port` | Kubernetes Service port (redis slave) | `6379` |
|
||||||
|
| `slave.service.loadBalancerIP` | LoadBalancerIP if Redis slave service type is `LoadBalancer` | `nil` |
|
||||||
|
| `slave.service.loadBalancerSourceRanges` | loadBalancerSourceRanges if Redis slave service type is `LoadBalancer` | `nil` |
|
||||||
|
| `slave.command` | Redis slave entrypoint array. The docker image's ENTRYPOINT is used if this is not provided. | `/run.sh` |
|
||||||
|
| `slave.configmap` | Additional Redis configuration for the slave nodes (this value is evaluated as a template) | `nil` |
|
||||||
|
| `slave.disableCommands` | Array of Redis commands to disable (slave) | `[FLUSHDB, FLUSHALL]` |
|
||||||
|
| `slave.extraFlags` | Redis slave additional command line flags | `[]` |
|
||||||
|
| `slave.livenessProbe.enabled` | Turn on and off liveness probe (redis slave pod) | `true` |
|
||||||
|
| `slave.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated (redis slave pod) | `30` |
|
||||||
|
| `slave.livenessProbe.periodSeconds` | How often to perform the probe (redis slave pod) | `10` |
|
||||||
|
| `slave.livenessProbe.timeoutSeconds` | When the probe times out (redis slave pod) | `5` |
|
||||||
|
| `slave.livenessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed (redis slave pod) | `1` |
|
||||||
|
| `slave.livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | `5` |
|
||||||
|
| `slave.readinessProbe.enabled` | Turn on and off slave.readiness probe (redis slave pod) | `true` |
|
||||||
|
| `slave.readinessProbe.initialDelaySeconds` | Delay before slave.readiness probe is initiated (redis slave pod) | `5` |
|
||||||
|
| `slave.readinessProbe.periodSeconds` | How often to perform the probe (redis slave pod) | `10` |
|
||||||
|
| `slave.readinessProbe.timeoutSeconds` | When the probe times out (redis slave pod) | `10` |
|
||||||
|
| `slave.readinessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed (redis slave pod) | `1` |
|
||||||
|
| `slave.readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. (redis slave pod) | `5` |
|
||||||
|
| `slave.persistence.enabled` | Use a PVC to persist data (slave node) | `true` |
|
||||||
|
| `slave.persistence.path` | Path to mount the volume at, to use other images | `/data` |
|
||||||
|
| `slave.persistence.subPath` | Subdirectory of the volume to mount at | `""` |
|
||||||
|
| `slave.persistence.storageClass` | Storage class of backing PVC | `generic` |
|
||||||
|
| `slave.persistence.accessModes` | Persistent Volume Access Modes | `[ReadWriteOnce]` |
|
||||||
|
| `slave.persistence.size` | Size of data volume | `8Gi` |
|
||||||
|
| `slave.persistence.matchLabels` | matchLabels persistent volume selector | `{}` |
|
||||||
|
| `slave.persistence.matchExpressions` | matchExpressions persistent volume selector | `{}` |
|
||||||
|
| `slave.statefulset.updateStrategy` | Update strategy for StatefulSet | onDelete |
|
||||||
|
| `slave.statefulset.rollingUpdatePartition` | Partition update strategy | `nil` |
|
||||||
|
| `slave.podLabels` | Additional labels for Redis slave pod | `master.podLabels` |
|
||||||
|
| `slave.podAnnotations` | Additional annotations for Redis slave pod | `master.podAnnotations` |
|
||||||
|
| `slave.schedulerName` | Name of an alternate scheduler | `nil` |
|
||||||
|
| `slave.resources` | Redis slave CPU/Memory resource requests/limits | `{}` |
|
||||||
|
| `slave.affinity` | Enable node/pod affinity for slaves | {} |
|
||||||
|
| `slave.priorityClassName` | Redis Slave pod priorityClassName | {} |
|
||||||
|
| `sentinel.enabled` | Enable sentinel containers | `false` |
|
||||||
|
| `sentinel.usePassword` | Use password for sentinel containers | `true` |
|
||||||
|
| `sentinel.masterSet` | Name of the sentinel master set | `mymaster` |
|
||||||
|
| `sentinel.initialCheckTimeout` | Timeout for querying the redis sentinel service for the active sentinel list | `5` |
|
||||||
|
| `sentinel.quorum` | Quorum for electing a new master | `2` |
|
||||||
|
| `sentinel.downAfterMilliseconds` | Timeout for detecting a Redis node is down | `60000` |
|
||||||
|
| `sentinel.failoverTimeout` | Timeout for performing a election failover | `18000` |
|
||||||
|
| `sentinel.parallelSyncs` | Number of parallel syncs in the cluster | `1` |
|
||||||
|
| `sentinel.port` | Redis Sentinel port | `26379` |
|
||||||
|
| `sentinel.configmap` | Additional Redis configuration for the sentinel nodes (this value is evaluated as a template) | `nil` |
|
||||||
|
| `sentinel.staticID` | Enable static IDs for sentinel replicas (If disabled IDs will be randomly generated on startup) | `false` |
|
||||||
|
| `sentinel.service.type` | Kubernetes Service type (redis sentinel) | `ClusterIP` |
|
||||||
|
| `sentinel.service.nodePort` | Kubernetes Service nodePort (redis sentinel) | `nil` |
|
||||||
|
| `sentinel.service.annotations` | annotations for redis sentinel service | {} |
|
||||||
|
| `sentinel.service.labels` | Additional labels for redis sentinel service | {} |
|
||||||
|
| `sentinel.service.redisPort` | Kubernetes Service port for Redis read only operations | `6379` |
|
||||||
|
| `sentinel.service.sentinelPort` | Kubernetes Service port for Redis sentinel | `26379` |
|
||||||
|
| `sentinel.service.redisNodePort` | Kubernetes Service node port for Redis read only operations | `` |
|
||||||
|
| `sentinel.service.sentinelNodePort` | Kubernetes Service node port for Redis sentinel | `` |
|
||||||
|
| `sentinel.service.loadBalancerIP` | LoadBalancerIP if Redis sentinel service type is `LoadBalancer` | `nil` |
|
||||||
|
| `sentinel.livenessProbe.enabled` | Turn on and off liveness probe (redis sentinel pod) | `true` |
|
||||||
|
| `sentinel.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated (redis sentinel pod) | `5` |
|
||||||
|
| `sentinel.livenessProbe.periodSeconds` | How often to perform the probe (redis sentinel container) | `5` |
|
||||||
|
| `sentinel.livenessProbe.timeoutSeconds` | When the probe times out (redis sentinel container) | `5` |
|
||||||
|
| `sentinel.livenessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed (redis sentinel container) | `1` |
|
||||||
|
| `sentinel.livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | `5` |
|
||||||
|
| `sentinel.readinessProbe.enabled` | Turn on and off sentinel.readiness probe (redis sentinel pod) | `true` |
|
||||||
|
| `sentinel.readinessProbe.initialDelaySeconds` | Delay before sentinel.readiness probe is initiated (redis sentinel pod) | `5` |
|
||||||
|
| `sentinel.readinessProbe.periodSeconds` | How often to perform the probe (redis sentinel pod) | `5` |
|
||||||
|
| `sentinel.readinessProbe.timeoutSeconds` | When the probe times out (redis sentinel container) | `1` |
|
||||||
|
| `sentinel.readinessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed (redis sentinel container) | `1` |
|
||||||
|
| `sentinel.readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. (redis sentinel container) | `5` |
|
||||||
|
| `sentinel.resources` | Redis sentinel CPU/Memory resource requests/limits | `{}` |
|
||||||
|
| `sentinel.image.registry` | Redis Sentinel Image registry | `docker.io` |
|
||||||
|
| `sentinel.image.repository` | Redis Sentinel Image name | `bitnami/redis-sentinel` |
|
||||||
|
| `sentinel.image.tag` | Redis Sentinel Image tag | `{TAG_NAME}` |
|
||||||
|
| `sentinel.image.pullPolicy` | Image pull policy | `IfNotPresent` |
|
||||||
|
| `sentinel.image.pullSecrets` | Specify docker-registry secret names as an array | `nil` |
|
||||||
|
| `sysctlImage.enabled` | Enable an init container to modify Kernel settings | `false` |
|
||||||
|
| `sysctlImage.command` | sysctlImage command to execute | [] |
|
||||||
|
| `sysctlImage.registry` | sysctlImage Init container registry | `docker.io` |
|
||||||
|
| `sysctlImage.repository` | sysctlImage Init container name | `bitnami/minideb` |
|
||||||
|
| `sysctlImage.tag` | sysctlImage Init container tag | `buster` |
|
||||||
|
| `sysctlImage.pullPolicy` | sysctlImage Init container pull policy | `Always` |
|
||||||
|
| `sysctlImage.mountHostSys` | Mount the host `/sys` folder to `/host-sys` | `false` |
|
||||||
|
| `sysctlImage.resources` | sysctlImage Init container CPU/Memory resource requests/limits | {} |
|
||||||
|
| `podSecurityPolicy.create` | Specifies whether a PodSecurityPolicy should be created | `false` |
|
||||||
|
|
||||||
|
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm install my-release \
|
||||||
|
--set password=secretpassword \
|
||||||
|
bitnami/redis
|
||||||
|
```
|
||||||
|
|
||||||
|
The above command sets the Redis server password to `secretpassword`.
|
||||||
|
|
||||||
|
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 bitnami/redis
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Tip**: You can use the default [values.yaml](values.yaml)
|
||||||
|
|
||||||
|
> **Note for minikube users**: Current versions of minikube (v0.24.1 at the time of writing) provision `hostPath` persistent volumes that are only writable by root. Using chart defaults cause pod failure for the Redis pod as it attempts to write to the `/bitnami` directory. Consider installing Redis with `--set persistence.enabled=false`. See minikube issue [1990](https://github.com/kubernetes/minikube/issues/1990) for more information.
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
### Production configuration
|
||||||
|
|
||||||
|
This chart includes a `values-production.yaml` file where you can find some parameters oriented to production configuration in comparison to the regular `values.yaml`. You can use this file instead of the default one.
|
||||||
|
|
||||||
|
- Number of slaves:
|
||||||
|
```diff
|
||||||
|
- cluster.slaveCount: 2
|
||||||
|
+ cluster.slaveCount: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
- Enable NetworkPolicy:
|
||||||
|
```diff
|
||||||
|
- networkPolicy.enabled: false
|
||||||
|
+ networkPolicy.enabled: true
|
||||||
|
```
|
||||||
|
|
||||||
|
- Start a side-car prometheus exporter:
|
||||||
|
```diff
|
||||||
|
- metrics.enabled: false
|
||||||
|
+ metrics.enabled: true
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cluster topologies
|
||||||
|
|
||||||
|
#### Default: Master-Slave
|
||||||
|
|
||||||
|
When installing the chart with `cluster.enabled=true`, it will deploy a Redis master StatefulSet (only one master node allowed) and a Redis slave StatefulSet. The slaves will be read-replicas of the master. Two services will be exposed:
|
||||||
|
|
||||||
|
- Redis Master service: Points to the master, where read-write operations can be performed
|
||||||
|
- Redis Slave service: Points to the slaves, where only read operations are allowed.
|
||||||
|
|
||||||
|
In case the master crashes, the slaves will wait until the master node is respawned again by the Kubernetes Controller Manager.
|
||||||
|
|
||||||
|
#### Master-Slave with Sentinel
|
||||||
|
|
||||||
|
When installing the chart with `cluster.enabled=true` and `sentinel.enabled=true`, it will deploy a Redis master StatefulSet (only one master allowed) and a Redis slave StatefulSet. In this case, the pods will contain en extra container with Redis Sentinel. This container will form a cluster of Redis Sentinel nodes, which will promote a new master in case the actual one fails. In addition to this, only one service is exposed:
|
||||||
|
|
||||||
|
- Redis service: Exposes port 6379 for Redis read-only operations and port 26379 for accesing Redis Sentinel.
|
||||||
|
|
||||||
|
For read-only operations, access the service using port 6379. For write operations, it's necessary to access the Redis Sentinel cluster and query the current master using the command below (using redis-cli or similar:
|
||||||
|
|
||||||
|
```
|
||||||
|
SENTINEL get-master-addr-by-name <name of your MasterSet. Example: mymaster>
|
||||||
|
```
|
||||||
|
This command will return the address of the current master, which can be accessed from inside the cluster.
|
||||||
|
|
||||||
|
In case the current master crashes, the Sentinel containers will elect a new master node.
|
||||||
|
|
||||||
|
### Using password file
|
||||||
|
To use a password file for Redis you need to create a secret containing the password.
|
||||||
|
|
||||||
|
> *NOTE*: It is important that the file with the password must be called `redis-password`
|
||||||
|
|
||||||
|
And then deploy the Helm Chart using the secret name as parameter:
|
||||||
|
|
||||||
|
```console
|
||||||
|
usePassword=true
|
||||||
|
usePasswordFile=true
|
||||||
|
existingSecret=redis-password-file
|
||||||
|
sentinels.enabled=true
|
||||||
|
metrics.enabled=true
|
||||||
|
```
|
||||||
|
|
||||||
|
### Metrics
|
||||||
|
|
||||||
|
The chart optionally can start a metrics exporter for [prometheus](https://prometheus.io). The metrics endpoint (port 9121) is exposed in the service. Metrics can be scraped from within the 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). If metrics are to be scraped from outside the cluster, the Kubernetes API proxy can be utilized to access the endpoint.
|
||||||
|
|
||||||
|
### Host Kernel Settings
|
||||||
|
Redis may require some changes in the kernel of the host machine to work as expected, in particular increasing the `somaxconn` value and disabling transparent huge pages.
|
||||||
|
To do so, you can set up a privileged initContainer with the `sysctlImage` config values, for example:
|
||||||
|
```
|
||||||
|
sysctlImage:
|
||||||
|
enabled: true
|
||||||
|
mountHostSys: true
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- |-
|
||||||
|
install_packages procps
|
||||||
|
sysctl -w net.core.somaxconn=10000
|
||||||
|
echo never > /host-sys/kernel/mm/transparent_hugepage/enabled
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, for Kubernetes 1.12+ you can set `securityContext.sysctls` which will configure sysctls for master and slave pods. Example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
securityContext:
|
||||||
|
sysctls:
|
||||||
|
- name: net.core.somaxconn
|
||||||
|
value: "10000"
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that this will not disable transparent huge tables.
|
||||||
|
|
||||||
|
## Persistence
|
||||||
|
|
||||||
|
By default, the chart mounts a [Persistent Volume](http://kubernetes.io/docs/user-guide/persistent-volumes/) at the `/data` path. The volume is created using dynamic volume provisioning. If a Persistent Volume Claim already exists, specify it during installation.
|
||||||
|
|
||||||
|
### Existing PersistentVolumeClaim
|
||||||
|
|
||||||
|
1. Create the PersistentVolume
|
||||||
|
2. Create the PersistentVolumeClaim
|
||||||
|
3. Install the chart
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ helm install my-release --set persistence.existingClaim=PVC_NAME bitnami/redis
|
||||||
|
```
|
||||||
|
|
||||||
|
## NetworkPolicy
|
||||||
|
|
||||||
|
To enable network policy for Redis, 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:
|
||||||
|
|
||||||
|
kubectl annotate namespace default "net.beta.kubernetes.io/network-policy={\"ingress\":{\"isolation\":\"DefaultDeny\"}}"
|
||||||
|
|
||||||
|
With NetworkPolicy enabled, only pods with the generated client label will be
|
||||||
|
able to connect to Redis. This label will be displayed in the output
|
||||||
|
after a successful install.
|
||||||
|
|
||||||
|
With `networkPolicy.ingressNSMatchLabels` pods from other namespaces can connect to redis. Set `networkPolicy.ingressNSPodMatchLabels` to match pod labels in matched namespace. For example, for a namespace labeled `redis=external` and pods in that namespace labeled `redis-client=true` the fields should be set:
|
||||||
|
|
||||||
|
```
|
||||||
|
networkPolicy:
|
||||||
|
enabled: true
|
||||||
|
ingressNSMatchLabels:
|
||||||
|
redis: external
|
||||||
|
ingressNSPodMatchLabels:
|
||||||
|
redis-client: true
|
||||||
|
```
|
||||||
|
|
||||||
|
## Upgrading an existing Release to a new major version
|
||||||
|
|
||||||
|
A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an
|
||||||
|
incompatible breaking change needing manual actions.
|
||||||
|
|
||||||
|
### To 10.0.0
|
||||||
|
|
||||||
|
For releases with `usePassword: true`, the value `sentinel.usePassword` controls whether the password authentication also applies to the sentinel port. This defaults to `true` for a secure configuration, however it is possible to disable to account for the following cases:
|
||||||
|
* Using a version of redis-sentinel prior to `5.0.1` where the authentication feature was introduced.
|
||||||
|
* Where redis clients need to be updated to support sentinel authentication.
|
||||||
|
|
||||||
|
If using a master/slave topology, or with `usePassword: false`, no action is required.
|
||||||
|
|
||||||
|
### To 8.0.18
|
||||||
|
|
||||||
|
For releases with `metrics.enabled: true` the default tag for the exporter image is now `v1.x.x`. This introduces many changes including metrics names. You'll want to use [this dashboard](https://github.com/oliver006/redis_exporter/blob/master/contrib/grafana_prometheus_redis_dashboard.json) now. Please see the [redis_exporter github page](https://github.com/oliver006/redis_exporter#upgrading-from-0x-to-1x) for more details.
|
||||||
|
|
||||||
|
### To 7.0.0
|
||||||
|
|
||||||
|
This version causes a change in the Redis Master StatefulSet definition, so the command helm upgrade would not work out of the box. As an alternative, one of the following could be done:
|
||||||
|
|
||||||
|
- Recommended: Create a clone of the Redis Master PVC (for example, using projects like [this one](https://github.com/edseymour/pvc-transfer)). Then launch a fresh release reusing this cloned PVC.
|
||||||
|
|
||||||
|
```
|
||||||
|
helm install my-release bitnami/redis --set persistence.existingClaim=<NEW PVC>
|
||||||
|
```
|
||||||
|
|
||||||
|
- Alternative (not recommended, do at your own risk): `helm delete --purge` does not remove the PVC assigned to the Redis Master StatefulSet. As a consequence, the following commands can be done to upgrade the release
|
||||||
|
|
||||||
|
```
|
||||||
|
helm delete --purge <RELEASE>
|
||||||
|
helm install <RELEASE> bitnami/redis
|
||||||
|
```
|
||||||
|
|
||||||
|
Previous versions of the chart were not using persistence in the slaves, so this upgrade would add it to them. Another important change is that no values are inherited from master to slaves. For example, in 6.0.0 `slaves.readinessProbe.periodSeconds`, if empty, would be set to `master.readinessProbe.periodSeconds`. This approach lacked transparency and was difficult to maintain. From now on, all the slave parameters must be configured just as it is done with the masters.
|
||||||
|
|
||||||
|
Some values have changed as well:
|
||||||
|
|
||||||
|
- `master.port` and `slave.port` have been changed to `redisPort` (same value for both master and slaves)
|
||||||
|
- `master.securityContext` and `slave.securityContext` have been changed to `securityContext`(same values for both master and slaves)
|
||||||
|
|
||||||
|
By default, the upgrade will not change the cluster topology. In case you want to use Redis Sentinel, you must explicitly set `sentinel.enabled` to `true`.
|
||||||
|
|
||||||
|
### To 6.0.0
|
||||||
|
|
||||||
|
Previous versions of the chart were using an init-container to change the permissions of the volumes. This was done in case the `securityContext` directive in the template was not enough for that (for example, with cephFS). In this new version of the chart, this container is disabled by default (which should not affect most of the deployments). If your installation still requires that init container, execute `helm upgrade` with the `--set volumePermissions.enabled=true`.
|
||||||
|
|
||||||
|
### To 5.0.0
|
||||||
|
|
||||||
|
The default image in this release may be switched out for any image containing the `redis-server`
|
||||||
|
and `redis-cli` binaries. If `redis-server` is not the default image ENTRYPOINT, `master.command`
|
||||||
|
must be specified.
|
||||||
|
|
||||||
|
#### Breaking changes
|
||||||
|
- `master.args` and `slave.args` are removed. Use `master.command` or `slave.command` instead in order to override the image entrypoint, or `master.extraFlags` to pass additional flags to `redis-server`.
|
||||||
|
- `disableCommands` is now interpreted as an array of strings instead of a string of comma separated values.
|
||||||
|
- `master.persistence.path` now defaults to `/data`.
|
||||||
|
|
||||||
|
### 4.0.0
|
||||||
|
|
||||||
|
This version removes the `chart` label from the `spec.selector.matchLabels`
|
||||||
|
which is immutable since `StatefulSet apps/v1beta2`. It has been inadvertently
|
||||||
|
added, causing any subsequent upgrade to fail. See https://github.com/helm/charts/issues/7726.
|
||||||
|
|
||||||
|
It also fixes https://github.com/helm/charts/issues/7726 where a deployment `extensions/v1beta1` can not be upgraded if `spec.selector` is not explicitly set.
|
||||||
|
|
||||||
|
Finally, it fixes https://github.com/helm/charts/issues/7803 by removing mutable labels in `spec.VolumeClaimTemplate.metadata.labels` so that it is upgradable.
|
||||||
|
|
||||||
|
In order to upgrade, delete the Redis StatefulSet before upgrading:
|
||||||
|
```bash
|
||||||
|
$ kubectl delete statefulsets.apps --cascade=false my-release-redis-master
|
||||||
|
```
|
||||||
|
And edit the Redis slave (and metrics if enabled) deployment:
|
||||||
|
```bash
|
||||||
|
kubectl patch deployments my-release-redis-slave --type=json -p='[{"op": "remove", "path": "/spec/selector/matchLabels/chart"}]'
|
||||||
|
kubectl patch deployments my-release-redis-metrics --type=json -p='[{"op": "remove", "path": "/spec/selector/matchLabels/chart"}]'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Notable changes
|
||||||
|
|
||||||
|
### 9.0.0
|
||||||
|
The metrics exporter has been changed from a separate deployment to a sidecar container, due to the latest changes in the Redis exporter code. Check the [official page](https://github.com/oliver006/redis_exporter/) for more information. The metrics container image was changed from oliver006/redis_exporter to bitnami/redis-exporter (Bitnami's maintained package of oliver006/redis_exporter).
|
||||||
|
|
||||||
|
### 7.0.0
|
||||||
|
In order to improve the performance in case of slave failure, we added persistence to the read-only slaves. That means that we moved from Deployment to StatefulSets. This should not affect upgrades from previous versions of the chart, as the deployments did not contain any persistence at all.
|
||||||
|
|
||||||
|
This version also allows enabling Redis Sentinel containers inside of the Redis Pods (feature disabled by default). In case the master crashes, a new Redis node will be elected as master. In order to query the current master (no redis master service is exposed), you need to query first the Sentinel cluster. Find more information [in this section](#master-slave-with-sentinel).
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Leave this file empty to ensure that CI runs builds against the default configuration in values.yaml.
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
master:
|
||||||
|
persistence:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
slaveCount: 1
|
||||||
|
|
||||||
|
usePassword: false
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
master:
|
||||||
|
extraFlags:
|
||||||
|
- --maxmemory-policy allkeys-lru
|
||||||
|
persistence:
|
||||||
|
enabled: false
|
||||||
|
slave:
|
||||||
|
extraFlags:
|
||||||
|
- --maxmemory-policy allkeys-lru
|
||||||
|
persistence:
|
||||||
|
enabled: false
|
||||||
|
usePassword: false
|
||||||
@@ -0,0 +1,524 @@
|
|||||||
|
## Global Docker image parameters
|
||||||
|
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
|
||||||
|
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
|
||||||
|
##
|
||||||
|
# global:
|
||||||
|
# imageRegistry: myRegistryName
|
||||||
|
# imagePullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Bitnami Redis image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.5-debian-9-r36
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Redis pod Security Context
|
||||||
|
securityContext:
|
||||||
|
enabled: true
|
||||||
|
fsGroup: 1001
|
||||||
|
runAsUser: 1001
|
||||||
|
|
||||||
|
## Cluster settings
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
slaveCount: 3
|
||||||
|
|
||||||
|
## Use redis sentinel in the redis pod. This will disable the master and slave services and
|
||||||
|
## create one redis service with ports to the sentinel and the redis instances
|
||||||
|
sentinel:
|
||||||
|
enabled: true
|
||||||
|
## Require password authentication on the sentinel itself
|
||||||
|
## ref: https://redis.io/topics/sentinel
|
||||||
|
usePassword: false
|
||||||
|
## Bitnami Redis Sentintel image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis-sentinel/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-sentinel
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis-sentinel#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.5-debian-9-r37
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
masterSet: mymaster
|
||||||
|
initialCheckTimeout: 5
|
||||||
|
quorum: 2
|
||||||
|
downAfterMilliseconds: 60000
|
||||||
|
failoverTimeout: 18000
|
||||||
|
parallelSyncs: 1
|
||||||
|
port: 26379
|
||||||
|
## Configure extra options for Redis Sentinel liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
## Redis Sentinel resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Redis Sentinel Service properties
|
||||||
|
service:
|
||||||
|
## Redis Sentinel Service type
|
||||||
|
type: ClusterIP
|
||||||
|
sentinelPort: 26379
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# sentinelNodePort:
|
||||||
|
# redisNodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
## Specifies whether a NetworkPolicy should be created
|
||||||
|
##
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
## The Policy model to apply. When set to false, only pods with the correct
|
||||||
|
## client label will have network access to the port Redis is listening
|
||||||
|
## on. When true, Redis will accept connections from any source
|
||||||
|
## (with the correct destination port).
|
||||||
|
##
|
||||||
|
# allowExternal: true
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
## Specifies whether a ServiceAccount should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
## The name of the ServiceAccount to use.
|
||||||
|
## If not set and create is true, a name is generated using the fullname template
|
||||||
|
name:
|
||||||
|
|
||||||
|
rbac:
|
||||||
|
## Specifies whether RBAC resources should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
|
||||||
|
role:
|
||||||
|
## Rules to create. It follows the role specification
|
||||||
|
# rules:
|
||||||
|
# - apiGroups:
|
||||||
|
# - extensions
|
||||||
|
# resources:
|
||||||
|
# - podsecuritypolicies
|
||||||
|
# verbs:
|
||||||
|
# - use
|
||||||
|
# resourceNames:
|
||||||
|
# - gce.unprivileged
|
||||||
|
rules: []
|
||||||
|
|
||||||
|
|
||||||
|
## Use password authentication
|
||||||
|
usePassword: true
|
||||||
|
## Redis password (both master and slave)
|
||||||
|
## Defaults to a random 10-character alphanumeric string if not set and usePassword is true
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#setting-the-server-password-on-first-run
|
||||||
|
##
|
||||||
|
password:
|
||||||
|
## Use existing secret (ignores previous password)
|
||||||
|
# existingSecret:
|
||||||
|
## Password key to be retrieved from Redis secret
|
||||||
|
##
|
||||||
|
# existingSecretPasswordKey:
|
||||||
|
|
||||||
|
## Mount secrets as files instead of environment variables
|
||||||
|
usePasswordFile: false
|
||||||
|
|
||||||
|
## Persist data to a persistent volume
|
||||||
|
persistence: {}
|
||||||
|
## A manually managed Persistent Volume and Claim
|
||||||
|
## Requires persistence.enabled: true
|
||||||
|
## If defined, PVC must be created manually before volume will be bound
|
||||||
|
# existingClaim:
|
||||||
|
|
||||||
|
# Redis port
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Master parameters
|
||||||
|
##
|
||||||
|
master:
|
||||||
|
## Redis command arguments
|
||||||
|
##
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Redis additional command line flags
|
||||||
|
##
|
||||||
|
## Can be used to specify command line flags, for example:
|
||||||
|
##
|
||||||
|
## extraFlags:
|
||||||
|
## - "--maxmemory-policy volatile-ttl"
|
||||||
|
## - "--repl-backlog-size 1024mb"
|
||||||
|
extraFlags: []
|
||||||
|
## Comma-separated list of Redis commands to disable
|
||||||
|
##
|
||||||
|
## Can be used to disable Redis commands for security reasons.
|
||||||
|
## Commands will be completely disabled by renaming each to an empty string.
|
||||||
|
## ref: https://redis.io/topics/security#disabling-of-specific-commands
|
||||||
|
##
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Master additional pod labels and annotations
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis Master resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Configure extra options for Redis Master liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis Master Node selectors and tolerations for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
##
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
## Redis Master pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Redis Master Service properties
|
||||||
|
service:
|
||||||
|
## Redis Master Service type
|
||||||
|
type: ClusterIP
|
||||||
|
port: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Redis Master pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Slave properties
|
||||||
|
## Note: service.type is a mandatory parameter
|
||||||
|
## The rest of the parameters are either optional or, if undefined, will inherit those declared in Redis Master
|
||||||
|
##
|
||||||
|
slave:
|
||||||
|
## Slave Service properties
|
||||||
|
service:
|
||||||
|
## Redis Slave Service type
|
||||||
|
type: ClusterIP
|
||||||
|
## Redis port
|
||||||
|
port: 6379
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
## Redis slave port
|
||||||
|
port: 6379
|
||||||
|
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Redis extra flags
|
||||||
|
extraFlags: []
|
||||||
|
## List of Redis commands to disable
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Slave pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Configure extra options for Redis Slave liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis slave Resource
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Redis slave selectors and tolerations for pod assignment
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Redis slave pod Annotation and Labels
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis slave pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
## Prometheus Exporter / Metrics
|
||||||
|
##
|
||||||
|
metrics:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-exporter
|
||||||
|
tag: 1.0.3-debian-9-r0
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Metrics exporter resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
##
|
||||||
|
# resources: {}
|
||||||
|
## Metrics exporter pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
## Use serviceLoadBalancerIP to request a specific static IP,
|
||||||
|
## otherwise leave blank
|
||||||
|
# loadBalancerIP:
|
||||||
|
annotations: {}
|
||||||
|
|
||||||
|
## Extra arguments for Metrics exporter, for example:
|
||||||
|
## extraArgs:
|
||||||
|
## check-keys: myKey,myOtherKey
|
||||||
|
# extraArgs: {}
|
||||||
|
|
||||||
|
## Metrics exporter pod Annotation and Labels
|
||||||
|
podAnnotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "9121"
|
||||||
|
# podLabels: {}
|
||||||
|
|
||||||
|
# Enable this if you're using https://github.com/coreos/prometheus-operator
|
||||||
|
serviceMonitor:
|
||||||
|
enabled: false
|
||||||
|
## Specify a namespace if needed
|
||||||
|
# namespace: monitoring
|
||||||
|
# fallback to the prometheus default unless specified
|
||||||
|
# interval: 10s
|
||||||
|
## Defaults to what's used if you follow CoreOS [Prometheus Install Instructions](https://github.com/helm/charts/tree/master/stable/prometheus-operator#tldr)
|
||||||
|
## [Prometheus Selector Label](https://github.com/helm/charts/tree/master/stable/prometheus-operator#prometheus-operator-1)
|
||||||
|
## [Kube Prometheus Selector Label](https://github.com/helm/charts/tree/master/stable/prometheus-operator#exporters)
|
||||||
|
selector:
|
||||||
|
prometheus: kube-prometheus
|
||||||
|
##
|
||||||
|
## Init containers parameters:
|
||||||
|
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||||
|
##
|
||||||
|
volumePermissions:
|
||||||
|
enabled: false
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Redis config file
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap: |-
|
||||||
|
# maxmemory-policy volatile-lru
|
||||||
|
|
||||||
|
## Sysctl InitContainer
|
||||||
|
## used to perform sysctl operation to modify Kernel settings (needed sometimes to avoid warnings)
|
||||||
|
sysctlImage:
|
||||||
|
enabled: false
|
||||||
|
command: []
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
mountHostSys: false
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
@@ -0,0 +1,524 @@
|
|||||||
|
## Global Docker image parameters
|
||||||
|
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
|
||||||
|
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
|
||||||
|
##
|
||||||
|
# global:
|
||||||
|
# imageRegistry: myRegistryName
|
||||||
|
# imagePullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Bitnami Redis image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.5-debian-9-r36
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Redis pod Security Context
|
||||||
|
securityContext:
|
||||||
|
enabled: true
|
||||||
|
fsGroup: 1001
|
||||||
|
runAsUser: 1001
|
||||||
|
|
||||||
|
## Cluster settings
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
slaveCount: 3
|
||||||
|
|
||||||
|
## Use redis sentinel in the redis pod. This will disable the master and slave services and
|
||||||
|
## create one redis service with ports to the sentinel and the redis instances
|
||||||
|
sentinel:
|
||||||
|
enabled: true
|
||||||
|
## Require password authentication on the sentinel itself
|
||||||
|
## ref: https://redis.io/topics/sentinel
|
||||||
|
usePassword: true
|
||||||
|
## Bitnami Redis Sentintel image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis-sentinel/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-sentinel
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis-sentinel#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.5-debian-9-r37
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
masterSet: mymaster
|
||||||
|
initialCheckTimeout: 5
|
||||||
|
quorum: 2
|
||||||
|
downAfterMilliseconds: 60000
|
||||||
|
failoverTimeout: 18000
|
||||||
|
parallelSyncs: 1
|
||||||
|
port: 26379
|
||||||
|
## Configure extra options for Redis Sentinel liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
## Redis Sentinel resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Redis Sentinel Service properties
|
||||||
|
service:
|
||||||
|
## Redis Sentinel Service type
|
||||||
|
type: ClusterIP
|
||||||
|
sentinelPort: 26379
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# sentinelNodePort:
|
||||||
|
# redisNodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
## Specifies whether a NetworkPolicy should be created
|
||||||
|
##
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
## The Policy model to apply. When set to false, only pods with the correct
|
||||||
|
## client label will have network access to the port Redis is listening
|
||||||
|
## on. When true, Redis will accept connections from any source
|
||||||
|
## (with the correct destination port).
|
||||||
|
##
|
||||||
|
# allowExternal: true
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
## Specifies whether a ServiceAccount should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
## The name of the ServiceAccount to use.
|
||||||
|
## If not set and create is true, a name is generated using the fullname template
|
||||||
|
name:
|
||||||
|
|
||||||
|
rbac:
|
||||||
|
## Specifies whether RBAC resources should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
|
||||||
|
role:
|
||||||
|
## Rules to create. It follows the role specification
|
||||||
|
# rules:
|
||||||
|
# - apiGroups:
|
||||||
|
# - extensions
|
||||||
|
# resources:
|
||||||
|
# - podsecuritypolicies
|
||||||
|
# verbs:
|
||||||
|
# - use
|
||||||
|
# resourceNames:
|
||||||
|
# - gce.unprivileged
|
||||||
|
rules: []
|
||||||
|
|
||||||
|
|
||||||
|
## Use password authentication
|
||||||
|
usePassword: true
|
||||||
|
## Redis password (both master and slave)
|
||||||
|
## Defaults to a random 10-character alphanumeric string if not set and usePassword is true
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#setting-the-server-password-on-first-run
|
||||||
|
##
|
||||||
|
password:
|
||||||
|
## Use existing secret (ignores previous password)
|
||||||
|
# existingSecret:
|
||||||
|
## Password key to be retrieved from Redis secret
|
||||||
|
##
|
||||||
|
# existingSecretPasswordKey:
|
||||||
|
|
||||||
|
## Mount secrets as files instead of environment variables
|
||||||
|
usePasswordFile: false
|
||||||
|
|
||||||
|
## Persist data to a persistent volume
|
||||||
|
persistence: {}
|
||||||
|
## A manually managed Persistent Volume and Claim
|
||||||
|
## Requires persistence.enabled: true
|
||||||
|
## If defined, PVC must be created manually before volume will be bound
|
||||||
|
# existingClaim:
|
||||||
|
|
||||||
|
# Redis port
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Master parameters
|
||||||
|
##
|
||||||
|
master:
|
||||||
|
## Redis command arguments
|
||||||
|
##
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Redis additional command line flags
|
||||||
|
##
|
||||||
|
## Can be used to specify command line flags, for example:
|
||||||
|
##
|
||||||
|
## extraFlags:
|
||||||
|
## - "--maxmemory-policy volatile-ttl"
|
||||||
|
## - "--repl-backlog-size 1024mb"
|
||||||
|
extraFlags: []
|
||||||
|
## Comma-separated list of Redis commands to disable
|
||||||
|
##
|
||||||
|
## Can be used to disable Redis commands for security reasons.
|
||||||
|
## Commands will be completely disabled by renaming each to an empty string.
|
||||||
|
## ref: https://redis.io/topics/security#disabling-of-specific-commands
|
||||||
|
##
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Master additional pod labels and annotations
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis Master resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Configure extra options for Redis Master liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis Master Node selectors and tolerations for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
##
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
## Redis Master pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Redis Master Service properties
|
||||||
|
service:
|
||||||
|
## Redis Master Service type
|
||||||
|
type: ClusterIP
|
||||||
|
port: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Redis Master pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Slave properties
|
||||||
|
## Note: service.type is a mandatory parameter
|
||||||
|
## The rest of the parameters are either optional or, if undefined, will inherit those declared in Redis Master
|
||||||
|
##
|
||||||
|
slave:
|
||||||
|
## Slave Service properties
|
||||||
|
service:
|
||||||
|
## Redis Slave Service type
|
||||||
|
type: ClusterIP
|
||||||
|
## Redis port
|
||||||
|
port: 6379
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
## Redis slave port
|
||||||
|
port: 6379
|
||||||
|
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Redis extra flags
|
||||||
|
extraFlags: []
|
||||||
|
## List of Redis commands to disable
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Slave pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Configure extra options for Redis Slave liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis slave Resource
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Redis slave selectors and tolerations for pod assignment
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Redis slave pod Annotation and Labels
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis slave pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
## Prometheus Exporter / Metrics
|
||||||
|
##
|
||||||
|
metrics:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-exporter
|
||||||
|
tag: 1.0.3-debian-9-r0
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Metrics exporter resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
##
|
||||||
|
# resources: {}
|
||||||
|
## Metrics exporter pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
## Use serviceLoadBalancerIP to request a specific static IP,
|
||||||
|
## otherwise leave blank
|
||||||
|
# loadBalancerIP:
|
||||||
|
annotations: {}
|
||||||
|
|
||||||
|
## Extra arguments for Metrics exporter, for example:
|
||||||
|
## extraArgs:
|
||||||
|
## check-keys: myKey,myOtherKey
|
||||||
|
# extraArgs: {}
|
||||||
|
|
||||||
|
## Metrics exporter pod Annotation and Labels
|
||||||
|
podAnnotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "9121"
|
||||||
|
# podLabels: {}
|
||||||
|
|
||||||
|
# Enable this if you're using https://github.com/coreos/prometheus-operator
|
||||||
|
serviceMonitor:
|
||||||
|
enabled: false
|
||||||
|
## Specify a namespace if needed
|
||||||
|
# namespace: monitoring
|
||||||
|
# fallback to the prometheus default unless specified
|
||||||
|
# interval: 10s
|
||||||
|
## Defaults to what's used if you follow CoreOS [Prometheus Install Instructions](https://github.com/helm/charts/tree/master/stable/prometheus-operator#tldr)
|
||||||
|
## [Prometheus Selector Label](https://github.com/helm/charts/tree/master/stable/prometheus-operator#prometheus-operator-1)
|
||||||
|
## [Kube Prometheus Selector Label](https://github.com/helm/charts/tree/master/stable/prometheus-operator#exporters)
|
||||||
|
selector:
|
||||||
|
prometheus: kube-prometheus
|
||||||
|
##
|
||||||
|
## Init containers parameters:
|
||||||
|
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||||
|
##
|
||||||
|
volumePermissions:
|
||||||
|
enabled: false
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Redis config file
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap: |-
|
||||||
|
# maxmemory-policy volatile-lru
|
||||||
|
|
||||||
|
## Sysctl InitContainer
|
||||||
|
## used to perform sysctl operation to modify Kernel settings (needed sometimes to avoid warnings)
|
||||||
|
sysctlImage:
|
||||||
|
enabled: false
|
||||||
|
command: []
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
mountHostSys: false
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
@@ -0,0 +1,525 @@
|
|||||||
|
## Global Docker image parameters
|
||||||
|
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
|
||||||
|
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
|
||||||
|
##
|
||||||
|
# global:
|
||||||
|
# imageRegistry: myRegistryName
|
||||||
|
# imagePullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Bitnami Redis image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.5-debian-9-r36
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Redis pod Security Context
|
||||||
|
securityContext:
|
||||||
|
enabled: true
|
||||||
|
fsGroup: 1001
|
||||||
|
runAsUser: 1001
|
||||||
|
|
||||||
|
## Cluster settings
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
slaveCount: 3
|
||||||
|
|
||||||
|
## Use redis sentinel in the redis pod. This will disable the master and slave services and
|
||||||
|
## create one redis service with ports to the sentinel and the redis instances
|
||||||
|
sentinel:
|
||||||
|
enabled: false
|
||||||
|
## Require password authentication on the sentinel itself
|
||||||
|
## ref: https://redis.io/topics/sentinel
|
||||||
|
usePassword: true
|
||||||
|
## Bitnami Redis Sentintel image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis-sentinel/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-sentinel
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis-sentinel#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.5-debian-9-r37
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
masterSet: mymaster
|
||||||
|
initialCheckTimeout: 5
|
||||||
|
quorum: 2
|
||||||
|
downAfterMilliseconds: 60000
|
||||||
|
failoverTimeout: 18000
|
||||||
|
parallelSyncs: 1
|
||||||
|
port: 26379
|
||||||
|
## Configure extra options for Redis Sentinel liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
## Redis Sentinel resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Redis Sentinel Service properties
|
||||||
|
service:
|
||||||
|
## Redis Sentinel Service type
|
||||||
|
type: ClusterIP
|
||||||
|
sentinelPort: 26379
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# sentinelNodePort:
|
||||||
|
# redisNodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
## Specifies whether a NetworkPolicy should be created
|
||||||
|
##
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
## The Policy model to apply. When set to false, only pods with the correct
|
||||||
|
## client label will have network access to the port Redis is listening
|
||||||
|
## on. When true, Redis will accept connections from any source
|
||||||
|
## (with the correct destination port).
|
||||||
|
##
|
||||||
|
# allowExternal: true
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
## Specifies whether a ServiceAccount should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
## The name of the ServiceAccount to use.
|
||||||
|
## If not set and create is true, a name is generated using the fullname template
|
||||||
|
name:
|
||||||
|
|
||||||
|
rbac:
|
||||||
|
## Specifies whether RBAC resources should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
|
||||||
|
role:
|
||||||
|
## Rules to create. It follows the role specification
|
||||||
|
# rules:
|
||||||
|
# - apiGroups:
|
||||||
|
# - extensions
|
||||||
|
# resources:
|
||||||
|
# - podsecuritypolicies
|
||||||
|
# verbs:
|
||||||
|
# - use
|
||||||
|
# resourceNames:
|
||||||
|
# - gce.unprivileged
|
||||||
|
rules: []
|
||||||
|
|
||||||
|
|
||||||
|
## Use password authentication
|
||||||
|
usePassword: true
|
||||||
|
## Redis password (both master and slave)
|
||||||
|
## Defaults to a random 10-character alphanumeric string if not set and usePassword is true
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#setting-the-server-password-on-first-run
|
||||||
|
##
|
||||||
|
password:
|
||||||
|
## Use existing secret (ignores previous password)
|
||||||
|
# existingSecret:
|
||||||
|
## Password key to be retrieved from Redis secret
|
||||||
|
##
|
||||||
|
# existingSecretPasswordKey:
|
||||||
|
|
||||||
|
## Mount secrets as files instead of environment variables
|
||||||
|
usePasswordFile: false
|
||||||
|
|
||||||
|
## Persist data to a persistent volume
|
||||||
|
persistence: {}
|
||||||
|
## A manually managed Persistent Volume and Claim
|
||||||
|
## Requires persistence.enabled: true
|
||||||
|
## If defined, PVC must be created manually before volume will be bound
|
||||||
|
# existingClaim:
|
||||||
|
|
||||||
|
# Redis port
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Master parameters
|
||||||
|
##
|
||||||
|
master:
|
||||||
|
## Redis command arguments
|
||||||
|
##
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Redis additional command line flags
|
||||||
|
##
|
||||||
|
## Can be used to specify command line flags, for example:
|
||||||
|
##
|
||||||
|
## extraFlags:
|
||||||
|
## - "--maxmemory-policy volatile-ttl"
|
||||||
|
## - "--repl-backlog-size 1024mb"
|
||||||
|
extraFlags: []
|
||||||
|
## Comma-separated list of Redis commands to disable
|
||||||
|
##
|
||||||
|
## Can be used to disable Redis commands for security reasons.
|
||||||
|
## Commands will be completely disabled by renaming each to an empty string.
|
||||||
|
## ref: https://redis.io/topics/security#disabling-of-specific-commands
|
||||||
|
##
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Master additional pod labels and annotations
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis Master resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Configure extra options for Redis Master liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis Master Node selectors and tolerations for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
##
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
## Redis Master pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Redis Master Service properties
|
||||||
|
service:
|
||||||
|
## Redis Master Service type
|
||||||
|
type: ClusterIP
|
||||||
|
port: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Redis Master pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Slave properties
|
||||||
|
## Note: service.type is a mandatory parameter
|
||||||
|
## The rest of the parameters are either optional or, if undefined, will inherit those declared in Redis Master
|
||||||
|
##
|
||||||
|
slave:
|
||||||
|
## Slave Service properties
|
||||||
|
service:
|
||||||
|
## Redis Slave Service type
|
||||||
|
type: ClusterIP
|
||||||
|
## Redis port
|
||||||
|
port: 6379
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
## Redis slave port
|
||||||
|
port: 6379
|
||||||
|
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Redis extra flags
|
||||||
|
extraFlags: []
|
||||||
|
## List of Redis commands to disable
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Slave pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Configure extra options for Redis Slave liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis slave Resource
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Redis slave selectors and tolerations for pod assignment
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Redis slave pod Annotation and Labels
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis slave pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
## Prometheus Exporter / Metrics
|
||||||
|
##
|
||||||
|
metrics:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-exporter
|
||||||
|
tag: 1.0.3-debian-9-r0
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Metrics exporter resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
##
|
||||||
|
# resources: {}
|
||||||
|
|
||||||
|
## Extra arguments for Metrics exporter, for example:
|
||||||
|
## extraArgs:
|
||||||
|
## check-keys: myKey,myOtherKey
|
||||||
|
# extraArgs: {}
|
||||||
|
## Metrics exporter pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
## Use serviceLoadBalancerIP to request a specific static IP,
|
||||||
|
## otherwise leave blank
|
||||||
|
# loadBalancerIP:
|
||||||
|
annotations: {}
|
||||||
|
|
||||||
|
## Metrics exporter pod Annotation and Labels
|
||||||
|
podAnnotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "9121"
|
||||||
|
# podLabels: {}
|
||||||
|
|
||||||
|
# Enable this if you're using https://github.com/coreos/prometheus-operator
|
||||||
|
serviceMonitor:
|
||||||
|
enabled: false
|
||||||
|
## Specify a namespace if needed
|
||||||
|
# namespace: monitoring
|
||||||
|
# fallback to the prometheus default unless specified
|
||||||
|
# interval: 10s
|
||||||
|
## Defaults to what's used if you follow CoreOS [Prometheus Install Instructions](https://github.com/helm/charts/tree/master/stable/prometheus-operator#tldr)
|
||||||
|
## [Prometheus Selector Label](https://github.com/helm/charts/tree/master/stable/prometheus-operator#prometheus-operator-1)
|
||||||
|
## [Kube Prometheus Selector Label](https://github.com/helm/charts/tree/master/stable/prometheus-operator#exporters)
|
||||||
|
selector:
|
||||||
|
prometheus: kube-prometheus
|
||||||
|
|
||||||
|
##
|
||||||
|
## Init containers parameters:
|
||||||
|
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||||
|
##
|
||||||
|
volumePermissions:
|
||||||
|
enabled: false
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Redis config file
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap: |-
|
||||||
|
# maxmemory-policy volatile-lru
|
||||||
|
|
||||||
|
## Sysctl InitContainer
|
||||||
|
## used to perform sysctl operation to modify Kernel settings (needed sometimes to avoid warnings)
|
||||||
|
sysctlImage:
|
||||||
|
enabled: false
|
||||||
|
command: []
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
mountHostSys: false
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
## Redis library image
|
||||||
|
## ref: https://hub.docker.com/r/library/redis/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: redis
|
||||||
|
tag: '5.0.5'
|
||||||
|
|
||||||
|
master:
|
||||||
|
command: "redis-server"
|
||||||
|
|
||||||
|
slave:
|
||||||
|
command: "redis-server"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: redislabs/redisgraph
|
||||||
|
tag: '1.0.0'
|
||||||
|
|
||||||
|
master:
|
||||||
|
command: "redis-server"
|
||||||
|
|
||||||
|
slave:
|
||||||
|
command: "redis-server"
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
** Please be patient while the chart is being deployed **
|
||||||
|
|
||||||
|
{{- if contains .Values.master.service.type "LoadBalancer" }}
|
||||||
|
{{- if not .Values.usePassword }}
|
||||||
|
{{ if and (not .Values.networkPolicy.enabled) (.Values.networkPolicy.allowExternal) }}
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
WARNING
|
||||||
|
|
||||||
|
By specifying "master.service.type=LoadBalancer" and "usePassword=false" you have
|
||||||
|
most likely exposed the Redis service externally without any authentication
|
||||||
|
mechanism.
|
||||||
|
|
||||||
|
For security reasons, we strongly suggest that you switch to "ClusterIP" or
|
||||||
|
"NodePort". As alternative, you can also switch to "usePassword=true"
|
||||||
|
providing a valid password on "password" parameter.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Values.cluster.enabled }}
|
||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
Redis can be accessed via port {{ .Values.sentinel.service.redisPort }} on the following DNS name from within your cluster:
|
||||||
|
|
||||||
|
{{ template "redis.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }} for read only operations
|
||||||
|
|
||||||
|
For read/write operations, first access the Redis Sentinel cluster, which is available in port {{ .Values.sentinel.service.sentinelPort }} using the same domain name above.
|
||||||
|
|
||||||
|
{{- else }}
|
||||||
|
Redis can be accessed via port {{ .Values.redisPort }} on the following DNS names from within your cluster:
|
||||||
|
|
||||||
|
{{ template "redis.fullname" . }}-master.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }} for read/write operations
|
||||||
|
{{ template "redis.fullname" . }}-slave.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }} for read-only operations
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- else }}
|
||||||
|
Redis can be accessed via port {{ .Values.redisPort }} on the following DNS name from within your cluster:
|
||||||
|
|
||||||
|
{{ template "redis.fullname" . }}-master.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{ if .Values.usePassword }}
|
||||||
|
To get your password run:
|
||||||
|
|
||||||
|
export REDIS_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "redis.secretName" . }} -o jsonpath="{.data.redis-password}" | base64 --decode)
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
To connect to your Redis server:
|
||||||
|
|
||||||
|
1. Run a Redis pod that you can use as a client:
|
||||||
|
|
||||||
|
kubectl run --namespace {{ .Release.Namespace }} {{ template "redis.fullname" . }}-client --rm --tty -i --restart='Never' \
|
||||||
|
{{ if .Values.usePassword }} --env REDIS_PASSWORD=$REDIS_PASSWORD \{{ end }}
|
||||||
|
{{- if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }}--labels="{{ template "redis.fullname" . }}-client=true" \{{- end }}
|
||||||
|
--image {{ template "redis.image" . }} -- bash
|
||||||
|
|
||||||
|
2. Connect using the Redis CLI:
|
||||||
|
|
||||||
|
{{- if .Values.cluster.enabled }}
|
||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
redis-cli -h {{ template "redis.fullname" . }} -p {{ .Values.sentinel.service.redisPort }}{{ if .Values.usePassword }} -a $REDIS_PASSWORD{{ end }} # Read only operations
|
||||||
|
redis-cli -h {{ template "redis.fullname" . }} -p {{ .Values.sentinel.service.sentinelPort }}{{ if .Values.usePassword }} -a $REDIS_PASSWORD{{ end }} # Sentinel access
|
||||||
|
{{- else }}
|
||||||
|
redis-cli -h {{ template "redis.fullname" . }}-master{{ if .Values.usePassword }} -a $REDIS_PASSWORD{{ end }}
|
||||||
|
redis-cli -h {{ template "redis.fullname" . }}-slave{{ if .Values.usePassword }} -a $REDIS_PASSWORD{{ end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
redis-cli -h {{ template "redis.fullname" . }}-master{{ if .Values.usePassword }} -a $REDIS_PASSWORD{{ end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{ if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }}
|
||||||
|
Note: Since NetworkPolicy is enabled, only pods with label
|
||||||
|
{{ template "redis.fullname" . }}-client=true"
|
||||||
|
will be able to connect to redis.
|
||||||
|
{{- else -}}
|
||||||
|
|
||||||
|
To connect to your database from outside the cluster execute the following commands:
|
||||||
|
|
||||||
|
{{- if contains "NodePort" .Values.master.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 {{ template "redis.fullname" . }}-master)
|
||||||
|
redis-cli -h $NODE_IP -p $NODE_PORT {{- if .Values.usePassword }} -a $REDIS_PASSWORD{{ end }}
|
||||||
|
|
||||||
|
{{- else if contains "LoadBalancer" .Values.master.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 {{ template "redis.fullname" . }}'
|
||||||
|
|
||||||
|
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "redis.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||||
|
redis-cli -h $SERVICE_IP -p {{ .Values.master.service.port }} {{- if .Values.usePassword }} -a $REDIS_PASSWORD{{ end }}
|
||||||
|
|
||||||
|
{{- else if contains "ClusterIP" .Values.master.service.type }}
|
||||||
|
|
||||||
|
kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ template "redis.fullname" . }}-master {{ .Values.redisPort }}:{{ .Values.redisPort }} &
|
||||||
|
redis-cli -h 127.0.0.1 -p {{ .Values.redisPort }} {{- if .Values.usePassword }} -a $REDIS_PASSWORD{{ end }}
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{ include "redis.checkRollingTags" . }}
|
||||||
@@ -0,0 +1,355 @@
|
|||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.name" -}}
|
||||||
|
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Expand the chart plus release name (used by the chart label)
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.chart" -}}
|
||||||
|
{{- printf "%s-%s" .Chart.Name .Chart.Version -}}
|
||||||
|
{{- 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 "redis.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 -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for networkpolicy.
|
||||||
|
*/}}
|
||||||
|
{{- define "networkPolicy.apiVersion" -}}
|
||||||
|
{{- if semverCompare ">=1.4-0, <1.7-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
{{- print "extensions/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "networking.k8s.io/v1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiGroup for PodSecurityPolicy.
|
||||||
|
*/}}
|
||||||
|
{{- define "podSecurityPolicy.apiGroup" -}}
|
||||||
|
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
{{- print "policy" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "extensions" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the appropriate apiVersion for PodSecurityPolicy.
|
||||||
|
*/}}
|
||||||
|
{{- define "podSecurityPolicy.apiVersion" -}}
|
||||||
|
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
{{- print "policy/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "extensions/v1beta1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Redis image name
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.image" -}}
|
||||||
|
{{- $registryName := .Values.image.registry -}}
|
||||||
|
{{- $repositoryName := .Values.image.repository -}}
|
||||||
|
{{- $tag := .Values.image.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Redis Sentinel image name
|
||||||
|
*/}}
|
||||||
|
{{- define "sentinel.image" -}}
|
||||||
|
{{- $registryName := .Values.sentinel.image.registry -}}
|
||||||
|
{{- $repositoryName := .Values.sentinel.image.repository -}}
|
||||||
|
{{- $tag := .Values.sentinel.image.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper image name (for the metrics image)
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.metrics.image" -}}
|
||||||
|
{{- $registryName := .Values.metrics.image.registry -}}
|
||||||
|
{{- $repositoryName := .Values.metrics.image.repository -}}
|
||||||
|
{{- $tag := .Values.metrics.image.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper image name (for the init container volume-permissions image)
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.volumePermissions.image" -}}
|
||||||
|
{{- $registryName := .Values.volumePermissions.image.registry -}}
|
||||||
|
{{- $repositoryName := .Values.volumePermissions.image.repository -}}
|
||||||
|
{{- $tag := .Values.volumePermissions.image.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the name of the service account to use
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.serviceAccountName" -}}
|
||||||
|
{{- if .Values.serviceAccount.create -}}
|
||||||
|
{{ default (include "redis.fullname" .) .Values.serviceAccount.name }}
|
||||||
|
{{- else -}}
|
||||||
|
{{ default "default" .Values.serviceAccount.name }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the password secret.
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.secretName" -}}
|
||||||
|
{{- if .Values.existingSecret -}}
|
||||||
|
{{- printf "%s" .Values.existingSecret -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s" (include "redis.fullname" .) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the password key to be retrieved from Redis secret.
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.secretPasswordKey" -}}
|
||||||
|
{{- if and .Values.existingSecret .Values.existingSecretPasswordKey -}}
|
||||||
|
{{- printf "%s" .Values.existingSecretPasswordKey -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "redis-password" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return Redis password
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.password" -}}
|
||||||
|
{{- if not (empty .Values.global.redis.password) }}
|
||||||
|
{{- .Values.global.redis.password -}}
|
||||||
|
{{- else if not (empty .Values.password) -}}
|
||||||
|
{{- .Values.password -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- randAlphaNum 10 -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return sysctl image
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.sysctl.image" -}}
|
||||||
|
{{- $registryName := default "docker.io" .Values.sysctlImage.registry -}}
|
||||||
|
{{- $repositoryName := .Values.sysctlImage.repository -}}
|
||||||
|
{{- $tag := default "buster" .Values.sysctlImage.tag | toString -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can't use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imageRegistry }}
|
||||||
|
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Docker Image Registry Secret Names
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.imagePullSecrets" -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
|
||||||
|
Also, we can not use a single if because lazy evaluation is not an option
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global }}
|
||||||
|
{{- if .Values.global.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range .Values.global.imagePullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else if or .Values.image.pullSecrets .Values.metrics.image.pullSecrets .Values.sysctlImage.pullSecrets .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range .Values.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.metrics.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.sysctlImage.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else if or .Values.image.pullSecrets .Values.metrics.image.pullSecrets .Values.sysctlImage.pullSecrets .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- range .Values.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.metrics.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.sysctlImage.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range .Values.volumePermissions.image.pullSecrets }}
|
||||||
|
- name: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/* Check if there are rolling tags in the images */}}
|
||||||
|
{{- define "redis.checkRollingTags" -}}
|
||||||
|
{{- if and (contains "bitnami/" .Values.image.repository) (not (.Values.image.tag | toString | regexFind "-r\\d+$|sha256:")) }}
|
||||||
|
WARNING: Rolling tag detected ({{ .Values.image.repository }}:{{ .Values.image.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 }}
|
||||||
|
{{- if and (contains "bitnami/" .Values.sentinel.image.repository) (not (.Values.sentinel.image.tag | toString | regexFind "-r\\d+$|sha256:")) }}
|
||||||
|
WARNING: Rolling tag detected ({{ .Values.sentinel.image.repository }}:{{ .Values.sentinel.image.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 -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Storage Class for master
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.master.storageClass" -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global -}}
|
||||||
|
{{- if .Values.global.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.global.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.global.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- if .Values.master.persistence.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.master.persistence.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.master.persistence.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- if .Values.master.persistence.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.master.persistence.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.master.persistence.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Return the proper Storage Class for slave
|
||||||
|
*/}}
|
||||||
|
{{- define "redis.slave.storageClass" -}}
|
||||||
|
{{/*
|
||||||
|
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||||
|
but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
|
||||||
|
*/}}
|
||||||
|
{{- if .Values.global -}}
|
||||||
|
{{- if .Values.global.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.global.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.global.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- if .Values.slave.persistence.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.slave.persistence.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.slave.persistence.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- if .Values.slave.persistence.storageClass -}}
|
||||||
|
{{- if (eq "-" .Values.slave.persistence.storageClass) -}}
|
||||||
|
{{- printf "storageClassName: \"\"" -}}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "storageClassName: %s" .Values.slave.persistence.storageClass -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
data:
|
||||||
|
redis.conf: |-
|
||||||
|
{{- if .Values.configmap }}
|
||||||
|
# User-supplied configuration:
|
||||||
|
{{ tpl .Values.configmap . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
master.conf: |-
|
||||||
|
dir {{ .Values.master.persistence.path }}
|
||||||
|
{{- if .Values.master.configmap }}
|
||||||
|
# User-supplied master configuration:
|
||||||
|
{{ tpl .Values.master.configmap . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.disableCommands }}
|
||||||
|
{{- range .Values.master.disableCommands }}
|
||||||
|
rename-command {{ . }} ""
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
replica.conf: |-
|
||||||
|
dir {{ .Values.slave.persistence.path }}
|
||||||
|
slave-read-only yes
|
||||||
|
{{- if .Values.slave.configmap }}
|
||||||
|
# User-supplied slave configuration:
|
||||||
|
{{ tpl .Values.slave.configmap . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.disableCommands }}
|
||||||
|
{{- range .Values.slave.disableCommands }}
|
||||||
|
rename-command {{ . }} ""
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
sentinel.conf: |-
|
||||||
|
dir "/tmp"
|
||||||
|
bind 0.0.0.0
|
||||||
|
port {{ .Values.sentinel.port }}
|
||||||
|
sentinel monitor {{ .Values.sentinel.masterSet }} {{ template "redis.fullname" . }}-master-0.{{ template "redis.fullname" . }}-headless.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }} {{ .Values.redisPort }} {{ .Values.sentinel.quorum }}
|
||||||
|
sentinel down-after-milliseconds {{ .Values.sentinel.masterSet }} {{ .Values.sentinel.downAfterMilliseconds }}
|
||||||
|
sentinel failover-timeout {{ .Values.sentinel.masterSet }} {{ .Values.sentinel.failoverTimeout }}
|
||||||
|
sentinel parallel-syncs {{ .Values.sentinel.masterSet }} {{ .Values.sentinel.parallelSyncs }}
|
||||||
|
{{- if .Values.sentinel.configmap }}
|
||||||
|
# User-supplied sentinel configuration:
|
||||||
|
{{ tpl .Values.sentinel.configmap . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}-headless
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
clusterIP: None
|
||||||
|
ports:
|
||||||
|
- name: redis
|
||||||
|
port: {{ .Values.redisPort }}
|
||||||
|
targetPort: redis
|
||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
- name: redis-sentinel
|
||||||
|
port: {{ .Values.sentinel.port }}
|
||||||
|
targetPort: redis-sentinel
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
@@ -0,0 +1,155 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}-health
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
data:
|
||||||
|
ping_readiness_local.sh: |-
|
||||||
|
#!/bin/bash
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
password_aux=`cat ${REDIS_PASSWORD_FILE}`
|
||||||
|
export REDIS_PASSWORD=$password_aux
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
no_auth_warning=$([[ "$(redis-cli --version)" =~ (redis-cli 5.*) ]] && echo --no-auth-warning)
|
||||||
|
{{- end }}
|
||||||
|
response=$(
|
||||||
|
timeout -s 9 $1 \
|
||||||
|
redis-cli \
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
-a $REDIS_PASSWORD $no_auth_warning \
|
||||||
|
{{- end }}
|
||||||
|
-h localhost \
|
||||||
|
-p $REDIS_PORT \
|
||||||
|
ping
|
||||||
|
)
|
||||||
|
if [ "$response" != "PONG" ]; then
|
||||||
|
echo "$response"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
ping_liveness_local.sh: |-
|
||||||
|
#!/bin/bash
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
password_aux=`cat ${REDIS_PASSWORD_FILE}`
|
||||||
|
export REDIS_PASSWORD=$password_aux
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
no_auth_warning=$([[ "$(redis-cli --version)" =~ (redis-cli 5.*) ]] && echo --no-auth-warning)
|
||||||
|
{{- end }}
|
||||||
|
response=$(
|
||||||
|
timeout -s 9 $1 \
|
||||||
|
redis-cli \
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
-a $REDIS_PASSWORD $no_auth_warning \
|
||||||
|
{{- end }}
|
||||||
|
-h localhost \
|
||||||
|
-p $REDIS_PORT \
|
||||||
|
ping
|
||||||
|
)
|
||||||
|
if [ "$response" != "PONG" ] && [ "$response" != "LOADING Redis is loading the dataset in memory" ]; then
|
||||||
|
echo "$response"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
ping_sentinel.sh: |-
|
||||||
|
#!/bin/bash
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
password_aux=`cat ${REDIS_PASSWORD_FILE}`
|
||||||
|
export REDIS_PASSWORD=$password_aux
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
no_auth_warning=$([[ "$(redis-cli --version)" =~ (redis-cli 5.*) ]] && echo --no-auth-warning)
|
||||||
|
{{- end }}
|
||||||
|
response=$(
|
||||||
|
timeout -s 9 $1 \
|
||||||
|
redis-cli \
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
-a $REDIS_PASSWORD $no_auth_warning \
|
||||||
|
{{- end }}
|
||||||
|
-h localhost \
|
||||||
|
-p $REDIS_SENTINEL_PORT \
|
||||||
|
ping
|
||||||
|
)
|
||||||
|
if [ "$response" != "PONG" ]; then
|
||||||
|
echo "$response"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
parse_sentinels.awk: |-
|
||||||
|
/ip/ {FOUND_IP=1}
|
||||||
|
/port/ {FOUND_PORT=1}
|
||||||
|
/runid/ {FOUND_RUNID=1}
|
||||||
|
!/ip|port|runid/ {
|
||||||
|
if (FOUND_IP==1) {
|
||||||
|
IP=$1; FOUND_IP=0;
|
||||||
|
}
|
||||||
|
else if (FOUND_PORT==1) {
|
||||||
|
PORT=$1;
|
||||||
|
FOUND_PORT=0;
|
||||||
|
} else if (FOUND_RUNID==1) {
|
||||||
|
printf "\nsentinel known-sentinel {{ .Values.sentinel.masterSet }} %s %s %s", IP, PORT, $0; FOUND_RUNID=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{- end }}
|
||||||
|
ping_readiness_master.sh: |-
|
||||||
|
#!/bin/bash
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
password_aux=`cat ${REDIS_MASTER_PASSWORD_FILE}`
|
||||||
|
export REDIS_MASTER_PASSWORD=$password_aux
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
no_auth_warning=$([[ "$(redis-cli --version)" =~ (redis-cli 5.*) ]] && echo --no-auth-warning)
|
||||||
|
{{- end }}
|
||||||
|
response=$(
|
||||||
|
timeout -s 9 $1 \
|
||||||
|
redis-cli \
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
-a $REDIS_MASTER_PASSWORD $no_auth_warning \
|
||||||
|
{{- end }}
|
||||||
|
-h $REDIS_MASTER_HOST \
|
||||||
|
-p $REDIS_MASTER_PORT_NUMBER \
|
||||||
|
ping
|
||||||
|
)
|
||||||
|
if [ "$response" != "PONG" ]; then
|
||||||
|
echo "$response"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
ping_liveness_master.sh: |-
|
||||||
|
#!/bin/bash
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
password_aux=`cat ${REDIS_MASTER_PASSWORD_FILE}`
|
||||||
|
export REDIS_MASTER_PASSWORD=$password_aux
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
no_auth_warning=$([[ "$(redis-cli --version)" =~ (redis-cli 5.*) ]] && echo --no-auth-warning)
|
||||||
|
{{- end }}
|
||||||
|
response=$(
|
||||||
|
timeout -s 9 $1 \
|
||||||
|
redis-cli \
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
-a $REDIS_MASTER_PASSWORD $no_auth_warning \
|
||||||
|
{{- end }}
|
||||||
|
-h $REDIS_MASTER_HOST \
|
||||||
|
-p $REDIS_MASTER_PORT_NUMBER \
|
||||||
|
ping
|
||||||
|
)
|
||||||
|
if [ "$response" != "PONG" ] && [ "$response" != "LOADING Redis is loading the dataset in memory" ]; then
|
||||||
|
echo "$response"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
ping_readiness_local_and_master.sh: |-
|
||||||
|
script_dir="$(dirname "$0")"
|
||||||
|
exit_status=0
|
||||||
|
"$script_dir/ping_readiness_local.sh" $1 || exit_status=$?
|
||||||
|
"$script_dir/ping_readiness_master.sh" $1 || exit_status=$?
|
||||||
|
exit $exit_status
|
||||||
|
ping_liveness_local_and_master.sh: |-
|
||||||
|
script_dir="$(dirname "$0")"
|
||||||
|
exit_status=0
|
||||||
|
"$script_dir/ping_liveness_local.sh" $1 || exit_status=$?
|
||||||
|
"$script_dir/ping_liveness_master.sh" $1 || exit_status=$?
|
||||||
|
exit $exit_status
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
{{- if and (.Values.metrics.enabled) (.Values.metrics.serviceMonitor.enabled) }}
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: ServiceMonitor
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
{{- if .Values.metrics.serviceMonitor.namespace }}
|
||||||
|
namespace: {{ .Values.metrics.serviceMonitor.namespace }}
|
||||||
|
{{- else }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
{{- range $key, $value := .Values.metrics.serviceMonitor.selector }}
|
||||||
|
{{ $key }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
endpoints:
|
||||||
|
- port: metrics
|
||||||
|
{{- if .Values.metrics.serviceMonitor.interval }}
|
||||||
|
interval: {{ .Values.metrics.serviceMonitor.interval }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
namespaceSelector:
|
||||||
|
matchNames:
|
||||||
|
- {{ .Release.Namespace }}
|
||||||
|
{{- end -}}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}-metrics
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
{{- if .Values.metrics.service.labels -}}
|
||||||
|
{{ toYaml .Values.metrics.service.labels | nindent 4 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if .Values.metrics.service.annotations }}
|
||||||
|
annotations: {{ toYaml .Values.metrics.service.annotations | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.metrics.service.type }}
|
||||||
|
{{ if eq .Values.metrics.service.type "LoadBalancer" -}} {{ if .Values.metrics.service.loadBalancerIP }}
|
||||||
|
loadBalancerIP: {{ .Values.metrics.service.loadBalancerIP }}
|
||||||
|
{{ end -}}
|
||||||
|
{{- end -}}
|
||||||
|
ports:
|
||||||
|
- name: metrics
|
||||||
|
port: 9121
|
||||||
|
targetPort: metrics
|
||||||
|
selector:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
{{- if .Values.networkPolicy.enabled }}
|
||||||
|
kind: NetworkPolicy
|
||||||
|
apiVersion: {{ template "networkPolicy.apiVersion" . }}
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
spec:
|
||||||
|
podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
{{- if .Values.cluster.enabled }}
|
||||||
|
policyTypes:
|
||||||
|
- Ingress
|
||||||
|
- Egress
|
||||||
|
egress:
|
||||||
|
# Allow dns resolution
|
||||||
|
- ports:
|
||||||
|
- port: 53
|
||||||
|
protocol: UDP
|
||||||
|
# Allow outbound connections to other cluster pods
|
||||||
|
- ports:
|
||||||
|
- port: {{ .Values.redisPort }}
|
||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
- port: {{ .Values.sentinel.port }}
|
||||||
|
{{- end }}
|
||||||
|
to:
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
|
ingress:
|
||||||
|
# Allow inbound connections
|
||||||
|
- ports:
|
||||||
|
- port: {{ .Values.redisPort }}
|
||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
- port: {{ .Values.sentinel.port }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if not .Values.networkPolicy.allowExternal }}
|
||||||
|
from:
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
{{ template "redis.fullname" . }}-client: "true"
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
{{- if .Values.networkPolicy.ingressNSMatchLabels }}
|
||||||
|
- namespaceSelector:
|
||||||
|
matchLabels:
|
||||||
|
{{- range $key, $value := .Values.networkPolicy.ingressNSMatchLabels }}
|
||||||
|
{{ $key | quote }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.networkPolicy.ingressNSPodMatchLabels }}
|
||||||
|
podSelector:
|
||||||
|
matchLabels:
|
||||||
|
{{- range $key, $value := .Values.networkPolicy.ingressNSPodMatchLabels }}
|
||||||
|
{{ $key | quote }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
# Allow prometheus scrapes for metrics
|
||||||
|
- ports:
|
||||||
|
- port: 9121
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }}
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: PrometheusRule
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
{{- if .Values.metrics.prometheusRule.namespace }}
|
||||||
|
namespace: {{ .Values.metrics.prometheusRule.namespace }}
|
||||||
|
{{- else }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name | quote }}
|
||||||
|
heritage: {{ .Release.Service | quote }}
|
||||||
|
{{- with .Values.metrics.prometheusRule.additionalLabels }}
|
||||||
|
{{ toYaml . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.metrics.prometheusRule.rules }}
|
||||||
|
groups:
|
||||||
|
- name: {{ template "redis.name" $ }}
|
||||||
|
rules: {{ tpl (toYaml .) $ | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{{- if .Values.podSecurityPolicy.create }}
|
||||||
|
apiVersion: {{ template "podSecurityPolicy.apiVersion" . }}
|
||||||
|
kind: PodSecurityPolicy
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
spec:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
fsGroup:
|
||||||
|
rule: 'MustRunAs'
|
||||||
|
ranges:
|
||||||
|
- min: {{ .Values.securityContext.fsGroup }}
|
||||||
|
max: {{ .Values.securityContext.fsGroup }}
|
||||||
|
hostIPC: false
|
||||||
|
hostNetwork: false
|
||||||
|
hostPID: false
|
||||||
|
privileged: false
|
||||||
|
readOnlyRootFilesystem: false
|
||||||
|
requiredDropCapabilities:
|
||||||
|
- ALL
|
||||||
|
runAsUser:
|
||||||
|
rule: 'MustRunAs'
|
||||||
|
ranges:
|
||||||
|
- min: {{ .Values.securityContext.runAsUser }}
|
||||||
|
max: {{ .Values.securityContext.runAsUser }}
|
||||||
|
seLinux:
|
||||||
|
rule: 'RunAsAny'
|
||||||
|
supplementalGroups:
|
||||||
|
rule: 'MustRunAs'
|
||||||
|
ranges:
|
||||||
|
- min: {{ .Values.securityContext.runAsUser }}
|
||||||
|
max: {{ .Values.securityContext.runAsUser }}
|
||||||
|
volumes:
|
||||||
|
- 'configMap'
|
||||||
|
- 'secret'
|
||||||
|
- 'emptyDir'
|
||||||
|
- 'persistentVolumeClaim'
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,420 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}-master
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
role: master
|
||||||
|
serviceName: {{ template "redis.fullname" . }}-headless
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
role: master
|
||||||
|
{{- if .Values.master.podLabels }}
|
||||||
|
{{ toYaml .Values.master.podLabels | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.podLabels }}
|
||||||
|
{{ toYaml .Values.metrics.podLabels | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
checksum/health: {{ include (print $.Template.BasePath "/health-configmap.yaml") . | sha256sum }}
|
||||||
|
checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
|
||||||
|
checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
|
||||||
|
{{- if .Values.master.podAnnotations }}
|
||||||
|
{{ toYaml .Values.master.podAnnotations | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.podAnnotations }}
|
||||||
|
{{ toYaml .Values.metrics.podAnnotations | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- include "redis.imagePullSecrets" . | indent 6 }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
fsGroup: {{ .Values.securityContext.fsGroup }}
|
||||||
|
{{- if .Values.securityContext.sysctls }}
|
||||||
|
sysctls:
|
||||||
|
{{ toYaml .Values.securityContext.sysctls | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: "{{ template "redis.serviceAccountName" . }}"
|
||||||
|
{{- if .Values.master.priorityClassName }}
|
||||||
|
priorityClassName: "{{ .Values.master.priorityClassName }}"
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.master.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{ tpl (toYaml .) $ | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{ toYaml .Values.master.nodeSelector | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{ toYaml .Values.master.tolerations | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.schedulerName }}
|
||||||
|
schedulerName: "{{ .Values.master.schedulerName }}"
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: {{ template "redis.name" . }}
|
||||||
|
image: "{{ template "redis.image" . }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
{{- if (eq (.Values.securityContext.runAsUser | int) 0) }}
|
||||||
|
useradd redis
|
||||||
|
chown -R redis {{ .Values.master.persistence.path }}
|
||||||
|
{{- end }}
|
||||||
|
if [[ -n $REDIS_PASSWORD_FILE ]]; then
|
||||||
|
password_aux=`cat ${REDIS_PASSWORD_FILE}`
|
||||||
|
export REDIS_PASSWORD=$password_aux
|
||||||
|
fi
|
||||||
|
if [[ ! -f /opt/bitnami/redis/etc/master.conf ]];then
|
||||||
|
cp /opt/bitnami/redis/mounted-etc/master.conf /opt/bitnami/redis/etc/master.conf
|
||||||
|
fi
|
||||||
|
if [[ ! -f /opt/bitnami/redis/etc/redis.conf ]];then
|
||||||
|
cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf
|
||||||
|
fi
|
||||||
|
ARGS=("--port" "${REDIS_PORT}")
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
ARGS+=("--requirepass" "${REDIS_PASSWORD}")
|
||||||
|
ARGS+=("--masterauth" "${REDIS_PASSWORD}")
|
||||||
|
{{- else }}
|
||||||
|
ARGS+=("--protected-mode" "no")
|
||||||
|
{{- end }}
|
||||||
|
ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf")
|
||||||
|
ARGS+=("--include" "/opt/bitnami/redis/etc/master.conf")
|
||||||
|
{{- if .Values.master.extraFlags }}
|
||||||
|
{{- range .Values.master.extraFlags }}
|
||||||
|
ARGS+=({{ . | quote }})
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.command }}
|
||||||
|
{{ .Values.master.command }} ${ARGS[@]}
|
||||||
|
{{- else }}
|
||||||
|
redis-server "${ARGS[@]}"
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
- name: REDIS_REPLICATION_MODE
|
||||||
|
value: master
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: REDIS_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/redis/secrets/redis-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: REDIS_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "redis.secretName" . }}
|
||||||
|
key: {{ template "redis.secretPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
- name: ALLOW_EMPTY_PASSWORD
|
||||||
|
value: "yes"
|
||||||
|
{{- end }}
|
||||||
|
- name: REDIS_PORT
|
||||||
|
value: {{ .Values.redisPort | quote }}
|
||||||
|
ports:
|
||||||
|
- name: redis
|
||||||
|
containerPort: {{ .Values.redisPort }}
|
||||||
|
{{- if .Values.master.livenessProbe.enabled }}
|
||||||
|
livenessProbe:
|
||||||
|
initialDelaySeconds: {{ .Values.master.livenessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.master.livenessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.master.livenessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.master.livenessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.master.livenessProbe.failureThreshold }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- /health/ping_liveness_local.sh {{ .Values.master.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.master.readinessProbe.enabled}}
|
||||||
|
readinessProbe:
|
||||||
|
initialDelaySeconds: {{ .Values.master.readinessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.master.readinessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.master.readinessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.master.readinessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.master.readinessProbe.failureThreshold }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- /health/ping_readiness_local.sh {{ .Values.master.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.master.resources | indent 10 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: health
|
||||||
|
mountPath: /health
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: redis-password
|
||||||
|
mountPath: /opt/bitnami/redis/secrets/
|
||||||
|
{{- end }}
|
||||||
|
- name: redis-data
|
||||||
|
mountPath: {{ .Values.master.persistence.path }}
|
||||||
|
subPath: {{ .Values.master.persistence.subPath }}
|
||||||
|
- name: config
|
||||||
|
mountPath: /opt/bitnami/redis/mounted-etc
|
||||||
|
- name: redis-tmp-conf
|
||||||
|
mountPath: /opt/bitnami/redis/etc/
|
||||||
|
{{- if and .Values.cluster.enabled .Values.sentinel.enabled }}
|
||||||
|
- name: sentinel
|
||||||
|
image: "{{ template "sentinel.image" . }}"
|
||||||
|
imagePullPolicy: {{ .Values.sentinel.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
if [[ -n $REDIS_PASSWORD_FILE ]]; then
|
||||||
|
password_aux=`cat ${REDIS_PASSWORD_FILE}`
|
||||||
|
export REDIS_PASSWORD=$password_aux
|
||||||
|
fi
|
||||||
|
if [[ ! -f /opt/bitnami/redis-sentinel/etc/sentinel.conf ]];then
|
||||||
|
cp /opt/bitnami/redis-sentinel/mounted-etc/sentinel.conf /opt/bitnami/redis-sentinel/etc/sentinel.conf
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
printf "\nsentinel auth-pass {{ .Values.sentinel.masterSet }} $REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf
|
||||||
|
{{- if .Values.sentinel.usePassword }}
|
||||||
|
printf "\nrequirepass $REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.sentinel.staticID }}
|
||||||
|
printf "\nsentinel myid $(echo $HOSTNAME | openssl sha1 | awk '{ print $2 }')" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf
|
||||||
|
{{- end }}
|
||||||
|
fi
|
||||||
|
echo "Getting information about current running sentinels"
|
||||||
|
# Get information from existing sentinels
|
||||||
|
existing_sentinels=$(timeout -s 9 {{ .Values.sentinel.initialCheckTimeout }} redis-cli --raw -h {{ template "redis.fullname" . }} -a "$REDIS_PASSWORD" -p {{ .Values.sentinel.service.sentinelPort }} SENTINEL sentinels {{ .Values.sentinel.masterSet }})
|
||||||
|
echo "$existing_sentinels" | awk -f /health/parse_sentinels.awk | tee -a /opt/bitnami/redis-sentinel/etc/sentinel.conf
|
||||||
|
|
||||||
|
redis-server /opt/bitnami/redis-sentinel/etc/sentinel.conf --sentinel
|
||||||
|
env:
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: REDIS_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/redis/secrets/redis-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: REDIS_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "redis.secretName" . }}
|
||||||
|
key: {{ template "redis.secretPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
- name: ALLOW_EMPTY_PASSWORD
|
||||||
|
value: "yes"
|
||||||
|
{{- end }}
|
||||||
|
- name: REDIS_SENTINEL_PORT
|
||||||
|
value: {{ .Values.sentinel.port | quote }}
|
||||||
|
ports:
|
||||||
|
- name: redis-sentinel
|
||||||
|
containerPort: {{ .Values.sentinel.port }}
|
||||||
|
{{- if .Values.sentinel.livenessProbe.enabled }}
|
||||||
|
livenessProbe:
|
||||||
|
initialDelaySeconds: {{ .Values.sentinel.livenessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.sentinel.livenessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.sentinel.livenessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.sentinel.livenessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.sentinel.livenessProbe.failureThreshold }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- /health/ping_sentinel.sh {{ .Values.sentinel.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.sentinel.readinessProbe.enabled}}
|
||||||
|
readinessProbe:
|
||||||
|
initialDelaySeconds: {{ .Values.sentinel.readinessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.sentinel.readinessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.sentinel.readinessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.sentinel.readinessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.sentinel.readinessProbe.failureThreshold }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- /health/ping_sentinel.sh {{ .Values.sentinel.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.sentinel.resources | indent 10 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: health
|
||||||
|
mountPath: /health
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: redis-password
|
||||||
|
mountPath: /opt/bitnami/redis/secrets/
|
||||||
|
{{- end }}
|
||||||
|
- name: redis-data
|
||||||
|
mountPath: {{ .Values.master.persistence.path }}
|
||||||
|
subPath: {{ .Values.master.persistence.subPath }}
|
||||||
|
- name: config
|
||||||
|
mountPath: /opt/bitnami/redis-sentinel/mounted-etc
|
||||||
|
- name: sentinel-tmp-conf
|
||||||
|
mountPath: /opt/bitnami/redis-sentinel/etc/
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
- name: metrics
|
||||||
|
image: {{ template "redis.metrics.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
|
||||||
|
command:
|
||||||
|
- /bin/bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
if [[ -f '/secrets/redis-password' ]]; then
|
||||||
|
export REDIS_PASSWORD=$(cat /secrets/redis-password)
|
||||||
|
fi
|
||||||
|
redis_exporter{{- range $key, $value := .Values.metrics.extraArgs }} --{{ $key }}={{ $value }}{{- end }}
|
||||||
|
env:
|
||||||
|
- name: REDIS_ALIAS
|
||||||
|
value: {{ template "redis.fullname" . }}
|
||||||
|
{{- if and .Values.usePassword (not .Values.usePasswordFile) }}
|
||||||
|
- name: REDIS_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "redis.secretName" . }}
|
||||||
|
key: {{ template "redis.secretPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: redis-password
|
||||||
|
mountPath: /secrets/
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: metrics
|
||||||
|
containerPort: 9121
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.metrics.resources | indent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- $needsVolumePermissions := and .Values.volumePermissions.enabled (and ( and .Values.master.persistence.enabled (not .Values.persistence.existingClaim) ) .Values.securityContext.enabled) }}
|
||||||
|
{{- if or $needsVolumePermissions .Values.sysctlImage.enabled }}
|
||||||
|
initContainers:
|
||||||
|
{{- if $needsVolumePermissions }}
|
||||||
|
- name: volume-permissions
|
||||||
|
image: "{{ template "redis.volumePermissions.image" . }}"
|
||||||
|
imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
|
||||||
|
command: ["/bin/chown", "-R", "{{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.fsGroup }}", "{{ .Values.master.persistence.path }}"]
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 0
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.volumePermissions.resources | indent 10 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: redis-data
|
||||||
|
mountPath: {{ .Values.master.persistence.path }}
|
||||||
|
subPath: {{ .Values.master.persistence.subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.sysctlImage.enabled }}
|
||||||
|
- name: init-sysctl
|
||||||
|
image: {{ template "redis.sysctl.image" . }}
|
||||||
|
imagePullPolicy: {{ default "" .Values.sysctlImage.pullPolicy | quote }}
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.sysctlImage.resources | indent 10 }}
|
||||||
|
{{- if .Values.sysctlImage.mountHostSys }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: host-sys
|
||||||
|
mountPath: /host-sys
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
{{ toYaml .Values.sysctlImage.command | indent 10 }}
|
||||||
|
securityContext:
|
||||||
|
privileged: true
|
||||||
|
runAsUser: 0
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
volumes:
|
||||||
|
- name: health
|
||||||
|
configMap:
|
||||||
|
name: {{ template "redis.fullname" . }}-health
|
||||||
|
defaultMode: 0755
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: redis-password
|
||||||
|
secret:
|
||||||
|
secretName: {{ template "redis.secretName" . }}
|
||||||
|
items:
|
||||||
|
- key: {{ template "redis.secretPasswordKey" . }}
|
||||||
|
path: redis-password
|
||||||
|
{{- end }}
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
{{- if not .Values.master.persistence.enabled }}
|
||||||
|
- name: "redis-data"
|
||||||
|
emptyDir: {}
|
||||||
|
{{- else }}
|
||||||
|
{{- if .Values.persistence.existingClaim }}
|
||||||
|
- name: "redis-data"
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ .Values.persistence.existingClaim }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.sysctlImage.mountHostSys }}
|
||||||
|
- name: host-sys
|
||||||
|
hostPath:
|
||||||
|
path: /sys
|
||||||
|
{{- end }}
|
||||||
|
- name: redis-tmp-conf
|
||||||
|
emptyDir: {}
|
||||||
|
{{- if and .Values.cluster.enabled .Values.sentinel.enabled }}
|
||||||
|
- name: sentinel-tmp-conf
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.master.persistence.enabled (not .Values.persistence.existingClaim) }}
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: redis-data
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
component: master
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
{{- range .Values.master.persistence.accessModes }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.master.persistence.size | quote }}
|
||||||
|
{{ include "redis.master.storageClass" . }}
|
||||||
|
selector:
|
||||||
|
{{- if .Values.master.persistence.matchLabels }}
|
||||||
|
matchLabels:
|
||||||
|
{{ toYaml .Values.master.persistence.matchLabels | indent 12 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if .Values.master.persistence.matchExpressions }}
|
||||||
|
matchExpressions:
|
||||||
|
{{ toYaml .Values.master.persistence.matchExpressions | indent 12 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
updateStrategy:
|
||||||
|
type: {{ .Values.master.statefulset.updateStrategy }}
|
||||||
|
{{- if .Values.master.statefulset.rollingUpdatePartition }}
|
||||||
|
{{- if (eq "Recreate" .Values.master.statefulset.updateStrategy) }}
|
||||||
|
rollingUpdate: null
|
||||||
|
{{- else }}
|
||||||
|
rollingUpdate:
|
||||||
|
partition: {{ .Values.master.statefulset.rollingUpdatePartition }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{{- if not .Values.sentinel.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}-master
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
{{- if .Values.master.service.labels -}}
|
||||||
|
{{ toYaml .Values.master.service.labels | nindent 4 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if .Values.master.service.annotations }}
|
||||||
|
annotations: {{ toYaml .Values.master.service.annotations | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.master.service.type }}
|
||||||
|
{{- if and (eq .Values.master.service.type "LoadBalancer") .Values.master.service.loadBalancerIP }}
|
||||||
|
loadBalancerIP: {{ .Values.master.service.loadBalancerIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq .Values.master.service.type "LoadBalancer") .Values.master.service.loadBalancerSourceRanges }}
|
||||||
|
loadBalancerSourceRanges:
|
||||||
|
{{- with .Values.master.service.loadBalancerSourceRanges }}
|
||||||
|
{{ toYaml . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: redis
|
||||||
|
port: {{ .Values.master.service.port }}
|
||||||
|
targetPort: redis
|
||||||
|
{{- if .Values.master.service.nodePort }}
|
||||||
|
nodePort: {{ .Values.master.service.nodePort }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
role: master
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{{- if .Values.rbac.create -}}
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: Role
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
rules:
|
||||||
|
{{- if .Values.podSecurityPolicy.create }}
|
||||||
|
- apiGroups: ['{{ template "podSecurityPolicy.apiGroup" . }}']
|
||||||
|
resources: ['podsecuritypolicies']
|
||||||
|
verbs: ['use']
|
||||||
|
resourceNames: [{{ template "redis.fullname" . }}]
|
||||||
|
{{- end -}}
|
||||||
|
{{- if .Values.rbac.role.rules }}
|
||||||
|
{{ toYaml .Values.rbac.role.rules | indent 2 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
{{- if .Values.rbac.create -}}
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: RoleBinding
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: Role
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: {{ template "redis.serviceAccountName" . }}
|
||||||
|
{{- end -}}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{{- if .Values.serviceAccount.create -}}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.serviceAccountName" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
{{- end -}}
|
||||||
@@ -0,0 +1,438 @@
|
|||||||
|
{{- if .Values.cluster.enabled }}
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}-slave
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
spec:
|
||||||
|
{{- if .Values.slave.updateStrategy }}
|
||||||
|
strategy:
|
||||||
|
{{ toYaml .Values.slave.updateStrategy | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
replicas: {{ .Values.cluster.slaveCount }}
|
||||||
|
serviceName: {{ template "redis.fullname" . }}-headless
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
role: slave
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
role: slave
|
||||||
|
{{- if .Values.slave.podLabels }}
|
||||||
|
{{ toYaml .Values.slave.podLabels | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.podLabels }}
|
||||||
|
{{ toYaml .Values.metrics.podLabels | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
annotations:
|
||||||
|
checksum/health: {{ include (print $.Template.BasePath "/health-configmap.yaml") . | sha256sum }}
|
||||||
|
checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
|
||||||
|
checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
|
||||||
|
{{- if .Values.slave.podAnnotations }}
|
||||||
|
{{ toYaml .Values.slave.podAnnotations | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.metrics.enabled .Values.metrics.podAnnotations }}
|
||||||
|
{{ toYaml .Values.metrics.podAnnotations | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- include "redis.imagePullSecrets" . | indent 6 }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
fsGroup: {{ .Values.securityContext.fsGroup }}
|
||||||
|
{{- if .Values.securityContext.sysctls }}
|
||||||
|
sysctls:
|
||||||
|
{{ toYaml .Values.securityContext.sysctls | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: "{{ template "redis.serviceAccountName" . }}"
|
||||||
|
{{- if .Values.slave.priorityClassName }}
|
||||||
|
priorityClassName: "{{ .Values.slave.priorityClassName }}"
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{ toYaml .Values.slave.nodeSelector | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{ toYaml .Values.slave.tolerations | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.schedulerName }}
|
||||||
|
schedulerName: "{{ .Values.slave.schedulerName }}"
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.slave.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{ tpl (toYaml .) $ | indent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: {{ template "redis.name" . }}
|
||||||
|
image: {{ template "redis.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
{{- if (eq (.Values.securityContext.runAsUser | int) 0) }}
|
||||||
|
useradd redis
|
||||||
|
chown -R redis {{ .Values.slave.persistence.path }}
|
||||||
|
{{- end }}
|
||||||
|
if [[ -n $REDIS_PASSWORD_FILE ]]; then
|
||||||
|
password_aux=`cat ${REDIS_PASSWORD_FILE}`
|
||||||
|
export REDIS_PASSWORD=$password_aux
|
||||||
|
fi
|
||||||
|
if [[ -n $REDIS_MASTER_PASSWORD_FILE ]]; then
|
||||||
|
password_aux=`cat ${REDIS_MASTER_PASSWORD_FILE}`
|
||||||
|
export REDIS_MASTER_PASSWORD=$password_aux
|
||||||
|
fi
|
||||||
|
if [[ ! -f /opt/bitnami/redis/etc/replica.conf ]];then
|
||||||
|
cp /opt/bitnami/redis/mounted-etc/replica.conf /opt/bitnami/redis/etc/replica.conf
|
||||||
|
fi
|
||||||
|
if [[ ! -f /opt/bitnami/redis/etc/redis.conf ]];then
|
||||||
|
cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf
|
||||||
|
fi
|
||||||
|
ARGS=("--port" "${REDIS_PORT}")
|
||||||
|
ARGS+=("--slaveof" "${REDIS_MASTER_HOST}" "${REDIS_MASTER_PORT_NUMBER}")
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
ARGS+=("--requirepass" "${REDIS_PASSWORD}")
|
||||||
|
ARGS+=("--masterauth" "${REDIS_MASTER_PASSWORD}")
|
||||||
|
{{- else }}
|
||||||
|
ARGS+=("--protected-mode" "no")
|
||||||
|
{{- end }}
|
||||||
|
ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf")
|
||||||
|
ARGS+=("--include" "/opt/bitnami/redis/etc/replica.conf")
|
||||||
|
{{- if .Values.slave.extraFlags }}
|
||||||
|
{{- range .Values.slave.extraFlags }}
|
||||||
|
ARGS+=({{ . | quote }})
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.slave.command }}
|
||||||
|
{{ .Values.slave.command }} "${ARGS[@]}"
|
||||||
|
{{- else }}
|
||||||
|
redis-server "${ARGS[@]}"
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
- name: REDIS_REPLICATION_MODE
|
||||||
|
value: slave
|
||||||
|
- name: REDIS_MASTER_HOST
|
||||||
|
value: {{ template "redis.fullname" . }}-master-0.{{ template "redis.fullname" . }}-headless.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}
|
||||||
|
- name: REDIS_PORT
|
||||||
|
value: {{ .Values.redisPort | quote }}
|
||||||
|
- name: REDIS_MASTER_PORT_NUMBER
|
||||||
|
value: {{ .Values.redisPort | quote }}
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: REDIS_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/redis/secrets/redis-password"
|
||||||
|
- name: REDIS_MASTER_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/redis/secrets/redis-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: REDIS_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "redis.secretName" . }}
|
||||||
|
key: {{ template "redis.secretPasswordKey" . }}
|
||||||
|
- name: REDIS_MASTER_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "redis.secretName" . }}
|
||||||
|
key: {{ template "redis.secretPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
- name: ALLOW_EMPTY_PASSWORD
|
||||||
|
value: "yes"
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: redis
|
||||||
|
containerPort: {{ .Values.redisPort }}
|
||||||
|
{{- if .Values.slave.livenessProbe.enabled }}
|
||||||
|
livenessProbe:
|
||||||
|
initialDelaySeconds: {{ .Values.slave.livenessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.slave.livenessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.slave.livenessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.slave.livenessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.slave.livenessProbe.failureThreshold}}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
- /health/ping_liveness_local.sh {{ .Values.slave.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- else }}
|
||||||
|
- /health/ping_liveness_local_and_master.sh {{ .Values.slave.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Values.slave.readinessProbe.enabled }}
|
||||||
|
readinessProbe:
|
||||||
|
initialDelaySeconds: {{ .Values.slave.readinessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.slave.readinessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.slave.readinessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.slave.readinessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.slave.readinessProbe.failureThreshold }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
- /health/ping_readiness_local.sh {{ .Values.slave.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- else }}
|
||||||
|
- /health/ping_readiness_local_and_master.sh {{ .Values.slave.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.slave.resources | indent 10 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: health
|
||||||
|
mountPath: /health
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: redis-password
|
||||||
|
mountPath: /opt/bitnami/redis/secrets/
|
||||||
|
{{- end }}
|
||||||
|
- name: redis-data
|
||||||
|
mountPath: /data
|
||||||
|
- name: config
|
||||||
|
mountPath: /opt/bitnami/redis/mounted-etc
|
||||||
|
- name: redis-tmp-conf
|
||||||
|
mountPath: /opt/bitnami/redis/etc
|
||||||
|
{{- if and .Values.cluster.enabled .Values.sentinel.enabled }}
|
||||||
|
- name: sentinel
|
||||||
|
image: "{{ template "sentinel.image" . }}"
|
||||||
|
imagePullPolicy: {{ .Values.sentinel.image.pullPolicy | quote }}
|
||||||
|
{{- if .Values.securityContext.enabled }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
if [[ -n $REDIS_PASSWORD_FILE ]]; then
|
||||||
|
password_aux=`cat ${REDIS_PASSWORD_FILE}`
|
||||||
|
export REDIS_PASSWORD=$password_aux
|
||||||
|
fi
|
||||||
|
if [[ ! -f /opt/bitnami/redis-sentinel/etc/sentinel.conf ]];then
|
||||||
|
cp /opt/bitnami/redis-sentinel/mounted-etc/sentinel.conf /opt/bitnami/redis-sentinel/etc/sentinel.conf
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
printf "\nsentinel auth-pass {{ .Values.sentinel.masterSet }} $REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf
|
||||||
|
{{- if .Values.sentinel.usePassword }}
|
||||||
|
printf "\nrequirepass $REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.sentinel.staticID }}
|
||||||
|
printf "\nsentinel myid $(echo $HOSTNAME | openssl sha1 | awk '{ print $2 }')" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf
|
||||||
|
{{- end }}
|
||||||
|
fi
|
||||||
|
|
||||||
|
redis-server /opt/bitnami/redis-sentinel/etc/sentinel.conf --sentinel
|
||||||
|
env:
|
||||||
|
{{- if .Values.usePassword }}
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: REDIS_PASSWORD_FILE
|
||||||
|
value: "/opt/bitnami/redis/secrets/redis-password"
|
||||||
|
{{- else }}
|
||||||
|
- name: REDIS_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "redis.secretName" . }}
|
||||||
|
key: {{ template "redis.secretPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
- name: ALLOW_EMPTY_PASSWORD
|
||||||
|
value: "yes"
|
||||||
|
{{- end }}
|
||||||
|
- name: REDIS_SENTINEL_PORT
|
||||||
|
value: {{ .Values.sentinel.port | quote }}
|
||||||
|
ports:
|
||||||
|
- name: redis-sentinel
|
||||||
|
containerPort: {{ .Values.sentinel.port }}
|
||||||
|
{{- if .Values.sentinel.livenessProbe.enabled }}
|
||||||
|
livenessProbe:
|
||||||
|
initialDelaySeconds: {{ .Values.sentinel.livenessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.sentinel.livenessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.sentinel.livenessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.sentinel.livenessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.sentinel.livenessProbe.failureThreshold }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- /health/ping_sentinel.sh {{ .Values.sentinel.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.sentinel.readinessProbe.enabled}}
|
||||||
|
readinessProbe:
|
||||||
|
initialDelaySeconds: {{ .Values.sentinel.readinessProbe.initialDelaySeconds }}
|
||||||
|
periodSeconds: {{ .Values.sentinel.readinessProbe.periodSeconds }}
|
||||||
|
timeoutSeconds: {{ .Values.sentinel.readinessProbe.timeoutSeconds }}
|
||||||
|
successThreshold: {{ .Values.sentinel.readinessProbe.successThreshold }}
|
||||||
|
failureThreshold: {{ .Values.sentinel.readinessProbe.failureThreshold }}
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- /health/ping_sentinel.sh {{ .Values.sentinel.livenessProbe.timeoutSeconds }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.sentinel.resources | indent 10 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: health
|
||||||
|
mountPath: /health
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: redis-password
|
||||||
|
mountPath: /opt/bitnami/redis/secrets/
|
||||||
|
{{- end }}
|
||||||
|
- name: redis-data
|
||||||
|
mountPath: {{ .Values.master.persistence.path }}
|
||||||
|
subPath: {{ .Values.master.persistence.subPath }}
|
||||||
|
- name: config
|
||||||
|
mountPath: /opt/bitnami/redis-sentinel/mounted-etc
|
||||||
|
- name: sentinel-tmp-conf
|
||||||
|
mountPath: /opt/bitnami/redis-sentinel/etc
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.metrics.enabled }}
|
||||||
|
- name: metrics
|
||||||
|
image: {{ template "redis.metrics.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
|
||||||
|
command:
|
||||||
|
- /bin/bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
if [[ -f '/secrets/redis-password' ]]; then
|
||||||
|
export REDIS_PASSWORD=$(cat /secrets/redis-password)
|
||||||
|
fi
|
||||||
|
redis_exporter{{- range $key, $value := .Values.metrics.extraArgs }} --{{ $key }}={{ $value }}{{- end }}
|
||||||
|
env:
|
||||||
|
- name: REDIS_ALIAS
|
||||||
|
value: {{ template "redis.fullname" . }}
|
||||||
|
{{- if and .Values.usePassword (not .Values.usePasswordFile) }}
|
||||||
|
- name: REDIS_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ template "redis.secretName" . }}
|
||||||
|
key: {{ template "redis.secretPasswordKey" . }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: redis-password
|
||||||
|
mountPath: /secrets/
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: metrics
|
||||||
|
containerPort: 9121
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.metrics.resources | indent 10 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- $needsVolumePermissions := and .Values.volumePermissions.enabled (and .Values.slave.persistence.enabled .Values.securityContext.enabled) }}
|
||||||
|
{{- if or $needsVolumePermissions .Values.sysctlImage.enabled }}
|
||||||
|
initContainers:
|
||||||
|
{{- if $needsVolumePermissions }}
|
||||||
|
- name: volume-permissions
|
||||||
|
image: "{{ template "redis.volumePermissions.image" . }}"
|
||||||
|
imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
|
||||||
|
command: ["/bin/chown", "-R", "{{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.fsGroup }}", "{{ .Values.slave.persistence.path }}"]
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 0
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.volumePermissions.resources | indent 10 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: redis-data
|
||||||
|
mountPath: {{ .Values.slave.persistence.path }}
|
||||||
|
subPath: {{ .Values.slave.persistence.subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.sysctlImage.enabled }}
|
||||||
|
- name: init-sysctl
|
||||||
|
image: {{ template "redis.sysctl.image" . }}
|
||||||
|
imagePullPolicy: {{ default "" .Values.sysctlImage.pullPolicy | quote }}
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.sysctlImage.resources | indent 10 }}
|
||||||
|
{{- if .Values.sysctlImage.mountHostSys }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: host-sys
|
||||||
|
mountPath: /host-sys
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
{{ toYaml .Values.sysctlImage.command | indent 10 }}
|
||||||
|
securityContext:
|
||||||
|
privileged: true
|
||||||
|
runAsUser: 0
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
volumes:
|
||||||
|
- name: health
|
||||||
|
configMap:
|
||||||
|
name: {{ template "redis.fullname" . }}-health
|
||||||
|
defaultMode: 0755
|
||||||
|
{{- if .Values.usePasswordFile }}
|
||||||
|
- name: redis-password
|
||||||
|
secret:
|
||||||
|
secretName: {{ template "redis.secretName" . }}
|
||||||
|
items:
|
||||||
|
- key: {{ template "redis.secretPasswordKey" . }}
|
||||||
|
path: redis-password
|
||||||
|
{{- end }}
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
{{- if .Values.sysctlImage.mountHostSys }}
|
||||||
|
- name: host-sys
|
||||||
|
hostPath:
|
||||||
|
path: /sys
|
||||||
|
{{- end }}
|
||||||
|
- name: sentinel-tmp-conf
|
||||||
|
emptyDir: {}
|
||||||
|
- name: redis-tmp-conf
|
||||||
|
emptyDir: {}
|
||||||
|
{{- if not .Values.slave.persistence.enabled }}
|
||||||
|
- name: redis-data
|
||||||
|
emptyDir: {}
|
||||||
|
{{- else }}
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: redis-data
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
component: slave
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
{{- range .Values.slave.persistence.accessModes }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.slave.persistence.size | quote }}
|
||||||
|
{{ include "redis.slave.storageClass" . }}
|
||||||
|
selector:
|
||||||
|
{{- if .Values.slave.persistence.matchLabels }}
|
||||||
|
matchLabels:
|
||||||
|
{{ toYaml .Values.slave.persistence.matchLabels | indent 12 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if .Values.slave.persistence.matchExpressions }}
|
||||||
|
matchExpressions:
|
||||||
|
{{ toYaml .Values.slave.persistence.matchExpressions | indent 12 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
updateStrategy:
|
||||||
|
type: {{ .Values.slave.statefulset.updateStrategy }}
|
||||||
|
{{- if .Values.slave.statefulset.rollingUpdatePartition }}
|
||||||
|
{{- if (eq "Recreate" .Values.slave.statefulset.updateStrategy) }}
|
||||||
|
rollingUpdate: null
|
||||||
|
{{- else }}
|
||||||
|
rollingUpdate:
|
||||||
|
partition: {{ .Values.slave.statefulset.rollingUpdatePartition }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
{{- if and .Values.cluster.enabled (not .Values.sentinel.enabled) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}-slave
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
{{- if .Values.slave.service.labels -}}
|
||||||
|
{{ toYaml .Values.slave.service.labels | nindent 4 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if .Values.slave.service.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{ toYaml .Values.slave.service.annotations | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.slave.service.type }}
|
||||||
|
{{- if and (eq .Values.slave.service.type "LoadBalancer") .Values.slave.service.loadBalancerIP }}
|
||||||
|
loadBalancerIP: {{ .Values.slave.service.loadBalancerIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq .Values.slave.service.type "LoadBalancer") .Values.slave.service.loadBalancerSourceRanges }}
|
||||||
|
loadBalancerSourceRanges:
|
||||||
|
{{- with .Values.slave.service.loadBalancerSourceRanges }}
|
||||||
|
{{ toYaml . | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: redis
|
||||||
|
port: {{ .Values.slave.service.port }}
|
||||||
|
targetPort: redis
|
||||||
|
{{- if .Values.slave.service.nodePort }}
|
||||||
|
nodePort: {{ .Values.slave.service.nodePort }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
role: slave
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
{{- if .Values.sentinel.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
{{- if .Values.sentinel.service.labels }}
|
||||||
|
{{ toYaml .Values.sentinel.service.labels | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.sentinel.service.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{ toYaml .Values.sentinel.service.annotations | indent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.sentinel.service.type }}
|
||||||
|
{{ if eq .Values.sentinel.service.type "LoadBalancer" -}} {{ if .Values.sentinel.service.loadBalancerIP }}
|
||||||
|
loadBalancerIP: {{ .Values.sentinel.service.loadBalancerIP }}
|
||||||
|
{{ end -}}
|
||||||
|
{{- end -}}
|
||||||
|
ports:
|
||||||
|
- name: redis
|
||||||
|
port: {{ .Values.sentinel.service.redisPort }}
|
||||||
|
targetPort: redis
|
||||||
|
{{- if .Values.sentinel.service.redisNodePort }}
|
||||||
|
nodePort: {{ .Values.sentinel.service.redisNodePort }}
|
||||||
|
{{- end }}
|
||||||
|
- name: redis-sentinel
|
||||||
|
port: {{ .Values.sentinel.service.sentinelPort }}
|
||||||
|
targetPort: redis-sentinel
|
||||||
|
{{- if .Values.sentinel.service.sentinelNodePort }}
|
||||||
|
nodePort: {{ .Values.sentinel.service.sentinelNodePort }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{{- if and .Values.usePassword (not .Values.existingSecret) -}}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ template "redis.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "redis.name" . }}
|
||||||
|
chart: {{ template "redis.chart" . }}
|
||||||
|
release: "{{ .Release.Name }}"
|
||||||
|
heritage: "{{ .Release.Service }}"
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
redis-password: {{ include "redis.password" . | b64enc | quote }}
|
||||||
|
{{- end -}}
|
||||||
@@ -0,0 +1,633 @@
|
|||||||
|
## Global Docker image parameters
|
||||||
|
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
|
||||||
|
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
|
||||||
|
##
|
||||||
|
global:
|
||||||
|
# imageRegistry: myRegistryName
|
||||||
|
# imagePullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
# storageClass: myStorageClass
|
||||||
|
redis: {}
|
||||||
|
|
||||||
|
## Bitnami Redis image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.8-debian-10-r32
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## String to partially override redis.fullname template (will maintain the release name)
|
||||||
|
##
|
||||||
|
# nameOverride:
|
||||||
|
|
||||||
|
## String to fully override redis.fullname template
|
||||||
|
##
|
||||||
|
# fullnameOverride:
|
||||||
|
|
||||||
|
## Cluster settings
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
slaveCount: 3
|
||||||
|
|
||||||
|
## Use redis sentinel in the redis pod. This will disable the master and slave services and
|
||||||
|
## create one redis service with ports to the sentinel and the redis instances
|
||||||
|
sentinel:
|
||||||
|
enabled: false
|
||||||
|
## Require password authentication on the sentinel itself
|
||||||
|
## ref: https://redis.io/topics/sentinel
|
||||||
|
usePassword: true
|
||||||
|
## Bitnami Redis Sentintel image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis-sentinel/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-sentinel
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis-sentinel#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.8-debian-10-r25
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
masterSet: mymaster
|
||||||
|
initialCheckTimeout: 5
|
||||||
|
quorum: 2
|
||||||
|
downAfterMilliseconds: 60000
|
||||||
|
failoverTimeout: 18000
|
||||||
|
parallelSyncs: 1
|
||||||
|
port: 26379
|
||||||
|
## Additional Redis configuration for the sentinel nodes
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap:
|
||||||
|
## Enable or disable static sentinel IDs for each replicas
|
||||||
|
## If disabled each sentinel will generate a random id at startup
|
||||||
|
## If enabled, each replicas will have a constant ID on each start-up
|
||||||
|
##
|
||||||
|
staticID: false
|
||||||
|
## Configure extra options for Redis Sentinel liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
## Redis Sentinel resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Redis Sentinel Service properties
|
||||||
|
service:
|
||||||
|
## Redis Sentinel Service type
|
||||||
|
type: ClusterIP
|
||||||
|
sentinelPort: 26379
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# sentinelNodePort:
|
||||||
|
# redisNodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
labels: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
## Specifies the Kubernetes Cluster's Domain Name.
|
||||||
|
##
|
||||||
|
clusterDomain: cluster.local
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
## Specifies whether a NetworkPolicy should be created
|
||||||
|
##
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
## The Policy model to apply. When set to false, only pods with the correct
|
||||||
|
## client label will have network access to the port Redis is listening
|
||||||
|
## on. When true, Redis will accept connections from any source
|
||||||
|
## (with the correct destination port).
|
||||||
|
##
|
||||||
|
# allowExternal: true
|
||||||
|
|
||||||
|
## Allow connections from other namespacess. Just set label for namespace and set label for pods (optional).
|
||||||
|
##
|
||||||
|
ingressNSMatchLabels: {}
|
||||||
|
ingressNSPodMatchLabels: {}
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
## Specifies whether a ServiceAccount should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
## The name of the ServiceAccount to use.
|
||||||
|
## If not set and create is true, a name is generated using the fullname template
|
||||||
|
name:
|
||||||
|
|
||||||
|
rbac:
|
||||||
|
## Specifies whether RBAC resources should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
|
||||||
|
role:
|
||||||
|
## Rules to create. It follows the role specification
|
||||||
|
# rules:
|
||||||
|
# - apiGroups:
|
||||||
|
# - extensions
|
||||||
|
# resources:
|
||||||
|
# - podsecuritypolicies
|
||||||
|
# verbs:
|
||||||
|
# - use
|
||||||
|
# resourceNames:
|
||||||
|
# - gce.unprivileged
|
||||||
|
rules: []
|
||||||
|
|
||||||
|
## Redis pod Security Context
|
||||||
|
securityContext:
|
||||||
|
enabled: true
|
||||||
|
fsGroup: 1001
|
||||||
|
runAsUser: 1001
|
||||||
|
## sysctl settings for master and slave pods
|
||||||
|
##
|
||||||
|
## Uncomment the setting below to increase the net.core.somaxconn value
|
||||||
|
##
|
||||||
|
# sysctls:
|
||||||
|
# - name: net.core.somaxconn
|
||||||
|
# value: "10000"
|
||||||
|
|
||||||
|
## Use password authentication
|
||||||
|
usePassword: true
|
||||||
|
## Redis password (both master and slave)
|
||||||
|
## Defaults to a random 10-character alphanumeric string if not set and usePassword is true
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#setting-the-server-password-on-first-run
|
||||||
|
##
|
||||||
|
password:
|
||||||
|
## Use existing secret (ignores previous password)
|
||||||
|
# existingSecret:
|
||||||
|
## Password key to be retrieved from Redis secret
|
||||||
|
##
|
||||||
|
# existingSecretPasswordKey:
|
||||||
|
|
||||||
|
## Mount secrets as files instead of environment variables
|
||||||
|
usePasswordFile: false
|
||||||
|
|
||||||
|
## Persist data to a persistent volume (Redis Master)
|
||||||
|
persistence: {}
|
||||||
|
## A manually managed Persistent Volume and Claim
|
||||||
|
## Requires persistence.enabled: true
|
||||||
|
## If defined, PVC must be created manually before volume will be bound
|
||||||
|
# existingClaim:
|
||||||
|
|
||||||
|
# Redis port
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Master parameters
|
||||||
|
##
|
||||||
|
master:
|
||||||
|
## Redis command arguments
|
||||||
|
##
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Additional Redis configuration for the master nodes
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap:
|
||||||
|
## Redis additional command line flags
|
||||||
|
##
|
||||||
|
## Can be used to specify command line flags, for example:
|
||||||
|
##
|
||||||
|
## extraFlags:
|
||||||
|
## - "--maxmemory-policy volatile-ttl"
|
||||||
|
## - "--repl-backlog-size 1024mb"
|
||||||
|
extraFlags: []
|
||||||
|
## Comma-separated list of Redis commands to disable
|
||||||
|
##
|
||||||
|
## Can be used to disable Redis commands for security reasons.
|
||||||
|
## Commands will be completely disabled by renaming each to an empty string.
|
||||||
|
## ref: https://redis.io/topics/security#disabling-of-specific-commands
|
||||||
|
##
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Master additional pod labels and annotations
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis Master resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Configure extra options for Redis Master liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis Master Node selectors and tolerations for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
##
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
## Redis Master pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Redis Master Service properties
|
||||||
|
service:
|
||||||
|
## Redis Master Service type
|
||||||
|
type: ClusterIP
|
||||||
|
port: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
labels: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
# loadBalancerSourceRanges: ["10.0.0.0/8"]
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
## Persistent Volume selectors
|
||||||
|
## https://kubernetes.io/docs/concepts/storage/persistent-volumes/#selector
|
||||||
|
matchLabels: {}
|
||||||
|
matchExpressions: {}
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Redis Master pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Slave properties
|
||||||
|
## Note: service.type is a mandatory parameter
|
||||||
|
## The rest of the parameters are either optional or, if undefined, will inherit those declared in Redis Master
|
||||||
|
##
|
||||||
|
slave:
|
||||||
|
## Slave Service properties
|
||||||
|
service:
|
||||||
|
## Redis Slave Service type
|
||||||
|
type: ClusterIP
|
||||||
|
## Redis port
|
||||||
|
port: 6379
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
labels: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
# loadBalancerSourceRanges: ["10.0.0.0/8"]
|
||||||
|
|
||||||
|
## Redis slave port
|
||||||
|
port: 6379
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Additional Redis configuration for the slave nodes
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap:
|
||||||
|
## Redis extra flags
|
||||||
|
extraFlags: []
|
||||||
|
## List of Redis commands to disable
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Slave pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Configure extra options for Redis Slave liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis slave Resource
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Redis slave selectors and tolerations for pod assignment
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Redis slave pod Annotation and Labels
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis slave pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
## Persistent Volume selectors
|
||||||
|
## https://kubernetes.io/docs/concepts/storage/persistent-volumes/#selector
|
||||||
|
matchLabels: {}
|
||||||
|
matchExpressions: {}
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Prometheus Exporter / Metrics
|
||||||
|
##
|
||||||
|
metrics:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-exporter
|
||||||
|
tag: 1.5.2-debian-10-r21
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Metrics exporter resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
##
|
||||||
|
# resources: {}
|
||||||
|
|
||||||
|
## Extra arguments for Metrics exporter, for example:
|
||||||
|
## extraArgs:
|
||||||
|
## check-keys: myKey,myOtherKey
|
||||||
|
# extraArgs: {}
|
||||||
|
|
||||||
|
## Metrics exporter pod Annotation and Labels
|
||||||
|
podAnnotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "9121"
|
||||||
|
# podLabels: {}
|
||||||
|
|
||||||
|
# Enable this if you're using https://github.com/coreos/prometheus-operator
|
||||||
|
serviceMonitor:
|
||||||
|
enabled: false
|
||||||
|
## Specify a namespace if needed
|
||||||
|
# namespace: monitoring
|
||||||
|
# fallback to the prometheus default unless specified
|
||||||
|
# interval: 10s
|
||||||
|
## Defaults to what's used if you follow CoreOS [Prometheus Install Instructions](https://github.com/bitnami/charts/tree/master/bitnami/prometheus-operator#tldr)
|
||||||
|
## [Prometheus Selector Label](https://github.com/bitnami/charts/tree/master/bitnami/prometheus-operator#prometheus-operator-1)
|
||||||
|
## [Kube Prometheus Selector Label](https://github.com/bitnami/charts/tree/master/bitnami/prometheus-operator#exporters)
|
||||||
|
selector:
|
||||||
|
prometheus: kube-prometheus
|
||||||
|
|
||||||
|
## Metrics exporter pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
## Use serviceLoadBalancerIP to request a specific static IP,
|
||||||
|
## otherwise leave blank
|
||||||
|
# loadBalancerIP:
|
||||||
|
annotations: {}
|
||||||
|
labels: {}
|
||||||
|
|
||||||
|
## Custom PrometheusRule to be defined
|
||||||
|
## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions
|
||||||
|
prometheusRule:
|
||||||
|
enabled: false
|
||||||
|
additionalLabels: {}
|
||||||
|
namespace: ""
|
||||||
|
rules: []
|
||||||
|
## These are just examples rules, please adapt them to your needs.
|
||||||
|
## Make sure to constraint the rules to the current postgresql service.
|
||||||
|
# - alert: RedisDown
|
||||||
|
# expr: redis_up{service="{{ template "redis.fullname" . }}-metrics"} == 0
|
||||||
|
# for: 2m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Redis instance {{ "{{ $labels.instance }}" }} down
|
||||||
|
# description: Redis instance {{ "{{ $labels.instance }}" }} is down
|
||||||
|
# - alert: RedisMemoryHigh
|
||||||
|
# expr: >
|
||||||
|
# redis_memory_used_bytes{service="{{ template "redis.fullname" . }}-metrics"} * 100
|
||||||
|
# /
|
||||||
|
# redis_memory_max_bytes{service="{{ template "redis.fullname" . }}-metrics"}
|
||||||
|
# > 90 =< 100
|
||||||
|
# for: 2m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Redis instance {{ "{{ $labels.instance }}" }} is using too much memory
|
||||||
|
# description: |
|
||||||
|
# Redis instance {{ "{{ $labels.instance }}" }} is using {{ "{{ $value }}" }}% of its available memory.
|
||||||
|
# - alert: RedisKeyEviction
|
||||||
|
# expr: |
|
||||||
|
# increase(redis_evicted_keys_total{service="{{ template "redis.fullname" . }}-metrics"}[5m]) > 0
|
||||||
|
# for: 1s
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Redis instance {{ "{{ $labels.instance }}" }} has evicted keys
|
||||||
|
# description: |
|
||||||
|
# Redis instance {{ "{{ $labels.instance }}" }} has evicted {{ "{{ $value }}" }} keys in the last 5 minutes.
|
||||||
|
|
||||||
|
##
|
||||||
|
## Init containers parameters:
|
||||||
|
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||||
|
##
|
||||||
|
volumePermissions:
|
||||||
|
enabled: false
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Redis config file
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap: |-
|
||||||
|
# Enable AOF https://redis.io/topics/persistence#append-only-file
|
||||||
|
appendonly yes
|
||||||
|
# Disable RDB persistence, AOF persistence already enabled.
|
||||||
|
save ""
|
||||||
|
|
||||||
|
## Sysctl InitContainer
|
||||||
|
## used to perform sysctl operation to modify Kernel settings (needed sometimes to avoid warnings)
|
||||||
|
sysctlImage:
|
||||||
|
enabled: false
|
||||||
|
command: []
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
mountHostSys: false
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## PodSecurityPolicy configuration
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/
|
||||||
|
##
|
||||||
|
podSecurityPolicy:
|
||||||
|
## Specifies whether a PodSecurityPolicy should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/schema#",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"usePassword": {
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Use password authentication",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Password",
|
||||||
|
"form": true,
|
||||||
|
"description": "Defaults to a random 10-character alphanumeric string if not set",
|
||||||
|
"hidden": {
|
||||||
|
"condition": false,
|
||||||
|
"value": "usePassword"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cluster": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Cluster Settings",
|
||||||
|
"form": true,
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"form": true,
|
||||||
|
"title": "Enable master-slave",
|
||||||
|
"description": "Enable master-slave architecture"
|
||||||
|
},
|
||||||
|
"slaveCount": {
|
||||||
|
"type": "integer",
|
||||||
|
"title": "Slave Replicas",
|
||||||
|
"form": true,
|
||||||
|
"hidden": {
|
||||||
|
"condition": false,
|
||||||
|
"value": "cluster.enabled"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"master": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Master replicas settings",
|
||||||
|
"form": true,
|
||||||
|
"properties": {
|
||||||
|
"persistence": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Persistence for master replicas",
|
||||||
|
"form": true,
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"form": true,
|
||||||
|
"title": "Enable persistence",
|
||||||
|
"description": "Enable persistence using Persistent Volume Claims"
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Persistent Volume Size",
|
||||||
|
"form": true,
|
||||||
|
"render": "slider",
|
||||||
|
"sliderMin": 1,
|
||||||
|
"sliderMax": 100,
|
||||||
|
"sliderUnit": "Gi",
|
||||||
|
"hidden": {
|
||||||
|
"condition": false,
|
||||||
|
"value": "master.persistence.enabled"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"matchLabels": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Persistent Match Labels Selector"
|
||||||
|
},
|
||||||
|
"matchExpressions": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Persistent Match Expressions Selector"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"slave": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Slave replicas settings",
|
||||||
|
"form": true,
|
||||||
|
"hidden": {
|
||||||
|
"condition": false,
|
||||||
|
"value": "cluster.enabled"
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"persistence": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Persistence for slave replicas",
|
||||||
|
"form": true,
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"form": true,
|
||||||
|
"title": "Enable persistence",
|
||||||
|
"description": "Enable persistence using Persistent Volume Claims"
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Persistent Volume Size",
|
||||||
|
"form": true,
|
||||||
|
"render": "slider",
|
||||||
|
"sliderMin": 1,
|
||||||
|
"sliderMax": 100,
|
||||||
|
"sliderUnit": "Gi",
|
||||||
|
"hidden": {
|
||||||
|
"condition": false,
|
||||||
|
"value": "slave.persistence.enabled"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"matchLabels": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Persistent Match Labels Selector"
|
||||||
|
},
|
||||||
|
"matchExpressions": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Persistent Match Expressions Selector"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"volumePermissions": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"form": true,
|
||||||
|
"title": "Enable Init Containers",
|
||||||
|
"description": "Use an init container to set required folder permissions on the data volume before mounting it in the final destination"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"metrics": {
|
||||||
|
"type": "object",
|
||||||
|
"form": true,
|
||||||
|
"title": "Prometheus metrics details",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Create Prometheus metrics exporter",
|
||||||
|
"description": "Create a side-car container to expose Prometheus metrics",
|
||||||
|
"form": true
|
||||||
|
},
|
||||||
|
"serviceMonitor": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Create Prometheus Operator ServiceMonitor",
|
||||||
|
"description": "Create a ServiceMonitor to track metrics using Prometheus Operator",
|
||||||
|
"form": true,
|
||||||
|
"hidden": {
|
||||||
|
"condition": false,
|
||||||
|
"value": "metrics.enabled"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,633 @@
|
|||||||
|
## Global Docker image parameters
|
||||||
|
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
|
||||||
|
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
|
||||||
|
##
|
||||||
|
global:
|
||||||
|
# imageRegistry: myRegistryName
|
||||||
|
# imagePullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
# storageClass: myStorageClass
|
||||||
|
redis: {}
|
||||||
|
|
||||||
|
## Bitnami Redis image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.8-debian-10-r32
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## String to partially override redis.fullname template (will maintain the release name)
|
||||||
|
##
|
||||||
|
# nameOverride:
|
||||||
|
|
||||||
|
## String to fully override redis.fullname template
|
||||||
|
##
|
||||||
|
# fullnameOverride:
|
||||||
|
|
||||||
|
## Cluster settings
|
||||||
|
cluster:
|
||||||
|
enabled: true
|
||||||
|
slaveCount: 2
|
||||||
|
|
||||||
|
## Use redis sentinel in the redis pod. This will disable the master and slave services and
|
||||||
|
## create one redis service with ports to the sentinel and the redis instances
|
||||||
|
sentinel:
|
||||||
|
enabled: false
|
||||||
|
## Require password authentication on the sentinel itself
|
||||||
|
## ref: https://redis.io/topics/sentinel
|
||||||
|
usePassword: true
|
||||||
|
## Bitnami Redis Sentintel image version
|
||||||
|
## ref: https://hub.docker.com/r/bitnami/redis-sentinel/tags/
|
||||||
|
##
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-sentinel
|
||||||
|
## Bitnami Redis image tag
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis-sentinel#supported-tags-and-respective-dockerfile-links
|
||||||
|
##
|
||||||
|
tag: 5.0.8-debian-10-r25
|
||||||
|
## Specify a imagePullPolicy
|
||||||
|
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||||
|
##
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
masterSet: mymaster
|
||||||
|
initialCheckTimeout: 5
|
||||||
|
quorum: 2
|
||||||
|
downAfterMilliseconds: 60000
|
||||||
|
failoverTimeout: 18000
|
||||||
|
parallelSyncs: 1
|
||||||
|
port: 26379
|
||||||
|
## Additional Redis configuration for the sentinel nodes
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap:
|
||||||
|
## Enable or disable static sentinel IDs for each replicas
|
||||||
|
## If disabled each sentinel will generate a random id at startup
|
||||||
|
## If enabled, each replicas will have a constant ID on each start-up
|
||||||
|
##
|
||||||
|
staticID: false
|
||||||
|
## Configure extra options for Redis Sentinel liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
## Redis Sentinel resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Redis Sentinel Service properties
|
||||||
|
service:
|
||||||
|
## Redis Sentinel Service type
|
||||||
|
type: ClusterIP
|
||||||
|
sentinelPort: 26379
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# sentinelNodePort:
|
||||||
|
# redisNodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
labels: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
|
||||||
|
## Specifies the Kubernetes Cluster's Domain Name.
|
||||||
|
##
|
||||||
|
clusterDomain: cluster.local
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
## Specifies whether a NetworkPolicy should be created
|
||||||
|
##
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
## The Policy model to apply. When set to false, only pods with the correct
|
||||||
|
## client label will have network access to the port Redis is listening
|
||||||
|
## on. When true, Redis will accept connections from any source
|
||||||
|
## (with the correct destination port).
|
||||||
|
##
|
||||||
|
# allowExternal: true
|
||||||
|
|
||||||
|
## Allow connections from other namespacess. Just set label for namespace and set label for pods (optional).
|
||||||
|
##
|
||||||
|
ingressNSMatchLabels: {}
|
||||||
|
ingressNSPodMatchLabels: {}
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
## Specifies whether a ServiceAccount should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
## The name of the ServiceAccount to use.
|
||||||
|
## If not set and create is true, a name is generated using the fullname template
|
||||||
|
name:
|
||||||
|
|
||||||
|
rbac:
|
||||||
|
## Specifies whether RBAC resources should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
|
|
||||||
|
role:
|
||||||
|
## Rules to create. It follows the role specification
|
||||||
|
# rules:
|
||||||
|
# - apiGroups:
|
||||||
|
# - extensions
|
||||||
|
# resources:
|
||||||
|
# - podsecuritypolicies
|
||||||
|
# verbs:
|
||||||
|
# - use
|
||||||
|
# resourceNames:
|
||||||
|
# - gce.unprivileged
|
||||||
|
rules: []
|
||||||
|
|
||||||
|
## Redis pod Security Context
|
||||||
|
securityContext:
|
||||||
|
enabled: true
|
||||||
|
fsGroup: 1001
|
||||||
|
runAsUser: 1001
|
||||||
|
## sysctl settings for master and slave pods
|
||||||
|
##
|
||||||
|
## Uncomment the setting below to increase the net.core.somaxconn value
|
||||||
|
##
|
||||||
|
# sysctls:
|
||||||
|
# - name: net.core.somaxconn
|
||||||
|
# value: "10000"
|
||||||
|
|
||||||
|
## Use password authentication
|
||||||
|
usePassword: true
|
||||||
|
## Redis password (both master and slave)
|
||||||
|
## Defaults to a random 10-character alphanumeric string if not set and usePassword is true
|
||||||
|
## ref: https://github.com/bitnami/bitnami-docker-redis#setting-the-server-password-on-first-run
|
||||||
|
##
|
||||||
|
password: ""
|
||||||
|
## Use existing secret (ignores previous password)
|
||||||
|
# existingSecret:
|
||||||
|
## Password key to be retrieved from Redis secret
|
||||||
|
##
|
||||||
|
# existingSecretPasswordKey:
|
||||||
|
|
||||||
|
## Mount secrets as files instead of environment variables
|
||||||
|
usePasswordFile: false
|
||||||
|
|
||||||
|
## Persist data to a persistent volume (Redis Master)
|
||||||
|
persistence: {}
|
||||||
|
## A manually managed Persistent Volume and Claim
|
||||||
|
## Requires persistence.enabled: true
|
||||||
|
## If defined, PVC must be created manually before volume will be bound
|
||||||
|
# existingClaim:
|
||||||
|
|
||||||
|
# Redis port
|
||||||
|
redisPort: 6379
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Master parameters
|
||||||
|
##
|
||||||
|
master:
|
||||||
|
## Redis command arguments
|
||||||
|
##
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Additional Redis configuration for the master nodes
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap:
|
||||||
|
## Redis additional command line flags
|
||||||
|
##
|
||||||
|
## Can be used to specify command line flags, for example:
|
||||||
|
##
|
||||||
|
## extraFlags:
|
||||||
|
## - "--maxmemory-policy volatile-ttl"
|
||||||
|
## - "--repl-backlog-size 1024mb"
|
||||||
|
extraFlags: []
|
||||||
|
## Comma-separated list of Redis commands to disable
|
||||||
|
##
|
||||||
|
## Can be used to disable Redis commands for security reasons.
|
||||||
|
## Commands will be completely disabled by renaming each to an empty string.
|
||||||
|
## ref: https://redis.io/topics/security#disabling-of-specific-commands
|
||||||
|
##
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Master additional pod labels and annotations
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis Master resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Configure extra options for Redis Master liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis Master Node selectors and tolerations for pod assignment
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
|
||||||
|
##
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
## Redis Master pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Redis Master Service properties
|
||||||
|
service:
|
||||||
|
## Redis Master Service type
|
||||||
|
type: ClusterIP
|
||||||
|
port: 6379
|
||||||
|
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
labels: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
# loadBalancerSourceRanges: ["10.0.0.0/8"]
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
## Persistent Volume selectors
|
||||||
|
## https://kubernetes.io/docs/concepts/storage/persistent-volumes/#selector
|
||||||
|
matchLabels: {}
|
||||||
|
matchExpressions: {}
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Redis Master pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
##
|
||||||
|
## Redis Slave properties
|
||||||
|
## Note: service.type is a mandatory parameter
|
||||||
|
## The rest of the parameters are either optional or, if undefined, will inherit those declared in Redis Master
|
||||||
|
##
|
||||||
|
slave:
|
||||||
|
## Slave Service properties
|
||||||
|
service:
|
||||||
|
## Redis Slave Service type
|
||||||
|
type: ClusterIP
|
||||||
|
## Redis port
|
||||||
|
port: 6379
|
||||||
|
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||||
|
##
|
||||||
|
# nodePort:
|
||||||
|
|
||||||
|
## Provide any additional annotations which may be required. This can be used to
|
||||||
|
## set the LoadBalancer service type to internal only.
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||||
|
##
|
||||||
|
annotations: {}
|
||||||
|
labels: {}
|
||||||
|
loadBalancerIP:
|
||||||
|
# loadBalancerSourceRanges: ["10.0.0.0/8"]
|
||||||
|
|
||||||
|
## Redis slave port
|
||||||
|
port: 6379
|
||||||
|
## Can be used to specify command line arguments, for example:
|
||||||
|
##
|
||||||
|
command: "/run.sh"
|
||||||
|
## Additional Redis configuration for the slave nodes
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap:
|
||||||
|
## Redis extra flags
|
||||||
|
extraFlags: []
|
||||||
|
## List of Redis commands to disable
|
||||||
|
disableCommands:
|
||||||
|
- FLUSHDB
|
||||||
|
- FLUSHALL
|
||||||
|
|
||||||
|
## Redis Slave pod/node affinity/anti-affinity
|
||||||
|
##
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
## Configure extra options for Redis Slave liveness and readiness probes
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
|
||||||
|
##
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 5
|
||||||
|
|
||||||
|
## Redis slave Resource
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 256Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Redis slave selectors and tolerations for pod assignment
|
||||||
|
# nodeSelector: {"beta.kubernetes.io/arch": "amd64"}
|
||||||
|
# tolerations: []
|
||||||
|
|
||||||
|
## Use an alternate scheduler, e.g. "stork".
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
|
||||||
|
##
|
||||||
|
# schedulerName:
|
||||||
|
|
||||||
|
## Redis slave pod Annotation and Labels
|
||||||
|
podLabels: {}
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
## Redis slave pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
|
||||||
|
## Enable persistence using Persistent Volume Claims
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||||
|
##
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
## The path the volume will be mounted at, useful when using different
|
||||||
|
## Redis images.
|
||||||
|
path: /data
|
||||||
|
## The subdirectory of the volume to mount to, useful in dev environments
|
||||||
|
## and one PV for multiple services.
|
||||||
|
subPath: ""
|
||||||
|
## redis data Persistent Volume Storage Class
|
||||||
|
## If defined, storageClassName: <storageClass>
|
||||||
|
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||||
|
## If undefined (the default) or set to null, no storageClassName spec is
|
||||||
|
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||||
|
## GKE, AWS & OpenStack)
|
||||||
|
##
|
||||||
|
# storageClass: "-"
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
size: 8Gi
|
||||||
|
## Persistent Volume selectors
|
||||||
|
## https://kubernetes.io/docs/concepts/storage/persistent-volumes/#selector
|
||||||
|
matchLabels: {}
|
||||||
|
matchExpressions: {}
|
||||||
|
|
||||||
|
## Update strategy, can be set to RollingUpdate or onDelete by default.
|
||||||
|
## https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
|
||||||
|
statefulset:
|
||||||
|
updateStrategy: RollingUpdate
|
||||||
|
## Partition update strategy
|
||||||
|
## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions
|
||||||
|
# rollingUpdatePartition:
|
||||||
|
|
||||||
|
## Prometheus Exporter / Metrics
|
||||||
|
##
|
||||||
|
metrics:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/redis-exporter
|
||||||
|
tag: 1.5.2-debian-10-r21
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
|
||||||
|
## Metrics exporter resource requests and limits
|
||||||
|
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||||
|
##
|
||||||
|
# resources: {}
|
||||||
|
|
||||||
|
## Extra arguments for Metrics exporter, for example:
|
||||||
|
## extraArgs:
|
||||||
|
## check-keys: myKey,myOtherKey
|
||||||
|
# extraArgs: {}
|
||||||
|
|
||||||
|
## Metrics exporter pod Annotation and Labels
|
||||||
|
podAnnotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "9121"
|
||||||
|
# podLabels: {}
|
||||||
|
|
||||||
|
# Enable this if you're using https://github.com/coreos/prometheus-operator
|
||||||
|
serviceMonitor:
|
||||||
|
enabled: false
|
||||||
|
## Specify a namespace if needed
|
||||||
|
# namespace: monitoring
|
||||||
|
# fallback to the prometheus default unless specified
|
||||||
|
# interval: 10s
|
||||||
|
## Defaults to what's used if you follow CoreOS [Prometheus Install Instructions](https://github.com/bitnami/charts/tree/master/bitnami/prometheus-operator#tldr)
|
||||||
|
## [Prometheus Selector Label](https://github.com/bitnami/charts/tree/master/bitnami/prometheus-operator#prometheus-operator-1)
|
||||||
|
## [Kube Prometheus Selector Label](https://github.com/bitnami/charts/tree/master/bitnami/prometheus-operator#exporters)
|
||||||
|
selector:
|
||||||
|
prometheus: kube-prometheus
|
||||||
|
|
||||||
|
## Custom PrometheusRule to be defined
|
||||||
|
## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart
|
||||||
|
## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions
|
||||||
|
prometheusRule:
|
||||||
|
enabled: false
|
||||||
|
additionalLabels: {}
|
||||||
|
namespace: ""
|
||||||
|
rules: []
|
||||||
|
## These are just examples rules, please adapt them to your needs.
|
||||||
|
## Make sure to constraint the rules to the current postgresql service.
|
||||||
|
# - alert: RedisDown
|
||||||
|
# expr: redis_up{service="{{ template "redis.fullname" . }}-metrics"} == 0
|
||||||
|
# for: 2m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Redis instance {{ "{{ $labels.instance }}" }} down
|
||||||
|
# description: Redis instance {{ "{{ $labels.instance }}" }} is down
|
||||||
|
# - alert: RedisMemoryHigh
|
||||||
|
# expr: >
|
||||||
|
# redis_memory_used_bytes{service="{{ template "redis.fullname" . }}-metrics"} * 100
|
||||||
|
# /
|
||||||
|
# redis_memory_max_bytes{service="{{ template "redis.fullname" . }}-metrics"}
|
||||||
|
# > 90 =< 100
|
||||||
|
# for: 2m
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Redis instance {{ "{{ $labels.instance }}" }} is using too much memory
|
||||||
|
# description: |
|
||||||
|
# Redis instance {{ "{{ $labels.instance }}" }} is using {{ "{{ $value }}" }}% of its available memory.
|
||||||
|
# - alert: RedisKeyEviction
|
||||||
|
# expr: |
|
||||||
|
# increase(redis_evicted_keys_total{service="{{ template "redis.fullname" . }}-metrics"}[5m]) > 0
|
||||||
|
# for: 1s
|
||||||
|
# labels:
|
||||||
|
# severity: error
|
||||||
|
# annotations:
|
||||||
|
# summary: Redis instance {{ "{{ $labels.instance }}" }} has evicted keys
|
||||||
|
# description: |
|
||||||
|
# Redis instance {{ "{{ $labels.instance }}" }} has evicted {{ "{{ $value }}" }} keys in the last 5 minutes.
|
||||||
|
|
||||||
|
## Metrics exporter pod priorityClassName
|
||||||
|
# priorityClassName: {}
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
## Use serviceLoadBalancerIP to request a specific static IP,
|
||||||
|
## otherwise leave blank
|
||||||
|
# loadBalancerIP:
|
||||||
|
annotations: {}
|
||||||
|
labels: {}
|
||||||
|
|
||||||
|
##
|
||||||
|
## Init containers parameters:
|
||||||
|
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||||
|
##
|
||||||
|
volumePermissions:
|
||||||
|
enabled: false
|
||||||
|
image:
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## Redis config file
|
||||||
|
## ref: https://redis.io/topics/config
|
||||||
|
##
|
||||||
|
configmap: |-
|
||||||
|
# Enable AOF https://redis.io/topics/persistence#append-only-file
|
||||||
|
appendonly yes
|
||||||
|
# Disable RDB persistence, AOF persistence already enabled.
|
||||||
|
save ""
|
||||||
|
|
||||||
|
## Sysctl InitContainer
|
||||||
|
## used to perform sysctl operation to modify Kernel settings (needed sometimes to avoid warnings)
|
||||||
|
sysctlImage:
|
||||||
|
enabled: false
|
||||||
|
command: []
|
||||||
|
registry: docker.io
|
||||||
|
repository: bitnami/minideb
|
||||||
|
tag: buster
|
||||||
|
pullPolicy: Always
|
||||||
|
## Optionally specify an array of imagePullSecrets.
|
||||||
|
## Secrets must be manually created in the namespace.
|
||||||
|
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
##
|
||||||
|
# pullSecrets:
|
||||||
|
# - myRegistryKeySecretName
|
||||||
|
mountHostSys: false
|
||||||
|
resources: {}
|
||||||
|
# resources:
|
||||||
|
# requests:
|
||||||
|
# memory: 128Mi
|
||||||
|
# cpu: 100m
|
||||||
|
|
||||||
|
## PodSecurityPolicy configuration
|
||||||
|
## ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/
|
||||||
|
##
|
||||||
|
podSecurityPolicy:
|
||||||
|
## Specifies whether a PodSecurityPolicy should be created
|
||||||
|
##
|
||||||
|
create: false
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# CI values for Pipelines
|
||||||
|
|
||||||
|
pipelines:
|
||||||
|
jfrogUrl: http://artifactory-artifactory.rt:8082
|
||||||
|
jfrogUrlUI: http://artifactory-artifactory.rt:8082
|
||||||
|
|
||||||
|
api:
|
||||||
|
externalUrl: http://pipelines.test.com
|
||||||
|
|
||||||
|
www:
|
||||||
|
externalUrl: http://pipelines.test.com
|
||||||
|
|
||||||
|
msg:
|
||||||
|
uiUserPassword: password
|
||||||
|
|
||||||
|
postgresql:
|
||||||
|
postgresqlPassword: password
|
||||||
|
|
||||||
|
rabbitmq:
|
||||||
|
rabbitmq:
|
||||||
|
password: password
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
dependencies:
|
||||||
|
- name: postgresql
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
version: 8.7.3
|
||||||
|
- name: redis
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
version: 10.6.3
|
||||||
|
- name: rabbitmq
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
version: 6.25.0
|
||||||
|
digest: sha256:cc7282a82d8640100139cde2dd6d9ef646662e4987adeb04c1a23276023ac3ce
|
||||||
|
generated: "2020-04-09T21:52:55.377842+03:00"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
dependencies:
|
||||||
|
- name: postgresql
|
||||||
|
version: 8.7.3
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
condition: postgresql.enabled
|
||||||
|
- name: redis
|
||||||
|
version: 10.6.3
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
condition: redis.enabled
|
||||||
|
- name: rabbitmq
|
||||||
|
version: 6.25.0
|
||||||
|
repository: https://charts.bitnami.com/bitnami
|
||||||
|
condition: rabbitmq.enabled
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
The Pipelines Dashboard can be accessed via URL:
|
||||||
|
|
||||||
|
{{- if (and .Values.pipelines.www.ingress.enabled .Values.pipelines.www.ingress.tls) }}
|
||||||
|
{{- range .Values.pipelines.www.ingress.hosts }}
|
||||||
|
https://{{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else if .Values.pipelines.www.ingress.enabled }}
|
||||||
|
{{- range .Values.pipelines.www.ingress.hosts }}
|
||||||
|
http://{{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
{{ .Values.pipelines.www.externalUrl }}
|
||||||
|
{{- end }}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user