From eb523f3f915ba70558dccbdf9f366253c6b6d537 Mon Sep 17 00:00:00 2001 From: AnchorArray Date: Tue, 18 Jun 2024 15:10:19 -0700 Subject: [PATCH] update documentation --- README.md | 52 +++---- charts/guardrails/README.md | 66 +++++++-- charts/guardrails/README.md.gotmpl | 66 +++++++-- charts/scaffold/.helmignore | 23 --- charts/scaffold/CHANGELOG.md | 19 --- charts/scaffold/Chart.yaml | 6 - charts/scaffold/README.md | 102 ------------- charts/scaffold/README.md.gotmpl | 76 ---------- charts/scaffold/templates/NOTES.txt | 55 ------- charts/scaffold/templates/_helpers.tpl | 65 --------- charts/scaffold/templates/deployment.yaml | 97 ------------ charts/scaffold/templates/hpa.yaml | 32 ---- charts/scaffold/templates/ingress.yaml | 61 -------- charts/scaffold/templates/service.yaml | 19 --- charts/scaffold/templates/serviceaccount.yaml | 13 -- charts/scaffold/values.yaml | 138 ------------------ charts/whylogs/README.md | 65 +++++---- charts/whylogs/README.md.gotmpl | 65 +++++---- 18 files changed, 215 insertions(+), 805 deletions(-) delete mode 100644 charts/scaffold/.helmignore delete mode 100644 charts/scaffold/CHANGELOG.md delete mode 100644 charts/scaffold/Chart.yaml delete mode 100644 charts/scaffold/README.md delete mode 100644 charts/scaffold/README.md.gotmpl delete mode 100644 charts/scaffold/templates/NOTES.txt delete mode 100644 charts/scaffold/templates/_helpers.tpl delete mode 100644 charts/scaffold/templates/deployment.yaml delete mode 100644 charts/scaffold/templates/hpa.yaml delete mode 100644 charts/scaffold/templates/ingress.yaml delete mode 100644 charts/scaffold/templates/service.yaml delete mode 100644 charts/scaffold/templates/serviceaccount.yaml delete mode 100644 charts/scaffold/values.yaml diff --git a/README.md b/README.md index 6a88a59..d4db411 100644 --- a/README.md +++ b/README.md @@ -10,71 +10,67 @@ > command, followed by specifying the chart's `.tgz` file, to access and utilize > our Helm charts. -### Example Using the [LangKit Helm Chart](./charts/langkit/) +### Example Using the [Guardrails Helm Chart](./charts/guardrails/) #### Quick Start ```shell -# Downloads a .tgz file to the working directory or --destination path +chart_version="" + +# The following command will download a guardrails-${chart_version}.tgz file to +# the working directory or --destination path helm pull \ - oci://ghcr.io/whylabs/langkit \ - --version "0.10.0" + oci://ghcr.io/whylabs/guardrails \ + --version "${chart_version}" +# Requires the helm-diff plugin to be installed: +# helm plugin install https://github.com/databus23/helm-diff helm diff upgrade \ --allow-unreleased \ - --namespace langkit \ - `# Specify the .tgz file as the chart` \ - langkit langkit-0.10.0.tgz + --namespace guardrails \ + guardrails "guardrails-${chart_version}.tgz" helm upgrade --install \ --create-namespace \ - --namespace langkit \ - langkit langkit-0.10.0.tgz + --namespace guardrails \ + guardrails "guardrails-${chart_version}.tgz" ``` #### Extended Example ```shell # Configure local variables for clarity and simplicity helm_repo="ghcr.io/whylabs" -chart_name="langkit" -chart_version="0.10.0" -chart="${chart_name}-${chart_version}.tgz" - -# Release and namespace values mirror other variables for simplicity. -# Set these to as desired -release="${chart_name}" -namespace="${release}" +chart_name="guardrails" +chart_version="1.0.0" +chart_file="${chart_name}-${chart_version}.tgz" +namespace="default" -# Downloads -.tgz to your current directory +# Downloads ${chart_name}-${chart_version}.tgz to your current directory helm pull \ "oci://${helm_repo}/${chart_name}" \ --version "${chart_version}" -# Performs a diff between current and proposed state -# --allow-unreleased flag will perform a diff even if there is no current state, -# i.e. a fresh installation will display all net new resource creation in the -# diff. --set namespace.create=false must be set if target namespace already -# exists; omit this line or set it to "true" if the target namespace should be -# created. Requires the helm-diff plugin to be installed: +# Perform a diff between current and proposed state +# Requires the helm-diff plugin to be installed: # `helm plugin install https://github.com/databus23/helm-diff` helm diff upgrade \ --allow-unreleased \ --namespace "${namespace}" \ - "${release}" "${chart}" + "${chart_name}" "${chart_file}" -# helm upgrade --install supports installation and upgrades. +# helm upgrade --install supports initial installation and upgrades. # In the `helm upgrade --install ` command, the chart may # be a chart reference('example/postgres'), a path to a chart directory, a fully # qualified URL, or a packaged chart (.tgz), which is what this example uses. helm upgrade --install \ --create-namespace \ --namespace "${namespace}" \ - "${release}" "${chart}" + "${chart_name}" "${chart_file}" # Uninstall helm uninstall \ --namespace "${namespace}" \ - "${release}" + "${chart_name}" ``` ## Development diff --git a/charts/guardrails/README.md b/charts/guardrails/README.md index 1a7a14c..62fa9d4 100644 --- a/charts/guardrails/README.md +++ b/charts/guardrails/README.md @@ -4,20 +4,69 @@ A Helm chart for WhyLabs Guardrails -## Installing the Chart +## Prerequisites + +### API Key + +Create a [WhyLabs API Key](https://docs.whylabs.ai/docs/whylabs-api/#creating-an-api-token) +that will be used when creating the required Kubernetes secrets to authenticate +with the WhyLabs API. + +### Secrets + +Use the following `kubectl` commands to create the required Kubernetes +`Secrets`. These secrets must exist prior to installing the Helm chart. ```shell -# Downloads a .tgz file to the working directory or --destination path +# API that was created above +whylabs_api_key="" +# Arbitrary value that will be required to make requests to the containers +container_password="" +# Change this to the desired namespace +target_namespace="default" + +kubectl create secret generic whylabs--api-key \ + --namespace "${target_namespace}" \ + --from-literal=WHYLABS_API_KEY="${whylabs_api_key}" + +kubectl create secret generic whylabs--api-secret \ + --namespace "${target_namespace}" \ + --from-literal=CONTAINER_PASSWORD="${container_password}" + +kubectl create secret docker-registry whylabs--registry-credentials \ + --namespace "${target_namespace}" \ + --docker-server="registry.gitlab.com" \ + --docker-username="" \ + --docker-password="" \ + --docker-email="" +``` + +## Installation & Upgrades + +### How to Use WhyLabs Helm Repository + +> :warning: WhyLab's Helm charts are hosted on GitHub Container Registry (GHCR), +> an OCI-compliant storage solution. GHCR aligns with industry standards for +> container artifact storage and has a slightly different API to be aware of. +> Use the `helm pull` command to download the a `.tgz` archive of the chart. +> Reference the `.tgz` archive as the chart identifier when installing. + +```shell +# Specify the namespace to install the chart into +target_namespace="" + +# The following command will download a guardrails-${chart_version}.tgz file to +# the working directory or --destination path helm pull \ oci://ghcr.io/whylabs/guardrails \ --version 0.2.0 +# Requires the helm-diff plugin to be installed: +# helm plugin install https://github.com/databus23/helm-diff helm diff upgrade \ --allow-unreleased \ - --namespace \ - `# Specify the .tgz file as the chart` \ - guardrails - guardrails-0.2.0.tgz + --namespace "${target_namespace}" \ + guardrails guardrails-0.2.0.tgz ``` After you've installed the repo you can install the chart. @@ -25,9 +74,8 @@ After you've installed the repo you can install the chart. ```shell helm upgrade --install \ --create-namespace \ - --namespace \ - guardrails - guardrails-0.2.0.tgz + --namespace "${target_namespace}" \ + guardrails guardrails-0.2.0.tgz ``` ## Horizontal Pod Autoscaling (HPA) diff --git a/charts/guardrails/README.md.gotmpl b/charts/guardrails/README.md.gotmpl index 64cf9d8..0b8ff6d 100644 --- a/charts/guardrails/README.md.gotmpl +++ b/charts/guardrails/README.md.gotmpl @@ -11,20 +11,69 @@ {{ template "chart.sourcesSection" . }} -## Installing the Chart +## Prerequisites + +### API Key + +Create a [WhyLabs API Key](https://docs.whylabs.ai/docs/whylabs-api/#creating-an-api-token) +that will be used when creating the required Kubernetes secrets to authenticate +with the WhyLabs API. + +### Secrets + +Use the following `kubectl` commands to create the required Kubernetes +`Secrets`. These secrets must exist prior to installing the Helm chart. ```shell -# Downloads a .tgz file to the working directory or --destination path +# API that was created above +whylabs_api_key="" +# Arbitrary value that will be required to make requests to the containers +container_password="" +# Change this to the desired namespace +target_namespace="default" + +kubectl create secret generic whylabs--api-key \ + --namespace "${target_namespace}" \ + --from-literal=WHYLABS_API_KEY="${whylabs_api_key}" + +kubectl create secret generic whylabs--api-secret \ + --namespace "${target_namespace}" \ + --from-literal=CONTAINER_PASSWORD="${container_password}" + +kubectl create secret docker-registry whylabs--registry-credentials \ + --namespace "${target_namespace}" \ + --docker-server="registry.gitlab.com" \ + --docker-username="" \ + --docker-password="" \ + --docker-email="" +``` + +## Installation & Upgrades + +### How to Use WhyLabs Helm Repository + +> :warning: WhyLab's Helm charts are hosted on GitHub Container Registry (GHCR), +> an OCI-compliant storage solution. GHCR aligns with industry standards for +> container artifact storage and has a slightly different API to be aware of. +> Use the `helm pull` command to download the a `.tgz` archive of the chart. +> Reference the `.tgz` archive as the chart identifier when installing. + +```shell +# Specify the namespace to install the chart into +target_namespace="" + +# The following command will download a guardrails-${chart_version}.tgz file to +# the working directory or --destination path helm pull \ oci://ghcr.io/whylabs/{{ template "chart.name" . }} \ --version {{ template "chart.version" . }} +# Requires the helm-diff plugin to be installed: +# helm plugin install https://github.com/databus23/helm-diff helm diff upgrade \ --allow-unreleased \ - --namespace \ - `# Specify the .tgz file as the chart` \ - {{ template "chart.name" . }} - {{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz + --namespace "${target_namespace}" \ + {{ template "chart.name" . }} {{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz ``` After you've installed the repo you can install the chart. @@ -32,9 +81,8 @@ After you've installed the repo you can install the chart. ```shell helm upgrade --install \ --create-namespace \ - --namespace \ - {{ template "chart.name" . }} - {{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz + --namespace "${target_namespace}" \ + {{ template "chart.name" . }} {{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz ``` ## Horizontal Pod Autoscaling (HPA) diff --git a/charts/scaffold/.helmignore b/charts/scaffold/.helmignore deleted file mode 100644 index 0e8a0eb..0000000 --- a/charts/scaffold/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# 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 -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/scaffold/CHANGELOG.md b/charts/scaffold/CHANGELOG.md deleted file mode 100644 index 2baa79f..0000000 --- a/charts/scaffold/CHANGELOG.md +++ /dev/null @@ -1,19 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning] -(https://semver.org/spec/v2.0.0.html). - -## [0.2.0] - 2024-05-14 - -### Updated - -- Default image tag from `1.0.19` to `1.0.20-dev2` - -## [0.1.0] - 2024-05-08 - -### Added - -- Initial release of `` Helm chart diff --git a/charts/scaffold/Chart.yaml b/charts/scaffold/Chart.yaml deleted file mode 100644 index 1a8cb67..0000000 --- a/charts/scaffold/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -name: -description: A Helm chart for WhyLabs -type: application -version: 0.2.0 -appVersion: "1.0.20-dev2" diff --git a/charts/scaffold/README.md b/charts/scaffold/README.md deleted file mode 100644 index b3d6c9d..0000000 --- a/charts/scaffold/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# - -![Version: 0.2.0](https://img.shields.io/badge/Version-0.2.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.0.20-dev2](https://img.shields.io/badge/AppVersion-1.0.20--dev2-informational?style=flat-square) - -A Helm chart for WhyLabs - -## Installing the Chart - -```shell -# Downloads a .tgz file to the working directory or --destination path -helm pull \ - oci://ghcr.io/whylabs/ \ - --version 0.2.0 - -helm diff upgrade \ - --allow-unreleased \ - --namespace \ - `# Specify the .tgz file as the chart` \ - - -0.2.0.tgz -``` - -After you've installed the repo you can install the chart. - -```shell -helm upgrade --install \ - --create-namespace \ - --namespace \ - - -0.2.0.tgz -``` - -## Horizontal Pod Autoscaling (HPA) - -The Horizontal Pod Autoscaler automatically scales the number of pods in a -replication controller, deployment, replica set or stateful set based on -observed CPU utilization (or, with custom metrics support, on some other -application-provided metrics). The Horizontal Pod Autoscaler uses the following -formula to calculate the desired number of pods: - -```text -Desired Replicas = [ (Current Utilization / Target Utilization) * Current Replicas ] -``` - -For example, if an HPA is configured with a target CPU utilization of 50%, there -are currently 3 pods, and the current average CPU utilization is 90%, the number -of replicas will be scaled to 6: - -```text -Desired Replicas = ⌈ (90% / 50%) * 3 ⌉ - = ⌈ 1.8 * 3 ⌉ - = ⌈ 5.4 ⌉ - = 6 -``` - -HPA uses the same formula for both increasing and decreasing the number of pods. -Horizontal pod scaling is disabled by default. To enable it, set the -`hpa.enabled` key to `true`. The pods QoS class will impact HPA behavior as a -deployment that is allowed to burst CPU usage will cause more aggressive HPA -scaling than a deployment with a `Guaranteed` QoS that does not go above 100% -utilization. - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | Affinity settings for `Pod` [scheduling](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/). If an explicit label selector is not provided for pod affinity or pod anti-affinity one will be created from the pod selector labels. | -| autoscaling | object | `{"enabled":false,"maxReplicas":100,"minReplicas":1,"targetCPUUtilizationPercentage":70}` | [Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) configuration for the `` container. | -| commonLabels | object | `{}` | Labels to add to all chart resources. | -| env | object | `{}` | [Environment variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) for the `` container. | -| extraVolumeMounts | list | `[]` | Extra [volume mounts](https://kubernetes.io/docs/concepts/storage/volumes/) for the `` container. | -| extraVolumes | list | `[]` | Extra [volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the `Pod`. | -| fullnameOverride | string | `""` | Override the full name of the chart. | -| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy for the `` container. | -| image.repository | string | `"registry.gitlab.com/whylabs/langkit-container"` | Image repository for the `` container. | -| image.tag | string | `""` | Image tag for the `` container, this will default to `.Chart.AppVersion` if not set. | -| imagePullSecrets[0] | list | `{"name":""}` | Image pull secrets for the `` container. Defaults to `whylabs-{{ .Release.Name }}-registry-credentials`. | -| ingress | object | `{"annotations":{},"className":"","enabled":false,"hosts":[{"host":"chart-example.local","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}],"tls":[]}` | [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) configuration for the `` container. | -| livenessProbe | object | `{"failureThreshold":3,"httpGet":{"path":"/health","port":8000},"initialDelaySeconds":30,"periodSeconds":30}` | [Liveness probe](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) configuration for the `` container. | -| nameOverride | string | `""` | Override the name of the chart. | -| nodeSelector | object | `{}` | Node labels to match for `Pod` [scheduling](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/). | -| podAnnotations | object | `{}` | Annotations to add to the `Pod`. | -| podLabels | object | `{}` | Labels to add to the `Pod`. | -| podSecurityContext | object | `{"runAsNonRoot":true}` | [Pod security context](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#podsecuritycontext-v1-core), this supports full customisation. | -| readinessProbe | object | `{"failureThreshold":10,"httpGet":{"path":"/health","port":8000},"initialDelaySeconds":30,"periodSeconds":30}` | [Readiness probe](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) configuration for the `` container. | -| replicaCount | int | `4` | Number of replicas for the service. | -| resources | object | `{"limits":{"cpu":"4","ephemeral-storage":"250Mi","memory":"4Gi"},"requests":{"cpu":"4","ephemeral-storage":"250Mi","memory":"4Gi"}}` | [Resources](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) for the `` container. | -| securityContext | object | `{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"privileged":false,"readOnlyRootFilesystem":true,"runAsNonRoot":true,"runAsUser":1000}` | [Security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container) for the `` container. | -| service.annotations | object | `{}` | Service annotations. | -| service.port | int | `80` | Service HTTP port. | -| service.targetPort | int | `8000` | The port on which the application container is listening. | -| service.type | string | `"ClusterIP"` | Service Type, i.e. ClusterIp, LoadBalancer, etc. | -| serviceAccount.annotations | object | `{}` | Annotations to add to the service account. | -| serviceAccount.automount | bool | `true` | Set this to `false` to [opt out of API credential automounting](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#opt-out-of-api-credential-automounting) for the `ServiceAccount`. | -| serviceAccount.create | bool | `true` | If `true`, create a new `ServiceAccount`. | -| serviceAccount.labels | object | `{}` | Labels to add to the service account. | -| serviceAccount.name | string | `""` | If this is set and `serviceAccount.create` is `true` this will be used for the created `ServiceAccount` name, if set and `serviceAccount.create` is `false` then this will define an existing `ServiceAccount` to use. | -| tolerations | list | `[]` | Node taints which will be tolerated for `Pod` [scheduling](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/). | - ----------------------------------------------- - -Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/). \ No newline at end of file diff --git a/charts/scaffold/README.md.gotmpl b/charts/scaffold/README.md.gotmpl deleted file mode 100644 index 64cf9d8..0000000 --- a/charts/scaffold/README.md.gotmpl +++ /dev/null @@ -1,76 +0,0 @@ -{{ template "chart.header" . }} -{{ template "chart.deprecationWarning" . }} - -{{ template "chart.badgesSection" . }} - -{{ template "chart.description" . }} - -{{ template "chart.homepageLine" . }} - -{{ template "chart.maintainersSection" . }} - -{{ template "chart.sourcesSection" . }} - -## Installing the Chart - -```shell -# Downloads a .tgz file to the working directory or --destination path -helm pull \ - oci://ghcr.io/whylabs/{{ template "chart.name" . }} \ - --version {{ template "chart.version" . }} - -helm diff upgrade \ - --allow-unreleased \ - --namespace \ - `# Specify the .tgz file as the chart` \ - {{ template "chart.name" . }} - {{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz -``` - -After you've installed the repo you can install the chart. - -```shell -helm upgrade --install \ - --create-namespace \ - --namespace \ - {{ template "chart.name" . }} - {{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz -``` - -## Horizontal Pod Autoscaling (HPA) - -The Horizontal Pod Autoscaler automatically scales the number of pods in a -replication controller, deployment, replica set or stateful set based on -observed CPU utilization (or, with custom metrics support, on some other -application-provided metrics). The Horizontal Pod Autoscaler uses the following -formula to calculate the desired number of pods: - -```text -Desired Replicas = [ (Current Utilization / Target Utilization) * Current Replicas ] -``` - -For example, if an HPA is configured with a target CPU utilization of 50%, there -are currently 3 pods, and the current average CPU utilization is 90%, the number -of replicas will be scaled to 6: - -```text -Desired Replicas = ⌈ (90% / 50%) * 3 ⌉ - = ⌈ 1.8 * 3 ⌉ - = ⌈ 5.4 ⌉ - = 6 -``` - -HPA uses the same formula for both increasing and decreasing the number of pods. -Horizontal pod scaling is disabled by default. To enable it, set the -`hpa.enabled` key to `true`. The pods QoS class will impact HPA behavior as a -deployment that is allowed to burst CPU usage will cause more aggressive HPA -scaling than a deployment with a `Guaranteed` QoS that does not go above 100% -utilization. - -{{ template "chart.requirementsSection" . }} - -{{ template "chart.valuesSection" . }} - ----------------------------------------------- - -Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/). \ No newline at end of file diff --git a/charts/scaffold/templates/NOTES.txt b/charts/scaffold/templates/NOTES.txt deleted file mode 100644 index 555f371..0000000 --- a/charts/scaffold/templates/NOTES.txt +++ /dev/null @@ -1,55 +0,0 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include ".fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include ".fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include ".fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") - echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include ".name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT -{{- end }} - -2. Ensure the necessary secrets are created. Your application requires specific secrets to function properly: - - - Secret for API Key: `whylabs-{{ .Release.Name }}-api-key` - - Secret for API Secret: `whylabs-{{ .Release.Name }}-api-secret` - - Secret for pulling private image: `whylabs-{{ .Release.Name }}-registry-credentials` - - You can create these secrets with the following commands: - ``` - kubectl create secret generic whylabs-{{ .Release.Name }}-api-key \ - --namespace {{ .Release.Namespace }} \ - --from-literal=WHYLABS_API_KEY='' - - kubectl create secret generic whylabs-{{ .Release.Name }}-api-secret \ - --namespace {{ .Release.Namespace }} \ - --from-literal=CONTAINER_PASSWORD='' - - kubectl create secret docker-registry whylabs-{{ .Release.Name }}-registry-credentials \ - --namespace {{ .Release.Namespace }} \ - --docker-server="registry.gitlab.com" \ - --docker-username="" \ - --docker-password="" \ - --docker-email="" - ``` - - Replace `` and other values with the actual values you need to use. - -3. After creating the secrets, verify that they are correctly set up by running: - - ``` - kubectl get secrets --namespace {{ .Release.Namespace }} - ``` - diff --git a/charts/scaffold/templates/_helpers.tpl b/charts/scaffold/templates/_helpers.tpl deleted file mode 100644 index e9e9a22..0000000 --- a/charts/scaffold/templates/_helpers.tpl +++ /dev/null @@ -1,65 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define ".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 ".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 ".chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define ".labels" -}} -helm.sh/chart: {{ include ".chart" . }} -{{ include ".selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- with .Values.commonLabels }} -{{ toYaml . }} -{{- end }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define ".selectorLabels" -}} -app.kubernetes.io/name: {{ include ".name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define ".serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include ".fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/charts/scaffold/templates/deployment.yaml b/charts/scaffold/templates/deployment.yaml deleted file mode 100644 index 7f94640..0000000 --- a/charts/scaffold/templates/deployment.yaml +++ /dev/null @@ -1,97 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include ".fullname" . }} - labels: - {{- include ".labels" . | nindent 4 }} -spec: - revisionHistoryLimit: 1 - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include ".selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include ".labels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - imagePullSecrets: - {{- if .Values.imagePullSecrets }} - {{- range .Values.imagePullSecrets }} - {{- if .name }} - - name: {{ .name }} - {{- else }} - - name: whylabs-{{ $.Release.Name }}-registry-credentials - {{- end }} - {{- end }} - {{- else }} - - name: whylabs-{{ .Release.Name }}-registry-credentials - {{- end }} - serviceAccountName: {{ include ".serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - {{- if .Values.env }} - env: - {{- range $key, $value := .Values.env }} - - name: {{ $key }} - value: {{ $value | quote }} - {{- end }} - {{- end }} - envFrom: - - secretRef: - name: whylabs-{{ .Release.Name }}-api-key - - secretRef: - name: whylabs-{{ .Release.Name }}-api-secret - ports: - - name: http - containerPort: {{ .Values.service.targetPort }} - protocol: TCP - livenessProbe: - {{- toYaml .Values.livenessProbe | nindent 12 }} - readinessProbe: - {{- toYaml .Values.readinessProbe | nindent 12 }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: temp-dir - mountPath: /tmp - {{- if .Values.extraVolumeMounts }} - {{- with .extraVolumeMounts }} - {{- toYaml . | nindent 12 }} - {{- end }} - {{- end }} - volumes: - - name: temp-dir - emptyDir: {} - {{- if .Values.extraVolumes }} - {{- with .Values.extraVolumes }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/charts/scaffold/templates/hpa.yaml b/charts/scaffold/templates/hpa.yaml deleted file mode 100644 index 395df66..0000000 --- a/charts/scaffold/templates/hpa.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.autoscaling.enabled }} -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include ".fullname" . }} - labels: - {{- include ".labels" . | nindent 4 }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include ".fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} - {{- end }} - {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} - {{- end }} -{{- end }} diff --git a/charts/scaffold/templates/ingress.yaml b/charts/scaffold/templates/ingress.yaml deleted file mode 100644 index af470e7..0000000 --- a/charts/scaffold/templates/ingress.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $fullName := include ".fullname" . -}} -{{- $svcPort := .Values.service.port -}} -{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} - {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} - {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} - {{- end }} -{{- end }} -{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1 -{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include ".labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - {{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} - pathType: {{ .pathType }} - {{- end }} - backend: - {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ $fullName }} - port: - number: {{ $svcPort }} - {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/scaffold/templates/service.yaml b/charts/scaffold/templates/service.yaml deleted file mode 100644 index 9d17017..0000000 --- a/charts/scaffold/templates/service.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include ".fullname" . }} - labels: - {{- include ".labels" . | nindent 4 }} - {{- if .Values.service.annotations }} - annotations: - {{- .Values.service.annotations | toYaml | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.service.type }} - ports: - - name: http - protocol: TCP - port: {{ .Values.service.port }} - targetPort: {{ .Values.service.targetPort }} - selector: - {{- include ".selectorLabels" . | nindent 4 }} diff --git a/charts/scaffold/templates/serviceaccount.yaml b/charts/scaffold/templates/serviceaccount.yaml deleted file mode 100644 index 1d1d00a..0000000 --- a/charts/scaffold/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include ".serviceAccountName" . }} - labels: - {{- include ".labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automount }} -{{- end }} diff --git a/charts/scaffold/values.yaml b/charts/scaffold/values.yaml deleted file mode 100644 index 243b878..0000000 --- a/charts/scaffold/values.yaml +++ /dev/null @@ -1,138 +0,0 @@ -# -- Number of replicas for the service. -replicaCount: 4 - -image: - # -- Image repository for the `` container. - repository: registry.gitlab.com/whylabs/langkit-container - # -- Image pull policy for the `` container. - pullPolicy: IfNotPresent - # -- (string) Image tag for the `` container, this will default to `.Chart.AppVersion` if not set. - tag: "" - -imagePullSecrets: - # -- (list) Image pull secrets for the `` container. Defaults to `whylabs-{{ .Release.Name }}-registry-credentials`. - - name: "" - -# -- (string) Override the name of the chart. -nameOverride: "" - -# -- (string) Override the full name of the chart. -fullnameOverride: "" - -# -- Labels to add to all chart resources. -commonLabels: {} - -# -- [Environment variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) for the `` container. -env: {} - # MY_ENV_VAR: "my env var value" - -serviceAccount: - # -- If `true`, create a new `ServiceAccount`. - create: true - # -- (string) If this is set and `serviceAccount.create` is `true` this will be used for the created `ServiceAccount` name, if set and `serviceAccount.create` is `false` then this will define an existing `ServiceAccount` to use. - name: "" - # -- Labels to add to the service account. - labels: {} - # -- Annotations to add to the service account. - annotations: {} - # -- Set this to `false` to [opt out of API credential automounting](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#opt-out-of-api-credential-automounting) for the `ServiceAccount`. - automount: true - -service: - # -- Service annotations. - annotations: {} - # -- Service Type, i.e. ClusterIp, LoadBalancer, etc. - type: ClusterIP - # -- Service HTTP port. - port: 80 - # -- The port on which the application container is listening. - targetPort: 8000 - -# -- Annotations to add to the `Pod`. -podAnnotations: {} - -# -- Labels to add to the `Pod`. -podLabels: {} - -# -- [Pod security context](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#podsecuritycontext-v1-core), this supports full customisation. -podSecurityContext: - runAsNonRoot: true - -# -- [Security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container) for the `` container. -securityContext: - privileged: false - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - runAsNonRoot: true - runAsUser: 1000 - capabilities: - drop: ["ALL"] - -# -- [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) configuration for the `` container. -ingress: - enabled: false - className: "" - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - hosts: - - host: chart-example.local - paths: - - path: / - pathType: ImplementationSpecific - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -# -- [Resources](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) for the `` container. -resources: - requests: - cpu: "4" - memory: 4Gi - ephemeral-storage: 250Mi - limits: - cpu: "4" - memory: 4Gi - ephemeral-storage: 250Mi - -# -- [Liveness probe](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) configuration for the `` container. -livenessProbe: - httpGet: - path: /health - port: 8000 - failureThreshold: 3 - initialDelaySeconds: 30 - periodSeconds: 30 - -# -- [Readiness probe](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) configuration for the `` container. -readinessProbe: - httpGet: - path: /health - port: 8000 - failureThreshold: 10 - initialDelaySeconds: 30 - periodSeconds: 30 - -# -- [Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) configuration for the `` container. -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 100 - targetCPUUtilizationPercentage: 70 - # targetMemoryUtilizationPercentage: 70 - -# -- Extra [volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the `Pod`. -extraVolumes: [] - -# -- Extra [volume mounts](https://kubernetes.io/docs/concepts/storage/volumes/) for the `` container. -extraVolumeMounts: [] - -# -- Node labels to match for `Pod` [scheduling](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/). -nodeSelector: {} - -# -- Node taints which will be tolerated for `Pod` [scheduling](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/). -tolerations: [] - -# -- Affinity settings for `Pod` [scheduling](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/). If an explicit label selector is not provided for pod affinity or pod anti-affinity one will be created from the pod selector labels. -affinity: {} diff --git a/charts/whylogs/README.md b/charts/whylogs/README.md index 186772d..d5fd987 100644 --- a/charts/whylogs/README.md +++ b/charts/whylogs/README.md @@ -4,48 +4,68 @@ A Helm chart for WhyLab's WhyLogs -See [WhyLogs Documentation](https://docs.whylabs.ai/docs/integrations-whylogs-container/) for more information - -> :warning: Review the [documentation on using WhyLab's Helm charts](../../README.md#how-to-use-whylabs-helm-repository) +> :mag: See [WhyLogs Documentation](https://docs.whylabs.ai/docs/integrations-whylogs-container/) for more information ## Prerequisites -### Secrets +### API Key -The following configured secrets must exist in the cluster prior to deploying -the WhyLogs Helm chart. +Create a [WhyLabs API Key](https://docs.whylabs.ai/docs/whylabs-api/#creating-an-api-token) +that will be used when creating the required Kubernetes secrets to authenticate +with the WhyLabs API. + +### Secrets -Create a [WhyLabs API Key](https://docs.whylabs.ai/docs/whylabs-capabilities/#access-token-management) -which must be stored in a `whylabs-api-key` Kubernetes secret, described below. +Use the following `kubectl` commands to create the required Kubernetes +`Secrets`. These secrets must exist prior to installing the Helm chart. ```shell +# API that was created above whylabs_api_key="" -whylogs_password="" -namespace="default" +# Arbitrary value that will be required to make requests to the containers +container_password="" +# Change this to the desired namespace +target_namespace="default" kubectl create secret generic whylabs-api-key \ - --namespace "${namespace}" \ - --from-literal=api-key="${whylabs_api_key}" + --namespace "${target_namespace}" \ + --from-literal=WHYLABS_API_KEY="${whylabs_api_key}" kubectl create secret generic whylogs-container-password \ - --namespace "${namespace}" \ - --from-literal=passwordy="${whylogs_password}" + --namespace "${target_namespace}" \ + --from-literal=CONTAINER_PASSWORD="${container_password}" ``` -## Deployment +## Installation & Upgrades -### Diff -View the difference between the current state and desired state. +### How to Use WhyLabs Helm Repository + +> :warning: WhyLab's Helm charts are hosted on GitHub Container Registry (GHCR), +> an OCI-compliant storage solution. GHCR aligns with industry standards for +> container artifact storage and has a slightly different API to be aware of. +> Use the `helm pull` command to download the a `.tgz` archive of the chart. +> Reference the `.tgz` archive as the chart identifier when installing. ```shell +# Specify the namespace to install the chart into +target_namespace="" + +# The following command will download a guardrails-${chart_version}.tgz file to +# the working directory or --destination path +helm pull \ + oci://ghcr.io/whylabs/whylogs \ + --version 0.1.0 + # Requires the helm-diff plugin to be installed: # helm plugin install https://github.com/databus23/helm-diff helm diff upgrade \ --allow-unreleased \ - whylogs "whylogs-0.1.0.tgz" + --namespace "${target_namespace}" \ + whylogs whylogs-0.1.0.tgz ``` -### Install/Update +After you've installed the repo you can install the chart. + ```shell helm upgrade --install \ --create-namespace \ @@ -53,13 +73,6 @@ helm upgrade --install \ whylogs "whylogs-0.1.0.tgz" ``` -### Uninstall -```shell -helm uninstall \ - --namespace "${namespace}" \ - whylogs "whylogs-0.1.0.tgz" -``` - ## Values | Key | Type | Default | Description | diff --git a/charts/whylogs/README.md.gotmpl b/charts/whylogs/README.md.gotmpl index 034b557..d202ef3 100644 --- a/charts/whylogs/README.md.gotmpl +++ b/charts/whylogs/README.md.gotmpl @@ -11,49 +11,68 @@ {{ template "chart.sourcesSection" . }} -See [WhyLogs Documentation](https://docs.whylabs.ai/docs/integrations-whylogs-container/) for more information - -> :warning: Review the [documentation on using WhyLab's Helm charts](../../README.md#how-to-use-whylabs-helm-repository) +> :mag: See [WhyLogs Documentation](https://docs.whylabs.ai/docs/integrations-whylogs-container/) for more information ## Prerequisites -### Secrets +### API Key -The following configured secrets must exist in the cluster prior to deploying -the WhyLogs Helm chart. +Create a [WhyLabs API Key](https://docs.whylabs.ai/docs/whylabs-api/#creating-an-api-token) +that will be used when creating the required Kubernetes secrets to authenticate +with the WhyLabs API. -Create a [WhyLabs API Key](https://docs.whylabs.ai/docs/whylabs-capabilities/#access-token-management) -which must be stored in a `whylabs-api-key` Kubernetes secret, described below. +### Secrets +Use the following `kubectl` commands to create the required Kubernetes +`Secrets`. These secrets must exist prior to installing the Helm chart. ```shell +# API that was created above whylabs_api_key="" -whylogs_password="" -namespace="default" +# Arbitrary value that will be required to make requests to the containers +container_password="" +# Change this to the desired namespace +target_namespace="default" kubectl create secret generic whylabs-api-key \ - --namespace "${namespace}" \ - --from-literal=api-key="${whylabs_api_key}" + --namespace "${target_namespace}" \ + --from-literal=WHYLABS_API_KEY="${whylabs_api_key}" kubectl create secret generic whylogs-container-password \ - --namespace "${namespace}" \ - --from-literal=passwordy="${whylogs_password}" + --namespace "${target_namespace}" \ + --from-literal=CONTAINER_PASSWORD="${container_password}" ``` -## Deployment +## Installation & Upgrades + +### How to Use WhyLabs Helm Repository -### Diff -View the difference between the current state and desired state. +> :warning: WhyLab's Helm charts are hosted on GitHub Container Registry (GHCR), +> an OCI-compliant storage solution. GHCR aligns with industry standards for +> container artifact storage and has a slightly different API to be aware of. +> Use the `helm pull` command to download the a `.tgz` archive of the chart. +> Reference the `.tgz` archive as the chart identifier when installing. ```shell +# Specify the namespace to install the chart into +target_namespace="" + +# The following command will download a guardrails-${chart_version}.tgz file to +# the working directory or --destination path +helm pull \ + oci://ghcr.io/whylabs/{{ template "chart.name" . }} \ + --version {{ template "chart.version" . }} + # Requires the helm-diff plugin to be installed: # helm plugin install https://github.com/databus23/helm-diff helm diff upgrade \ --allow-unreleased \ - {{ template "chart.name" . }} "{{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz" + --namespace "${target_namespace}" \ + {{ template "chart.name" . }} {{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz ``` -### Install/Update +After you've installed the repo you can install the chart. + ```shell helm upgrade --install \ --create-namespace \ @@ -61,14 +80,6 @@ helm upgrade --install \ {{ template "chart.name" . }} "{{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz" ``` -### Uninstall -```shell -helm uninstall \ - --namespace "${namespace}" \ - whylogs "{{ template "chart.name" . }}-{{ template "chart.version" . }}.tgz" -``` - - {{ template "chart.requirementsSection" . }} {{ template "chart.valuesSection" . }}