Cara menggunakan mysql ha on kubernetes

Namespace dibuat untuk digunakan di environment dengan banyak pengguna yang berada di dalam beberapa tim ataupun proyek. Untuk sebuah cluster dengan beberapa pengguna saja, kamu tidak harus membuat ataupun memikirkan tentang namespace. Mulai gunakan namespace saat kamu membutuhkan fitur dari namespace itu sendiri.

Membuat Namespace Baru

Buat satu file YML dengan nama namespace.yml.

apiVersion: v1
kind: Namespace
metadata:
name: medium-demo
labels:
name : development

Lalu, apply file di atas ke dalam cluster kita.

kubectl apply -f namespace.yml

Pastikan bahwa namespace sudah aktif.

amka@Abduls-MacBook-Pro:~$ kubectl get namespaceNAME                   STATUS   AGE
default Active 17d
medium-demo Active 20s
Membuat PersistentVolumeClaims untuk menyimpan data MySQL

Selanjutnya, kita perlu membuat 1 PVC untuk menyimpan data di dalam direktori /var/lib/mysql.

PVC untuk MySQL

Buat satu file YML dengan nama mysql-vc.yml dengan isinya.

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-volumeclaim
namespace: medium-demo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi

Lalu, apply file mysql-vc.yml ke dalam cluster kita.

amka@Abduls-MacBook-Pro:~$ kubectl apply -f mysql-vc.ymlpersistentvolumeclaim/mysql-volumeclaim created

Pastikan PVC sudah berhasil dibuat dengan namespace.

amka@Abduls-MacBook-Pro:~$ kubectl get pvc -n medium-demo
  • -n adalah singkatan dari namespace, karena semua services MySQL di-deploy dalam namespace medium-demo.
Membuat Secret untuk Menyimpan MySQL Password

Kita perlu membuat 2 Secret, Karena MySQL memerlukan root password dan user

Secret MySQL untuk Root Password

secret-mysql-password.ymlapiVersion: v1
kind: Secret
metadata:
name: mysql-root-password
namespace: medium-demo
type: Opaque
stringData:
password: KuB3D3m0db

Secret MySQL untuk User

secret-mysql-user.ymlapiVersion: v1
kind: Secret
metadata:
name: mysql-user-creds
namespace: medium-demo
type: Opaque
stringData:
MYSQL_USER: user
MYSQL_ROOT_PASSWORD: KuB3D3m0db
MYSQL_PASSWORD: mediumdemomysql

Apply file Secret.

kubectl apply -f secret-mysql-password.ymlkubectl apply -f secret-mysql-user.yml

Pastikan Secret yang sudah dibuat masuk ke dalam namespace medium-demo.

amka@Abduls-MacBook-Pro:~$ kubectl get secret -n medium-demo 

NAME TYPE DATA AGE
mysql-root-password Opaque 1 2m13s
mysql-user-creds Opaque 3 2m45s
Membuat ConfigMap untuk Menyimpan Konfigurasi MySQL

Kita perlu membuat direktori dengan nama mysql-config untuk konfigurasi MySQL yang akan di-mount ke direktori /etc/mysql/conf.d.

letak file

Setelah masuk ke dalam direktori, tahap selanjutnya adalah pembuatan file konfigurasi MySQL dengan nama max_allowed_packet.cnf.

kubectl apply -f namespace.yml
0

Membuat ConfigMap

Siapkan mysql-conf.yml.

kubectl apply -f namespace.yml
1

Apply file ConfigMap.

kubectl apply -f namespace.yml
2

Pastikan ConfigMap sudah masuk ke dalam namespace.

kubectl apply -f namespace.yml
3Membuat Deployment MySQL

Setelah PVC, Secret, dan ConfigMap, kita siap untuk menggunakan file YML berikut.

Pertama, siapkan mysql-cluster.yml.

Sebagai referensi, berikut adalah isi file mysql-cluster.yml yang menggunakan private registry.

kubectl apply -f namespace.yml
4

Untuk yang tidak menggunakan private registry, bisa menggunakan isi di bawah ini.

kubectl apply -f namespace.yml
5

Beberapa komentar tentang YAML,

  • Menggunakan MySQL versi 5.7 untuk menyamakan dengan versi MySQL di CloudSQL,
  • Menggunakan variabel untuk mengambil root password yang ada pada Secret,
  • Jika menggunakan private registry, tambahkan,

    imagePullSecrets:
    — name: gcr-registry-json
kubectl apply -f namespace.yml
6

Selanjutnya, kita dapat memeriksa log dari pod MySQL untuk menentukan apakah layanan sudah berjalan.

kubectl apply -f namespace.yml
7Publish MySQL via Kubernetes Service

Setelah MySQL aktif dan berjalan, kita perlu membuat endpoint publik untuk mengakses MySQL.

Dimulai dengan membuat 2 file YML dengan nama mysql-service-lb.yml dan mysql-service.yml.

kubectl apply -f namespace.yml
8

File mysql-service.yml untuk mendapatkan ClusterIP local dari MySQL.

kubectl apply -f namespace.yml
9

Apply file mysql-service-lb.yml dan mysql-service.yml untuk membuat Service dan pastikan Service tersebut sudah ter-deploy di dalam namespace medium-demo.

amka@Abduls-MacBook-Pro:~$ kubectl get namespaceNAME                   STATUS   AGE
default Active 17d
medium-demo Active 20s
0

Lalu, gunakan ClusterIP untuk mengakses MySQL melalui CLI.

amka@Abduls-MacBook-Pro:~$ kubectl get namespaceNAME                   STATUS   AGE
default Active 17d
medium-demo Active 20s
1

Setelah mencoba mengakses melalui CLI, kita dapat pula menggunakan endpoint publik EXTERNAL-IP untuk mengakses MySQL dari database client.

Itu dia! Setelah mengikuti tahapan tersebut, kita memiliki MySQL yang berjalan di Kubernetes. Jika salah satu node gagal, pod akan secara otomatis dipindahtugaskan ke node yang sehat.