Belajar Kubernetes (Penggunaan Service dengan Tipe Headless Service)
Salah satu contoh kasus untuk penggunaan headless service yang sering digunakan di kubernetes adalah untuk menjalankan sebuah distributed database cluster seperti Mongodb cluster atau Apache Kafka.
Database cluster tersebut membutuhkan beberapa server atau pod yang berjalan secara paralel untuk memastikan high availability, scalability dan fault tolerance. Dalam kasus ini, setiap database berjalan pada pod masing-masing yang memiliki alamat IP dan hostname yang unik.
Headless service dapat digunakan untuk mengkespos setiap individual pod secara terpisah dengan endpoints dari service atau aplikasi lain yang ada dalam kubernetes cluster. Setiap alamat IP dan hostname tersebut dapat digunakan untuk melakukan koneksi langsung terhadap pod dari database.
Pendekatan ini memberikan beberapa manfaat, antara lain:
- Load Balancing: Headless service dapat bertindak sebagai load balancer, mendistribusikan trafik secara merata ke seluruh database pods.
- Scaling: Semakin banyak pod database yang ditambahkan dan dihapus, headless service akan secara otomatis memperbarui daftar endpoint untuk merefleksikan state dari cluster.
- Discovery: Headless service menyediakan cara mudah baaplikasi lain untuk menemukan endpoint individu dari pod database.
Berikut adalah contoh manifest Pod untuk menjalankan instance MongoDB di Kubernetes:
apiVersion: v1
kind: Pod
metadata:
name: mongodb-0
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo:4.4.3
ports:
- containerPort: 27017
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-username
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-password
volumeMounts:
- name: mongodb-data
mountPath: /data/db
volumes:
- name: mongodb-data
emptyDir: {}
Dalam contoh tersebut, kita membuat sebuah MongoDB pod dengan nama mongodb-0
berjalan dengan image mongo:4.4.3
. Kita juga menggunakan port 27017 yang merupakan port default dari mongodb. Disini kita juga melakukan mounting emptyDir volume untuk menyimpan MongoDB data dan melakukan konfigurasi environment variables untuk mengambil alamat IP dari pod dan yang terakhir kita menentukan user dan password dengan menggunakan fitur secret.
Untuk membuat sebuah headless service MongoDB, kita dapat menggunakan manifest berikut:
apiVersion: v1
kind: Service
metadata:
name: mongodb
spec:
clusterIP: None
selector:
app: mongodb
ports:
- name: mongo
port: 27017
Manifes ini membuat headless service bernama mongodb dengan clusterIP dari None untuk menunjukkan bahwa itu adalah headless service. Selector akan mencocokkan pod dengan label app: mongodb untuk memilih semua pod yang menjalankan aplikasi MongoDB, dan menampilkan port 27017 untuk trafik MongoDB.
Secara keseluruhan, menggunakan headless service bersama dengan distributed database cluster di Kubernetes dapat membantu memastikan high availability, scalability, dan fault tolerance, sekaligus menyederhanakan proses koneksi dan berinteraksi dengan pod database.