491 lines
51 KiB
Markdown
491 lines
51 KiB
Markdown
|
# Elasticsearch Helm Chart
|
||
|
|
||
|
[![Build Status](https://img.shields.io/jenkins/s/https/devops-ci.elastic.co/job/elastic+helm-charts+main.svg)](https://devops-ci.elastic.co/job/elastic+helm-charts+main/) [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/elastic)](https://artifacthub.io/packages/search?repo=elastic)
|
||
|
|
||
|
This Helm chart is a lightweight way to configure and run our official
|
||
|
[Elasticsearch Docker image][].
|
||
|
|
||
|
> **Warning**
|
||
|
> When it comes to running the Elastic on Kubernetes infrastructure, we
|
||
|
> recommend [Elastic Cloud on Kubernetes][] (ECK) as the best way to run and manage
|
||
|
> the Elastic Stack.
|
||
|
>
|
||
|
> ECK offers many operational benefits for both our basic-tier and our
|
||
|
> enterprise-tier customers, such as spinning up cluster nodes that were lost on
|
||
|
> failed infrastructure, seamless upgrades, rolling cluster changes, and much
|
||
|
> much more.
|
||
|
>
|
||
|
> With the release of the Elastic Stack Helm charts for Elastic version 8.5.1,
|
||
|
> we are handing over the ongoing maintenance of our Elastic Stack Helm charts
|
||
|
> to the community and contributors. This repository will finally be archived
|
||
|
> after 6 months time. Elastic Stacks deployed on Kubernetes through Helm charts
|
||
|
> will still be fully supported under EOL limitations.
|
||
|
>
|
||
|
> Since we want to provide an even better experience for our customers by
|
||
|
> running the Elastic Stack on Kubernetes, we will continue maintaining the
|
||
|
> Helm charts applicable to ECK Custom Resources. These charts can be found in
|
||
|
> the [ECK repository][eck-charts].
|
||
|
>
|
||
|
> Helm charts will currently be maintained for ECK Enterprise-tier customers,
|
||
|
> however, we encourage the community to engage with the existing Helm charts
|
||
|
> for the Elastic Stack and continue supporting their ongoing maintenance.
|
||
|
>
|
||
|
> See <https://github.com/elastic/helm-charts/issues/1731> for more details.
|
||
|
|
||
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||
|
|
||
|
|
||
|
- [Requirements](#requirements)
|
||
|
- [Installing](#installing)
|
||
|
- [Install a released version using the Helm repository](#install-a-released-version-using-the-helm-repository)
|
||
|
- [Install a development version using the main branch](#install-a-development-version-using-the-main-branch)
|
||
|
- [Upgrading](#upgrading)
|
||
|
- [Usage notes](#usage-notes)
|
||
|
- [Configuration](#configuration)
|
||
|
- [FAQ](#faq)
|
||
|
- [How to deploy this chart on a specific K8S distribution?](#how-to-deploy-this-chart-on-a-specific-k8s-distribution)
|
||
|
- [How to deploy dedicated nodes types?](#how-to-deploy-dedicated-nodes-types)
|
||
|
- [Coordinating nodes](#coordinating-nodes)
|
||
|
- [Clustering and Node Discovery](#clustering-and-node-discovery)
|
||
|
- [How to deploy clusters with security (authentication and TLS) enabled?](#how-to-deploy-clusters-with-security-authentication-and-tls-enabled)
|
||
|
- [How to migrate from helm/charts stable chart?](#how-to-migrate-from-helmcharts-stable-chart)
|
||
|
- [How to install plugins?](#how-to-install-plugins)
|
||
|
- [How to use the keystore?](#how-to-use-the-keystore)
|
||
|
- [Basic example](#basic-example)
|
||
|
- [Multiple keys](#multiple-keys)
|
||
|
- [Custom paths and keys](#custom-paths-and-keys)
|
||
|
- [How to enable snapshotting?](#how-to-enable-snapshotting)
|
||
|
- [How to configure templates post-deployment?](#how-to-configure-templates-post-deployment)
|
||
|
- [Contributing](#contributing)
|
||
|
|
||
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||
|
<!-- Use this to update TOC: -->
|
||
|
<!-- docker run --entrypoint doctoc --rm -it -v $(pwd):/usr/src jorgeandrada/doctoc README.md --github --no-title -->
|
||
|
|
||
|
|
||
|
## Requirements
|
||
|
|
||
|
* Minimum cluster requirements include the following to run this chart with
|
||
|
default settings. All of these settings are configurable.
|
||
|
* Three Kubernetes nodes to respect the default "hard" affinity settings
|
||
|
* 1GB of RAM for the JVM heap
|
||
|
|
||
|
See [supported configurations][] for more details.
|
||
|
|
||
|
|
||
|
## Installing
|
||
|
|
||
|
### Install a released version using the Helm repository
|
||
|
|
||
|
* Add the Elastic Helm charts repo:
|
||
|
`helm repo add elastic https://helm.elastic.co`
|
||
|
|
||
|
* Install it: `helm install elasticsearch elastic/elasticsearch`
|
||
|
|
||
|
### Install a development version using the main branch
|
||
|
|
||
|
* Clone the git repo: `git clone git@github.com:elastic/helm-charts.git`
|
||
|
|
||
|
* Install it: `helm install elasticsearch ./helm-charts/elasticsearch --set imageTag=8.5.1`
|
||
|
|
||
|
## Upgrading
|
||
|
|
||
|
Please always check [CHANGELOG.md][] and [BREAKING_CHANGES.md][] before
|
||
|
upgrading to a new chart version.
|
||
|
|
||
|
|
||
|
## Usage notes
|
||
|
|
||
|
* This repo includes several [examples][] of configurations that can be used
|
||
|
as a reference. They are also used in the automated testing of this chart.
|
||
|
* Automated testing of this chart is currently only run against GKE (Google
|
||
|
Kubernetes Engine).
|
||
|
* The chart deploys a StatefulSet and by default will do an automated rolling
|
||
|
update of your cluster. It does this by waiting for the cluster health to become
|
||
|
green after each instance is updated. If you prefer to update manually you can
|
||
|
set `OnDelete` [updateStrategy][].
|
||
|
* It is important to verify that the JVM heap size in `esJavaOpts` and to set
|
||
|
the CPU/Memory `resources` to something suitable for your cluster.
|
||
|
* To simplify chart and maintenance each set of node groups is deployed as a
|
||
|
separate Helm release. Take a look at the [multi][] example to get an idea for
|
||
|
how this works. Without doing this it isn't possible to resize persistent
|
||
|
volumes in a StatefulSet. By setting it up this way it makes it possible to add
|
||
|
more nodes with a new storage size then drain the old ones. It also solves the
|
||
|
problem of allowing the user to determine which node groups to update first when
|
||
|
doing upgrades or changes.
|
||
|
* We have designed this chart to be very un-opinionated about how to configure
|
||
|
Elasticsearch. It exposes ways to set environment variables and mount secrets
|
||
|
inside of the container. Doing this makes it much easier for this chart to
|
||
|
support multiple versions with minimal changes.
|
||
|
|
||
|
|
||
|
## Configuration
|
||
|
|
||
|
| Parameter | Description | Default |
|
||
|
|------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|
|
||
|
| `antiAffinityTopologyKey` | The [anti-affinity][] topology key. By default this will prevent multiple Elasticsearch nodes from running on the same Kubernetes node | `kubernetes.io/hostname` |
|
||
|
| `antiAffinity` | Setting this to hard enforces the [anti-affinity][] rules. If it is set to soft it will be done "best effort". Other values will be ignored | `hard` |
|
||
|
| `clusterHealthCheckParams` | The [Elasticsearch cluster health status params][] that will be used by readiness [probe][] command | `wait_for_status=green&timeout=1s` |
|
||
|
| `clusterName` | This will be used as the Elasticsearch [cluster.name][] and should be unique per cluster in the namespace | `elasticsearch` |
|
||
|
| `createCert` | This will automatically create the SSL certificates | `true` |
|
||
|
| `enableServiceLinks` | Set to false to disabling service links, which can cause slow pod startup times when there are many services in the current namespace. | `true` |
|
||
|
| `envFrom` | Templatable string to be passed to the [environment from variables][] which will be appended to the `envFrom:` definition for the container | `[]` |
|
||
|
| `esConfig` | Allows you to add any config files in `/usr/share/elasticsearch/config/` such as `elasticsearch.yml` and `log4j2.properties`. See [values.yaml][] for an example of the formatting | `{}` |
|
||
|
| `esJavaOpts` | [Java options][] for Elasticsearch. This is where you could configure the [jvm heap size][] | `""` |
|
||
|
| `esJvmOptions` | [Java options][] for Elasticsearch. Override the default JVM options by adding custom options files . See [values.yaml][] for an example of the formatting | `{}` |
|
||
|
| `esMajorVersion` | Deprecated. Instead, use the version of the chart corresponding to your ES minor version. Used to set major version specific configuration. If you are using a custom image and not running the default Elasticsearch version you will need to set this to the version you are running (e.g. `esMajorVersion: 6`) | `""` |
|
||
|
| `extraContainers` | Templatable string of additional `containers` to be passed to the `tpl` function | `""` |
|
||
|
| `extraEnvs` | Extra [environment variables][] which will be appended to the `env:` definition for the container | `[]` |
|
||
|
| `extraInitContainers` | Templatable string of additional `initContainers` to be passed to the `tpl` function | `""` |
|
||
|
| `extraVolumeMounts` | Templatable string of additional `volumeMounts` to be passed to the `tpl` function | `""` |
|
||
|
| `extraVolumes` | Templatable string of additional `volumes` to be passed to the `tpl` function | `""` |
|
||
|
| `fullnameOverride` | Overrides the `clusterName` and `nodeGroup` when used in the naming of resources. This should only be used when using a single `nodeGroup`, otherwise you will have name conflicts | `""` |
|
||
|
| `healthNameOverride` | Overrides `test-elasticsearch-health` pod name | `""` |
|
||
|
| `hostAliases` | Configurable [hostAliases][] | `[]` |
|
||
|
| `httpPort` | The http port that Kubernetes will use for the healthchecks and the service. If you change this you will also need to set [http.port][] in `extraEnvs` | `9200` |
|
||
|
| `imagePullPolicy` | The Kubernetes [imagePullPolicy][] value | `IfNotPresent` |
|
||
|
| `imagePullSecrets` | Configuration for [imagePullSecrets][] so that you can use a private registry for your image | `[]` |
|
||
|
| `imageTag` | The Elasticsearch Docker image tag | `8.5.1` |
|
||
|
| `image` | The Elasticsearch Docker image | `docker.elastic.co/elasticsearch/elasticsearch` |
|
||
|
| `ingress` | Configurable [ingress][] to expose the Elasticsearch service. See [values.yaml][] for an example | see [values.yaml][] |
|
||
|
| `initResources` | Allows you to set the [resources][] for the `initContainer` in the StatefulSet | `{}` |
|
||
|
| `keystore` | Allows you map Kubernetes secrets into the keystore. See the [config example][] and [how to use the keystore][] | `[]` |
|
||
|
| `labels` | Configurable [labels][] applied to all Elasticsearch pods | `{}` |
|
||
|
| `lifecycle` | Allows you to add [lifecycle hooks][]. See [values.yaml][] for an example of the formatting | `{}` |
|
||
|
| `masterService` | The service name used to connect to the masters. You only need to set this if your master `nodeGroup` is set to something other than `master`. See [Clustering and Node Discovery][] for more information | `""` |
|
||
|
| `maxUnavailable` | The [maxUnavailable][] value for the pod disruption budget. By default this will prevent Kubernetes from having more than 1 unhealthy pod in the node group | `1` |
|
||
|
| `minimumMasterNodes` | The value for [discovery.zen.minimum_master_nodes][]. Should be set to `(master_eligible_nodes / 2) + 1`. Ignored in Elasticsearch versions >= 7 | `2` |
|
||
|
| `nameOverride` | Overrides the `clusterName` when used in the naming of resources | `""` |
|
||
|
| `networkHost` | Value for the [network.host Elasticsearch setting][] | `0.0.0.0` |
|
||
|
| `networkPolicy` | The [NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/network-policies/) to set. See [`values.yaml`](./values.yaml) for an example | `{http.enabled: false,transport.enabled: false}` |
|
||
|
| `nodeAffinity` | Value for the [node affinity settings][] | `{}` |
|
||
|
| `nodeGroup` | This is the name that will be used for each group of nodes in the cluster. The name will be `clusterName-nodeGroup-X` , `nameOverride-nodeGroup-X` if a `nameOverride` is specified, and `fullnameOverride-X` if a `fullnameOverride` is specified | `master` |
|
||
|
| `nodeSelector` | Configurable [nodeSelector][] so that you can target specific nodes for your Elasticsearch cluster | `{}` |
|
||
|
| `persistence` | Enables a persistent volume for Elasticsearch data. Can be disabled for nodes that only have [roles][] which don't require persistent data | see [values.yaml][] |
|
||
|
| `podAnnotations` | Configurable [annotations][] applied to all Elasticsearch pods | `{}` |
|
||
|
| `podManagementPolicy` | By default Kubernetes [deploys StatefulSets serially][]. This deploys them in parallel so that they can discover each other | `Parallel` |
|
||
|
| `podSecurityContext` | Allows you to set the [securityContext][] for the pod | see [values.yaml][] |
|
||
|
| `podSecurityPolicy` | Configuration for create a pod security policy with minimal permissions to run this Helm chart with `create: true`. Also can be used to reference an external pod security policy with `name: "externalPodSecurityPolicy"` | see [values.yaml][] |
|
||
|
| `priorityClassName` | The name of the [PriorityClass][]. No default is supplied as the PriorityClass must be created first | `""` |
|
||
|
| `protocol` | The protocol that will be used for the readiness [probe][]. Change this to `https` if you have `xpack.security.http.ssl.enabled` set | `http` |
|
||
|
| `rbac` | Configuration for creating a role, role binding and ServiceAccount as part of this Helm chart with `create: true`. Also can be used to reference an external ServiceAccount with `serviceAccountName: "externalServiceAccountName"`, or automount the service account token | see [values.yaml][] |
|
||
|
| `readinessProbe` | Configuration fields for the readiness [probe][] | see [values.yaml][] |
|
||
|
| `replicas` | Kubernetes replica count for the StatefulSet (i.e. how many pods) | `3` |
|
||
|
| `resources` | Allows you to set the [resources][] for the StatefulSet | see [values.yaml][] |
|
||
|
| `roles` | A list with the specific [roles][] for the `nodeGroup` | see [values.yaml][] |
|
||
|
| `schedulerName` | Name of the [alternate scheduler][] | `""` |
|
||
|
| `secret.enabled` | Enable Secret creation for Elasticsearch credentials | `true` |
|
||
|
| `secret.password` | Initial password for the elastic user | `""` (generated randomly) |
|
||
|
| `secretMounts` | Allows you easily mount a secret as a file inside the StatefulSet. Useful for mounting certificates and other secrets. See [values.yaml][] for an example | `[]` |
|
||
|
| `securityContext` | Allows you to set the [securityContext][] for the container | see [values.yaml][] |
|
||
|
| `service.annotations` | [LoadBalancer annotations][] that Kubernetes will use for the service. This will configure load balancer if `service.type` is `LoadBalancer` | `{}` |
|
||
|
| `service.enabled` | Enable non-headless service | `true` |
|
||
|
| `service.externalTrafficPolicy` | Some cloud providers allow you to specify the [LoadBalancer externalTrafficPolicy][]. Kubernetes will use this to preserve the client source IP. This will configure load balancer if `service.type` is `LoadBalancer` | `""` |
|
||
|
| `service.httpPortName` | The name of the http port within the service | `http` |
|
||
|
| `service.labelsHeadless` | Labels to be added to headless service | `{}` |
|
||
|
| `service.labels` | Labels to be added to non-headless service | `{}` |
|
||
|
| `service.loadBalancerIP` | Some cloud providers allow you to specify the [loadBalancer][] IP. If the `loadBalancerIP` field is not specified, the IP is dynamically assigned. If you specify a `loadBalancerIP` but your cloud provider does not support the feature, it is ignored. | `""` |
|
||
|
| `service.loadBalancerSourceRanges` | The IP ranges that are allowed to access | `[]` |
|
||
|
| `service.nodePort` | Custom [nodePort][] port that can be set if you are using `service.type: nodePort` | `""` |
|
||
|
| `service.transportPortName` | The name of the transport port within the service | `transport` |
|
||
|
| `service.publishNotReadyAddresses` | Consider that all endpoints are considered "ready" even if the Pods themselves are not | `false` |
|
||
|
| `service.type` | Elasticsearch [Service Types][] | `ClusterIP` |
|
||
|
| `sysctlInitContainer` | Allows you to disable the `sysctlInitContainer` if you are setting [sysctl vm.max_map_count][] with another method | `enabled: true` |
|
||
|
| `sysctlVmMaxMapCount` | Sets the [sysctl vm.max_map_count][] needed for Elasticsearch | `262144` |
|
||
|
| `terminationGracePeriod` | The [terminationGracePeriod][] in seconds used when trying to stop the pod | `120` |
|
||
|
| `tests.enabled` | Enable creating test related resources when running `helm template` or `helm test` | `true` |
|
||
|
| `tolerations` | Configurable [tolerations][] | `[]` |
|
||
|
| `transportPort` | The transport port that Kubernetes will use for the service. If you change this you will also need to set [transport port configuration][] in `extraEnvs` | `9300` |
|
||
|
| `updateStrategy` | The [updateStrategy][] for the StatefulSet. By default Kubernetes will wait for the cluster to be green after upgrading each pod. Setting this to `OnDelete` will allow you to manually delete each pod during upgrades | `RollingUpdate` |
|
||
|
| `volumeClaimTemplate` | Configuration for the [volumeClaimTemplate for StatefulSets][]. You will want to adjust the storage (default `30Gi` ) and the `storageClassName` if you are using a different storage class | see [values.yaml][] |
|
||
|
|
||
|
|
||
|
## FAQ
|
||
|
|
||
|
### How to deploy this chart on a specific K8S distribution?
|
||
|
|
||
|
This chart is designed to run on production scale Kubernetes clusters with
|
||
|
multiple nodes, lots of memory and persistent storage. For that reason it can be
|
||
|
a bit tricky to run them against local Kubernetes environments such as
|
||
|
[Minikube][].
|
||
|
|
||
|
This chart is highly tested with [GKE][], but some K8S distribution also
|
||
|
requires specific configurations.
|
||
|
|
||
|
We provide examples of configuration for the following K8S providers:
|
||
|
|
||
|
- [Docker for Mac][]
|
||
|
- [KIND][]
|
||
|
- [Minikube][]
|
||
|
- [MicroK8S][]
|
||
|
- [OpenShift][]
|
||
|
|
||
|
### How to deploy dedicated nodes types?
|
||
|
|
||
|
All the Elasticsearch pods deployed share the same configuration. If you need to
|
||
|
deploy dedicated [nodes types][] (for example dedicated master and data nodes),
|
||
|
you can deploy multiple releases of this chart with different configurations
|
||
|
while they share the same `clusterName` value.
|
||
|
|
||
|
For each Helm release, the nodes types can then be defined using `roles` value.
|
||
|
|
||
|
An example of Elasticsearch cluster using 2 different Helm releases for master,
|
||
|
data and coordinating nodes can be found in [examples/multi][].
|
||
|
|
||
|
#### Coordinating nodes
|
||
|
|
||
|
Every node is implicitly a coordinating node. This means that a node that has an
|
||
|
explicit empty list of roles will only act as a coordinating node.
|
||
|
|
||
|
When deploying coordinating-only node with Elasticsearch chart, it is required
|
||
|
to define the empty list of roles in both `roles` value and `node.roles`
|
||
|
settings:
|
||
|
|
||
|
```yaml
|
||
|
roles: []
|
||
|
|
||
|
esConfig:
|
||
|
elasticsearch.yml: |
|
||
|
node.roles: []
|
||
|
```
|
||
|
|
||
|
More details in [#1186 (comment)][]
|
||
|
|
||
|
#### Clustering and Node Discovery
|
||
|
|
||
|
This chart facilitates Elasticsearch node discovery and services by creating two
|
||
|
`Service` definitions in Kubernetes, one with the name `$clusterName-$nodeGroup`
|
||
|
and another named `$clusterName-$nodeGroup-headless`.
|
||
|
Only `Ready` pods are a part of the `$clusterName-$nodeGroup` service, while all
|
||
|
pods ( `Ready` or not) are a part of `$clusterName-$nodeGroup-headless`.
|
||
|
|
||
|
If your group of master nodes has the default `nodeGroup: master` then you can
|
||
|
just add new groups of nodes with a different `nodeGroup` and they will
|
||
|
automatically discover the correct master. If your master nodes have a different
|
||
|
`nodeGroup` name then you will need to set `masterService` to
|
||
|
`$clusterName-$masterNodeGroup`.
|
||
|
|
||
|
The chart value for `masterService` is used to populate
|
||
|
`discovery.zen.ping.unicast.hosts` , which Elasticsearch nodes will use to
|
||
|
contact master nodes and form a cluster.
|
||
|
Therefore, to add a group of nodes to an existing cluster, setting
|
||
|
`masterService` to the desired `Service` name of the related cluster is
|
||
|
sufficient.
|
||
|
|
||
|
### How to deploy clusters with security (authentication and TLS) enabled?
|
||
|
|
||
|
This Helm chart can generate a [Kubernetes Secret][] or use an existing one to
|
||
|
setup Elastic credentials.
|
||
|
|
||
|
This Helm chart can use existing [Kubernetes Secret][] to setup Elastic
|
||
|
certificates for example. These secrets should be created outside of this chart
|
||
|
and accessed using [environment variables][] and volumes.
|
||
|
|
||
|
This chart is setting TLS and creating a certificate by default, but you can also provide your own certs as a K8S secret. An example of configuration for providing existing certificates can be found in [examples/security][].
|
||
|
|
||
|
### How to migrate from helm/charts stable chart?
|
||
|
|
||
|
If you currently have a cluster deployed with the [helm/charts stable][] chart
|
||
|
you can follow the [migration guide][].
|
||
|
|
||
|
### How to install plugins?
|
||
|
|
||
|
The recommended way to install plugins into our Docker images is to create a
|
||
|
[custom Docker image][].
|
||
|
|
||
|
The Dockerfile would look something like:
|
||
|
|
||
|
```
|
||
|
ARG elasticsearch_version
|
||
|
FROM docker.elastic.co/elasticsearch/elasticsearch:${elasticsearch_version}
|
||
|
|
||
|
RUN bin/elasticsearch-plugin install --batch repository-gcs
|
||
|
```
|
||
|
|
||
|
And then updating the `image` in values to point to your custom image.
|
||
|
|
||
|
There are a couple reasons we recommend this.
|
||
|
|
||
|
1. Tying the availability of Elasticsearch to the download service to install
|
||
|
plugins is not a great idea or something that we recommend. Especially in
|
||
|
Kubernetes where it is normal and expected for a container to be moved to
|
||
|
another host at random times.
|
||
|
2. Mutating the state of a running Docker image (by installing plugins) goes
|
||
|
against best practices of containers and immutable infrastructure.
|
||
|
|
||
|
### How to use the keystore?
|
||
|
|
||
|
#### Basic example
|
||
|
|
||
|
Create the secret, the key name needs to be the keystore key path. In this
|
||
|
example we will create a secret from a file and from a literal string.
|
||
|
|
||
|
```
|
||
|
kubectl create secret generic encryption-key --from-file=xpack.watcher.encryption_key=./watcher_encryption_key
|
||
|
kubectl create secret generic slack-hook --from-literal=xpack.notification.slack.account.monitoring.secure_url='https://hooks.slack.com/services/asdasdasd/asdasdas/asdasd'
|
||
|
```
|
||
|
|
||
|
To add these secrets to the keystore:
|
||
|
|
||
|
```
|
||
|
keystore:
|
||
|
- secretName: encryption-key
|
||
|
- secretName: slack-hook
|
||
|
```
|
||
|
|
||
|
#### Multiple keys
|
||
|
|
||
|
All keys in the secret will be added to the keystore. To create the previous
|
||
|
example in one secret you could also do:
|
||
|
|
||
|
```
|
||
|
kubectl create secret generic keystore-secrets --from-file=xpack.watcher.encryption_key=./watcher_encryption_key --from-literal=xpack.notification.slack.account.monitoring.secure_url='https://hooks.slack.com/services/asdasdasd/asdasdas/asdasd'
|
||
|
```
|
||
|
|
||
|
```
|
||
|
keystore:
|
||
|
- secretName: keystore-secrets
|
||
|
```
|
||
|
|
||
|
#### Custom paths and keys
|
||
|
|
||
|
If you are using these secrets for other applications (besides the Elasticsearch
|
||
|
keystore) then it is also possible to specify the keystore path and which keys
|
||
|
you want to add. Everything specified under each `keystore` item will be passed
|
||
|
through to the `volumeMounts` section for mounting the [secret][]. In this
|
||
|
example we will only add the `slack_hook` key from a secret that also has other
|
||
|
keys. Our secret looks like this:
|
||
|
|
||
|
```
|
||
|
kubectl create secret generic slack-secrets --from-literal=slack_channel='#general' --from-literal=slack_hook='https://hooks.slack.com/services/asdasdasd/asdasdas/asdasd'
|
||
|
```
|
||
|
|
||
|
We only want to add the `slack_hook` key to the keystore at path
|
||
|
`xpack.notification.slack.account.monitoring.secure_url`:
|
||
|
|
||
|
```
|
||
|
keystore:
|
||
|
- secretName: slack-secrets
|
||
|
items:
|
||
|
- key: slack_hook
|
||
|
path: xpack.notification.slack.account.monitoring.secure_url
|
||
|
```
|
||
|
|
||
|
You can also take a look at the [config example][] which is used as part of the
|
||
|
automated testing pipeline.
|
||
|
|
||
|
### How to enable snapshotting?
|
||
|
|
||
|
1. Install your [snapshot plugin][] into a custom Docker image following the
|
||
|
[how to install plugins guide][].
|
||
|
2. Add any required secrets or credentials into an Elasticsearch keystore
|
||
|
following the [how to use the keystore][] guide.
|
||
|
3. Configure the [snapshot repository][] as you normally would.
|
||
|
4. To automate snapshots you can use [Snapshot Lifecycle Management][] or a tool
|
||
|
like [curator][].
|
||
|
|
||
|
### How to configure templates post-deployment?
|
||
|
|
||
|
You can use `postStart` [lifecycle hooks][] to run code triggered after a
|
||
|
container is created.
|
||
|
|
||
|
Here is an example of `postStart` hook to configure templates:
|
||
|
|
||
|
```yaml
|
||
|
lifecycle:
|
||
|
postStart:
|
||
|
exec:
|
||
|
command:
|
||
|
- bash
|
||
|
- -c
|
||
|
- |
|
||
|
#!/bin/bash
|
||
|
# Add a template to adjust number of shards/replicas
|
||
|
TEMPLATE_NAME=my_template
|
||
|
INDEX_PATTERN="logstash-*"
|
||
|
SHARD_COUNT=8
|
||
|
REPLICA_COUNT=1
|
||
|
ES_URL=http://localhost:9200
|
||
|
while [[ "$(curl -s -o /dev/null -w '%{http_code}\n' $ES_URL)" != "200" ]]; do sleep 1; done
|
||
|
curl -XPUT "$ES_URL/_template/$TEMPLATE_NAME" -H 'Content-Type: application/json' -d'{"index_patterns":['\""$INDEX_PATTERN"\"'],"settings":{"number_of_shards":'$SHARD_COUNT',"number_of_replicas":'$REPLICA_COUNT'}}'
|
||
|
```
|
||
|
|
||
|
|
||
|
## Contributing
|
||
|
|
||
|
Please check [CONTRIBUTING.md][] before any contribution or for any questions
|
||
|
about our development and testing process.
|
||
|
|
||
|
[#1186 (comment)]: https://github.com/elastic/helm-charts/pull/1186#discussion_r631166442
|
||
|
[alternate scheduler]: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/#specify-schedulers-for-pods
|
||
|
[annotations]: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
|
||
|
[anti-affinity]: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
|
||
|
[BREAKING_CHANGES.md]: https://github.com/elastic/helm-charts/blob/main/BREAKING_CHANGES.md
|
||
|
[CHANGELOG.md]: https://github.com/elastic/helm-charts/blob/main/CHANGELOG.md
|
||
|
[cluster.name]: https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster.name.html
|
||
|
[clustering and node discovery]: https://github.com/elastic/helm-charts/blob/main/elasticsearch/README.md#clustering-and-node-discovery
|
||
|
[config example]: https://github.com/elastic/helm-charts/blob/main/elasticsearch/examples/config/values.yaml
|
||
|
[CONTRIBUTING.md]: https://github.com/elastic/helm-charts/blob/main/CONTRIBUTING.md
|
||
|
[curator]: https://www.elastic.co/guide/en/elasticsearch/client/curator/current/snapshot.html
|
||
|
[custom docker image]: https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_c_customized_image
|
||
|
[deploys statefulsets serially]: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies
|
||
|
[discovery.zen.minimum_master_nodes]: https://www.elastic.co/guide/en/elasticsearch/reference/current/discovery-settings.html#minimum_master_nodes
|
||
|
[docker for mac]: https://github.com/elastic/helm-charts/tree/main/elasticsearch/examples/docker-for-mac
|
||
|
[eck-charts]: https://github.com/elastic/cloud-on-k8s/tree/master/deploy
|
||
|
[elastic cloud on kubernetes]: https://github.com/elastic/cloud-on-k8s
|
||
|
[elasticsearch cluster health status params]: https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html#request-params
|
||
|
[elasticsearch docker image]: https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
|
||
|
[environment from variables]: https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables
|
||
|
[environment variables]: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/#using-environment-variables-inside-of-your-config
|
||
|
[examples]: https://github.com/elastic/helm-charts/tree/main/elasticsearch/examples/
|
||
|
[examples/multi]: https://github.com/elastic/helm-charts/tree/main/elasticsearch/examples/multi
|
||
|
[examples/security]: https://github.com/elastic/helm-charts/tree/main/elasticsearch/examples/security
|
||
|
[gke]: https://cloud.google.com/kubernetes-engine
|
||
|
[helm]: https://helm.sh
|
||
|
[helm/charts stable]: https://github.com/helm/charts/tree/master/stable/elasticsearch/
|
||
|
[hostAliases]: https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
|
||
|
[how to install plugins guide]: https://github.com/elastic/helm-charts/blob/main/elasticsearch/README.md#how-to-install-plugins
|
||
|
[how to use the keystore]: https://github.com/elastic/helm-charts/blob/main/elasticsearch/README.md#how-to-use-the-keystore
|
||
|
[http.port]: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-http.html#_settings
|
||
|
[imagePullPolicy]: https://kubernetes.io/docs/concepts/containers/images/#updating-images
|
||
|
[imagePullSecrets]: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-pod-that-uses-your-secret
|
||
|
[ingress]: https://kubernetes.io/docs/concepts/services-networking/ingress/
|
||
|
[java options]: https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html
|
||
|
[jvm heap size]: https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
|
||
|
[kind]: https://github.com/elastic/helm-charts/tree/main//elasticsearch/examples/kubernetes-kind
|
||
|
[labels]: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
|
||
|
[lifecycle hooks]: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
|
||
|
[loadBalancer annotations]: https://kubernetes.io/docs/concepts/services-networking/service/#ssl-support-on-aws
|
||
|
[loadBalancer externalTrafficPolicy]: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
|
||
|
[loadBalancer]: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer
|
||
|
[maxUnavailable]: https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
|
||
|
[microk8s]: https://github.com/elastic/helm-charts/tree/main/elasticsearch/examples/microk8s
|
||
|
[migration guide]: https://github.com/elastic/helm-charts/blob/main/elasticsearch/examples/migration/README.md
|
||
|
[minikube]: https://github.com/elastic/helm-charts/tree/main/elasticsearch/examples/minikube
|
||
|
[multi]: https://github.com/elastic/helm-charts/tree/main/elasticsearch/examples/multi/
|
||
|
[network.host elasticsearch setting]: https://www.elastic.co/guide/en/elasticsearch/reference/current/network.host.html
|
||
|
[node affinity settings]: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity-beta-feature
|
||
|
[nodePort]: https://kubernetes.io/docs/concepts/services-networking/service/#nodeport
|
||
|
[nodes types]: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
|
||
|
[nodeSelector]: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
|
||
|
[openshift]: https://github.com/elastic/helm-charts/tree/main/elasticsearch/examples/openshift
|
||
|
[priorityClass]: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
|
||
|
[probe]: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
|
||
|
[resources]: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
|
||
|
[roles]: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
|
||
|
[secret]: https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets
|
||
|
[securityContext]: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||
|
[service types]: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
|
||
|
[snapshot lifecycle management]: https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshot-lifecycle-management.html
|
||
|
[snapshot plugin]: https://www.elastic.co/guide/en/elasticsearch/plugins/current/repository.html
|
||
|
[snapshot repository]: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html
|
||
|
[supported configurations]: https://github.com/elastic/helm-charts/blob/main/README.md#supported-configurations
|
||
|
[sysctl vm.max_map_count]: https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html#vm-max-map-count
|
||
|
[terminationGracePeriod]: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods
|
||
|
[tolerations]: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
|
||
|
[transport port configuration]: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-transport.html#_transport_settings
|
||
|
[updateStrategy]: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
|
||
|
[values.yaml]: https://github.com/elastic/helm-charts/blob/main/elasticsearch/values.yaml
|
||
|
[volumeClaimTemplate for statefulsets]: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#stable-storage
|