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