iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 13
5
DevOps

Kubernetes 30天學習筆記系列 第 13

[Day 13] Demo: 在 minikube 上架設 Stateless Wordpress

前言

在前幾天介紹完幾個常用的 Kubernetes 的元件後,想必讀者對 Kubernetes 有些基本了解。 今天我們將藉由這些元件,在 minikube 上架設 Wordpress

若是還不太熟悉的讀者,不妨在開始今天實作之前,先來回顧一下幾個我們等等會使用的物件:

今天學習筆記內容如下:

  • 介紹什麼是 Wordpress
  • 從 Docker Hub 上下載 Wordpress ImageMySQL Image
  • 實作:如何在 minikube 上架設 Stateless Wordpress

小提醒:今天的程式碼都可以在 demo-wordpress 上找到。

什麼是 Wordpress

Wordpress 是一個可以協助開發者快速架設好一個網站的軟體。Wordpress 是開源的,以 PHP 和 MySQL 為主要架構。除了提供開發者許多外掛以及主題來打造個人 Blog、商業網站之外,Wordpress 本身還提供一個好用的後台,方便網站管理者修改、編輯文件。若是對於 Wordpress 還想暸解更多的讀者,不妨參考 Wordpress 新手教學文件

從 Docker Hub 上下載 WordpressMySQL

若有印象 第四天學習筆記介紹到的 Docker Hub,應該還記得 Docker Hub 上有者許多開源軟體提供的 Docker Image,而 Wordpress 官方 也有提供 Docker Image 讓開發者使用。

Wordpress Docker Image

Docker Hub for Wordpress 頁面中,可以找到 Wordpress Image 中可設定的環境變數(Environment Variables) 的介紹。在稍後我們會透過 Secret 物件,將我們設定的環境變數傳給 Wordpress container。

MySQL Docker Image

正如 前言 提到,Wordpress 是 PHP 以及 MySQL 為主要架構的軟體。在 Wordpress Image 中提供了 PHP 的部分,MySQL server 則需要額外架設。

在這次範例中,我們將使用官方提供的 MySQL Docker Image,來存放 Wordpress 中的所有資料。

Docker Hub for MySQL 頁面 底下,也可以看到 Environment Variables 的介紹。

實作:如何在 minikube 上架設 Stateless Wordpress

首先,用 kubectl get nodes 確認目前 minikube 的運行狀態

$ kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     <none>    1d        v1.8.0

接著,我們需要創建一個 Secret 物件,裡面存放著 Wordpress application 存取 MySQL server 的密碼,以 wordpress-secret.yaml 為例:

apiVersion: v1
kind: Secret
metadata:
  name: wordpress-secret
type: Opaque
data:
  # echo -n "rootpass" | base64
  db-password: cm9vdHBhc3M=

透過 kubectl create 創建 wordpress-secret

$ kubectl create -f ./wordpress-secret.yaml
secret "wordpress-secret" created

接下來使用 my-wordpress-deploy.yaml 創建一個 Deployment 物件去管理 Wordpress 服務, 內容如下:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress-deployment
  template:
    metadata:
      labels:
        app: wordpress-deployment
    spec:
      containers:
      - name: wordpress
        image: wordpress:4-php7.0
        ports:
        - name: wordpress-port
          containerPort: 80
        env:
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: wordpress-secret
              key: db-password
        - name: WORDPRESS_DB_HOST
          value: 127.0.0.1
      - name: mysql
        image: mysql:5.7
        ports:
        - name: mysql-port
          containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: wordpress-secret
              key: db-password

在這個 wordpress-deployment 物件中,我們有兩個 container,分別是 Wordpress application 與 MySQL server。

  • 在 Wordpress Docker Image 介紹中表示,開發者若無指定 WORDPRESS_DB_USER,則連結到 MySQL server 的 user 預設為 root

  • 在 MySQL Docker Image 介紹中表示,可以透過 MYSQL_ROOT_PASSWORD 設定 root 帳號的密碼

  • 因此,我們只需將 MySQL Docker Image 的 MYSQL_ROOT_PASSWORD 與 Wordpress Docker Image 中的 WORDPRESS_DB_PASSWORD 設置相同的密碼。Wordpress Container 就會以 root 身份連結到 MYSQL server container

  • 我們將 Database 的密碼存在 wordpress-secret 中,並將密碼設置成 環境變數

  • Pod 中的 container 都會透過 localhost + port number 互相溝通,所以 Wordpress container 會透過 127.0.0.1:3306 去訪問 MySQL server container

  • 第一次 pull Image 需要較久的時間,可以用 kubectl describe 查看各個物件的狀態

接著,還需要創建一個 Service 物件,讓本機端的瀏覽器也可以訪問到 Kubernetes Cluster 中的 wordpress-deployment 物件。wordpress-service.yaml 設定如下:

apiVersion: v1
kind: Service
metadata:
  name: wordpress-service
spec:
  ports:
  - port: 3000
    nodePort: 30300
    protocol: TCP
    targetPort: wordpress-port
  selector:
    app: wordpress-deployment
  type: NodePort

透過 kubectl create 創建 wordpress-service

$ kubectl create -f ./wordpress-service.yaml
service "wordpress-service" created

最後,我們可以用 kubectl get all 來看一下目前所有物件的狀況,

當所有物件都 READY 時,透過 minikube service 指令找到 wordpress-service 的 url,

$ minikube service wordpress-service --url
http://192.168.99.100:30300

打開本機端的瀏覽器輸入 http://192.168.99.100:30300

