iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0

本篇大綱

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

內文

這裡先做個聲明:

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

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

https://ithelp.ithome.com.tw/upload/images/20220927/20112934PqguEzG9tw.png

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

https://ithelp.ithome.com.tw/upload/images/20220927/20112934FFVB0nyO7l.png

再來把 WordPress 安裝上去:

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

https://ithelp.ithome.com.tw/upload/images/20220927/20112934KbXSca1hY8.png

這裡面的 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 就會掛著。

https://ithelp.ithome.com.tw/upload/images/20220927/20112934I6U6HJ56Xc.png

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

https://ithelp.ithome.com.tw/upload/images/20220927/20112934ycd2zPrkvN.png

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

https://ithelp.ithome.com.tw/upload/images/20220927/20112934ueN1Gxj6WM.png

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

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

https://ithelp.ithome.com.tw/upload/images/20220927/20112934b6NbL2O3G4.png

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

kubectl delete -f .
kubectl delete secret mysql-pass

https://ithelp.ithome.com.tw/upload/images/20220927/20112934zyHEKKa9Gn.png

也要記得把 8000 Port 連線刪掉

https://ithelp.ithome.com.tw/upload/images/20220927/20112934gg5Zfemc9J.png

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

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

本系列內容也會同步貼到我的 Blog https://blog.yangjerry.tw 歡迎來我的 Blog 點一下 RSS 追蹤,那我們就下一篇文章見啦!

Source


上一篇
Day 11 Kubernetes - 組建真正的服務吧(一)
下一篇
Day 13 Kubernetes - Cheatsheet 篇
系列文
關於我怎麼把一年內學到的新手 IT/SRE 濃縮到 30 天筆記這檔事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言