今年是 AI 生態圈快速發展的一年,許多應用在快速萌芽,但身為後端開發者的我來說,打好基礎還是比較重要的。過去幾年我專注於語言、架構或可觀測性工程的學習,近期則發現自己對 Kubernetes還不夠熟悉。因此,這個月我決定從頭學習 Kubernetes 的基礎。不過,身為開發者而非 Infra 工程師,單機的 k8s 環境就很夠用了。這次,我選擇了 KinD(Kubernetes in Docker)、 DevSpace 和 DevContainer 作為學習主題,因為它更貼近現代 CI/CD、測試自動化等情境,也更容易在不同平台上快速建立多節點Cluster。
其實今年寫這系列的主因是,OpenTelemetry Collector 需要用到 KinD 做測試。然後 eBPF cilium 框架也很需要 K8s 的知識,不如先讓自己熟稔這方面的知識。這次我給自己的課題就是要能夠在 local 跟 CI 環境中能透過 KinD 來測試跟驗證,明年再來挑戰 eBPF 相關的議題。
這次學習旅途預計修煉以下知識(只是預計也有可能調整)︰
這次主要想學習以下 3 個工具︰
CI/CD 的佈署跟 Infra 管理等,就不會在這次學習範圍中了。因為我覺得 DevOps 不是只有 CI/CD,而是能整合一些工具來增加開發體驗。而且...我也不是 Infra 工程師 XD
學習目的 :第一天我們先來掌握 KinD 的安裝、配置和基本操作,建立高效的本地開發環境。
KinD(Kubernetes in Docker)是一個可以在本地端利用 Docker 容器快速建立 Kubernetes 叢集的工具。它特別適合開發、測試、CI/CD pipeline 等場景,讓你不用依賴雲端或實體機器,就能輕鬆模擬多節點的 k8s 環境。
K8s 是一個分散式容器編排平台,本身沒有「本地單機」的官方安裝方式。
Minikube、k3d、KinD 都是「本地端模擬 K8s」的工具,讓你不用真的建一整套生產環境,也能體驗/測試 K8s 的部署流程。
你在這些環境寫的 YAML、用的 kubectl 指令,幾乎都跟運營環境一樣。
Minikube、k3d、kind 都是用來在本地端快速建立 Kubernetes 叢集的工具。
它們本質上都在幫你「模擬一個小型的 K8s 環境」,方便開發、測試、學習,不需像生產環境那樣複雜。Minikube、k3d、KinD 都是用來在本地端快速建立 Kubernetes 叢集的工具。
它們本質上都在幫你「模擬一個小型的 K8s 環境」,方便開發、測試、學習,不需像生產環境那樣複雜。
各工具簡介與差異
工具 | 底層運作 | 特色與優勢 | 適合情境 |
---|---|---|---|
Minikube | VM/Container | 最接近原生 K8s,安裝簡單,支援多種驅動(Docker、VM)、有 Dashboard、外掛多 | 學習、開發、初學者、單機測試 |
k3d | Docker Container | 基於輕量級 k3s(非官方 K8s),超快啟動,佔用資源少,適合多節點模擬 | 需要多節點、資源有限、CI 測試 |
KinD | Docker Container | 使用官方 K8s,全部跑在 Docker 裡,超快啟動,非常適合 CI/CD pipeline | 自動化測試、CI/CD、開發環境 |
##為什麼後端工程師應該學習 KinD?
現代雲端架構趨勢現在許多後端應用都會部署在 Kubernetes 上,學會 KinD 就等於學會如何在本地模擬這種雲端環境。你可以先在本地驗證應用的部署、設定與運作,降低在雲端出錯的機率。
開發與測試自動化利器
KinD 天生適合整合到 CI/CD pipeline,常被用於自動化測試環境。你可以在本機或 CI server 上快速建立、銷毀叢集,大幅提升測試與開發效率。
熟悉 k8s 多節點與網路行為
KinD 支援多節點部署,幫助你了解 k8s 真實運作時的網路、服務發現、Pod 調度等細節,這是 Minikube 較難模擬的。
容器化思維與除錯KinD 完全基於 Docker,讓你更熟悉容器生態,也方便直接測試本地自建 Image 的行為。
團隊協作與跨平台一致性
KinD 的叢集定義完全程式化(YAML),可納入版本控制,讓團隊每個人都能用相同設定快速建立一致的 k8s 環境。
指令 | 功能說明 | 描述 |
---|---|---|
kind | create cluster | 建立一個新的 Kubernetes 叢集(可加參數自訂名稱等) |
kind | delete cluster | 刪除一個叢集(預設為 kind,也可指定名稱) |
kind | get clusters | 列出目前所有由 kind 建立的叢集 |
kind | get kubeconfig | 輸出 kubeconfig 設定(可用於多叢集/多帳號場景) |
kind | load docker-image | 將本地 Docker image 載入 kind 叢集 |
kind | export logs | 匯出叢集的詳細 log(除錯用) |
kind | build node-image | 從 Kubernetes 原始碼自製 node image(進階用) |
kind | version | 顯示 kind 版本 |
kind | completion | 產生 shell 自動補全腳本 |
kind | export kubeconfig | 匯出 kubeconfig 檔案 |
kind 和 kubectl 都是 Kubernetes 相關工具,但他們的用途和功能不同,彼此之間有明確的分工和關聯:
kind 是一個用來建立、管理本地 Kubernetes 叢集的工具。
它主要負責:
kubectl 是Kubernetes 的官方命令列管理工具。
它主要負責:
kind ──> 建立本地 K8s 叢集 ──>
\
→ kubectl ──> 管理/查詢/部署 K8s 資源
必須先安裝好 Docker。沒有 Docker,KinD 無法運作。
參考 KinD 官方網站 Installation 的教學。
小弟我是 Linux Mint 的系統,首先我需要確認自己的 CPU 架構是 x86 還是 arm 指令集。
> uname -m
x86_64
根據指令下載對應版本的 kind 並給予可執行權限,鐵人賽當下 KinD 最新是 v0.29.0
版本,之後應該當下最新的版本來換版本號進行安裝。
# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
輸入指令確定 kind 安裝完成,且版本如預期。
> kind version
kind v0.29.0 go1.24.2 linux/amd64
參考k8s Install kubectl on Linux
因為剛剛已經確認過是x86指令集了。
# 下載 kubectl 最新版本
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# 安裝到系統路徑
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 確認安裝完成
kubectl version
我們能透過 get Gets one of [clusters, nodes, kubeconfig]
這指令,來取得 cluster、nodes、kubeconfig 的現有清單,確定我們目前是沒有建立 cluster 的。
> kind get clusters
No kind clusters found.
然後我們就能建立 k8s cluster 了。透過 create
指令,以及 --name
就能定義 cluster 名稱,若是沒給名稱,則預設是kind
。所以可以同時建立多個不同名稱的 kind 叢集,彼此互不影響,這就很像 Docker-compose。
> kind create cluster --name demo
Creating cluster "demo" ...
# 確認並下載(如果本地沒有)Kubernetes 節點所需的 Docker image。
✓ Ensuring node image (kindest/node:v1.33.1) 🖼
# 準備要啟動的節點(這裡通常就是一個 control-plane node,也可以設定多節點)。
✓ Preparing nodes 📦
# 產生並寫入 Kubernetes cluster 的設定檔。
✓ Writing configuration 📜
# 啟動 Kubernetes 的 control-plane node(即主要管理節點)。
✓ Starting control-plane 🕹️
# 安裝 CNI (Container Network Interface),讓 Pod 之間可以互相通訊。
✓ Installing CNI 🔌
# 安裝預設的 StorageClass,讓你可以在叢集裡建立 PersistentVolumeClaim 等儲存資源。
✓ Installing StorageClass 💾
# kind 已經自動幫你把 kubectl 的預設 context 切換到這個新建立的 demo 叢集。
# 之後你用 kubectl 指令時,會直接操作這個叢集。
Set kubectl context to "kind-demo"
You can now use your cluster with:
kubectl cluster-info --context kind-demo
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community
kubectl cluster-info
# 這是你的 Kubernetes 叢集的 API Server 位址(本機連接埠 35123)
Kubernetes control plane is running at https://127.0.0.1:35123
# 這是叢集內 DNS 服務的位置。
CoreDNS is running at https://127.0.0.1:35123/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
# 如果你要進一步除錯,可以用這個指令取得更詳細的診斷資訊。
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
當我們透過瀏覽器打開https://127.0.0.1:35123
,會看到以下錯誤 403 Forbidden 訊息。
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
"reason": "Forbidden",
"details": {},
"code": 403
}
因為 K8s API Server 需要權限驗證,你沒有帶上 kubeconfig 憑證資訊,所以被視為「匿名使用者(system:anonymous)」。匿名使用者沒有權限存取 API Server 的根路徑,因此回傳 403 Forbidden。通常我們會透過kubectl
來存取這的資訊,因為 kubectl 會自動讀取 kubeconfig 檔案,帶上認證資訊(token、憑證等)跟 API Server 溝通。
除非我們有 token。
我們能透過 kubectl config view
查詢。
找到目前 context 對應的 user 設定。
ca.crt
、cert.crt
和 key.key
,3個檔案後。就能透過 curl 指令來看件資訊了。> kubectl config view --raw
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZ
server: https://127.0.0.1:35123
name: kind-demo
contexts:
- context:
cluster: kind-demo
user: kind-demo
name: kind-demo
current-context: kind-demo
kind: Config
preferences: {}
users:
- name: kind-demo
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk
client-key-data: LS0tLS1CRU==
這下我們就能成功的獲取該 K8s API server 跟目錄下所有可操作的 API 路徑了,這裡只列舉一部分。
> curl --cert cert.crt --key key.key --cacert ca.crt https://127.0.0.1:35123
{
"paths": [
"/.well-known/openid-configuration",
"/api",
"/api/v1",
"/apis",
"/healthz",
"/livez",
"/metrics",
"/openapi/v2",
"/openapi/v3",
"/openapi/v3/",
"/readyz",
"/version"
]
}%
所以若要用 API 來存取 k8s 除了用 kubectl,其實也能依靠client certificate authentication
來存取,只要憑證沒過期沒被撤銷就能繼續用。
當我們做完實驗或測試時,就能把資源給刪除乾淨了,畢竟 KinD 就是來給我們測試跟實驗用的,不適合跑在環境中。
我們能先查看現有 KinD cluster 有哪些,這時應該只有剛剛建立出來的 demo cluster。
> kind get clusters
demo
刪除跟建立Cluster的指令非常相似。
# 刪除單一 Cluster
kind delete cluster --name demo
# 刪除所有 Cluster
for c in $(kind get clusters); do kind delete cluster --name $c; done
# 清理 Docker 殘留資源
docker system prune -a
# 刪除 kubeconfig 設定
# KinD 產生的 kubeconfig 檔案預設寫在 ~/.kube/config,如果你只用 KinD,可以直接清空或移除
rm -rf ~/.kube/config
KinD 是開發者「本地端玩 Kubernetes」的超好用利器,能讓你無痛練習、測試、Debug,跟生產環境無縫接軌,是每個現代後端工程師都該會的技能!
如果你還沒玩過 KinD,真的推薦馬上動手試試,你會發現 K8s 沒那麼可怕,而且本地端也能很快上手、驗證想法!