便可以看到 Wordpress application 的設定頁面。選擇好自己所需的語言後,點選繼續,會進到使用者登入設定頁面,將 網站名稱使用者帳號使用者密碼,以及 使用者email 都輸入之後,往下點選 Install Wordpress

進到登入頁面後,此時再輸入剛剛設定的帳號密碼,輸入完畢後點選 Login

登入之後,便可以看到 Wordpress 的後台管理。點選左上角的 My Blog 可以進入到首頁。在首頁上,可以看到我們剛剛設置好的使用者帳號與網站 title

如此,我們就在 Kubernetes Cluster 中,利用 Wordpress Docker Image 與 MySQL Docker Image 架設好個人 Blog 網站了。

讀者不妨在 Wordpress 上試試看如何編輯或新增文章。更多有關 Wordpress 的教學,可參考 該連結

最後但也最重要的是,由於 MySQL 的資料都是存在 container 中,若是 Pod 不小心 crash 或是其他因素遭刪除,我們在 Wordpress 後台編輯的資料也會跟著遺失。因此在 [Day 20] 如何保存我的資料 - Volumes 的學習筆記中,筆者也將會與大家詳細介紹如何透過 Volumes 保存 Pod 中的資訊。

總結

希望透過今天在 minikube 上架設 Wordpress 的分享,能幫助讀者更熟悉 Kubernetes 的基本操作。而在往後的學習筆記中,筆者將介紹,如何透過第三方套件 kops ,在AWS 上架設 Kubernetes Cluster,讓實作更貼近於一般的實際場景。

Q&A

依舊歡迎大家給予建議與討論,如果能按個讚給些鼓勵也是很開心唷 : )

參考連結


上一篇
[Day 12] 敏感的資料怎麼存在k8s?! - Secrets
下一篇
[Day 14] Kubernetes Dashboard 介紹
系列文
Kubernetes 30天學習筆記30
0
peter_fu
iT邦新手 5 級 ‧ 2018-03-20 16:23:28

學到了在minikube上架設WP。謝謝版主分享:)

我們常說的WordPress,其實有三種:

  1. WordPress 是軟體本身:一個開源、免費的架站軟體。只要把它裝在任一伺服器,你就可以在網路上發佈內容。
  2. WordPress.org 是WordPress開源計劃的官方網站。在WordPress.org,你可以下載WordPress軟體、閱讀官方文件、及參與討論。
  3. WordPress.com 是一個SaaS(Software as a Service 軟體即服務)架站平台 - 有免費及付費版。

WP入門者,除了在WordPress.org的Codex學習之外,這裡有篇圖文教學
https://ithelp.ithome.com.tw/upload/images/20180320/20109158jXR1jpo8sb.jpg

透過實作,你將學會如何安裝主題、外掛甚至購物車。文末更有WordPress搬家,及「角色權限」管理。

教學大綱:

  1. 如何架設網站
  2. FTP上傳WordPress
  3. File Manager(可選)
  4. 建立資料庫
  5. 安裝WordPress
  6. 登入WordPress
  7. 固定網址設定
  8. 頁面 vs. 文章
  9. 新增頁面
  10. 新增媒體
  11. WordPress主題
  12. 付費版型
  13. 安裝第三方主題
  14. 發表文章
  15. 如何截短文章
  16. WordPress文章摘要
  17. 嵌入影音媒體
  18. 外觀 > 自訂
  19. 設定WordPress選單
  20. 修改小工具
  21. 網站圖示 & Logo
  22. 首頁設定
  23. CSS編輯器
  24. WordPress留言板
  25. Gravatar 大頭貼
  26. 安裝外掛
  27. 必裝外掛推薦
  28. WordPress購物車
  29. 搬家&備份外掛
  30. WordPress角色權限
  31. 權限設定技巧
  32. 新增WP帳號

希望此圖文教學,能幫助WP入門新手~

zxcvbnius iT邦新手 5 級 ‧ 2018-06-06 22:12:48 檢舉

感謝 @peter_fu 分享!! 介紹超詳細的 XD
我也對 WorldPress 有更進一步的認識了!!

0
changec
iT邦新手 5 級 ‧ 2018-05-10 15:21:06

哈囉,有個問題想要請教一下,我成功的建立了這個範例
然後我用[Day 12]的方法進入機器,也就是下面這段語法

kubectl exec -it wordpress-app-55765787f4-2dpfx -- /bin/bash

如果我的理解沒有錯的話,這是Pod內wordpress那個container,
我想請問,如果我想進去mysql,如下圖,該如何進去呢?謝謝您

mysql>

補充:
剛剛看到[Day 17]
因為產生2個pod分別為wordpress跟mysql-server
所以透過 kubectl exec -it mysql-server -- /bin/bash
可以順利進去mysql,不過還是想知道,如果只有一個pod,產生兩個container,
該怎麼進去mysql。

答案:自問自答XD 參考這邊

kubectl exec -it <podname> -c mysql -- /bin/bash
zxcvbnius iT邦新手 5 級 ‧ 2018-06-06 22:14:10 檢舉

Hi @changec
是的沒錯 XD,抱歉現在才看到...太不常登這個帳號了 XD

0
changec
iT邦新手 5 級 ‧ 2018-05-28 14:27:14

哈囉您好,有一問題想請教,如果我在本機端A成功連進wordpress了,
有什麼辦法讓同一網域的其他電腦或是手機也可以連進A呢

zxcvbnius iT邦新手 5 級 ‧ 2018-06-06 22:17:46 檢舉

如果是同網域的話,可以查看一下本機端 A 的 private ip, 通常為 10.0 或 192.168 等開頭。通常若無其他防火牆設定,其他設備端可以直接透過該 private ip 直接與本機端 A 相連。

我要留言

立即登入留言