在 Kubernetes 上,使用 Persistent Disks 建置 WordPress,並使用 TLS/SSL 連線

許聖泉 Michael Hsu
7 min readFeb 28, 2019

--

本篇將教學如在 GKE 上建置 Wordpress,並且會包含以下 Kubernetes 功能:

  • TLS/SSL
  • Loading balance
  • Using Persistent Disks

英文版請見:https://github.com/tpps88206/wordpress-with-gke/blob/master/README.md

1. 建立 Kubernetes 叢集

登入 GCP 平台並建立新的 Kubernetes 叢集,可以根據使用者的情況設定適合的節點數量,完成後取得 gcloud 連結。

$ gcloud container clusters get-credentials yourk8s --zone asia-east1-b --project yourk8s

2. 建立 MySQL 的 Persistent Volumes

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-volumeclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi

建立 MySQL 的 Persistent Volumes

$ kubectl create -f mysql-volumeclaim.yaml

3. 建立 WordPress 的 Persistent Volumes

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: wordpress-volumeclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi

建立 WordPress 的 Persistent Volumes

$ kubectl create -f wordpress-volumeclaim.yaml

4. 建立 MySQL 密碼的 Secret

$ kubectl create secret generic mysql --from-literal=password=root

5. 建立 MySQL 的 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-volumeclaim

建立 MySQL 的 Deployment

$ kubectl create -f mysql.yaml

6. 建立 MySQL 的 Service

apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
type: ClusterIP
ports:
- port: 3306
selector:
app: mysql

建立 MySQL 的 Service

$ kubectl create -f mysql-service.yaml

7. 建立 WordPress 的 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql:3306
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wordpress-volumeclaim

建立 WordPress 的 Deployment

$ kubectl create -f wordpress.yaml

8. 建立 WordPress 的 Service

apiVersion: v1
kind: Service
metadata:
labels:
app: wordpress
name: wordpress
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: wordpress

建立 WordPress 的 Service

$ kubectl create -f wordpress-service.yaml

9. 增加 WordPress 上傳檔案最大容量(選擇)

先取得 WordPress 的 Pod,並複製

$ kubectl get pod -l app=wordpress

進入容器

$ kubectl exec -ti wordpress-78c9b8d684-zvnqf bash

安裝 vim package

$ apt-get update $ apt-get install vim

將以下程式碼加進 .htaccess

php_value upload_max_filesize 128M 
php_value post_max_size 128M
php_value memory_limit 256M
php_value max_execution_time 300
php_value max_input_time 300

10. 建立 TLS/SSL 的 Secret

確定可以使用 IP 進入 WordPress 並且安裝完畢以後,便可開始設定 TLS/SSL

$ kubectl create secret tls yourwp-tls --key tls/wp.key --cert tls/wp.crt

11. 建立 Ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
spec:
tls:
- hosts:
- yourwp.com
secretName: yourwp-tls
rules:
- host: yourwp.com
http:
paths:
- path: /
backend:
serviceName: wordpress
servicePort: 80
- path: /*
backend:
serviceName: wordpress
servicePort: 80

建立 Ingress

$ kubectl create -f ingress.yaml

建立完成後,由 GCP 的 VPC 網路,取得 Kubernetes 叢集外部靜態 IP,並設定好 DNS 服務。

設定完成後,登入 WordPress 後台,修改預設網址成新的網址即完成。

--

--

許聖泉 Michael Hsu
許聖泉 Michael Hsu

No responses yet