CodeFarmer 技術週報 #20 - 初學 Kubernetes (4):動手玩 K8s
今天來參考官方文件手把手地利用 Minikube 與 kubectl 的各種指令實際玩玩看上一篇介紹的各種元件
嗨嗨大家,歡迎閱讀不知不覺竟然已經第 20 期的 CodeFarmer 技術週報!
開頭一如往常簡單閒話家常一下,延續上週的搬家話題,這個週末終於是完全清空了住了 5 年的租屋,也跟前房東辦完交接,正式完成了去年列在第一項的年度目標 — 搬家。
每一次的搬家都是一次斷捨離,離開了習慣的生活圈正式搬到新公司附近開始新生活,雖然暫時還是個租屋仔,但有預感差不多是成家前的最後一租了。
主要是因為前陣子利用找新工作的空檔,也新手入門約了仲介看了幾間房,講了幾年的買房總算是有了個開頭。陸續看的物件有新店陸橋旁的中古屋、宏匯廣場旁的貴鬆鬆新成屋、八字頭的新莊預售屋等,原以為當了幾年的工程師應該還算個生活無虞的階層,殊不知在雙北房價面前我終究感到渺小,這可能也是為什麼我還坐在這持續學習的動機之一吧 (?
所以廢話不多說,就繼續來進行本週的 K8s 學習吧,想看前情提要的讀者也歡迎直接到 Substack 上回顧!
前情提要
上週簡單介紹了 K8s 架構與常用服務,雖然暫時還沒太深入 cluster 底層架構中的 kube-apiserver、kube-scheduler、kubelet、kube-proxy 等觀念,但關於 DevOps 的學習精髓最近的體悟是先知道怎麼用 (How) 比知道那是什麼 (What) 更重要,反正用久了、會動、有了感覺就可以學的更快。
所以今天這篇就直接來動手玩 K8s 吧。
Hello Minikube
參考官方的基礎教學,會借助 Minikube 這個輕量級 K8s 實現來練習。
Step.1 安裝 Minikube
其他作業系統可以參考這個網址來設定 minikube 環境,我這邊就做一下 ARM-based 的 macOS 安裝筆記:
$ curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-darwin-arm64
$ sudo install minikube-darwin-arm64 /usr/local/bin/minikube
這是透過下載 binary 檔案並安裝的方式,或是有 Homebrew 的人也可以直接用以下指令安裝:
$ brew install minikube
Step.2 啟動 Minikube
$ minikube start
直接執行這行後可能會遇到像是 Unable to pick a default driver 這樣的錯誤訊息:
這是因為在啟動 minikube 時也需要 driver 來啟動 K8s cluster,可以看到上圖中有列出像是 docker、podman 等容器化工具,解法可以直接安裝最泛用的 Docker Desktop 後啟動程式,再試一次就可以看到成功畫面:
Step.3 打開 dashboard
$ minikube dashboard
執行這個指令後應該會自動用預設瀏覽器啟動熟悉的 K8s dashboard:
Step.4 部署一個簡單的應用程式
首先先用以下的 kubectl 指令來創建一個用來管理 Pod 的 Deployment:
$ kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
kubectl 是 K8s 的 CLI 工具,如果沒安裝過的讀者也可以參考這個連結安裝。
以上指令的意思是用 kubectl 建立一個名為 hello-node 的 Deployment,在 hello-node 被建立的同時,也會創建一個對應的 Pod,這時如果你到 dashboard 上的網頁畫面可以看到以下的內容:
或其實比較 hardcore 點也可以用指令看:
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 35m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-node-c74958b5d-7bbz5 1/1 Running 0 35m
在上一篇中有提到 Pod 由一個或多個容器組成,因此這裡會看到它用上了一個叫做 agnhost 的 image,並會利用 -- /agnhost netexec --http-port=8080 這段指令去開啟一個 8080 port 的 HTTP server。
補充:agnhost 是一個 K8s 測試用的 image,其中的 netexec 這個指令可以拿來模擬網路連線。
也可以用指令查看 cluster 事件就可以印證上述的細節:
$ kubectl get events
這時候你可能會舉一反三地說,既然我啟了一個 run 在 8080 port 的 HTTP server,那一定可以用網頁去開啟 localhost:8080 看看有沒有東西。
很遺憾,並沒有。
這是因為在建立 Pod 時,預設只能通過 cluster 的內部 IP 連到 hello-node 這個容器,如果要讓外部網路可以連進來,就會需要建立 service。
Step. 5 建立 Service
可以透過以下的指令對 hello-node 這個 Deployment 建立一個對應的 Service,讓外部網路的請求可以透過這個 Service 存取到由 hello-node 產生的 Pod:
$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
可以透過這個指令確認 Service 內容:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
hello-node LoadBalancer 10.106.48.102 <pending> 8080:30812/TCP
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP
此時如果你用這個指令就可以自動打開一個瀏覽器連到這個 HTTP server:
$ minikube service hello-node
小結
今天參考官方文件手把手地利用 Minikube 與 kubectl 的各種指令實際看到了上一篇介紹的各種元件,但不小心有些晚了,只好今天先筆記到這,我們下週三見!
以上就是這期週報的所有內容了。若內容有什麼問題與討論也都歡迎透過以下管道與我交流,或直接留言與回覆這封電子信我也能收到:
Email:codefarmer.tw@gmail.com