# k8s-pulse Helm Chart This Helm chart provides a production-ready Kubernetes deployment for **k8s-pulse**, a Python web application that visualizes cluster metrics and resource usage. ## Prerequisites - A running Kubernetes cluster (v1.19+ recommended). - [Helm v3+](https://helm.sh/) installed. - (Optional) Metrics Server installed in your cluster for detailed container CPU & memory usage. ## Kubeconfig & Secret Setup To mirror the `docker-compose.yml` setup where `KUBECONFIG=/root/.kube/config` is mounted into the container, the Helm chart mounts a Kubernetes `Secret` containing your `kubeconfig` file to `/root/.kube/config` and sets the `KUBECONFIG` environment variable. You can configure and set up the `kubeconfig` secret using one of the following methods: ### Method 1: Create a Kubernetes Secret manually with `kubectl` (Recommended) 1. Create a secret containing your `.kube/config` file: ```bash kubectl create secret generic k8s-pulse-kubeconfig --from-file=config=$HOME/.kube/config ``` 2. Install or upgrade the Helm chart specifying the existing secret: ```bash helm install k8s-pulse ./helm-chart \ --set kubeconfig.enabled=true \ --set kubeconfig.secretName=k8s-pulse-kubeconfig ``` ### Method 2: Create the Secret via Helm using `--set-file` You can have Helm create the `Secret` resource directly from your local `kubeconfig` file during installation: ```bash helm install k8s-pulse ./helm-chart \ --set kubeconfig.enabled=true \ --set kubeconfig.createSecret=true \ --set-file kubeconfig.content=$HOME/.kube/config ``` ### Method 3: Use a custom `values.yaml` file Create a custom values file (e.g. `my-values.yaml`): ```yaml kubeconfig: enabled: true createSecret: true secretName: "k8s-pulse-kubeconfig" secretKey: "config" mountPath: "/root/.kube/config" content: | apiVersion: v1 clusters: - cluster: server: https://127.0.0.1:6443 name: my-cluster ... ``` Then install the chart using: ```bash helm install k8s-pulse ./helm-chart -f my-values.yaml ``` --- ## Quick Start ### 1. Install the Chart Default installation (uses `kubeconfig.enabled=true` with secret `-kubeconfig`): ```bash # 1. Create the secret kubectl create secret generic k8s-pulse-kubeconfig --from-file=config=$HOME/.kube/config # 2. Install the chart helm install k8s-pulse ./helm-chart --set kubeconfig.secretName=k8s-pulse-kubeconfig ``` ### 2. Custom Configuration You can override default settings by passing a custom `values.yaml` file or using `--set`: ```bash helm install k8s-pulse ./helm-chart -f custom-values.yaml ``` Example: Enable Ingress and change image tag: ```bash helm install k8s-pulse ./helm-chart \ --set image.tag="1.0.0" \ --set ingress.enabled=true \ --set ingress.hosts[0].host="k8s-pulse.example.com" ``` ### 3. Upgrade the Release ```bash helm upgrade k8s-pulse ./helm-chart ``` ### 4. Uninstall ```bash helm uninstall k8s-pulse ``` --- ## Configuration Parameters | Parameter | Description | Default | |-----------|-------------|---------| | `replicaCount` | Number of application replicas | `1` | | `image.repository` | Docker image repository | `k8s-pulse` | | `image.tag` | Docker image tag | `latest` | | `image.pullPolicy` | Image pull policy | `IfNotPresent` | | `kubeconfig.enabled` | Enable mounting kubeconfig Secret and `KUBECONFIG` env var | `true` | | `kubeconfig.secretName` | Name of existing Secret containing kubeconfig file | `""` (defaults to `-kubeconfig`) | | `kubeconfig.createSecret` | Create Secret resource via Helm from `kubeconfig.content` | `false` | | `kubeconfig.content` | Raw kubeconfig content when `createSecret` is true | `""` | | `kubeconfig.secretKey` | Secret data key containing kubeconfig file content | `"config"` | | `kubeconfig.mountPath` | Container path to mount kubeconfig file and set `KUBECONFIG` env | `"/root/.kube/config"` | | `service.type` | Kubernetes service type | `ClusterIP` | | `service.port` | Service port exposed | `80` | | `service.targetPort` | Container application port | `5000` | | `rbac.create` | Create ClusterRole & ClusterRoleBinding for K8s API access | `true` | | `serviceAccount.create` | Create ServiceAccount for the deployment | `true` | | `serviceAccount.name` | Explicit ServiceAccount name | `""` | | `ingress.enabled` | Enable Ingress resource | `false` | | `resources` | Pod CPU/Memory resource limits & requests | `{ limits: { cpu: 200m, memory: 256Mi }, requests: { cpu: 100m, memory: 128Mi } }` | | `persistence.enabled` | Enable optional PersistentVolumeClaim | `false` | --- ## RBAC Requirements `k8s-pulse` requires read access to cluster nodes, pods, and `metrics.k8s.io` custom objects. By default, `rbac.create: true` creates a `ClusterRole` and `ClusterRoleBinding` bound to the pod's `ServiceAccount`. ## Verification Check the deployment status: ```bash kubectl get pods -l app.kubernetes.io/name=k8s-pulse kubectl get svc -l app.kubernetes.io/name=k8s-pulse ```