Saturday, January 18, 2025

Cài đặt wordpress trên Kubernetes

-

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

cat > mysql-deployment.yaml << 'OEF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: website-mysql
  namespace: wordpress
  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
OEF

MySQL Service

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.yaml

cat > mysql-service.yaml << 'OEF'
apiVersion: v1
kind: Service
metadata:
  name: website-mysql
  namespace: wordpress
  labels:
    app: website-mysql
spec:
  ports:
    - port: 3306
  selector:
    app: website-mysql
OEF

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:

cat > mysql-volume.yaml << 'OEF'
apiVersion: v1
kind: PersistentVolume
metadata:
  name: website-mysql-pv
  namespace: wordpress
  labels:
    app: website-mysql
spec:
  storageClassName: website-mysql
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/nfsdata/website/mysql"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: website-mysql-pvc
  namespace: wordpress
  labels:
    app: website-mysql
spec:
  storageClassName: website-mysql
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
OEF

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 database
  • WORDPRESS_DB_USER: Tên của user có quyền access vào database ở trên
  • WORDPRESS_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:

cat > wordpress-deployment.yaml << 'OEF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: website-wp
  namespace: wordpress
  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
OEF

WordPress service

wordpress-service.yaml:

cat > wordpress-service.yaml << 'OEF'
apiVersion: v1
kind: Service
metadata:
  name: website-wp
  namespace: wordpress
  labels:
    app: website-wp
spec:
  ports:
    - port: 80
  selector:
    app: website-wp
  #type: LoadBalancer
OEF

WordPress Volume

wordpress-volume.yaml

cat > wordpress-volume.yaml << 'OEF'
apiVersion: v1
kind: PersistentVolume
metadata:
  name: website-wp-pv
  namespace: wordpress
  labels:
    app: website-wp
spec:
  storageClassName: website-wp
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/mnt/nfs/website/www"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: website-wp-pvc
  namespace: wordpress
  labels:
    app: website-wp
spec:
  storageClassName: website-wp
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
OEF

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

cat > secrets.yaml << 'OEF'
apiVersion: v1
kind: Secret
metadata:
  name: mysql
  namespace: wordpress
  labels:
    app: website-wp
type: Opaque
data:
  db_prefix: d3Bf
  db_name: ZGVtbw==
  db_user: ZGVtby11c2Vy
  db_pass: ZGVtby1wYXNz
  username: bXlzcWwtYWRtaW4=
  password: bXlwYXNz
OEF

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

cat > ingress.yaml << 'OEF'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: website
  namespace: wordpress
  labels:
    app: website-wp
  annotations:
    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:
#     - wordpress.hoanghd.com
#     secretName: ssl-wordpress.hoanghd.com
  ingressClassName: nginx
  rules:
    - host: hoanghd.com
      http:
        paths:
          - backend:
              service:
                name: website-wp
                port:
                  number: 80
            path: /
            pathType: Prefix
OEF

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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories