Skip to content

Installation Guide

OptiPod is a Kubernetes operator that provides explainable recommendations for CPU and memory requests/limits. This guide covers installation methods and verification steps.

  • Kubernetes 1.21 or later
  • Helm 3.8+ (for Helm installation)
  • kubectl configured to access your cluster
  • cert-manager 1.14+ (required for webhook mode, auto-installed by default)

Helm is the recommended installation method as it provides the most flexibility and handles cert-manager dependencies automatically.

Terminal window
# Install latest version
helm install optipod oci://ghcr.io/sagart-cactus/charts/optipod \
--namespace optipod-system \
--create-namespace
# Install specific version
VERSION=1.5.3 # Replace with desired version
helm install optipod oci://ghcr.io/sagart-cactus/charts/optipod \
--version "${VERSION}" \
--namespace optipod-system \
--create-namespace
Terminal window
# Add the OptiPod Helm repository
helm repo add optipod https://optipod.github.io/charts
helm repo update
# Install OptiPod
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace

For GitOps environments or when you prefer kubectl, use the pre-built manifests:

Webhook Strategy (ArgoCD/GitOps Compatible)

Section titled “Webhook Strategy (ArgoCD/GitOps Compatible)”
Terminal window
kubectl apply -f https://github.com/Sagart-cactus/optipod/releases/latest/download/install-webhook.yaml
Terminal window
kubectl apply -f https://github.com/Sagart-cactus/optipod/releases/latest/download/install.yaml

For quick setup with interactive prompts:

Terminal window
curl -sSL https://raw.githubusercontent.com/Sagart-cactus/optipod/main/config/webhook/install.sh | bash

The Helm chart automatically manages cert-manager installation:

  • Auto-detect (default): Checks if cert-manager is installed and installs it if needed
  • Force install: Always installs cert-manager, even if one exists
  • Use existing: Skips cert-manager installation (requires cert-manager already installed)
Terminal window
# Auto-detect cert-manager (default)
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace
# Force install cert-manager
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set certManager.install=true
# Use existing cert-manager only
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set certManager.install=false

Webhook mode is enabled by default and recommended for GitOps environments:

Terminal window
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set webhook.enabled=true

For environments without webhook requirements:

Terminal window
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set webhook.enabled=false

For local development with kind or minikube:

Terminal window
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set webhook.failurePolicy=Ignore
Terminal window
# Check OptiPod pods are running
kubectl get pods -n optipod-system
# Expected output:
# NAME READY STATUS RESTARTS AGE
# optipod-controller-manager-xxx 1/1 Running 0 2m
# optipod-webhook-xxx 1/1 Running 0 2m
Terminal window
# Check OptimizationPolicy CRD is installed
kubectl get crd optimizationpolicies.optipod.optipod.io
# Expected output:
# NAME CREATED AT
# optimizationpolicies.optipod.optipod.io 2025-01-28T10:00:00Z
Terminal window
# Check webhook configuration
kubectl get mutatingwebhookconfiguration optipod-mutating-webhook
# Check certificate is ready
kubectl get certificate -n optipod-system
# Expected output:
# NAME READY SECRET AGE
# webhook-server-certs True webhook-server-certs 2m
Terminal window
# View controller logs
kubectl logs -n optipod-system -l app.kubernetes.io/component=controller --tail=50
# View webhook logs (if enabled)
kubectl logs -n optipod-system -l app.kubernetes.io/component=webhook --tail=50
ParameterDescriptionDefault
webhook.enabledEnable mutating webhooktrue
webhook.failurePolicyWebhook failure policy (Ignore/Fail)Ignore
certManager.installInstall cert-manager subchartauto
image.repositoryOptiPod image repositoryghcr.io/sagart-cactus/optipod
image.tagOptiPod image tagChart.appVersion
webhook.deployment.replicaCountNumber of webhook replicas2
controller.replicaCountNumber of controller replicas1
metricsProvider.typeMetrics provider typemetrics-server
metricsProvider.prometheus.urlPrometheus server URLhttp://prometheus:9090
metricsProvider.prometheus.auth.typePrometheus auth type (none/basic/bearer)none

OptiPod supports two metrics providers: metrics-server (default) and prometheus.

Terminal window
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set metricsProvider.type=metrics-server
Terminal window
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set metricsProvider.type=prometheus \
--set metricsProvider.prometheus.url=http://prometheus:9090

Basic Authentication:

Terminal window
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set metricsProvider.type=prometheus \
--set metricsProvider.prometheus.url=http://prometheus:9090 \
--set metricsProvider.prometheus.auth.type=basic \
--set metricsProvider.prometheus.auth.basic.username=admin \
--set metricsProvider.prometheus.auth.basic.password=secret

Bearer Token Authentication:

