1. 為什么要有pod
Pod 這個詞原意是“豌豆莢”,后來又延伸出“艙室”“太空艙”等含義,你可以看一下這張圖片,形 象地來說 Pod 就是包含了很多組件、成員的一種結構。
之前的容器技術讓進程在一個“沙盒”環境里運行,具有良好的隔離性,對應用是一個非常好的封裝。
不過,當容器技術進入到現實的生產環境中時,這種隔離性就帶來了一些麻煩。因為很少有應 用是完全獨立運行的,經常需要幾個進程互相協作才能完成任務,比如在我們搭建一個網站的時候,就需要Nginx,數據庫,應用服務等容器一起工作。這三個應用之間的關系還是比較松散的,它們可以分別調度,運行在不 同的機器上也能夠以 IP 地址通信。
但還有一些特殊情況,多個應用結合得非常緊密以至于無法把它們拆開。比如,有的應用運行 前需要其他應用幫它初始化一些配置,還有就是日志代理,它必須讀取另一個應用存儲在本地 磁盤的文件再轉發出去。這些應用如果被強制分離成兩個容器,切斷聯系,就無法正常工作 了。
為了解決這樣多應用聯合運行的問題,同時還要不破壞容器的隔離,就需要在容器外面再建立 一個“收納艙”,讓多個容器既保持相對獨立,又能夠小范圍共享網絡、存儲等資源,而且永遠 是“綁在一起”的狀態。
所以,Pod 的概念也就呼之欲出了,容器正是“豆莢”里那些小小的“豌豆”,你可以在 Pod 的 YAML 里看到,“spec.containers”字段其實是一個數組,里面允許定義多個容器。
2. 為什么 Pod 是 Kubernetes 的核心對象
因為 Pod 是對容器的“打包”,里面的容器是一個整體,總是能夠一起調度、一起運行,絕不會 出現分離的情況,而且 Pod 屬于 Kubernetes,可以在不觸碰下層容器的情況下任意定制修 改。所以有了 Pod 這個抽象概念,Kubernetes 在集群級別上管理應用就會“得心應手”了。
Kubernetes 讓 Pod 去編排處理容器,然后把 Pod 作為應用調度部署的最小單位,Pod 也因此成為了 Kubernetes 世界里的“原子”(當然這個“原子”內部是有結構的,不是鐵板一塊),基于 Pod 就可以構建出更多更復雜的業務形態了。
從這張圖中你也應該能夠看出來,所有的 Kubernetes 資源都直接或者間接地依附在 Pod 之 上,所有的 Kubernetes 功能都必須通過 Pod 來實現,所以 Pod 理所當然地成為了 Kubernetes 的核心對象。
3. 使用 YAML 描述 Pod
既然 Pod 這么重要,那么我們就很有必要來詳細了解一下 Pod,理解了 Pod 概念,我們的 Kubernetes 學習之旅就成功了一半。
在 K8S 中,我們通常使用 YAML 文件來定義和創建 Pod。YAML 文件以簡潔、易讀的格式描述了 Pod 的各種配置信息,就像是一份詳細的建筑藍圖,告訴 K8S 該如何構建我們的 Pod。
下面是一個使用 YAML 文件創建 Pod 的簡單示例:
apiVersion: v1
kind: Pod
metadata:name: my-podlabels:app: my-app
spec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80
在這個示例中,apiVersion字段指定了 K8S API 的版本,它就像是一個軟件的版本號,不同的版本可能會有不同的功能和特性 。kind字段明確了我們要創建的資源類型是 Pod,這是告訴 K8S 我們要構建的是一個 “房子”,而不是其他類型的資源。
metadata字段則包含了 Pod 的元數據信息,其中name是 Pod 的名稱,就像每個人都有自己的名字一樣,Pod 也需要一個唯一的名稱來標識自己 。labels是標簽,它是一種鍵值對形式的元數據,我們可以給 Pod 添加各種標簽,用于對 Pod 進行分類和篩選,比如這里的app: my-app標簽,就可以幫助我們快速找到所有屬于my-app應用的 Pod。
spec字段是整個 YAML 文件的核心部分,它定義了 Pod 的具體規格和配置。containers字段列出了 Pod 中包含的容器信息,這里我們定義了一個名為my-container的容器,它使用的鏡像nginx:latest,這就像是告訴 K8S 我們要在這個 “房間” 里安裝什么 “家具” 。ports字段指定了容器要暴露的端口,這里我們將容器的 80 端口暴露出來,這樣外界就可以通過這個端口訪問到容器內運行的 Nginx 服務。
當我們編寫好 YAML 文件后,只需要執行kubectl apply -f my-pod.yaml命令,K8S 就會根據這個文件的描述創建出對應的 Pod。
4. pod管理
創建好 Pod 之后,我們還需要對它進行各種管理操作,以確保它能夠穩定運行。kubectl 工具為我們提供了豐富的命令來實現這些操作 。?
要查看 Pod 的狀態和詳細信息,可以使用kubectl get pods命令,它會列出所有 Pod 的基本信息,包括名稱、狀態、運行的節點等 。如果想要查看某個 Pod 的詳細信息,比如容器的運行日志、資源使用情況等,可以使用kubectl describe pod my-pod命令,它就像是一個放大鏡,幫助我們深入了解 Pod 的內部狀態 。?
當我們需要進入 Pod 容器內部進行調試或執行一些命令時,可以使用kubectl exec -it my-pod -- /bin/bash命令,其中-it參數表示以交互模式進入容器,--后面的/bin/bash表示在容器內執行的命令,這里我們進入了容器的 bash 終端,就可以像在本地服務器上一樣執行各種命令了 。?
如果需要對 Pod 的配置進行修改,可以使用kubectl edit pod my-pod命令,它會打開一個編輯器,讓我們直接修改 Pod 的 YAML 配置文件,修改保存后,K8S 會自動應用這些更改,就像是給房子重新裝修一樣,讓 Pod 擁有新的 “面貌” 。?
當某個 Pod 不再需要時,我們可以使用kubectl delete pod my-pod命令將其刪除,釋放集群資源。但要注意,刪除 Pod 時要謹慎操作,避免誤刪重要的應用服務 。?
通過這些 kubectl 命令,我們可以輕松地對 Pod 進行創建、查看、管理和刪除等操作,讓我們能夠靈活地掌控 K8S 集群中的應用服務。
5. 小結
通過上面的學習,了解了Kubernetes 里最核心最基本的概念 Pod,知道了應該如何使用 YAML 來定制 Pod,還有如何使用 kubectl 命令來創建、刪除、查看、調試 Pod。
雖然 Pod 是 Kubernetes 的核心概念,非常重要,但事實上在 Kubernetes 里通常并不會直接 創建 Pod,因為它只是對容器做了簡單的包裝,比較脆弱,離復雜的業務需求還有些距離,需 要 Job、CronJob、Deployment 等其他對象增添更多的功能才能投入生產使用。