2 cách xây dựng website WordPress trên Kubernetes bằng YAML và Helm Chart

Những điểm chính

 

• Quan điểm của mình: Theo kinh nghiệm triển khai thực tế, việc đưa WordPress lên Kubernetes giúp giải quyết hiệu quả các vấn đề về khả năng mở rộng và tính sẵn sàng cao mà mô hình hosting truyền thống thường gặp hạn chế. Tuy nhiên, để hệ thống hoạt động ổn định cần đặc biệt chú ý đến quản lý Persistent Volume và tối ưu tài nguyên để đảm bảo hiệu suất cũng như chi phí vận hành hợp lý.

 

• Nắm vững các yêu cầu chuẩn bị: Giúp bạn thiết lập đầy đủ môi trường cần thiết trước khi triển khai WordPress trên Kubernetes.

 

• Nắm vững quy trình triển khai bằng YAML: Giúp bạn kiểm soát chi tiết toàn bộ tài nguyên Kubernetes từ build image, deploy database đến triển khai ứng dụng.

 

• Tìm hiểu triển khai bằng Helm Chart: Giúp đơn giản hóa quá trình cài đặt, dễ dàng quản lý, nâng cấp và rollback ứng dụng bằng vài lệnh cơ bản.

 

Yêu cầu cần thiết trước khi triển khai

 

Để triển khai WordPress trên Kubernetes thành công, bạn cần chuẩn bị đầy đủ các yêu cầu kỹ thuật cho cả hai phương pháp YAML manifests và Helm Chart:

 

• Kubernetes cluster và công cụ quản lý: Kubernetes cluster phiên bản 1.10 trở lên, đã bật RBAC (Role-Based Access Control), có quyền admin để tạo và quản lý Deployment, Namespace, Service, PVC… Đồng thời cần cài kubectl trên máy local và cấu hình đúng cluster context.

 

• Docker và container registry: Máy local cần cài Docker để build custom WordPress image. Ngoài ra cần có Docker Hub hoặc container registry để push image custom hoặc sử dụng image public như wordpress:5.8.3-php7.4-apache, mysql:5.7.

 

• Helm package manager (đối với phương pháp Helm): Cần cài Helm client và cấu hình kết nối tới cluster Kubernetes.

 

• Quyền truy cập và storage provisioner: Cluster cần có StorageClass hỗ trợ ReadWriteOnce để cấp phát PersistentVolume cho MySQL và dữ liệu uploads của WordPress.

 

• MySQL external server (đối với Helm): MySQL server cần cho phép kết nối từ Kubernetes cluster bằng cách chỉnh bind-address=0.0.0.0 và restart lại MySQL service.

 

Xây dựng website WordPress trên Kubernetes bằng YAML manifests

 

Bước 1: Tạo namespace và Secret/ConfigMap

 

Bạn clone repository chứa manifests:


 
git clone https://github.com/techiescamp/kubernetes-projects.git

cd kubernetes-projects/04-WordPress-deployment

 

Tiếp theo tạo namespace riêng cho WordPress:


 
kubectl create ns wordpress

kubectl config set-context --current --namespace=wordpress
 

Sau đó tạo Secret mysql-cred chứa thông tin đăng nhập MySQL bằng base64 encode và apply bằng:


 
kubectl apply -f secret.yaml
 

Tiếp theo tạo ConfigMap cho Nginx và MySQL init script:


 
kubectl apply -f nginx-cm.yaml

kubectl apply -f mysql-cm.yaml
 

Bước 2: Tạo PersistentVolumeClaim

 

Bạn tạo PVC wordpress-pvc với dung lượng 2Gi để lưu uploads WordPress:


 
apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: wordpress-pvc

spec:

  storageClassName: local-path

  accessModes:

    - ReadWriteOnce

  resources:

    requests:

      storage: 2Gi
 

MySQL StatefulSet cũng sẽ tự tạo PVC riêng để lưu dữ liệu database tại /var/lib/mysql.

 

Do StorageClass local-path dùng volumeBindingMode: WaitForFirstConsumer nên trạng thái Pending ban đầu là bình thường.

 

Bước 3: Build và push custom Docker image

 

Bạn di chuyển vào thư mục Docker chứa Dockerfile, startup.sh, php.ini và cấu hình WordPress.

 

Build image:


 
docker build -t wordpress-nginx:7.0.0 .
 

Sau đó tag và push image lên Docker Hub:


 
docker tag wordpress-nginx:7.0.0 techiescamp/wordpress-nginx:7.0.0

docker push techiescamp/wordpress-nginx:7.0.0
 

Bước 4: Deploy MySQL StatefulSet

 

Bạn deploy MySQL bằng:


 
kubectl apply -f mysql.yaml
 

