本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。
從前面的文章我們知道,Kubernetes 脫胎於 Google 的 Borg,Borg 在 Kubernetes 誕生之初已經在 Google 內部身經百戰 10 余年,且不說它的歷史源遠流長,就憑它是出自 Google 那幫天才工程師之手,就知道它的學習難度不低。
對於這種有一定學習門檻的技術,最好的入門方式是先玩起來,如果剛開始就沉迷在那些理論中,很容易從入門到放棄。
可喜的是,Google 已經考慮到了這一點,官方文檔提供了一個很小的 demo,麻雀雖小,五臟俱全,這個 demo 基本涵蓋了 K8S 的基本概念,通過它,可以輕松構建一個 K8S 集群,玩轉 K8S,我們現在就去玩一玩。(PS:下面提到的概念,我們后面會詳細討論,不理解可以暫時跳過)
打開:
https://kubernetes.io/docs/tutorials/kubernetes-basics
映入眼簾的是圖文並茂的 6 個步驟:
- 創建一個 K8S 集群
- 部署 APP
- 探索 APP
- 訪問 APP
- APP 彈性伸縮
- 更新 APP
在開始每個步驟之前,先來了解個東西——minikube
。顧名思義,這是一個迷你版的 K8S,一個輕量級的 K8S 實現,對於平常的學習體驗,使用它可以達到和使用 K8S 一樣的效果。它的部署方式足夠簡單,All-In-One,一個集群只有一個節點,K8S 所有組件都部署在這個節點上。
用戶也可以使用 Web UI 和 minikube CLI 的方式來管理 K8S 集群,比如:啟動,停止,刪除,獲取狀態等。官方的 demo 就是使用 minikube CLI 來完成的。
話不多說,下面我們就開始體驗下 K8S 之旅吧。
第一步:創建一個 K8S 集群
在交互界面輸入 minikube start
就創建了一個 K8S 集群,這個集群創建在一台 VM 上,K8S 所有組件都跑在這台 VM 上。
接下來我們就可以使用 K8S 命令行工具 kubectl
來操作這個集群了。
kubectl version
查看 K8S 的版本號:
看到兩個 version,client version
指 kubectl 的 version,server version
就是 K8S 的 version。
kubectl get nodes
獲取集群節點數:
可以看到這個 demo 只有一個節點,就是前面創建的 VM。status
是 ready
,說明該節點准備好部署 APP 了。
第二步:部署一個 APP
執行命令:
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
就完成了一個 APP 的部署。
其中,--image
指定 APP 的 Docker 鏡像,--port
設置 APP 對外服務的端口,kubectl run
會下載鏡像,然后創建 deployment
,根據 deployment 創建 APP。deployment 就像是 APP 的說明書,它指導怎么創建 和維護 APP。APP 創建完運行在 Docker 容器中,使用 kubectl get deployments
可以查看 deployment 的信息。
第三步:探索 APP
上一步創建完 deployment,會接着創建 Pod 來運行 APP 容器,K8S 使用 Pod 來管理容器資源,一個 Pod 可以包含一個或多個容器,在這個例子,一個 Pod 就只有一個 APP 容器。使用 kubectl get pods
查看當前 Pod 信息。
更詳細信息使用 kubectl describe pods
查看。
kubectl 工具對於排錯很有幫助,下面幾個是較為常用的命令:
- kubectl get - 列出資源
- kubectl describe - 顯示資源的詳細信息
- kubectl logs - 輸出 Pod 中容器的日志
- kubectl exec - 在 Pod 容器中執行命令
第四步:訪問 APP
默認情況下,所有 Pod 都只能在集群內部訪問,上面看到每個 Pod 有 IP 和端口,Pod 之間可以直接訪問。外部想要訪問 Pod, 需要將端口暴露出去,執行如下命令:
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
將容器的端口(8080)映射到節點的端口。
執行 kubectl get services
查看映射到的節點的端口。
可以看到容器的 8080 端口已經映射到節點的 31915 端口。外部可以通過 NodeIP:Port
的方式就可以訪問到 Pod 內的容器,如下:
service
是 K8S 中對 Pod 的進一步抽象,是外部訪問 Pod 的入口。如果把 K8S 集群想象成一個組織,那么 service 就是這個組織的接口人,為什么需要 service,這個留作后面的內容再講,在這里你可以把它暫時理解成端口映射。
第五步:APP 的彈性伸縮
為了滿足高可用,Pod 可以自動擴容和縮容。默認情況下,Pod 只會運行一個副本,這是由 deployment 定義的,可以通過 kubectl get deployments
查看副本數,通過 kubectl scale deployments/app --replicas=num
增加或減少副本數。
比如,增加副本數到 4 個:
看到 Pod 數也增加到了 4 個。
減少副本數為 2 個:
看到兩個副本顯示 Terminating,表示正在中止,過段時間再看就只有兩個了。
對於多副本的情況,訪問 APP 會實現負載均衡,如下:
看到每次請求訪問都落在不同的 Pod 上,這個功能是由 service 來完成的。
第六步:更新 APP
當前 APP 使用的鏡像版本是 v1,需要升級到 v2,執行如下命令:
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
看到升級過程是先中止之前的 4 個副本,再重開 4 個副本。
如果回退到 v1 版本,只用執行如下命令即可:
kubectl rollout undo deployments/kubernetes-bootcamp
至此,我們已經通過官方這個 demo 體驗了一把 K8S 的功能和使用方法,下面我會陸陸續續把自己學習 K8S 的筆記整理出來,分享給你,希望對你有幫助。如有可能,請隨手轉發分享一下,讓更多的人也參與進來。
最后,還是繼續送書,容器網絡專家倪朋飛寫的《K8S 指南》電子書,如有需要后台回復“K8S”(之前回復過就不用回復了)。如需加群學習回復“加群”。
我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。