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.helmuntuk 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: trueagar tidak muncul di log.- Untuk chart dengan konfigurasi kompleks, gunakan
values_filesyang menunjuk ke file YAML terpisah — lebih mudah di-review dan di-maintain.wait: truedi helm module memastikan Ansible menunggu sampai chart benar-benar siap sebelum melanjutkan ke task berikutnya.
← Sebelumnya: Deploy Manifest Berikutnya: Cluster Maintenance →