在 Kubernetes 上,使用 Persistent Disks 建置 WordPress,並使用 TLS/SSL 連線
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 後台,修改預設網址成新的網址即完成。