Helm

Helm #

Menulis manifest Kubernetes dari nol untuk setiap komponen — ingress controller, cert-manager, database operator, monitoring stack — adalah pekerjaan yang sangat banyak. Helm hadir sebagai package manager untuk Kubernetes: kamu tinggal menjalankan helm install nginx-ingress ingress-nginx/ingress-nginx dan semua resource yang diperlukan langsung terdeploy dengan konfigurasi yang sudah teruji. Ansible menyediakan module untuk mengelola Helm chart secara idempoten — install, upgrade, dan konfigurasi semuanya terdokumentasi dalam playbook.

Instalasi Helm #

# roles/helm/tasks/main.yml
---
- name: Unduh Helm installer
  get_url:
    url: https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    dest: /tmp/get-helm-3.sh
    mode: '0700'

- name: Jalankan Helm installer
  command: /tmp/get-helm-3.sh
  args:
    creates: /usr/local/bin/helm   # Idempoten — skip jika sudah ada

- name: Verifikasi instalasi Helm
  command: helm version --short
  register: helm_version
  changed_when: false

- name: Tampilkan versi Helm
  debug:
    msg: "Helm version: {{ helm_version.stdout }}"

Menambahkan Helm Repository #

- name: Tambahkan Helm repositories yang diperlukan
  kubernetes.core.helm_repository:
    name: "{{ item.name }}"
    repo_url: "{{ item.url }}"
    state: present
  loop:
    - name: ingress-nginx
      url: https://kubernetes.github.io/ingress-nginx
    - name: cert-manager
      url: https://charts.jetstack.io
    - name: prometheus-community
      url: https://prometheus-community.github.io/helm-charts
    - name: bitnami
      url: https://charts.bitnami.com/bitnami

- name: Update semua Helm repository
  command: helm repo update
  changed_when: false

Deploy Chart dengan kubernetes.core.helm #

# Deploy nginx ingress controller
- name: Install nginx Ingress Controller
  kubernetes.core.helm:
    kubeconfig: "{{ k8s_kubeconfig }}"
    name: nginx-ingress
    chart_ref: ingress-nginx/ingress-nginx
    chart_version: "4.9.0"          # Pin versi chart
    release_namespace: ingress-nginx
    create_namespace: true
    state: present
    values:
      controller:
        replicaCount: 2
        service:
          type: LoadBalancer
        resources:
          requests:
            cpu: 100m
            memory: 90Mi
          limits:
            cpu: 500m
            memory: 512Mi

Values dari Ansible Vault #

Banyak Helm chart menerima nilai sensitif seperti password atau API key. Ambil dari Vault:

- name: Install PostgreSQL menggunakan Bitnami chart
  kubernetes.core.helm:
    kubeconfig: "{{ k8s_kubeconfig }}"
    name: postgresql
    chart_ref: bitnami/postgresql
    chart_version: "13.4.0"
    release_namespace: database
    create_namespace: true
    state: present
    values:
      auth:
        postgresPassword: "{{ vault_postgres_root_password }}"
        username: "{{ db_user }}"
        password: "{{ vault_db_password }}"
        database: "{{ db_name }}"
      primary:
        persistence:
          enabled: true
          size: 20Gi
        resources:
          requests:
            cpu: 250m
            memory: 256Mi
  no_log: true    # Jangan tampilkan values yang berisi password

Values dari File Terpisah #

Untuk chart dengan banyak konfigurasi, simpan values di file tersendiri:

# playbooks/deploy-monitoring.yml
- name: Install Prometheus Stack
  kubernetes.core.helm:
    kubeconfig: "{{ k8s_kubeconfig }}"
    name: kube-prometheus
    chart_ref: prometheus-community/kube-prometheus-stack
    chart_version: "55.5.0"
    release_namespace: monitoring
    create_namespace: true
    state: present
    values_files:
      - "{{ playbook_dir }}/helm-values/prometheus-stack.yml"    # File values utama
      - "{{ playbook_dir }}/helm-values/prometheus-alerting.yml" # Override untuk alerting
# helm-values/prometheus-stack.yml
grafana:
  enabled: true
  persistence:
    enabled: true
    size: 10Gi
  adminPassword: "{{ vault_grafana_password }}"

prometheus:
  prometheusSpec:
    retention: 30d
    storageSpec:
      volumeClaimTemplate:
        spec:
          resources:
            requests:
              storage: 50Gi

alertmanager:
  enabled: true

Upgrade Chart #

Module helm otomatis melakukan upgrade jika release sudah ada:

- name: Upgrade nginx Ingress Controller ke versi terbaru
  kubernetes.core.helm:
    kubeconfig: "{{ k8s_kubeconfig }}"
    name: nginx-ingress
    chart_ref: ingress-nginx/ingress-nginx
    chart_version: "4.10.0"        # Versi baru
    release_namespace: ingress-nginx
    state: present                 # Akan upgrade jika sudah ada
    wait: true                     # Tunggu sampai upgrade selesai
    wait_timeout: "10m"
    values:
      controller:
        replicaCount: 3            # Tambah replika

Cek Status Release #

- name: Ambil informasi semua Helm release
  kubernetes.core.helm_info:
    kubeconfig: "{{ k8s_kubeconfig }}"
    name: nginx-ingress
    release_namespace: ingress-nginx
  register: helm_release_info

- name: Tampilkan status release
  debug:
    msg:
      - "Release: {{ helm_release_info.status.name }}"
      - "Status: {{ helm_release_info.status.status }}"
      - "Chart: {{ helm_release_info.status.chart }}"
      - "Version: {{ helm_release_info.status.app_version }}"
  when: helm_release_info.status is defined

- name: Uninstall chart jika tidak diperlukan lagi
  kubernetes.core.helm:
    kubeconfig: "{{ k8s_kubeconfig }}"
    name: old-release
    release_namespace: default
    state: absent

Ringkasan #

  • Helm adalah package manager untuk Kubernetes — menyederhanakan deployment komponen kompleks yang sudah punya chart resmi.
  • Gunakan kubernetes.core.helm untuk install, upgrade, dan uninstall chart — idempoten dan terintegrasi dengan variabel Ansible.
  • Selalu pin versi chart (chart_version) — update chart yang tidak terkontrol bisa membreak konfigurasi yang sudah berjalan.
  • Ambil values sensitif dari Ansible Vault dan gunakan no_log: true agar tidak muncul di log.
  • Untuk chart dengan konfigurasi kompleks, gunakan values_files yang menunjuk ke file YAML terpisah — lebih mudah di-review dan di-maintain.
  • wait: true di helm module memastikan Ansible menunggu sampai chart benar-benar siap sebelum melanjutkan ke task berikutnya.

← Sebelumnya: Deploy Manifest   Berikutnya: Cluster Maintenance →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact