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.
Prerequisites
Section titled “Prerequisites”- 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)
Installation Methods
Section titled “Installation Methods”Helm Installation (Recommended)
Section titled “Helm Installation (Recommended)”Helm is the recommended installation method as it provides the most flexibility and handles cert-manager dependencies automatically.
Install from OCI Registry
Section titled “Install from OCI Registry”# Install latest versionhelm install optipod oci://ghcr.io/sagart-cactus/charts/optipod \ --namespace optipod-system \ --create-namespace
# Install specific versionVERSION=1.5.3 # Replace with desired versionhelm install optipod oci://ghcr.io/sagart-cactus/charts/optipod \ --version "${VERSION}" \ --namespace optipod-system \ --create-namespaceInstall from Helm Repository
Section titled “Install from Helm Repository”# Add the OptiPod Helm repositoryhelm repo add optipod https://optipod.github.io/chartshelm repo update
# Install OptiPodhelm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespacekubectl Installation
Section titled “kubectl Installation”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)”kubectl apply -f https://github.com/Sagart-cactus/optipod/releases/latest/download/install-webhook.yamlSSA Strategy (Traditional Kubernetes)
Section titled “SSA Strategy (Traditional Kubernetes)”kubectl apply -f https://github.com/Sagart-cactus/optipod/releases/latest/download/install.yamlAutomated Installation Script
Section titled “Automated Installation Script”For quick setup with interactive prompts:
curl -sSL https://raw.githubusercontent.com/Sagart-cactus/optipod/main/config/webhook/install.sh | bashInstallation Options
Section titled “Installation Options”cert-manager Behavior
Section titled “cert-manager Behavior”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)
# Auto-detect cert-manager (default)helm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespace
# Force install cert-managerhelm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespace \ --set certManager.install=true
# Use existing cert-manager onlyhelm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespace \ --set certManager.install=falseWebhook Configuration
Section titled “Webhook Configuration”Enable Webhook (Default)
Section titled “Enable Webhook (Default)”Webhook mode is enabled by default and recommended for GitOps environments:
helm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespace \ --set webhook.enabled=trueDisable Webhook (SSA Only)
Section titled “Disable Webhook (SSA Only)”For environments without webhook requirements:
helm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespace \ --set webhook.enabled=falseDevelopment/Testing Setup
Section titled “Development/Testing Setup”For local development with kind or minikube:
helm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespace \ --set webhook.failurePolicy=IgnoreVerification
Section titled “Verification”Check Installation Status
Section titled “Check Installation Status”# Check OptiPod pods are runningkubectl 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 2mVerify CRD Installation
Section titled “Verify CRD Installation”# Check OptimizationPolicy CRD is installedkubectl get crd optimizationpolicies.optipod.optipod.io
# Expected output:# NAME CREATED AT# optimizationpolicies.optipod.optipod.io 2025-01-28T10:00:00ZVerify Webhook Configuration (if enabled)
Section titled “Verify Webhook Configuration (if enabled)”# Check webhook configurationkubectl get mutatingwebhookconfiguration optipod-mutating-webhook
# Check certificate is readykubectl get certificate -n optipod-system
# Expected output:# NAME READY SECRET AGE# webhook-server-certs True webhook-server-certs 2mCheck Controller Logs
Section titled “Check Controller Logs”# View controller logskubectl 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=50Configuration
Section titled “Configuration”Key Configuration Options
Section titled “Key Configuration Options”| Parameter | Description | Default |
|---|---|---|
webhook.enabled | Enable mutating webhook | true |
webhook.failurePolicy | Webhook failure policy (Ignore/Fail) | Ignore |
certManager.install | Install cert-manager subchart | auto |
image.repository | OptiPod image repository | ghcr.io/sagart-cactus/optipod |
image.tag | OptiPod image tag | Chart.appVersion |
webhook.deployment.replicaCount | Number of webhook replicas | 2 |
controller.replicaCount | Number of controller replicas | 1 |
metricsProvider.type | Metrics provider type | metrics-server |
metricsProvider.prometheus.url | Prometheus server URL | http://prometheus:9090 |
metricsProvider.prometheus.auth.type | Prometheus auth type (none/basic/bearer) | none |
Metrics Provider Configuration
Section titled “Metrics Provider Configuration”OptiPod supports two metrics providers: metrics-server (default) and prometheus.
Using metrics-server (Default)
Section titled “Using metrics-server (Default)”helm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespace \ --set metricsProvider.type=metrics-serverUsing Prometheus
Section titled “Using Prometheus”helm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespace \ --set metricsProvider.type=prometheus \ --set metricsProvider.prometheus.url=http://prometheus:9090Prometheus with Authentication
Section titled “Prometheus with Authentication”Basic Authentication:
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=secretBearer Token Authentication:
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-tokenUsing Existing Secrets (Recommended):
Create a secret with credentials:
# For basic authkubectl create secret generic prometheus-auth \ --namespace optipod-system \ --from-literal=username=admin \ --from-literal=password=secret
# For bearer tokenkubectl create secret generic prometheus-auth \ --namespace optipod-system \ --from-literal=token=your-tokenInstall with secret reference:
# Basic auth with secrethelm 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 secrethelm 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=tokenPrometheus with TLS
Section titled “Prometheus with TLS”# Create secret with TLS certificateskubectl 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 TLShelm 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.keyCustom Values File
Section titled “Custom Values File”Create a values.yaml file with your configuration:
webhook: enabled: true failurePolicy: Ignore deployment: replicaCount: 3
controller: replicaCount: 2 resources: limits: cpu: 1000m memory: 1Gi requests: cpu: 200m memory: 256Mi
# Metrics provider configurationmetricsProvider: 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: 30sInstall with custom values:
helm install optipod optipod/optipod \ --namespace optipod-system \ --create-namespace \ --values values.yamlUpgrading
Section titled “Upgrading”Upgrade to Latest Version
Section titled “Upgrade to Latest Version”# Update Helm repositoryhelm repo update
# Upgrade OptiPodhelm upgrade optipod optipod/optipod \ --namespace optipod-system \ --reuse-valuesUpgrade to Specific Version
Section titled “Upgrade to Specific Version”VERSION=1.5.3 # Replace with desired versionhelm upgrade optipod oci://ghcr.io/sagart-cactus/charts/optipod \ --version "${VERSION}" \ --namespace optipod-system \ --reuse-valuesUninstallation
Section titled “Uninstallation”Remove OptiPod
Section titled “Remove OptiPod”# Uninstall Helm releasehelm uninstall optipod --namespace optipod-system
# Delete namespacekubectl delete namespace optipod-systemClean Up CRDs (Optional)
Section titled “Clean Up CRDs (Optional)”# Remove OptimizationPolicy CRDkubectl delete crd optimizationpolicies.optipod.optipod.ioRemove cert-manager (Optional)
Section titled “Remove cert-manager (Optional)”If cert-manager was installed by OptiPod and is not used by other applications:
helm uninstall cert-manager --namespace cert-managerkubectl delete namespace cert-managerTroubleshooting
Section titled “Troubleshooting”Webhook Not Working
Section titled “Webhook Not Working”Check cert-manager installation:
Terminal window kubectl get crd certificates.cert-manager.iokubectl get pods -n cert-managerVerify certificate is ready:
Terminal window kubectl get certificate -n optipod-systemkubectl describe certificate -n optipod-systemCheck CA bundle injection:
Terminal window kubectl get mutatingwebhookconfiguration optipod-mutating-webhook \-o jsonpath='{.webhooks[0].clientConfig.caBundle}' | base64 -d
cert-manager Conflicts
Section titled “cert-manager Conflicts”If cert-manager is already installed:
# Check existing cert-managerkubectl get deployment -A | grep cert-manager
# Force use of existing cert-managerhelm upgrade optipod optipod/optipod \ --set certManager.install=falseCertificate Errors
Section titled “Certificate Errors”If webhook fails with certificate errors:
# Check certificate secretkubectl get secret webhook-server-certs -n optipod-system -o yaml
# Force certificate renewalkubectl delete certificate -n optipod-system --allkubectl delete secret webhook-server-certs -n optipod-system
# Restart webhook podskubectl rollout restart deployment -n optipod-system -l app.kubernetes.io/component=webhookNext Steps
Section titled “Next Steps”- Quick Start Guide - Create your first optimization policy
- Creating Your First Policy - Detailed policy creation guide
- Architecture Overview - Understand how OptiPod works
For more detailed configuration options, see the Helm Values Reference.