Belajar Elasticsearch - Container Orchestration - Docker & Kubernetes
Episode 27 of 31

Belajar Elasticsearch - Container Orchestration - Docker & Kubernetes

Menjalankan Elasticsearch di kontainer: image resmi Docker, Docker Compose multi-node, volume management; deployment Kubernetes dengan ECK, StatefulSets, PVC, service dan ingress; serta resource limits, anti-affinity, init containers, dan probes.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Sebagian besar deployment Elasticsearch production modern berjalan di atas kontainer — konsisten, portable, dan mudah diotomasi. Dari satu docker run untuk mencoba-coba hingga cluster multi-node di Kubernetes dengan operator, episode ini membawa kalian melewati seluruh spektrum containerization Elasticsearch.

Episode 27 membahas deployment Docker (image, environment variables, volume), Docker Compose untuk cluster multi-node, lalu Kubernetes — khususnya ECK (Elastic Cloud on Kubernetes), StatefulSets, PVC, service dan ingress, ConfigMaps dan Secrets — serta production considerations: resource limits, anti-affinity, init containers, dan probes.

Docker Deployment

Image Resmi dan Environment Variables

Image resmi di docker.elastic.co/elasticsearch/elasticsearch:8.x. Konfigurasi Elasticsearch lewat environment variables (ES_JAVA_OPTS untuk heap, discovery.type untuk mode single-node):

Jalankan Elasticsearch dengan keamanan nonaktif (untuk lab)
docker run -d --name es-lab \
  -p 9200:9200 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
  docker.elastic.co/elasticsearch/elasticsearch:8.15.3

Docker Compose Multi-Node

Untuk cluster multi-node di mesin lokal, Compose adalah alat paling praktis:

docker-compose.yml: cluster 2 node
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.3
    environment:
      - cluster.name=compose-cluster
      - node.name=es01
      - node.roles=master,data
      - discovery.seed_hosts=es02
      - cluster.initial_master_nodes=es01,es02
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
    volumes:
      - es01-data:/usr/share/elasticsearch/data
    ulimits:
      memlock: { soft: -1, hard: -1 }
    ports:
      - "9200:9200"
 
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.3
    environment:
      - cluster.name=compose-cluster
      - node.name=es02
      - discovery.seed_hosts=es01
      - cluster.initial_master_nodes=es01,es02
    volumes:
      - es02-data:/usr/share/elasticsearch/data
 
volumes:
  es01-data:
  es02-data:

Jalankan dengan docker compose up -d. bootstrap.memory_lock=true dan ulimits.memlock mencegah swap JVM — penting untuk performa. Di production, perhatikan vm.max_map_count di host (minimal 262144): sudo sysctl -w vm.max_map_count=262144.

Volume Management

Volume menyimpan data di luar container sehingga data selamat saat container restart/recreate. Jangan pernah menyimpan data Elasticsearch di filesystem container — container bersifat ephemeral; volume (named volume atau persistent volume di Kubernetes) adalah satu-satunya tempat data aman.

Important

Jangan jalankan es sebagai root di dalam container, dan jangan mount direktori host tanpa perhatian pada ownership (UID 1000). Kebanyakan error startup di Docker karena permission data directory. Gunakan volume named dan biarkan image mengelola owner-nya.

Kubernetes Deployment

ECK: Elastic Cloud on Kubernetes

ECK adalah operator resmi Elastic untuk Kubernetes — kalian mendeklarasikan cluster Elasticsearch sebagai custom resource, dan operator mewujudkannya (deploy StatefulSet, PVC, service, dan setup security) secara otomatis:

Elasticsearch CRD via ECK
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: production-cluster
spec:
  version: 8.15.3
  nodeSets:
    - name: hot
      count: 3
      config:
        node.roles: [master, data_hot, ingest]
      podTemplate:
        spec:
          containers:
            - name: elasticsearch
              resources:
                requests: { memory: 8Gi, cpu: "4" }
                limits: { memory: 8Gi, cpu: "4" }
              env:
                - name: ES_JAVA_OPTS
                  value: "-Xms4g -Xmx4g"
      volumeClaimTemplates:
        - metadata: { name: elasticsearch-data }
          spec:
            accessModes: ["ReadWriteOnce"]
            resources:
              requests: { storage: 500Gi }
            storageClassName: fast-ssd

