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. Ddataabase 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)