這篇文章的目標很明確:帶你成功建立第一個本地的 Kubernetes (K8s) 叢集。我們先專注於「建立」,讓服務成功運行起來,至於複雜的 K8s 指令,我們可以在實際操作中慢慢熟悉。
為了達成這個目標,我準備了一個簡單而完整的範例專案,讓你一窺現代雲原生應用的基本樣貌。
叢集基礎 (Kind):我們將使用 Kind (Kubernetes in Docker) 來模擬 K8s 環境。它非常巧妙地將每個 K8s 節點(Node)都打包成一個 Docker 容器,讓你在本機就能輕鬆擁有一個多節點的叢集。
一個前端服務:一個簡單的 Web 介面。
一個後端服務:一個提供 API 的 HTTP 伺服器。
流量入口 (Nginx Ingress):在 Port 80/443 上部署一個 Nginx Ingress Controller,它就像是整個叢集的交通警察,負責將外部流量導向到正確的服務。
域名服務 (sslip.io):透過 sslip.io
這個免費的公開 DNS 服務,讓我們能用一個漂亮的網址(而不是 localhost:8080
這種形式)來訪問我們的應用。
專案連結:https://github.com/kevinyay945/learn-devops-iac-kind
在魔法開始之前,請確保你的開發環境已經安裝好必要的工具。
安裝 Kind:請參考 Kind 官網 的指引,將 Kind 這個核心工具安裝好。
安裝 Docker:Kind 的一切都運行在 Docker 之上,請確保 Docker Desktop 正在你的電腦上運行。
安裝 kubectl:這是與 K8s 叢集溝通的官方命令列工具,後續所有操作都會依賴它。
首先,從 GitHub 下載範例專案,並進入專案目錄。
git clone https://github.com/kevinyay945/learn-devops-iac-kind.git
cd learn-devops-iac-kind
接著,驗證 Kind 是否安裝成功。這是一個很好的除錯起點。
kind version
如果你看到類似 kind v0.20.0
的版本資訊,代表工具已準備就緒。
這是最關鍵的一步。我們將使用 Kind,根據預先定義好的設定檔來建立叢集。
kind create cluster --config ./component/kind/kind-config.yaml
洞見:這個指令的靈魂在於 --config
所指向的 kind-config.yaml
檔案。這個檔案定義了叢集的拓撲結構,其中最關鍵的設定是 extraPortMappings
,它負責將你電腦的 Port 80 和 443 映射到 Kind 叢集內部的對應 Port。若沒有這個設定,外部世界的所有請求都將被擋在叢集之外,我們部署的任何服務都將無法訪問。
叢集本身只提供了運行的基礎設施,但它還不知道如何處理來自外部的 HTTP/HTTPS 請求。這時,我們需要一個「交通指揮官」的角色,也就是 Ingress Controller。
pushd ./component/ingress/scripts
./ingress-for-kind.sh
popd
這個腳本會自動幫我們安裝社群推薦的 Nginx Ingress Controller。安裝完成後,我們可以檢查它是否正常運行。
kubectl get pods -n ingress-nginx -o wide
你應該會看到一個 ingress-nginx-controller-...
的 Pod,且其 STATUS
為 Running
。這表示我們的交通指揮官已經上崗了。
萬事俱備,現在我們可以將範例專案中的前端和後端服務部署到叢集裡了。
kubectl apply -k .
洞見:這裡 -k .
參數的威力在於它啟用了 Kustomize。kubectl
會讀取當前目錄下的 kustomization.yaml
檔案,並根據其定義,一次性地建立所有相關的 K8s 資源,包括前端的 Deployment、後端的 Deployment、對應的 Service 以及最重要的 Ingress 規則。這是一種比單獨 apply
每一個 yaml 檔更現代、更具擴展性的管理方式。
所有服務都已部署並運行。現在,打開你的瀏覽器,訪問以下兩個網址:
如果你已經熟悉了前面的步驟,或者只是想快速啟動環境,可以直接執行以下整合腳本,它會自動完成叢集建立、Ingress安裝和應用部署的所有工作。
kind create cluster --config ./component/kind/kind-config.yaml
pushd ./component/ingress/scripts
./ingress-for-kind.sh
popd
kubectl apply -k .
當你在瀏覽器輸入網址時,一趟奇妙的旅程就此展開:
DNS 解析:sslip.io
服務會自動將 127.0.0.1.sslip.io
這個域名解析回 127.0.0.1
,也就是你的本機 IP。
端口映射:請求到達你電腦的 80 Port,並被 Docker 轉發到 Kind 容器內部的 80 Port (歸功於第二步的設定)。
Ingress 路由:Kind 容器內的 Nginx Ingress Controller 接收到請求,並根據請求的 Hostname (frontend...
或 backend...
),查詢它所管理的 Ingress 規則。
服務轉發:Ingress 找到對應的規則,將請求精準地轉發到叢集內部的前端或後端服務 (Pod)。
成功響應:你的瀏覽器最終收到了來自 K8s 叢集內部服務的回應,並成功渲染頁面。
恭喜!你已經成功在本地端建立並運行了一個功能完整的 Kubernetes 應用。從這裡開始,你便有了一個可以隨意實驗、不怕玩壞的 K8s 沙盒環境。
當你實驗完畢,想要釋放電腦資源時,只需要一行指令就可以將 Kind 建立的整個叢集(包含裡面所有的應用)完整刪除,不會留下任何殘餘。
kind delete cluster
這個指令會刪除預設名稱為 kind
的叢集。如果你的叢集在建立時有透過 --name
參數自訂名稱,刪除時也需要用同樣的名稱來指定。