這篇要來嘗試 Service 之間的連線,用 MySQL 建立 DB 掛 Service,再用 Wordpress 連線到 MySQL 的 Service 上,並且使用 Port forward 把 Wordpress 轉出去。
這裡先做個聲明:
今天要實作 Wordpress + MySQL 架設服務,以下是這次的架構圖:
用 mysql-deployment
建立 mysql-pod
,儲存資料用 emptyDir,傳 mysql-pass-secret
進去當作資料庫的密碼,再用 mysql-svc
對外開 Port。
接下來用 wordpress-deployment
建立 Wordpress Pod,儲存資料用 emptyDir,傳入 mysql-pass-secret
作為連接資料庫的密碼,再用 Service 對外出去連線。
那就先來建立 Secret 作為 MySQL 的密碼:
kubectl create secret generic mysql-pass --from-literal=password='My5tr0ngP@s5w0rd'
# 1. Save as `mysql-svc.yaml`
# 2. In bash, `kubectl apply -f mysql-svc.yaml`
# 3. If you want to remove, `kubectl delete -f mysql-svc.yaml`
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306 # Expost 3306 Port
selector:
app: wordpress
tier: mysql
# 1. Save as `mysql-deploy.yaml`
# 2. In bash, `kubectl apply -f mysql-deploy.yaml`
# 3. If you want to remove, `kubectl delete -f mysql-deploy.yaml`
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deploy
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env: # 環境變數
- name: MYSQL_ROOT_PASSWORD # 設定資料庫 root 密碼
valueFrom:
secretKeyRef: # 從 Secret 取得
name: mysql-pass # Secret 名字
key: password # Secret 裡面的 password 資料
ports:
- containerPort: 3306 # 將 3306 Port 對外開放
name: mysql
volumeMounts:
- name: mysql-persistent-storage # 對應到下面的 Volume
mountPath: /var/lib/mysql # 對應 Container 路徑
volumes:
- name: mysql-persistent-storage # 定義 Volume 名字
emptyDir: {} # 使用 EmptyDir 儲存
# 1. Save as `wordpress-svc.yaml`
# 2. In bash, `kubectl apply -f wordpress-svc.yaml`
# 3. If you want to remove, `kubectl delete -f wordpress-svc.yaml`
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: ClusterIP
# 1. Save as `wordpress-deploy.yaml`
# 2. In bash, `kubectl apply -f wordpress-deploy.yaml`
# 3. If you want to remove, `kubectl delete -f wordpress-deploy.yaml`
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-deploy
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:4.8-apache
name: wordpress
env: # 環境變數
- name: WORDPRESS_DB_HOST # 設定 Wordpress DB 主機
value: wordpress-mysql # 填寫 MySQL 的 Service 名字
- name: WORDPRESS_DB_PASSWORD # 設定 Wordpress DB 密碼
valueFrom:
secretKeyRef: # 從 Secret 取得
name: mysql-pass # Secret 名字
key: password # Secret 裡面的 password 資料
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage # 對應到下面的 Volume
mountPath: /var/www/html # 對應 Container 路徑
volumes:
- name: wordpress-persistent-storage # 定義 Volume 名字
emptyDir: {} # 使用 EmptyDir 儲存
那先把 MySQL 安裝上去:
kubectl apply -f mysql-deploy.yaml -f mysql-svc.yaml
kubectl get all
再來把 WordPress 安裝上去:
kubectl apply -f wordpress-deploy.yaml -f wordpress-svc.yaml
kubectl get all
這裡面的 Service 都採用 ClusterIP 連線,那要怎麼連上去?
我這裡可以偷偷開個 port forward 從 bastion-host
轉發出去:
# kubectl port-forward <POD 或 SERVICE 皆可> <HostPort>:<ServicePort or ContainerPort>
kubectl port-forward service/wordpress 8000:80 --address='0.0.0.0'
後面加個 --address='0.0.0.0'
代表所有主機皆可連線,預設是 127.0.0.1
,按下 enter 就會掛著。
那記得把 OpenStack 安全性群組 Public SSH
的 8080 Port 打開,這樣 Bastion Host 才能連線。
那我們就可以在網址上輸入:http://103.122.116.3:8000
試試連線
有辦法顯示這樣畫面就代表簡單服務已經完成了!
那就可以回到 Console 按下 ctrl+c
回到 bastion-host
(瀏覽器端就會停止連線了)
記得把剛剛的設定檔刪除:
kubectl delete -f .
kubectl delete secret mysql-pass
也要記得把 8000 Port 連線刪掉
這樣每次安裝上去都有點麻煩,都要去重新命名,有沒有比較方便的工具可以讓我們直接 apply 這些設定呢?
其實是有的,那個工具叫做 Helm,後面就要來介紹它怎麼安裝使用了。
本系列內容也會同步貼到我的 Blog https://blog.yangjerry.tw 歡迎來我的 Blog 點一下 RSS 追蹤,那我們就下一篇文章見啦!