pod 概述
Pod 是 K8S 系統中可以創建和管理的最小單元,是資源對象模型中由用戶創建或部署的最小資源對象模型,也是在 K8S 上運行容器化應用的資源對象,其它的資源對象都是用來支撐或者擴展 Pod 對象功能的,比如控制器對象是用來管控 Pod 對象的,Service 或者 Ingress 資源對象是用來暴露 Pod 引用對象的,PersistentVolume 資源對象是用來為 Pod 提供存儲等等,K8S 不會直接處理容器,而是 Pod,Pod 是由一個或多個 container 組成。
Pod 是 Kubernetes 的最重要概念,每一個 Pod 都有一個特殊的被稱為 “根容器”的 Pause 容器。Pause 容器對應的鏡像屬於 Kubernetes 平台的一部分,除了 Pause 容器,每個 Pod 還包含一個或多個緊密相關的用戶業務容器
Pod基本概念
- 最小部署的單元
- Pod 里面是由一個或多個容器組成【一組容器的集合】
- 一個 pod 中的容器是共享網絡命名空間
- Pod 生命周期是短暫的
- 每個 Pod 包含一個或多個緊密相關的用戶業務容器
Pod存在的意義
- 創建容器使用 docker,一個 docker 對應一個容器,一個容器運行一個應用進程
- Pod 是多進程設計,運用多個應用程序,也就是一個 Pod 里面有多個容器,而一個容器里面運行一個應用程序
Pod 是在 K8S 集群中運行部署應用或服務的最小單元,它是可以支持多容器的。Pod 的設計理念是支持多個容器在一個 Pod 中共享網絡地址和文件系統,可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。同時 Pod 對多容器的支持是 K8S 中最基礎的設計理念。在生產環境中,通常是由不同的團隊各自開發構建自己的容器鏡像,在部署的時候組合成一個微服務對外提供服務。
Pod 是 K8S 集群中所有業務類型的基礎,可以把 Pod 看作運行在 K8S 集群上的小機器人,不同類型的業務就需要不同類型的小機器人去執行。目前 K8S 的業務主要可以分為以下幾種
- 長期伺服型:long-running
- 批處理型:batch
- 節點后台支撐型:node-daemon
- 有狀態應用型:stateful application
Pod實現機制
主要有以下兩大機制
- 共享網絡
- 共享存儲
共享網絡
容器本身之間相互隔離的,一般是通過 namespace 和 group 進行隔離,那么Pod里面的容器如何實現通信?
- 首先需要滿足前提條件,也就是容器都在同一個namespace之間
關於Pod實現原理,首先會在Pod會創建一個根容器: pause容器
,然后我們在創建業務容器 【nginx,redis 等】,在我們創建業務容器的時候,會把它添加到 info容器
中
而在 info容器
中會獨立出 ip地址,mac地址,port 等信息,然后實現網絡的共享
共享存儲
Pod 持久化數據,專門存儲到某個地方中
常用命令
# 查看所有的 pod 列表,-n 后面跟 namespace,查看指定的命名空間,-o wide 查看詳細信息
kubectl get pod
kubectl get pod -n kube-system # 查看 kube-system 命名空間下的 pod
kubectl get pod -o wide # 查看 pod 的詳細信息,有 ip、node 節點等信息
kubectl get pod -o wide 的參數含義如下
- name:自定義的名稱,后面會加些數據
- READY:當前 pod 里的容器,pause 容器不算在里面,/ 前面的表示運行了幾個,后面的數字表示一共有幾個
- STATUS:當前的狀態
- AGE:pod 存在的時長
- IP:pod 的 ip,這個只能在當前部署的機器上訪問,外網是訪問不了的
- NODE:當前 pod 在哪個 node 上運行
# 顯示 Node 的詳細信息
kubectl describe node dce-10-6-215-190 # node 后面的是 node名稱
# 顯示 Pod 的詳細信息, 特別是查看 pod 無法創建的時候的日志
kubectl describe pod web # web 是你創建 pod 時起的名稱
# 根據 yaml 創建資源, apply 可以重復執行,create 不行
kubectl create -f pod.yaml
kubectl apply -f pod.yaml
# 刪除所有 Pod
kubectl delete pod --all
# 強制刪除某個文件名命名節點 ,基於 pod.yaml 定義的名稱刪除 pod
kubectl delete -f <文件名>
# 刪除某個Pod命令節點
kubectl delete pod <pod名>
# 刪除某個Replication Controller命名節點
kubectl delete rc <rc名>
kubectl delete deployment 名稱
# 刪除某個服務命名節點
kubectl delete service <service名>
# 刪除所有Pod節點
kubectl delete pod --all