Introduction to Helm-Based Odoo Deployment

With our Kubernetes cluster fully operational, the next critical step is deploying the heart of the ERP system: Odoo. This guide explains how to deploy Odoo with Helm, set up PostgreSQL, and expose Odoo internally using Kubernetes Ingress. By doing so, you’ll ensure a secure, scalable, and production-ready ERP environment.

🧠 This article is part of our On-Premise Odoo Infrastructure Series.

Why Use Helm to Deploy Odoo?

Helm simplifies the deployment process by turning complex Kubernetes configurations into manageable packages. More importantly, it helps teams:

  • Reuse consistent deployment templates across environments
  • Manage version control and configuration updates
  • Automate rollbacks and rollouts as needed

As a result, Helm allows faster, more reliable ERP deployments at scale. Furthermore, it standardizes deployments across multiple environments.

🔗 Official Helm Installation Docs

Step 1: Install Helm

To get started, make sure Helm is installed on your local machine:

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

This ensures you’re ready to manage your Kubernetes applications efficiently.

Step 2: Create a Namespace for Odoo

Next, define a separate namespace to logically isolate your Odoo deployment:

kubectl create namespace odoo

By isolating resources, you’ll improve manageability and security.

Step 3: Prepare a Custom Helm Chart for Odoo

At this stage, you can use the Bitnami chart, or alternatively, create a simplified custom chart for better control. This chart defines your application’s structure.

Chart.yaml

apiVersion: v2
name: odoo
version: 0.1.0

values.yaml

replicaCount: 2
image:
  repository: odoo
  tag: 16
service:
  type: ClusterIP
postgresql:
  enabled: true
  postgresqlUsername: odoo
  postgresqlPassword: odoo
  postgresqlDatabase: odoo

Step 4: Deploy Odoo with Helm

Now use Helm to install Odoo into your Kubernetes cluster:

helm install odoo ./k8s-odoo --namespace odoo

This command performs three key actions:

  • It launches two Odoo pods for redundancy.
  • It creates a PostgreSQL StatefulSet for database persistence.
  • It sets up a ClusterIP service for internal-only access.

Consequently, your Odoo service is now logically segmented and resilient.

Step 5: Set Up Internal-Only Access Using Ingress

To allow secure, internal browser access to Odoo, define an Ingress rule as shown below:

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: odoo
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: odoo.internal.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: odoo
            port:
              number: 8069

Apply this rule using the following command:

kubectl apply -f ingress.yaml -n odoo

🔧 Additionally, ensure internal DNS or /etc/hosts correctly maps odoo.internal.local to your ingress controller’s IP.

Step 6: Verify Access to Odoo

Once configuration is complete, open a browser on a machine inside your internal network and visit:

http://odoo.internal.local

If everything is set up properly, you should see the Odoo login screen. From here, you can begin managing your ERP environment.

What’s Next?

At this point, you’ve successfully deployed Odoo using Helm inside Kubernetes. In the next and final article of this series, we’ll focus on CI/CD automation using GitLab pipelines to streamline your ERP development lifecycle.

🔁 Previous: Bootstrap Kubernetes for Odoo
🔁 Next: Automate Odoo CI/CD with GitLab

💡 Want to test this setup in your lab? Download our sample Helm chart or get in touch for assistance.

Leave a Reply