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