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.

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.
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):
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.3Untuk cluster multi-node di mesin lokal, Compose adalah alat paling praktis:
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 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.
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:
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-ssdOperator mengurus hal-hal yang menyakitkan manual: sertifikat TLS, pembuatan user, dan rolling upgrade. Inilah cara paling direkomendasikan menjalankan Elasticsearch di Kubernetes.
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.
elasticsearch.yml ekstra).Jangan pernah menaruh kredensial di ConfigMap; itu teks biasa. Referensi secret lewat envFrom atau volume mount.
| Aspek | Pengaturan |
|---|---|
| Resource | Set requests = limits (heap dihitung dari request); tidak ada oversubscribe |
| Anti-affinity | Pod tersebar di node berbeda agar satu host down tidak menumbangkan cluster |
| Init containers | Persiapan sebelum main container — misal sysctl setting |
| Probes | readinessProbe (cluster yellow) dan livenessProbe (health endpoint) |
| Rolling updates | Operator/StatefulSet meng-update pod satu per satu (episode 30) |
Contoh 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: 20Tip
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.
vm.max_map_count terlalu kecil. Error max virtual memory areas saat start di container.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:
requests = limits; memlock dan vm.max_map_count diperhatikan.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!