1、容器、Pod是什麼
容器是一個獨立的環境,我們在其中打包應用程序及其依賴項。通常,容器運行單個進程,每個容器都有一個IP地址,可以附加捲並控制CPU和內存資源等。所有這些都是通過命名空間和控制組的概念發生的。
Kubernetes是一個用於部署、擴展和管理容器化應用程序的容器編排系統,它有自己的容器運行方式。其中,Pod是Kubernetes中最小的可部署單元,代表應用程序的單個實例。
比如,如果想運行Nginx應用程序,就可以在Pod中運行。與容器的區別:容器是一個單一的單元,而一個Pod可以包含多個容器。可以將Pod視為將一個或多個容器容納在一起的盒子。Pod提供更高級別的抽象,允許將多個容器作為一個單元管理。這裏不再是每一個容器一個IP,而是Pod整體獲取一個IP,然後Pod內的多個不同容器互相之間,用localhost通信。
1)Pod內所有容器共享以下Linux命名空間:
- 網絡命名空間:統一IP、端口範圍、路由規則;
- IPC命名空間:支持進程間通信(信號、管道、共享內存);
- UTS命名空間:共享主機名與域名;
- 存儲卷:Pod掛載的Volume(如EmptyDir、PersistentVolume)對所有容器可見。
2)Pod內容器默認隔離以下資源:
- PID命名空間:容器進程彼此不可見,可通過
shareProcessNamespace: true開啓共享; - 掛載命名空間:每個容器擁有獨立文件系統(除非顯式掛載Pod級Volume);
- 資源限制:CPU、內存等cgroups限制可針對單個容器單獨配置。
Pod的設計是Kubernetes對”容器化應用協作”的抽象優化——既保留了容器的隔離性(每個組件獨立鏡像、獨立進程),又通過資源共享降低了協作成本。最終實現:
① 主業務與輔助功能分離,便於獨立開發
② 容器間低延遲通信、資源共享、避免跨節點開銷
③ 組件隔離運行,單個容器故障不擴散至整個應用
【ps】
- Pod是k8s中最小的可部署單元
- 一個pod可以有多個容器,可以運行的容器數量沒有限制
- Pod內的容器使用不同端口,通過localhost連接,避免端口衝突
- 若有多個容器,則在Pod啓動期間,所有主容器都會並行啓動。而Pod內的init容器按順序執行。
- 只有“緊密耦合、聲明週期一致、需要共享資源”的容器,才應放入同一個Pod。
2、Pod YAML(對象定義)
Pod是原生Kubernetes對象,若要創建Pod,要以YAML格式聲明pod要求。還可以用kubectl命令創建pod。以下是創建Nginx web服務器Pod的Pod yaml示例。
apiVersion: v1
kind: Pod
metadata:
name: web-server-pod
labels:
app: web-server
environment: production
annotations:
description: This pod runs the web server
spec:
containers:
- name: web-server
image: nginx:latest
ports:
- containerPort: 80
- apiVersion:pod的API版本
- kind:對象的種類,這裏是pod
- metadata:用於唯一標識和描述容器-標籤,每個對象都必須使用標準標籤進行標記,有助於對象進行分組。name(Pod的名稱)
- spec:聲明瞭pod所需的狀態
- containers:聲明pod內容器的所需狀態。容器鏡像、公開端口等。
3、創建Pod
有兩種方式創建容器:1)使用kubectl(命令有其自身侷限性);2)聲明性方法(使用YAML清單)。
Pod 的名稱是 web-server-pod
它應該有標籤 app:web-server 和 environment:production
添加註釋來描述容器。
使用 nginx:1.14.2 容器鏡像。
公開容器端口 80。
(1)使用kubectl命令創建Pod
kubectl run web-server-pod \
--image=nginx:1.14.2 \
--restart=Never \
--port=80 \
--labels=app=web-server,environment=production \
--annotations description="This pod runs the web server"
kubectl get pods可以看到容器正在運行的狀態,在我們這個例子中pod內只有一個容器。因此顯示1/1準備就緒並正在運行。如果想查看正在運行的pod的所有內容,可以使用kebectl來查看這個pod的描述:kubectl describe pod web-server-pod(包括IP地址、命名空間、容器詳細信息等)
(2)使用聲明式YAML創建Pod
就是上面那個YAML文件,需要使用文件名執行以下kubectl命令:kubectl create -f nginx.yaml。
從本地工作站訪問K8S集羣中正在運行的pod。kubectl port-forward pod/web-server-pod 8080:80。此時進入到瀏覽器並訪問localhost:8080會看到Nginx主頁,該網頁由我們的Nginx Web Server的Pod提供服務。
4、Pod生命週期
Pod通常由ReplicaSet Controller、Deployment Controller等控制器管理,使用YAML創建單個Pod時,不受任何控制器管理,在這種情況下,Pod會經歷不同的生命週期階段。
- Pending:創建Pod成功,但還在調度中。
- Running:容器正常運行。
- Succeeded:Pod內所有容器已終止。
- Failed:所有Pod都終止,但至少有一個容器因失敗而終止。
- Unknown:容器狀態未知。
參考:
1、https://zhuanlan.zhihu.com/p/714041421