Bài viết này sẽ giới thiệu cách mà mình thiết lập MySQL server trên Kubernetes cluster. Yêu cầu chuẩn bị là bạn phải thực hiện các bài viết:

Namespace

Namespace dùng để quản lý một nhóm các resource, riêng mình thường dùng để phân chia các environments: dev, stagingproduction. Tạo file namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: dev

Sau đó deploy resource:

kubectl apply -f namespace.yaml

Storage

Ở đây, data của MySQL server được lưu trên NFS server đã được tạo ở bài viết trước, chúng ta tạo folder con /mnt/nfs/data/database/dev/mysql

sudo mkdir -p /mnt/nfs/data/database
sudo mkdir -p /mnt/nfs/data/database/dev
sudo mkdir -p /mnt/nfs/data/database/dev/mysql

Sau khi folder trên host machine được tạo, khai báo file storage.yaml để tạo Persistent Volumes cho database:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: mysql-pv
  labels:
    app: mysql
    stage: dev
  namespace: dev
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    server: 192.168.50.1
    path: "/mnt/nfs/data/database/dev/mysql"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-pvc
  labels:
    app: mysql
    stage: dev
  namespace: dev
spec:
  selector:
    matchLabels:
      app: mysql
      stage: dev
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  volumeName: mysql-pv

Deploy resource bằng lệnh: kubectl -n dev apply -f storage.yaml

Secrets

Trong quá trình deploy MySQL resource, chúng ta cần thiết phải đặt mật khẩu cho root user. Để làm điều đó, chúng ta cần lưu mật khẩu đó ở một nơi gọi là Secret. Ví dụ muốn lưu mật khẩu root mysql là abcd123456 thì mở terminal và chạy:

echo -n 'abcd123456' | base64
YWJjZDEyMzQ1Ng==

Sau đó tạo file secrets.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  mypass: YWJjZDEyMzQ1Ng==

Chạy kubectl -n dev apply -f secrets.yaml

Deployment

Tạo file deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
    stage: dev
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
        stage: dev
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: mypass
        livenessProbe:
          tcpSocket:
            port: 3306
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

Sau đó apply resource: kubectl -n dev apply -f deployment.yaml

Service

Tạo resouce service service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    app: mysql
    stage: dev
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
    stage: dev

Với cấu hình service ở trên (ClusterIP) thì chỉ các lớp mạng bên ngoài không thể truy cập vào được mysql server, do đó giúp nâng cao tính bảo mật.

Apply resource kubectl -n dev apply -f service.yaml

Như vậy muốn truy xuất dữ liệu, thêm chỉnh sửa database thì cần phải làm như thế nào? Một vài phương án cho bạn:

  • Mở Kubernetes dashboard và truy xuất trược tiếp vào Pod container
  • Deploy 1 backend kubernetes truy xuất đế database thông qua mysql-service:3306. (Tham khảo ví dụ deploy WordPress trên Kubernetes)
  • Tạo 1 Ingress để public access qua internet
  • Deploy dashboard quản lý như phpmyAdmin (Tham khảo ví dụ deploy PhpMyAdmin)

Liên quan đến khái niệm stateful and stateless chưa được đề cập ở đây

— Anh Nguyễn