Bài viết này sẽ giới thiệu cách cài đặt 1 website dùng WordPress trên Kubernetes cluster.
Cài đặt MySQL trên Kubernetes
MySQL Deployment
mysql-deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: website-mysql namespace: website labels: app: website-mysql spec: selector: matchLabels: app: website-mysql strategy: type: Recreate template: metadata: labels: app: website-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: website-mysql-pvc
Sau khi deploy file yaml này thì 1 MySQL server được tạo trong namespace wordpress
đồng thời 1 database với tên, user, password truy cập được khởi tạo thông qua việc truyền các giá trị vào 3 env MYSQL_DATABASE
, MYSQL_USER
và MYSQL_PASSWORD
, đây là thông tin nhạy cảm nên sẽ được lưu trong 1 secretKey tên là mysql sẽ được nói đến ở phần secrets.yaml
MySQL Service
mysql-service.yaml:
apiVersion: v1 kind: Service metadata: name: website-mysql namespace: website labels: app: website-mysql spec: ports: - port: 3306 selector: app: website-mysql
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/website/mysql
: là folder lưu data của MySQL trên NFS server
mysql-volume.yaml:
kind: PersistentVolume apiVersion: v1 metadata: name: website-mysql-pv namespace: website labels: app: website-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/website/mysql" --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: website-mysql-pvc namespace: website labels: app: website-mysql spec: selector: matchLabels: app: website-mysql accessModes: - ReadWriteOnce resources: requests: storage: 1Gi volumeMode: Filesystem volumeName: website-mysql-pv
Cài đặt WordPress trên Kubernetes
WordPress Deployment
Các thông số cần quan tâm:
WORDPRESS_DB_HOST
: đây là địa chỉ của MySQL server chưa database của wordpress và cũng chính là service name của MySQL đã deploy ở trên.WORDPRESS_DB_NAME
: Tên của databaseWORDPRESS_DB_USER
: Tên của user có quyền access vào database ở trênWORDPRESS_DB_PASSWORD
: Mật khẩu của user đóWORDPRESS_TABLE_PREFIX
: tùy chọn giúp thay đổi prefix của wordpress database, mặc định làwp
wordpress-deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: website-wp namespace: website labels: app: website-wp spec: selector: matchLabels: app: website-wp strategy: type: Recreate template: metadata: labels: app: website-wp spec: containers: - image: wordpress:5.8-apache imagePullPolicy: IfNotPresent name: wordpress env: - name: WORDPRESS_DB_HOST value: website-mysql - name: WORDPRESS_DB_NAME valueFrom: secretKeyRef: name: mysql key: db_name - name: WORDPRESS_DB_USER valueFrom: secretKeyRef: name: mysql key: db_user - name: WORDPRESS_TABLE_PREFIX valueFrom: secretKeyRef: name: mysql key: db_prefix - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql key: db_pass ports: - containerPort: 80 name: wordpress volumeMounts: - name: wordpress-files mountPath: /var/www/html volumes: - name: wordpress-files persistentVolumeClaim: claimName: website-wp-pvc
WordPress service
wordpress-service.yaml:
apiVersion: v1 kind: Service metadata: name: website-wp namespace: website labels: app: website-wp spec: ports: - port: 80 selector: app: website-wp type: LoadBalancer
WordPress Volume
wordpress-volume.yaml
kind: PersistentVolume apiVersion: v1 metadata: name: website-wp-pv namespace: website labels: app: website-wp spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: server: 10.110.0.101 path: "/mnt/nfs/website/www" --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: website-wp-pvc namespace: website labels: app: website-wp spec: selector: matchLabels: app: website-wp accessModes: - ReadWriteMany resources: requests: storage: 5Gi volumeName: website-wp-pv
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.
Secrets chưa thông tin nhạy cảm
Như đã nói ở trên, 1 số thông tin nhạy cảm như Mật khấu, user của database không nên được thể hiện trong file yaml. Chúng ta nên tạo 1 file secrets để chứa các thông tin đó.
secrets.yaml
Các giá trị db_prefix
, db_name
, … là các chuỗi ký tự được encode bằng base64
piVersion: v1 kind: Secret metadata: name: mysql namespace: website labels: app: website-wp type: Opaque data: db_prefix: d3Bf db_name: ZGVtbw== db_user: ZGVtby11c2Vy db_pass: ZGVtby1wYXNz username: bXlzcWwtYWRtaW4= password: bXlwYXNz
Ingress
Thiết lập Ingress resouce, bây giờ bạn có thể truy cập vào wordpress thông qua địa chỉ https://website.com
ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: website namespace: website labels: app: website-wp annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/add-base-url: "true" nginx.ingress.kubernetes.io/proxy-body-size: "0" spec: tls: - hosts: - website.com secretName: ssl-website.com rules: - host: website.com http: paths: - path: / pathType: Prefix backend: service: name: website-wp port: number: 80
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 .\wordpress-volume.yaml kubectl apply -f .\mysql-deployment.yaml kubectl apply -f .\wordpress-deployment.yaml kubectl apply -f .\mysql-service.yaml kubectl apply -f .\wordpress-service.yaml kubectl apply -f .\ingress.yaml