blob: 323707b962d009664844b3df0d8882b0e6cce6d7 [file] [view]
# Requirements
What your cluster and workstation need before `helm install`, and the one pre-install step the
default (Elasticsearch) path requires.
## Kubernetes and Helm
| Requirement | Version | Where it comes from |
|---|---|---|
| Kubernetes | 1.21+ | `eck-operator` 3.3.1 and `eck-elasticsearch` 0.18.1 both declare a `kubeVersion` floor of `1.21.0-0`; `chart/skywalking` itself declares none. Helm does **not** enforce a *subchart's* `kubeVersion`, so an older cluster still installs — it just runs an unsupported ECK. |
| Helm | 3.8+ (4.x also works) | The chart is `apiVersion: v2`, and `helm dep up` pulls the BanyanDB dependency from an OCI registry (`oci://docker.io/apache`), which needs Helm's non-experimental OCI support (3.8.0). |
| `kubectl` | matching your cluster | Used to watch the install (`kubectl get pods -w`) and for all troubleshooting. |
CI exercises the chart on a four-node [kind](https://kind.sigs.k8s.io/) cluster running
`kindest/node:v1.28.15` (`test/e2e/kind28.yaml`) every e2e cell uses it so 1.28 is the
version with the most coverage.
The chart adapts to older Ingress APIs (`ui-ingress.yaml` falls back from
`networking.k8s.io/v1` to `v1beta1` to `extensions/v1beta1`), so ingress itself is not what sets
the minimum.
## Cluster permissions
Installing needs more than namespace-scoped rights:
- **CRDs are cluster-scoped.** The ECK CRDs (see below) can only be installed by a user with
cluster-admin-level permissions.
- **The chart creates a `ClusterRole` and `ClusterRoleBinding`** for OAP (`oap-clusterrole.yaml`,
`oap-clusterrolebinding.yaml`), granting `get`/`watch`/`list` on pods, pod logs, endpoints,
services, nodes, namespaces, configmaps, `extensions` deployments/replicasets and Istio
`networking.istio.io` `serviceentries` this is what backs Kubernetes-based service discovery
and mesh analysis. Both templates are gated on `serviceAccounts.oap.create`, so set
`serviceAccounts.oap.create=false` and supply your own `serviceAccounts.oap.name` if you cannot
create cluster-scoped RBAC.
## Storage volumes
Only Elasticsearch and a BanyanDB *cluster* claim persistent volumes out of the box. The other
paths render `emptyDir` fine for a trial, data loss on every pod restart anywhere else:
| Component | Claims a PV by default? | Note |
|---|---|---|
| Elasticsearch (ECK) | Yes | `elasticsearch.nodeSets[0].count: 3`, and because `volumeClaimTemplates` is left commented out ECK applies its own default a 1Gi `elasticsearch-data` PVC per node on the default StorageClass. Uncomment `elasticsearch.nodeSets[].volumeClaimTemplates` in `values.yaml` to size it (the example asks for 30Gi). See [ECK volume claim settings](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-volume-claim-templates.html). |
| BanyanDB standalone (`banyandb.standalone.enabled: true`, the default) | **No** | The subchart ships `storage.standalone.enabled: false`. Set `banyandb.storage.standalone.enabled=true` to claim the 200Gi `standalone-data` volume. |
| BanyanDB cluster (`banyandb.cluster.enabled=true`) | Yes | `banyandb.storage.data.enabled: true` five data PVCs (50Gi/50Gi/5Gi/50Gi/5Gi) plus 10Gi for liaison, all with `storageClass: null`, i.e. the cluster default StorageClass. |
| PostgreSQL | **No** | This chart overrides the Bitnami `postgresql` 12.1.2 defaults with `postgresql.primary.persistence.enabled: false` and `postgresql.readReplicas.persistence.enabled: false`; the data directory is an `emptyDir`. It is a demo backend, as `values.yaml` says. |
| Horizon UI | No | `ui.persistence.enabled: false` (1Gi, `ReadWriteOnce` once enabled). Turn it on to keep BFF audit log, setup state and alarm state across restarts. |
`oap.resources`, `ui.resources` and `satellite.resources` are all `{}` by default no requests or
limits are set, so plan capacity yourself. For a laptop-sized cluster, drop the Elasticsearch node
count to 1 the way `test/e2e/values.yaml` does.
## Install the ECK CRDs first
**When you need this:** `elasticsearch.enabled=true`, which is the **default**. The
`eck-operator-crds` chart ships the CRDs as ordinary templates, so without this step they would be
created in the same install that also renders the `Elasticsearch` custom resource depending on
them. Install them as their own release first `SKYWALKING_RELEASE_NAMESPACE` is the namespace you
install into, exported as in [Quick Start](../install/quick-start.md):
```shell
helm dep up chart/skywalking
tar xzf chart/skywalking/charts/eck-operator-3.3.1.tgz -C /tmp eck-operator/charts/eck-operator-crds
helm install eck-crds /tmp/eck-operator/charts/eck-operator-crds \
-n "${SKYWALKING_RELEASE_NAMESPACE}" --create-namespace
```
Then install the chart with `eck-operator.installCRDs=false` so the operator does not try to create
the same cluster-scoped CRDs again:
```shell
helm install skywalking chart/skywalking -n "${SKYWALKING_RELEASE_NAMESPACE}" \
--set oap.image.tag=11.0.0 \
--set oap.storageType=elasticsearch \
--set ui.image.tag=horizon-1.0.0 \
--set eck-operator.installCRDs=false
```
Pass `installCRDs=false` for the same reason if the ECK CRDs are already present because someone
else installed ECK in the cluster they are global resources, and a second chart owning them would
overwrite them on upgrade and delete them on uninstall.
The `eck-crds` release is independent of the SkyWalking release: `helm uninstall skywalking` leaves
the CRDs in place, and uninstalling `eck-crds` deletes every ECK-managed Elasticsearch in the
cluster.
**When you do NOT need this:** any install with `elasticsearch.enabled=false` no ECK operator, no
CRDs. Note that `elasticsearch.enabled` is the *only* switch: the dependency condition is
`elasticsearch.enabled`, not `oap.storageType`, so `--set oap.storageType=banyandb` on its own
still deploys ECK and an Elasticsearch cluster nobody uses. Turn it off explicitly:
```yaml
elasticsearch:
enabled: false
# Only read when oap.storageType is elasticsearch — i.e. an external cluster.
config:
host: elasticsearch-es-http
port:
http: 9200
```
## Required values
Three values have no default and must be set on every install (`ui.image.tag` only while the UI is
deployed `ui.enabled` defaults to `true`):
| Value | Example |
|---|---|
| `oap.image.tag` | `11.0.0` |
| `oap.storageType` | `elasticsearch`, `postgresql`, `banyandb` |
| `ui.image.tag` | `horizon-1.0.0` |
Two more are required only when you switch a component on: `banyandb.image.tag` (e.g. `0.11.0`)
with `banyandb.enabled=true`, or rendering fails with `banyandb.image.tag is required`, and
`satellite.image.tag` with `satellite.enabled=true`.
## Next
- [Quick Start](../install/quick-start.md)
- [Where to Get the Chart](../install/chart-sources.md)
- [Version Compatibility](version-compatibility.md)
- [Elasticsearch](../storage/elasticsearch.md) · [BanyanDB](../storage/banyandb.md)