From ef74c4c155e976659140512ca41e905ba6f9d0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20=C5=9Awi=C4=85tek?= Date: Mon, 16 Oct 2023 13:43:12 +0200 Subject: [PATCH] docs: refactor installation guide --- .worktrees/backport-release-v3 | 1 + argocd-app.yaml | 151 ++++++++++ docs/installation.md | 482 +++++++++++++++----------------- images/helm_chart_installed.png | Bin 0 -> 50069 bytes 4 files changed, 370 insertions(+), 264 deletions(-) create mode 160000 .worktrees/backport-release-v3 create mode 100644 argocd-app.yaml create mode 100644 images/helm_chart_installed.png diff --git a/.worktrees/backport-release-v3 b/.worktrees/backport-release-v3 new file mode 160000 index 0000000000..277d6db225 --- /dev/null +++ b/.worktrees/backport-release-v3 @@ -0,0 +1 @@ +Subproject commit 277d6db22519c9abf15d7ca532b4bfcdadc2aa9d diff --git a/argocd-app.yaml b/argocd-app.yaml new file mode 100644 index 0000000000..7b5aa6d9be --- /dev/null +++ b/argocd-app.yaml @@ -0,0 +1,151 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: sumologic +spec: + project: default + source: + repoURL: "https://sumologic.github.io/sumologic-kubernetes-collection/" + targetRevision: 3.8.0 + helm: + releaseName: collection + values: > + sumologic: + setupEnabled: true + accessId: "dummy" + accessKey: "dummy" + endpoint: http://receiver-mock.receiver-mock:3000/terraform/api/ + + metrics: + collector: + otelcol: + scrapeInterval: 15s + resources: + requests: + memory: 128Mi + cpu: 50m + remoteWriteProxy: + resources: + requests: + cpu: 5m + memory: 16Mi + replicaCount: 1 + + kube-prometheus-stack: + prometheus: + prometheusSpec: + resources: + requests: + cpu: 100m + memory: 128Mi + # kind exposes etcd metrics in http on a different port, and enables TLS for the default + # port. This change is simpler than configuring TLS for the default port. + # TODO: Should we use TLS for our default values.yaml here? + kubeEtcd: + service: + targetPort: 2381 + + metadata: + persistence: + size: 128Mi + + logs: + statefulset: + resources: + requests: + cpu: 100m + memory: 128Mi + replicaCount: 1 + metrics: + statefulset: + resources: + requests: + cpu: 100m + memory: 128Mi + replicaCount: 1 + otelevents: + config: + merge: + receivers: + raw_k8s_events: + # we want to get all historical events for this test + max_event_age: 1h + statefulset: + resources: + requests: + memory: 64Mi + cpu: 100m + + otelcol: + logs: + statefulset: + replicaCount: 1 + metrics: + statefulset: + replicaCount: 1 + + tracesSampler: + config: + # Default otlp pipeline from values.yaml is used. + exporters: + otlphttp: + traces_endpoint: ${SUMO_ENDPOINT_DEFAULT_TRACES_SOURCE}/v1/traces + deployment: + replicas: 1 + resources: + requests: + memory: 64Mi + cpu: 10m + + tracesGateway: + deployment: + replicas: 1 + resources: + requests: + memory: 64Mi + cpu: 10m + + otelcolInstrumentation: + enabled: true + statefulset: + replicaCount: 1 + resources: + requests: + memory: 64Mi + cpu: 10m + otellogs: + config: + merge: + receivers: + journald: + directory: /run/log/journal + # Prevent snowball effect by filtering out receiver mock logs + filelog/containers: + exclude: + - /var/log/pods/receiver-mock_*/*/*.log + daemonset: + extraVolumeMounts: + - mountPath: /run/log/journal + name: run-log-journal + extraVolumes: + # kind doesn't enable journald persistence, and the journal resides at /run/log/journal + # instead of /var/log/journal + - hostPath: + path: /run/log/journal + type: DirectoryOrCreate + name: run-log-journal + + telegraf-operator: + enabled: true + resources: + requests: + cpu: 5m + memory: 32Mi + sidecarResources: + requests: + cpu: 5m + memory: 10Mi + chart: sumologic + destination: + server: "https://kubernetes.default.svc" + namespace: sumologic diff --git a/docs/installation.md b/docs/installation.md index c971fbad99..8259040136 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -2,43 +2,38 @@ -- [Requirements](#requirements) - - [Helm](#helm) - - [Non-helm installation](#non-helm-installation) - - [OpenShift](#openshift) - - [Sumo Logic Account](#sumo-logic-account) - - [Sumo Logic fields](#sumo-logic-fields) -- [Add repository](#add-repository) -- [Prepare minimal configuration](#prepare-minimal-configuration) - - [Required parameters](#required-parameters) - - [Setting cluster name](#setting-cluster-name) - - [Proxy](#proxy) - - [Installing with existing Prometheus](#installing-with-existing-prometheus) - - [Installing in Openshift platform](#installing-in-openshift-platform) - - [Examples](#examples) - - [Minimal configuration](#minimal-configuration) -- [Install chart](#install-chart) -- [Customizing Installation](#customizing-installation) - - [Override names of the resources](#override-names-of-the-resources) - - [Authenticating with container registry](#authenticating-with-container-registry) - - [Collecting container logs](#collecting-container-logs) - - [Collecting application metrics](#collecting-application-metrics) - - [Collecting Kubernetes metrics](#collecting-kubernetes-metrics) - - [Collecting Kubernetes events](#collecting-kubernetes-events) -- [Viewing Data In Sumo Logic](#viewing-data-in-sumo-logic) -- [Troubleshooting Installation](#troubleshooting-installation) - - [General troubleshooting](#general-troubleshooting) - - [Installation fails with error `function "dig" not defined`](#installation-fails-with-error-function-dig-not-defined) - - [Error: timed out waiting for the condition](#error-timed-out-waiting-for-the-condition) - - [Error: collector with name 'sumologic' does not exist](#error-collector-with-name-sumologic-does-not-exist) - - [Secret 'sumologic::sumologic' exists, abort](#secret-sumologicsumologic-exists-abort) - - [OpenTelemetry Collector Pods Stuck in CreateContainerConfigError](#opentelemetry-collector-pods-stuck-in-createcontainerconfigerror) - - [Prometheus Troubleshooting](#prometheus-troubleshooting) -- [Upgrading Sumo Logic Collection](#upgrading-sumo-logic-collection) -- [Uninstalling Sumo Logic Collection](#uninstalling-sumo-logic-collection) - - [Post installation cleanup](#post-installation-cleanup) - - [Removing the kubelet Service](#removing-the-kubelet-service) - +- [Installation](#installation) + - [Requirements](#requirements) + - [Helm](#helm) + - [Add Helm Chart repository](#add-helm-chart-repository) + - [Sumo Logic Account](#sumo-logic-account) + - [Installation steps](#installation-steps) + - [Required parameters](#required-parameters) + - [Prepare minimal configuration](#prepare-minimal-configuration) + - [Install the Helm Chart](#install-the-helm-chart) + - [Viewing Data In Sumo Logic](#viewing-data-in-sumo-logic) + - [Customizing Installation](#customizing-installation) + - [Overriding names of resources](#overriding-names-of-resources) + - [Using a custom container registry](#using-a-custom-container-registry) + - [Proxy](#proxy) + - [Collecting container logs](#collecting-container-logs) + - [Collecting application metrics](#collecting-application-metrics) + - [Collecting Kubernetes metrics](#collecting-kubernetes-metrics) + - [Collecting Kubernetes events](#collecting-kubernetes-events) + - [Upgrading Sumo Logic Collection](#upgrading-sumo-logic-collection) + - [Uninstalling Sumo Logic Collection](#uninstalling-sumo-logic-collection) + - [Post uninstallation cleanup](#post-uninstallation-cleanup) + - [Troubleshooting Installation](#troubleshooting-installation) + - [General troubleshooting](#general-troubleshooting) + - [Installation fails with error `function "dig" not defined`](#installation-fails-with-error-function-dig-not-defined) + - [Sumo Logic fields](#sumo-logic-fields) + - [Error: timed out waiting for the condition](#error-timed-out-waiting-for-the-condition) + - [Error: collector with name 'sumologic' does not exist](#error-collector-with-name-sumologic-does-not-exist) + - [Secret 'sumologic::sumologic' exists, abort](#secret-sumologicsumologic-exists-abort) + - [OpenTelemetry Collector Pods Stuck in CreateContainerConfigError](#opentelemetry-collector-pods-stuck-in-createcontainerconfigerror) + - [Installing in OpenShift platform](#installing-in-openshift-platform) + - [Non-helm installation](#non-helm-installation) + - [OpenShift](#openshift) Our Helm chart deploys Kubernetes resources for collecting Kubernetes logs, metrics, and events; enriching them with deployment, pod, and service level metadata; and sends them to Sumo Logic. @@ -47,58 +42,16 @@ service level metadata; and sends them to Sumo Logic. ### Helm -Helm is required, but you can use it for template generation only, if you don't want to use it to manage your installation. +Sumo Logic’s Kubernetes Collection solution is packaged as a Helm Chart. See the [official documentation][install_helm] for installation +instructions for the Helm binary. -#### Non-helm installation +### Add Helm Chart repository -If you don't want to use Helm to manage the installation, please use `helm template` to generate Kubernetes templates and apply them using -Kubectl. - -> **Warning:** > Before upgrade, please delete the old jobs: - -- `kubectl delete job -n ${NAMESPACE} my-release-sumologic-setup` -- `kubectl delete job -n ${NAMESPACE} my-release-sumologic-ot-operator-instr` (needed only if `opentelemetry-operator.enabled=true`) - -Simply replace: - -```bash -helm upgrade \ - --install \ - -n `${NAMESPACE}` \ - --create-namespace \ - -f user-values.yaml \ - my-release \ - sumologic/sumologic -``` - -with +Before installing the chart, you need to add the `sumologic` Helm repository: ```bash -helm template \ - -n "${NAMESPACE}" \ - --create-namespace \ - -f user-values.yaml \ - my-release \ - sumologic/sumologic | tee sumologic-rendered.yaml -kubectl create namespace "${NAMESPACE}" -kubectl apply -f sumologic-rendered.yaml -n "${NAMESPACE}" -``` - -##### OpenShift - -For Openshift, you need to add `--api-versions=security.openshift.io/v1` argument to `helm template`, so the final set of upgrade commands -will look like the following: - -``` -helm template \ - --api-versions=security.openshift.io/v1` \ - -n "${NAMESPACE}" \ - --create-namespace \ - -f user-values.yaml \ - my-release \ - sumologic/sumologic | tee sumologic-rendered.yaml -kubectl create namespace "${NAMESPACE}" -kubectl apply -f sumologic-rendered.yaml -n "${NAMESPACE}" +helm repo add sumologic https://sumologic.github.io/sumologic-kubernetes-collection +helm repo update ``` ### Sumo Logic Account @@ -113,42 +66,9 @@ The following are required to set up Sumo Logic's Kubernetes collection. To get an idea of the resources this chart will require to run on your cluster, you can reference our [performance doc](performance.md). -### Sumo Logic fields - -Sumo Logic Apps for Kubernetes and Explore require below listed fields to be added in Sumo Logic UI to your Fields table schema. - -- `cluster` -- `container` -- `daemonset` -- `deployment` -- `host` -- `namespace` -- `node` -- `pod` -- `service` -- `statefulset` - -This is normally done in the setup job when `sumologic.setupEnabled` is set to `true` (default behavior). - -In an unlikely scenario that this fails please create them manually by visiting -[Fields#Manage_fields](https://help.sumologic.com/docs/manage/fields/#manage-fields) in Sumo Logic UI. - -This is to ensure your logs are tagged with relevant metadata. +[install_helm]: https://helm.sh/docs/intro/install/ -This is a one time setup per Sumo Logic account. - -## Add repository - -Before installing the chart, you need to add the `sumologic` Helm repo: - -```bash -helm repo add sumologic https://sumologic.github.io/sumologic-kubernetes-collection -helm repo update -``` - -## Prepare minimal configuration - -Next you can prepare a `user-values.yaml` file with your configuration. +## Installation steps ### Required parameters @@ -156,62 +76,12 @@ The Helm chart installation requires two parameter overrides: - `sumologic.accessId` - Sumo [Access ID](https://help.sumologic.com/docs/manage/security/access-keys/). - `sumologic.accessKey` - Sumo [Access key](https://help.sumologic.com/docs/manage/security/access-keys/). +- `sumologic.clusterName` - An identifier for your Kubernetes cluster. This is the name you will see for the cluster in Sumo Logic. Set a + different value for each cluster you install the Helm Chart in. -### Setting cluster name - -The following parameter is optional, but we recommend setting it. - -- `sumologic.clusterName` - An identifier for your Kubernetes cluster. This is the name you will see for the cluster in Sumo Logic. Default - is `kubernetes`. Whitespaces in the cluster name will be replaced with dashes. - -### Proxy - -If you are installing the collection in a cluster that requires proxying outbound requests, please see the following -[additional properties](installing-behind-proxy.md) you will need to set. - -### Installing with existing Prometheus - -If you already have Prometheus installed in your cluster, and would like to use it instead of the Prometheus instance provided by the Chart, -please see [Prometheus document](/docs/prometheus.md#prometheus) - -### Installing in OpenShift platform - -The daemonset/statefulset fails to create the pods in Openshift environment due to the request of elevated privileges, like HostPath mounts, -privileged: true, etc. - -If you wish to install the chart in the Openshift Platform, it requires a SCC resource which is only created in Openshift (detected via API -capabilities in the chart), you can add the following configuration to `user-values.yaml`: - -```yaml -sumologic: - scc: - create: true -otellogs: - daemonset: - containers: - otelcol: - securityContext: - privileged: true - initContainers: - changeowner: - securityContext: - privileged: true -tailing-sidecar-operator: - scc: - create: true -``` - -**Notice:** Prometheus Operator is deployed by default on OpenShift platform, you may either limit scope for Prometheus Operator installed -with Sumo Logic Kubernetes Collection using `kube-prometheus-stack.prometheusOperator.namespaces.additional` parameter in `user-values.yaml` -or exclude namespaces for Prometheus Operator installed with Sumo Logic Kubernetes Collection using -`kube-prometheus-stack.prometheusOperator.denyNamespaces` in `user-values.yaml`. For details see -[Prometheus document](/docs/prometheus.md#prometheus-operator-in-the-cluster) - -### Examples - -#### Minimal configuration +### Prepare minimal configuration -An example file with the minimum configuration is provided below. +Create a `user-values.yaml` file in your working directory with the following content: ```yaml sumologic: @@ -220,12 +90,9 @@ sumologic: clusterName: ${MY_CLUSTER_NAME} ``` -More configuration examples (i.e. OpenShift) can be seen in [this document](/docs/configuration-examples.md). - -## Install chart +### Install the Helm Chart -Now you can install our chart. The following command will install the Sumo Logic chart with the release name `my-release` in the -`${NAMESPACE}` namespace. +The following command will install the Sumo Logic chart with the release name `my-release` in the `${NAMESPACE}` namespace. ```bash helm upgrade \ @@ -241,11 +108,22 @@ helm upgrade \ > > **Note**: If the namespace doesn't exists, it will be created. +![installed](/images/helm_chart_installed.png) + +More configuration examples (i.e. OpenShift) can be seen in [this document](/docs/configuration-examples.md). + +## Viewing Data In Sumo Logic + +Once you have completed installation, you can [install the Kubernetes App and view the dashboards][sumo-k8s-app-dashboards] or [open a new +Explore tab] in Sumo Logic. If you do not see data in Sumo Logic, you can review our [troubleshooting guide](troubleshoot-collection.md). + +[sumo-k8s-app-dashboards]: https://help.sumologic.com/docs/integrations/containers-orchestration/kubernetes#installing-the-kubernetes-app +[open a new explore tab]: https://help.sumologic.com/docs/observability/kubernetes/monitoring#open-explore + ## Customizing Installation -All default properties for the Helm chart can be found in our [documentation](/deploy/helm/sumologic/README.md). We recommend creating a new -`user-values.yaml` for each Kubernetes cluster you wish to install collection on and **setting only the properties you wish to override**. -Once you have customized you should use the following commands to install or upgrade. +We recommend creating a new user-values.yaml for each Kubernetes cluster you wish to install collection in and setting only the properties +you wish to override. Once you have customized it you should use the following commands to install or upgrade. ```bash helm upgrade \ @@ -257,28 +135,21 @@ helm upgrade \ sumologic/sumologic ``` -We documented some common customizations: - -- [Override names of the resources](#override-names-of-the-resources) -- [Authenticating with container registry](#authenticating-with-container-registry) -- [Collecting container logs](#collecting-container-logs) -- [Collecting application metrics](#collecting-application-metrics) -- [Collecting Kubernetes metrics](#collecting-kubernetes-metrics) -- [Collecting Kubernetes events](#collecting-kubernetes-events) +We documented some common customizations below: -### Override names of the resources +### Overriding names of resources If you want to override the names of the resources created by the chart, see [Overriding chart resource names with `fullnameOverride`](best-practices.md#overriding-chart-resource-names-with-fullnameoverride). -### Authenticating with container registry +### Using a custom container registry -Sumo Logic container images used for collection are currently hosted on [Amazon Public ECR][aws-public-ecr-docs] which requires -authentication to provide a higher quota for image pulls. To find a comprehensive information on this please refer to [Amazon Elastic -Container Registry pricing][aws-ecr-pricing]. +Container images used by this Helm Chart are currently hosted on [Amazon Public ECR][aws-public-ecr-docs] which requires authentication to +provide a higher quota for image pulls. To find a comprehensive information on this please refer to [Amazon Elastic Container Registry +pricing][aws-ecr-pricing]. Please refer to [our instructions](/docs/working-with-container-registries.md#authenticating-with-container-registry) on how to provide -credentials in order to authenticate with Docker Hub. +credentials in order to authenticate with Public ECR. An alternative would be to host Sumo Logic container images in one's container registries. To do so please refer to the following [instructions](/docs/working-with-container-registries.md#hosting-sumo-logic-images) @@ -286,6 +157,11 @@ An alternative would be to host Sumo Logic container images in one's container r [aws-public-ecr-docs]: https://aws.amazon.com/blogs/aws/amazon-ecr-public-a-new-public-container-registry/ [aws-ecr-pricing]: https://aws.amazon.com/ecr/pricing/ +### Proxy + +If you are installing the collection in a cluster that requires proxying outbound requests, please see the following +[additional properties](installing-behind-proxy.md) you will need to set. + ### Collecting container logs Refer to [Collecting Container Logs document](/docs/collecting-container-logs.md#collecting-container-logs) @@ -302,13 +178,67 @@ Refer to [Collecting Kubernetes Metrics document](/docs/collecting-kubernetes-me Refer to [Collecting Kubernetes Events document](/docs/collecting-kubernetes-events.md#collecting-kubernetes-events) -## Viewing Data In Sumo Logic +## Upgrading Sumo Logic Collection -Once you have completed installation, you can [install the Kubernetes App and view the dashboards][sumo-k8s-app-dashboards] or [open a new -Explore tab] in Sumo Logic. If you do not see data in Sumo Logic, you can review our [troubleshooting guide](troubleshoot-collection.md). +To upgrade our helm chart to a newer version, you must first run update your local helm repo. -[sumo-k8s-app-dashboards]: https://help.sumologic.com/docs/integrations/containers-orchestration/kubernetes#installing-the-kubernetes-app -[open a new explore tab]: https://help.sumologic.com/docs/observability/kubernetes/monitoring#open-explore +```bash +helm repo update +``` + +Next, you can run `helm upgrade --install` to upgrade to that version. The following upgrades the current version of `my-release` to the +latest. + +```bash +helm upgrade --install my-release sumologic/sumologic -f `user-values.yaml` +``` + +If you wish to upgrade to a specific version, you can use the `--version` flag. + +```bash +helm upgrade --install my-release sumologic/sumologic -f `user-values.yaml` --version=2.0.0 +``` + +**Note:** If you no longer have your `user-values.yaml` from the first installation or do not remember the options you added via `--set` you +can run the following to see the values for the currently installed helm chart. For example, if the release is called `my-release` you can +run the following. + +```bash +helm get values my-release +``` + +If something goes wrong, or you want to go back to the previous version, you can +[rollback changes using helm](https://helm.sh/docs/helm/helm_rollback/): + +``` +helm history my-release +helm rollback my-release +``` + +## Uninstalling Sumo Logic Collection + +To uninstall/delete the Helm chart: + +```bash +helm delete my-release +``` + +> **Helm3 Tip**: In Helm3 the default behavior is to purge history. Use --keep-history to preserve it while deleting the release. + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +### Post uninstallation cleanup + +In order to clean up the Kubernetes secret and associated hosted collector one can use the optional cleanup job by setting +`sumologic.cleanupEnabled` to `true`. + +Alternatively the secret can be removed manually with: + +```bash +kubectl delete secret sumologic +``` + +and the associated hosted collector can be deleted in the Sumo Logic UI. ## Troubleshooting Installation @@ -322,6 +252,30 @@ You need to use a more recent version of Helm. See [Minimum Requirements](/docs/ If you are using ArgoCD or another tool that uses Helm under the hood, make sure that tool uses the required version of Helm. +### Sumo Logic fields + +Sumo Logic Apps for Kubernetes and Explore require below listed fields to be added in Sumo Logic UI to your Fields table schema. + +- `cluster` +- `container` +- `daemonset` +- `deployment` +- `host` +- `namespace` +- `node` +- `pod` +- `service` +- `statefulset` + +This is normally done in the setup job when `sumologic.setupEnabled` is set to `true` (default behavior). + +In an unlikely scenario that this fails please create them manually by visiting +[Fields#Manage_fields](https://help.sumologic.com/docs/manage/fields/#manage-fields) in Sumo Logic UI. + +This is to ensure your logs are tagged with relevant metadata. + +This is a one time setup per Sumo Logic account. + ### Error: timed out waiting for the condition If `helm upgrade --install` hangs, it usually means the pre-install setup job is failing and is in a retry loop. Due to a Helm limitation, @@ -388,87 +342,87 @@ Get the logs from that pod: kubectl logs POD_NAME -f ``` -### Prometheus Troubleshooting - -Please refer to [Troubleshooting section in Prometheus document](/docs/prometheus.md#troubleshooting). - -## Upgrading Sumo Logic Collection - -To upgrade our helm chart to a newer version, you must first run update your local helm repo. - -```bash -helm repo update -``` - -Next, you can run `helm upgrade --install` to upgrade to that version. The following upgrades the current version of `my-release` to the -latest. +## Installing in OpenShift platform -```bash -helm upgrade --install my-release sumologic/sumologic -f `user-values.yaml` -``` +The daemonset/statefulset fails to create the pods in Openshift environment due to the request of elevated privileges, like HostPath mounts, +privileged: true, etc. -If you wish to upgrade to a specific version, you can use the `--version` flag. +If you wish to install the chart in the Openshift Platform, it requires a SCC resource which is only created in Openshift (detected via API +capabilities in the chart), you can add the following configuration to `user-values.yaml`: -```bash -helm upgrade --install my-release sumologic/sumologic -f `user-values.yaml` --version=2.0.0 +```yaml +sumologic: + scc: + create: true +otellogs: + daemonset: + containers: + otelcol: + securityContext: + privileged: true + initContainers: + changeowner: + securityContext: + privileged: true +tailing-sidecar-operator: + scc: + create: true ``` -**Note:** If you no longer have your `user-values.yaml` from the first installation or do not remember the options you added via `--set` you -can run the following to see the values for the currently installed helm chart. For example, if the release is called `my-release` you can -run the following. +**Notice:** Prometheus Operator is deployed by default on OpenShift platform, you may either limit scope for Prometheus Operator installed +with Sumo Logic Kubernetes Collection using `kube-prometheus-stack.prometheusOperator.namespaces.additional` parameter in `user-values.yaml` +or exclude namespaces for Prometheus Operator installed with Sumo Logic Kubernetes Collection using +`kube-prometheus-stack.prometheusOperator.denyNamespaces` in `user-values.yaml`. For details see +[Prometheus document](/docs/prometheus.md#prometheus-operator-in-the-cluster) -```bash -helm get values my-release -``` +## Non-helm installation -If something goes wrong, or you want to go back to the previous version, you can -[rollback changes using helm](https://helm.sh/docs/helm/helm_rollback/): +If you don't want to use Helm to manage the installation, please use `helm template` to generate Kubernetes templates and apply them using +Kubectl. -``` -helm history my-release -helm rollback my-release -``` +> **Warning:** > Before upgrade, please delete the old jobs: -## Uninstalling Sumo Logic Collection +- `kubectl delete job -n ${NAMESPACE} my-release-sumologic-setup` +- `kubectl delete job -n ${NAMESPACE} my-release-sumologic-ot-operator-instr` (needed only if `opentelemetry-operator.enabled=true`) -To uninstall/delete the Helm chart: +Simply replace: ```bash -helm delete my-release +helm upgrade \ + --install \ + -n `${NAMESPACE}` \ + --create-namespace \ + -f user-values.yaml \ + my-release \ + sumologic/sumologic ``` -> **Helm3 Tip**: In Helm3 the default behavior is to purge history. Use --keep-history to preserve it while deleting the release. - -The command removes all the Kubernetes components associated with the chart and deletes the release. - -### Post installation cleanup - -In order to clean up the Kubernetes secret and associated hosted collector one can use the optional cleanup job by setting -`sumologic.cleanupEnabled` to `true`. - -Alternatively the secret can be removed manually with: +with ```bash -kubectl delete secret sumologic +helm template \ + -n "${NAMESPACE}" \ + --create-namespace \ + -f user-values.yaml \ + my-release \ + sumologic/sumologic | tee sumologic-rendered.yaml +kubectl create namespace "${NAMESPACE}" +kubectl apply -f sumologic-rendered.yaml -n "${NAMESPACE}" ``` -and the associated hosted collector can be deleted in the Sumo Logic UI. - -### Removing the kubelet Service +### OpenShift -The Helm chart uses the Prometheus Operator to manage Prometheus instances. This operator creates a Service for scraping metrics exposed by -the kubelet (subject to configuration in the `kube-prometheus-stack.prometheusOperator.kubeletService` key in `user-values.yaml`), which -isn't removed by the chart uninstall process. This Service is largely harmless, but can cause issues if a different release of the chart is -installed, resulting in duplicated metrics from the kubelet. See -[this issue](https://github.com/SumoLogic/sumologic-kubernetes-collection/issues/1101) and the corresponding -[upstream issue](https://github.com/prometheus-community/helm-charts/issues/1523) for a more detailed explanation. - -To remove this service after uninstalling the chart, run: +For Openshift, you need to add `--api-versions=security.openshift.io/v1` argument to `helm template`, so the final set of upgrade commands +will look like the following: -```bash -kubectl delete svc -kube-prometheus-kubelet -n kube-system ``` - -Please keep in mind that if you've changed any configuration values related to this service (they reside under the -`kube-prometheus-stack.prometheusOperator.kubeletService` key in `user-values.yaml`), you should substitute those values in the command -provided above. +helm template \ + --api-versions=security.openshift.io/v1` \ + -n "${NAMESPACE}" \ + --create-namespace \ + -f user-values.yaml \ + my-release \ + sumologic/sumologic | tee sumologic-rendered.yaml +kubectl create namespace "${NAMESPACE}" +kubectl apply -f sumologic-rendered.yaml -n "${NAMESPACE}" +``` diff --git a/images/helm_chart_installed.png b/images/helm_chart_installed.png new file mode 100644 index 0000000000000000000000000000000000000000..cc1fa72ad875de467537e4d7abbe9ac6ed96ee7f GIT binary patch literal 50069 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%0DIB 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