Contoh: Men-deploy WordPress dan MySQL dengan Persistent Volumes
Tutorial ini menunjukkan cara untuk men-deploy situs WordPress dan database MySQL menggunakan Minikube. Kedua aplikasi ini menggunakan PersistentVolumes dan PersistentVolumeClaims untuk menyimpan data.
PersistentVolume (PV) adalah bagian dari penyimpanan di dalam klaster yang telah disediakan secara manual oleh administrator, atau secara dinamis disediakan oleh Kubernetes menggunakan StorageClass.
PersistentVolumeClaim (PVC) adalah permintaan penyimpanan oleh pengguna yang dapat dipenuhi oleh PV. PersistentVolumes dan PersistentVolumeClaims bersifat independen dari siklus hidup Pod dan mempertahankan data meskipun Pod di-restart, dijadwalkan ulang, atau bahkan dihapus.
Peringatan:
Deployment ini tidak cocok untuk kasus penggunaan produksi, karena menggunakan Pod WordPress dan MySQL instance tunggal. Pertimbangkan untuk menggunakan WordPress Helm Chart untuk mendeploy WordPress di lingkungan produksi.Catatan:
File yang disediakan dalam tutorial ini menggunakan API Deployment GA dan spesifik untuk Kubernetes versi 1.9 dan yang lebih baru. Jika kamu ingin menggunakan tutorial ini dengan versi Kubernetes yang lebih lama, harap perbarui versi API sesuai kebutuhan, atau rujuk ke versi tutorial sebelumnya.Tujuan
- Membuat PersistentVolumeClaims dan PersistentVolumes
- Membuat
kustomization.yaml
dengan- generator Secret
- konfigurasi sumber daya MySQL
- konfigurasi sumber daya WordPress
- Terapkan direktori kustomisasi dengan
kubectl apply -k ./
- Bersihkan sumber daya
Sebelum kamu memulai
Kamu harus memiliki klaster Kubernetes, dan perangkat baris perintah kubectl juga harus dikonfigurasikan untuk berkomunikasi dengan klastermu. Jika kamu belum memiliki klaster, kamu dapat membuatnya dengan menggunakan minikube, atau kamu juga dapat menggunakan salah satu dari tempat mencoba Kubernetes berikut ini:
Untuk melihat versi, tekan kubectl version
.
Contoh yang ditunjukkan di halaman ini bekerja dengan kubectl
versi 1.27 dan yang lebih baru.
Unduh file konfigurasi berikut:
Membuat PersistentVolumeClaims dan PersistentVolumes
MySQL dan WordPress masing-masing memerlukan PersistentVolume untuk menyimpan data. PersistentVolumeClaims mereka akan dibuat pada langkah deployment.
Banyak lingkungan klaster memiliki StorageClass default yang sudah di-instal. Ketika StorageClass tidak ditentukan dalam PersistentVolumeClaim, StorageClass default klaster akan digunakan.
Ketika PersistentVolumeClaim dibuat, PersistentVolume akan disediakan secara dinamis berdasarkan konfigurasi StorageClass.
Peringatan:
Di klaster lokal, StorageClass default menggunakan provisionerhostPath
. Volume hostPath
hanya cocok untuk pengembangan dan pengujian. Dengan volume hostPath
, data kamu akan disimpan di /tmp
pada node tempat Pod dijadwalkan dan tidak akan berpindah antar node. Jika sebuah Pod mati dan dijadwalkan ke node lain di klaster, atau node di-reboot, data akan hilang.Catatan:
Jika kamuu menjalankan klaster yang memerlukan provisionerhostPath
, flag --enable-hostpath-provisioner
harus diatur pada komponen controller-manager
.Catatan:
Jika kamu memiliki klaster Kubernetes yang berjalan di Google Kubernetes Engine, silakan ikuti panduan ini.Membuat kustomization.yaml
Menambahkan Generator Secret
Secret adalah objek yang menyimpan data sensitif seperti kata sandi atau kunci. Sejak versi 1.14, kubectl
mendukung pengelolaan objek Kubernetes menggunakan file kustomisasi. kamu dapat membuat Secret menggunakan generator di kustomization.yaml
.
Tambahkan generator Secret di kustomization.yaml
dengan perintah berikut. kamu perlu mengganti KATA_SANDI
dengan kata sandi yang ingin kamu gunakan.
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=KATA_SANDI
EOF
Menambahkan Konfigurasi Sumber Daya untuk MySQL dan WordPress
Manifest berikut menjelaskan Deployment MySQL instance tunggal. Kontainer MySQL memasang PersistentVolume di /var/lib/mysql. Variabel lingkungan MYSQL_ROOT_PASSWORD
mengatur kata sandi database dari Secret.
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:8.0
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
Manifest berikut menjelaskan Deployment WordPress instance tunggal. Kontainer WordPress memasang PersistentVolume di /var/www/html
untuk file data situs web. Variabel lingkungan WORDPRESS_DB_HOST
mengatur nama Layanan MySQL yang didefinisikan di atas, dan WordPress akan mengakses database melalui Layanan. Variabel lingkungan WORDPRESS_DB_PASSWORD
mengatur kata sandi database dari Secret yang dihasilkan oleh kustomize.
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:6.2.1-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: WORDPRESS_DB_USER
value: wordpress
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
-
Unduh file konfigurasi deployment MySQL.
curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
-
Unduh file konfigurasi WordPress.
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
-
Tambahkan mereka ke file
kustomization.yaml
.cat <<EOF >>./kustomization.yaml resources: - mysql-deployment.yaml - wordpress-deployment.yaml EOF
Terapkan dan Verifikasi
kustomization.yaml
berisi semua sumber daya untuk mendeploy situs WordPress dan database MySQL. kamu dapat menerapkan direktori dengan
kubectl apply -k ./
Sekarang kamu dapat memverifikasi bahwa semua objek ada.
-
Verifikasi bahwa Secret ada dengan menjalankan perintah berikut:
kubectl get secrets
Responsnya akan seperti ini:
NAME TYPE DATA AGE mysql-pass-c57bb4t7mf Opaque 1 9s
-
Verifikasi bahwa PersistentVolume telah disediakan secara dinamis.
kubectl get pvc
Catatan:
Mungkin memerlukan waktu beberapa menit untuk PV disediakan dan terikat.Responsnya akan seperti ini:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pv-claim Bound pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s wp-pv-claim Bound pvc-8cd0df54-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s
-
Verifikasi bahwa Pod sedang berjalan dengan menjalankan perintah berikut:
kubectl get pods
Catatan:
Mungkin memerlukan waktu beberapa menit untuk Status Pod menjadiRUNNING
.Responsnya akan seperti ini:
NAME READY STATUS RESTARTS AGE wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s
-
Verifikasi bahwa Layanan sedang berjalan dengan menjalankan perintah berikut:
kubectl get services wordpress
Responsnya akan seperti ini:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress LoadBalancer 10.0.0.89 <pending> 80:32406/TCP 4m
Catatan:
Minikube hanya dapat mengekspos Layanan melaluiNodePort
. EXTERNAL-IP selalu pending. -
Jalankan perintah berikut untuk mendapatkan Alamat IP untuk Layanan WordPress:
minikube service wordpress --url
Responsnya akan seperti ini:
http://1.2.3.4:32406
-
Salin alamat IP, dan muat halaman di browser kamu untuk melihat situs kamu.
kamu akan melihat halaman pengaturan WordPress yang mirip dengan tangkapan layar berikut.
Peringatan:
Jangan biarkan instalasi WordPress kamu di halaman ini. Jika pengguna lain menemukannya, mereka dapat mengatur situs web di instance kamu dan menggunakannya untuk menyajikan konten berbahaya.
Instal WordPress dengan membuat nama pengguna dan kata sandi atau hapus instance kamu.
Bersihkan
-
Jalankan perintah berikut untuk menghapus Secret, Deployment, Service, dan PersistentVolumeClaim kamu:
kubectl delete -k ./
Selanjutnya
- Pelajari lebih lanjut tentang Introspeksi dan Debugging
- Pelajari lebih lanjut tentang Jobs
- Pelajari lebih lanjut tentang Port Forwarding
- Pelajari cara Mendapatkan Shell ke Kontainer