- Đăng vào
Cài đặt database MySQL trên Kubernetes
Bài viết này sẽ trình bày cách deploy database MySQL trên Kubernetes cluster mà mình sử dụng trong môi trường DEV, không nên sử dụng cho môi trường production. Database sẽ sử dụng phương thức lưu trữ NFS.
MySQL Volume
Trong ví dụ của mình dùng Persistent Volume NFS, các bạn có thể dùng loại PV khác cũng được. Trong đó:
10.110.0.101
: là IP của NFS server/mnt/nfsdata/database/mysql
: là folder lưu data của MySQL trên NFS server.
Xem thêm bài viết Thiết lập và dụng NFS Persistent Volume trên Kubernetes để hiểu rõ hơn về NFS PVC.
mysql-volume.yaml:
kind: PersistentVolume
apiVersion: v1
metadata:
name: database-mysql-pv
namespace: database
labels:
app: mysql
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
mountOptions:
- hard
- nfsvers=4.1
nfs:
server: 10.110.0.101
path: '/mnt/nfsdata/database/mysql'
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: database-mysql-pvc
namespace: database
labels:
app: mysql
spec:
selector:
matchLabels:
app: database-mysql
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
volumeMode: Filesystem
volumeName: database-mysql-pv
MySQL Deployment
mysql-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: database-mysql
namespace: database
labels:
app: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: mysql
key: db_name
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql
key: db_user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: db_pass
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql
mountPath: /var/lib/mysql
volumes:
- name: mysql
persistentVolumeClaim:
claimName: database-mysql-pvc
Với cấu hình này:
- MYSQL_ROOT_PASSWORD: là mật khẩu của root trong mysql
- MYSQL_DATABASE: tên của database được khởi tạo ban đầu.
- MYSQL_USER: tên của user được khởi tạo ban đầu, user này là owner của databse ở trên.
- MYSQL_PASSWORD: Mật khẩu của user ở trên.
Các thông tin ở trên được lưu trong secrets tên mysql
nhằm tránh hiển thị thông tin nhạy cảm ở dạng plain text.
MySQL Secrets
secrets.yaml
Các giá trị db_pass
, db_name
, ... là các chuỗi ký tự được encode bằng base64
apiVersion: v1
kind: Secret
metadata:
name: mysql
namespace: database
labels:
app: mysql
type: Opaque
data:
db_name: ZGVtbw== # demo
db_user: ZGVtby11c2Vy # demo-user
db_pass: ZGVtby1wYXNz # demo-pass
password: bXlwYXNz # mypass
MySQL Service
mysql-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: database-mysql
namespace: database
labels:
app: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
Sau khi đã tạo hết các file đó, chúng ta chạy kubectl
để cài đặt và thiết lập trang web wordpress lên Kubernetes cluster
kubectl create namespace website
kubectl apply -f .\secrets.yaml
kubectl apply -f .\mysql-volume.yaml
kubectl apply -f .\mysql-deployment.yaml
kubectl apply -f .\mysql-service.yaml
Sau khi database được triển khai thì mọi pod trong cluster đề có thể truy cập vào MySQL server qua hosts mysql.database
(service.namespace)