Terminal window
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set metricsProvider.type=prometheus \
--set metricsProvider.prometheus.url=http://prometheus:9090 \
--set metricsProvider.prometheus.auth.type=bearer \
--set metricsProvider.prometheus.auth.bearer.token=your-token

Using Existing Secrets (Recommended):

Create a secret with credentials:

Terminal window
# For basic auth
kubectl create secret generic prometheus-auth \
--namespace optipod-system \
--from-literal=username=admin \
--from-literal=password=secret
# For bearer token
kubectl create secret generic prometheus-auth \
--namespace optipod-system \
--from-literal=token=your-token

Install with secret reference:

Terminal window
# Basic auth with secret
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set metricsProvider.type=prometheus \
--set metricsProvider.prometheus.url=http://prometheus:9090 \
--set metricsProvider.prometheus.auth.type=basic \
--set metricsProvider.prometheus.auth.basic.existingSecret.name=prometheus-auth \
--set metricsProvider.prometheus.auth.basic.existingSecret.usernameKey=username \
--set metricsProvider.prometheus.auth.basic.existingSecret.passwordKey=password
# Bearer token with secret
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set metricsProvider.type=prometheus \
--set metricsProvider.prometheus.url=http://prometheus:9090 \
--set metricsProvider.prometheus.auth.type=bearer \
--set metricsProvider.prometheus.auth.bearer.existingSecret.name=prometheus-auth \
--set metricsProvider.prometheus.auth.bearer.existingSecret.key=token
Terminal window
# Create secret with TLS certificates
kubectl create secret generic prometheus-tls \
--namespace optipod-system \
--from-file=ca.crt=ca.crt \
--from-file=tls.crt=client.crt \
--from-file=tls.key=client.key
# Install with TLS
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--set metricsProvider.type=prometheus \
--set metricsProvider.prometheus.url=https://prometheus:9090 \
--set metricsProvider.prometheus.tls.enabled=true \
--set metricsProvider.prometheus.tls.existingSecret.name=prometheus-tls \
--set metricsProvider.prometheus.tls.existingSecret.caKey=ca.crt \
--set metricsProvider.prometheus.tls.existingSecret.certKey=tls.crt \
--set metricsProvider.prometheus.tls.existingSecret.keyKey=tls.key

Create a values.yaml file with your configuration:

values.yaml
webhook:
enabled: true
failurePolicy: Ignore
deployment:
replicaCount: 3
controller:
replicaCount: 2
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 200m
memory: 256Mi
# Metrics provider configuration
metricsProvider:
type: prometheus
prometheus:
url: http://prometheus-server.monitoring:9090
auth:
type: basic
basic:
existingSecret:
name: prometheus-auth
usernameKey: username
passwordKey: password
tls:
enabled: false
timeout: 30s

Install with custom values:

Terminal window
helm install optipod optipod/optipod \
--namespace optipod-system \
--create-namespace \
--values values.yaml
Terminal window
# Update Helm repository
helm repo update
# Upgrade OptiPod
helm upgrade optipod optipod/optipod \
--namespace optipod-system \
--reuse-values
Terminal window
VERSION=1.5.3 # Replace with desired version
helm upgrade optipod oci://ghcr.io/sagart-cactus/charts/optipod \
--version "${VERSION}" \
--namespace optipod-system \
--reuse-values
Terminal window
# Uninstall Helm release
helm uninstall optipod --namespace optipod-system
# Delete namespace
kubectl delete namespace optipod-system
Terminal window
# Remove OptimizationPolicy CRD
kubectl delete crd optimizationpolicies.optipod.optipod.io

If cert-manager was installed by OptiPod and is not used by other applications:

Terminal window
helm uninstall cert-manager --namespace cert-manager
kubectl delete namespace cert-manager
  1. Check cert-manager installation:

    Terminal window
    kubectl get crd certificates.cert-manager.io
    kubectl get pods -n cert-manager
  2. Verify certificate is ready:

    Terminal window
    kubectl get certificate -n optipod-system
    kubectl describe certificate -n optipod-system
  3. Check CA bundle injection:

    Terminal window
    kubectl get mutatingwebhookconfiguration optipod-mutating-webhook \
    -o jsonpath='{.webhooks[0].clientConfig.caBundle}' | base64 -d

If cert-manager is already installed:

Terminal window
# Check existing cert-manager
kubectl get deployment -A | grep cert-manager
# Force use of existing cert-manager
helm upgrade optipod optipod/optipod \
--set certManager.install=false

If webhook fails with certificate errors:

Terminal window
# Check certificate secret
kubectl get secret webhook-server-certs -n optipod-system -o yaml
# Force certificate renewal
kubectl delete certificate -n optipod-system --all
kubectl delete secret webhook-server-certs -n optipod-system
# Restart webhook pods
kubectl rollout restart deployment -n optipod-system -l app.kubernetes.io/component=webhook

For more detailed configuration options, see the Helm Values Reference.