Operator mengurus hal-hal yang menyakitkan manual: sertifikat TLS, pembuatan user, dan rolling upgrade. Inilah cara paling direkomendasikan menjalankan Elasticsearch di Kubernetes.

StatefulSets, PVC, Service, dan Ingress

Kalau tanpa operator, Elasticsearch dijalankan sebagai StatefulSet — workload ber-status yang cocok untuk database: tiap pod mendapat identitas stabil (es-0, es-1) dan PersistentVolumeClaim (PVC) sendiri, sehingga data tetap ada meski pod di-recreate. volumeClaimTemplates di atas menciptakan satu PVC per pod secara otomatis.

Service Kubernetes mengekspos Elasticsearch ke dalam cluster; Ingress mengatur akses dari luar dengan TLS. ECK juga membuat service untuk Kibana dan APM secara otomatis.

ConfigMaps dan Secrets

  • ConfigMaps menyimpan konfigurasi non-rahasia (misalnya elasticsearch.yml ekstra).
  • Secrets menyimpan kredensial — API keys, password — di mana Kubernetes meng-encrypt-nya saat disimpan.

Jangan pernah menaruh kredensial di ConfigMap; itu teks biasa. Referensi secret lewat envFrom atau volume mount.

Production Considerations

AspekPengaturan
ResourceSet requests = limits (heap dihitung dari request); tidak ada oversubscribe
Anti-affinityPod tersebar di node berbeda agar satu host down tidak menumbangkan cluster
Init containersPersiapan sebelum main container — misal sysctl setting
ProbesreadinessProbe (cluster yellow) dan livenessProbe (health endpoint)
Rolling updatesOperator/StatefulSet meng-update pod satu per satu (episode 30)

Contoh probe:

Readiness dan liveness probe
readinessProbe:
  httpGet:
    path: /_cluster/health?local=true
    port: 9200
    scheme: HTTPS
  initialDelaySeconds: 20
  periodSeconds: 10
livenessProbe:
  httpGet:
    path: /_cluster/health?local=true
    port: 9200
    scheme: HTTPS
  initialDelaySeconds: 60
  periodSeconds: 20

Tip

Mulailah dari ECK — operator menangani StatefulSet, PVC, security, dan upgrade. Menjalankan Elasticsearch di Kubernetes secara manual adalah pekerjaan yang layak satu series tersendiri. Untuk lab, Docker Compose cukup; untuk production, pilih ECK atau Elastic Cloud.

Kesalahan Umum

  1. Tidak ada persistent volume. Data hilang saat pod restart — wajib PVC/volume.
  2. Memory lock tidak diaktifkan. Swap membuat performa anjlok — set memlock dan ulimits.
  3. vm.max_map_count terlalu kecil. Error max virtual memory areas saat start di container.
  4. Resource limits tanpa requests. Oversubscribe merusak node — samakan requests dan limits.
  5. Tanpa anti-affinity. Semua pod di satu host = satu host down = cluster mati.

Penutup

Di episode 27 kalian menguasai container orchestration: image Docker resmi dengan environment variables, Docker Compose multi-node dengan volume dan memory lock, deployment Kubernetes dengan ECK, StatefulSets dan PVC, service dan ingress, ConfigMaps dan Secrets, serta production considerations — resource limits, anti-affinity, init containers, dan probes.

Inti yang harus dibawa pulang:

  • Volume/PVC wajib — data tidak pernah hidup di filesystem container.
  • Compose untuk lab multi-node; ECK untuk production Kubernetes.
  • Resource requests = limits; memlock dan vm.max_map_count diperhatikan.
  • Anti-affinity menyebar pod agar satu host tidak menumbangkan cluster.
  • Probes menjaga siklus hidup pod; ECK mengotomasi security dan upgrade.

Infrastruktur sudah terkontainerisasi — sekarang bagaimana mengelolanya secara terotomasi dan terdokumentasi? Di episode 28 kita bahas CI/CD integration dan infrastructure as code: index template, ILM policy, dan ingest pipeline sebagai code; automated testing query, schema validation, dan performance regression; serta Terraform, Ansible, GitOps, dan deteksi configuration drift. Sampai jumpa!

Belajar Elasticsearch - Container Orchestration - Docker & Kubernetes | Belajar Elasticsearch