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
OEFMySQL 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
OEFMySQL 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
OEFCà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
OEFWordPress 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
OEFWordPress 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
OEFXem 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
OEFIngress
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
OEFSau 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
