《關於我怎麼把一年內學到的新手 IT/SRE 濃縮到 30 天筆記這檔事》 Day 12 Kubernetes - 組建真正的服務吧(二)

本篇大綱

這篇要來嘗試 Service 之間的連線,用 MySQL 建立 DB 掛 Service,再用 Wordpress 連線到 MySQL 的 Service 上,並且使用 Port forward 把 Wordpress 轉出去。

內文

這裡先做個聲明:

  • Wordpress 有官方建議的安裝方式,如果想要在正式環境使用,請參考 Wordpress 建議安裝,這裡只是為了展示 Pod 與 Service 之間的溝通和 Secret 的運作方式。
  • MySQL 想要用 ReplicaSet,請使用 MySQL 官方指定的 K8s 建議安裝方式,請不要使用 Deployment 方式作為安裝。

今天要實作 Wordpress + MySQL 架設服務,以下是這次的架構圖:

day12-01.png

mysql-deployment 建立 mysql-pod,儲存資料用 emptyDir,傳 mysql-pass-secret 進去當作資料庫的密碼,再用 mysql-svc 對外開 Port。

接下來用 wordpress-deployment 建立 Wordpress Pod,儲存資料用 emptyDir,傳入 mysql-pass-secret 作為連接資料庫的密碼,再用 Service 對外出去連線。

那就先來建立 Secret 作為 MySQL 的密碼:

1
kubectl create secret generic mysql-pass --from-literal=password='My5tr0ngP@s5w0rd'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 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 安裝上去:

1
2
kubectl apply -f mysql-deploy.yaml -f mysql-svc.yaml
kubectl get all

day12-02.png

再來把 WordPress 安裝上去:

1
2
kubectl apply -f wordpress-deploy.yaml -f wordpress-svc.yaml
kubectl get all

day12-03.png

這裡面的 Service 都採用 ClusterIP 連線,那要怎麼連上去?

我這裡可以偷偷開個 port forward 從 bastion-host 轉發出去:

1
2
# 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 就會掛著。

day12-04.png

那記得把 OpenStack 安全性群組 Public SSH 的 8080 Port 打開,這樣 Bastion Host 才能連線。

day12-05.png

那我們就可以在網址上輸入:http://103.122.116.3:8000 試試連線

day12-06.png

有辦法顯示這樣畫面就代表簡單服務已經完成了!

那就可以回到 Console 按下 ctrl+c 回到 bastion-host(瀏覽器端就會停止連線了)

day12-07.png

記得把剛剛的設定檔刪除:

1
2
kubectl delete -f .
kubectl delete secret mysql-pass

day12-08.png

也要記得把 8000 Port 連線刪掉

day12-09.png

這樣每次安裝上去都有點麻煩,都要去重新命名,有沒有比較方便的工具可以讓我們直接 apply 這些設定呢?

其實是有的,那個工具叫做 Helm,後面就要來介紹它怎麼安裝使用了。

本系列內容也會同步貼到我的 iT 邦幫忙 https://ithelp.ithome.com.tw/users/20112934 歡迎來點一下追蹤,那我們就下一篇文章見啦!

Source


《關於我怎麼把一年內學到的新手 IT/SRE 濃縮到 30 天筆記這檔事》 Day 12 Kubernetes - 組建真正的服務吧(二)
https://blog.yangjerry.tw/2022/09/27/it2022-day12/
作者
Jerry Yang
發布於
2022年9月27日
許可協議