StatefulSet sử dụng image mysql:latest, mount PVC để lưu database và ConfigMap để chạy init

 

Sau khi deploy, kiểm tra trạng thái:


 
kubectl get sts

kubectl get svc

kubectl get pod

kubectl get pvc
 

Khi MySQL Pod ở trạng thái Running và PVC đã Bound nghĩa là database đã hoạt động bình thường.

 

Bước 5: Deploy WordPress Deployment

 

Tiếp theo deploy WordPress:


 
kubectl apply -f wordpress.yaml
 

Deployment sử dụng custom image techiescamp/wordpress-nginx:7.0.0, kết nối tới MySQL thông qua Service nội bộ.

 

WordPress Deployment sẽ mount:

 

• ConfigMap Nginx tại /etc/nginx/conf.d

 

• PVC uploads tại /var/www/html/wordpress/wp-content/uploads

 

Sau đó kiểm tra tài nguyên:


 
kubectl get pvc,pod,deploy,svc
 

Đảm bảo Pod WordPress ở trạng thái Running và Service đã expose đúng NodePort.

 

Bước 6: Tạo NetworkPolicy và truy cập website

 

Bạn apply NetworkPolicy để chỉ cho phép WordPress truy cập MySQL:


 
kubectl apply -f networkpolicy.yaml
 

Sau đó truy cập WordPress bằng:


 
YOUR-NODE-IP:30004
 

Tiến hành cài đặt WordPress lần đầu bằng cách chọn ngôn ngữ, nhập site title, username, password và email quản trị.

 

Cuối cùng kiểm tra lại PVC/PV để đảm bảo dữ liệu đã được lưu persistent.

 

Xây dựng website WordPress trên Kubernetes bằng Helm Chart

 

Bước 1: Cấu hình MySQL external server

 

Bạn SSH vào MySQL server rồi đăng nhập:


 
mysql -u root -p
 

Tạo database WordPress:


 
CREATE DATABASE wordpress;
 

Tạo user riêng cho WordPress:


 
CREATE USER wordpress_user IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON wordpress.* TO wordpress_user@'%';

FLUSH PRIVILEGES;

 

Kiểm tra lại database:


 
SHOW DATABASES;
 

Sau đó chỉnh file:


 
/etc/mysql/mysql.conf.d/mysqld.cnf
 

Thay:


 
bind-address=127.0.0.1
 

thành:


 
bind-address=0.0.0.0
 

rồi restart MySQL:


 
sudo systemctl restart mysql
 

Bước 2: Deploy WordPress bằng Helm Chart Bitnami

 

Bạn thêm repository Bitnami:


 
helm repo add bitnami https://charts.bitnami.com/bitnami

helm repo update
 

Tiếp theo deploy WordPress:


 
helm install myblog bitnami/wordpress \

--set externalDatabase.host=<IP_MYSQL> \

--set externalDatabase.user=root \

--set externalDatabase.password=password \

--set externalDatabase.database=wordpress \

--set mariadb.enabled=false
 

Lệnh trên sẽ deploy toàn bộ WordPress bằng Helm Chart và sử dụng MySQL external thay vì MariaDB internal.

 

Bước 3: Nâng cấp và rollback Helm release

 

Để kiểm tra release hiện tại:


 
helm list
 

Khi có phiên bản mới, cập nhật repository:


 
helm repo update
 

Kiểm tra chart:


 
helm inspect chart bitnami/wordpress
 

Nâng cấp release:


 
helm upgrade myblog bitnami/wordpress
 

Nếu gặp lỗi sau khi update, bạn có thể rollback về revision cũ:


 
helm rollback myblog <REVISION_NUMBER>
 

Helm giúp việc quản lý phiên bản, nâng cấp và rollback WordPress trên Kubernetes đơn giản hơn rất nhiều so với triển khai YAML thủ công.

 

So sánh triển khai bằng YAML và Helm Chart

 

Tiêu chí YAML Manifests Helm Chart
Mức độ kiểm soát Chi tiết, tùy biến cao Nhanh và tự động hơn
Độ phức tạp Cao hơn Đơn giản hơn
Quản lý phiên bản Thủ công Hỗ trợ upgrade/rollback
Phù hợp Hệ thống cần custom sâu Triển khai nhanh
Thời gian triển khai Lâu hơn Nhanh hơn

 

Khi nào nên chọn YAML hoặc Helm?

 

• Nên dùng YAML manifests khi bạn cần kiểm soát toàn bộ cấu hình Kubernetes, custom sâu hoặc muốn học chi tiết cách hoạt động của từng resource.

 

• Nên dùng Helm Chart khi cần triển khai nhanh, dễ nâng cấp, rollback và quản lý ứng dụng theo mô hình package manager trên Kubernetes.

 HỖ TRỢ TRỰC TUYẾN