Published on

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)