前言
Kubernetes 幫忙處理掉許多以前很繁雜的問題(Auto-Scaling、容器管理..),讓開發者只要手持 Container 與大量 yaml 檔即可將工具部署上去(前提是容器要正常工作),但作為僅有一台筆電的開發者(我)想試玩總不能直接至雲端開叢集(金幣攻擊),因此找到了一個解決方案,使用 k3d 來幫助我們建立 Kubernetes 試玩,以下就一步步帶大家從容器建立到將服務部署於叢集上。
範例專案:louis70109/kubernetes-line-echo-bot
建立容器
首先要先進入 echo-bot-python 資料夾中,在建立前可以先測試這個範例是否正常運作,這隻機器人只是一隻基本回話的 Chatbot:
1 | cd echo-bot-python/ |
- 請至 LINE Developer Console 建立 Chatbot
- LINE Chatbot 建立流程參考於 Chatbot Taichung 工作坊的文章
為求方便與練習,這邊使用 Docker Hub 作為 Kubernetes 的容器使用平台,接著請先至 Docker Hub 註冊帳號並下載 Docker。
1 | docker login # 登入 |
第二段意思是在當前位置建立一個 帳號/line-echo-bot-python
的標籤,因為在上半部測試 Chatbot 時已經在 echo-bot-python/ 資料夾下,若不知道位置可使用 pwd
來查當前位置。
若建立上還是有問題,可以使用我已經有建立好了的 Echo-Bot-Container。
補充: Docker 是 Container 的一個解決方案,Container 不等於 Docker
練習開始
日常工作中,上半部的工作可能會更加複雜,而若只是練習許多人會直接使用 Nginx 來測試也是沒問題的,那麼接下來就開始使用 k3d 來練習囉!
k3d 是什麼呢?它是將 k3s 這個輕量化(Lightweight) Kubernetes 打包成 Docker Image,讓不同平台的 Docker 用戶可以在 Docker 上操作 Kubernetes,當然也有很多不同的服務可以支援,這邊就不贅述。
1. 安裝 k3d (其他安裝方式) 與 kubectl (其他) 於 Mac
1 | brew install k3d |
kubectl 是 kubernetes 操作叢集(cluster)的的指令集
2. 建立叢集(cluster),將 mycluster 改成你想要的名字
1 | k3d cluster create mycluster --agents 1 -p '8082:30080@agent[0]' |
-p 的意思是將本機(Mac)的 8082 port 轉到 Docker 裡的 Kubernetes 環境中的 30080 port
[2021/10/15 更新]
在這天我在回顧使用時遇到了以下錯誤
1 | Error from server (InternalError): an error on the server ("") has prevented the request from succeeding |
問題是在 kubectl
沒有跟 k3d
建立的 cluster 連結
因此重新建立一個 cluster 之後會看到以下的 logs:
1 | INFO[0000] Prep: Network |
其中 kubectl config use-context k3d-nijiacluster
非常中藥,它需要設定 config 讓 kubectl 認識你的 k3d container,下完這指令之後就不會出現剛剛以上的問題喔。
[2021/02/24 更新]
透過 docker ps
會看到剛剛建立的 agent 被起了一個 Docker Container,並 forward 8082:30080
port,這就是 k3d 將 k3s 包裝起來的 Container
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
建立完後使用 k3d node list
來看自己剛剛建立的 cluster 們狀態:
1 | k3d node list |
按造過往經驗, Mac 在這裡會是代表像是 Linux 中的 iptable(防火牆),也就是最後一到對外關卡,因此才需要挖通道讓 Mac 與 Docker 中的 kubernetes 互通。
3. 將 chatbot(bot_service.yml) 部署到 cluster 中
修改以 clone 下來的專案,開啟 bot_service.yml 後先把上述建立好並推上 DockerHub 的容器貼在 image 欄位,並將剛剛建立的 LINE Chatbot key env 參數中:
- 容器對外是 8000 port
- 每個像這樣會被部署的服務皆會稱為 Deployment
1 | containers: |
將 bot_service.yml 部署上 kubernetes(k3d) 並用 get 看來看 pods 的狀態:
1 | kubectl apply -f bot_service.yml |
1 | NAME READY UP-TO-DATE AVAILABLE AGE |
如果要看更詳細資訊的話可以使用 describe 來看:
1 | kubectl describe pods # 看細節 |
4. 進入 forward.yml 介接 kubernetes(k3d) 與 Deployment(chatbot) 的 port
做到這邊狀態現在整體狀態應該會如下:
看到檔案 - forward.yml 中的以下欄位:
1 | ports: |
- 文件上有提到 Kubernetes 預設的 NodePort 範圍為30000-32767,因此上述則被設定在 30080(範圍中)
Reference - port 與 targetPort 則是 Deployment(chatbot) 的對外 port
知道動作後,接著就把它放上 kubernetes 吧!
1 | kebectl apply -f forward.yml |
如此一來就用 forward.yml 這個 deployment 介接完成還可以看到是否有對應成功啦!
1 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE |
5. 測試
我有做一個 root 路由是來測試用的,直接在瀏覽器上輸入 localhost:8082/
看有沒有出現 World 的字串,若有出現代表待會測試 chatbot 理論上也是會成功的。
6. 測試 Chatbot 有沒有 Echo
由於我是在 Mac 上執行,為求方便我使用 ngrok 來建立暫時含有 SSL 的網址,並把網址複製到剛剛於 LINE Developer Console 建立的 Chatbot 當中的 endpoint 欄位,接著就到剛剛的 Chatbot 上開始跟它聊天吧!
結論
憑藉著過往僅存的經驗好不容易完成了一整個 Kubernetes 試玩的循環,雖然曾經因為不小心忘了叢集而被被索取大量費用(怕.png),但在這次的經驗中了解到文件完整性的重要性(Kubernetes & k3d),讓開發者可以在碰壁的情況下快速找到需要的解答,也體現出 Kubernetes 生態的完整性!接下來若有其他的練習(踩坑)經驗我也會再透過文章分享給大家!😊