Pod概念及網絡通訊方式
什么是Pod?
Pod是Kubernetes的最小單元。
一個Pod是一組緊密相關的容器,是一起運行在同一個工作節點上,以及同一個Linux命名空間中。每個Pod就像是一個獨立的邏輯機器,擁有自己的IP、主機名、進程等,運行一個獨立的應用程序。
Pod是邏輯主機,一個Pod中的所有的容器都運行在同一個邏輯機器上,其他Pod中的容器,即使運行在用一個工作節點上,也會出現在不同的節點上。即一個Pod包含多個容器時,那些容器總是運行在同一個工作節點上,一個Pod決不能跨多個工作節點
例如:
Pod和容器概念的區分
為什么k8s會使用Pod為最小單元,而不是Docker容器
1、更利於擴展
k8s不僅僅支持Docker容器,也支持rkt甚至用戶自定義容器。Kubernetes不依賴於底層某一種具體的規則去實現容器技術,而是通過CRI這個抽象層操作容器,這樣就會需要Pod這樣一個東西,Pod內部再管理多個業務上緊密相關的用戶業務容器,就會更有利用業務擴展Pod而不是容器。
2、更容易定義一組容器的狀態
如果沒有Pod,我們直接使用一組容器去跑一個業務,那么其中一個或若干個容器出現問題,我們如何去定義這一組容器的狀態呢?通過Pod我們就很容易解決,一組業務容器跑在同一個Pod中,這個Pod會有一個pause容器,這個容器跟其他的業務容器都沒有關系,以這個pause容器狀態來代表Pod的狀態。
3、利用容器間文件共享,以及通信
pause容器有一個IP地址和一個存儲卷,Pod中的其他容器共享pause容器的IP地址和存儲,這樣就達到了文件共享和通信。
Pod與容器的區別:Pod是指一組容器,可以指多個或一個,容器只能代表一個。
Pod的類型
自主式Pod:指定調度到某節點,如節點down,Pod無法自動恢復
控制器管理的Pod:諸多控制器類型,看下邊詳解
控制器類型及作用
1、ReplicationController
用來確保容器應用的副本數始終保持在用戶定義的副本數,即如果有容器異常退出,會自動創建新的Pod來代替;而如果異常多出來的容易也會自動回收。在新版本的k8s中建議使用ReplicaSet來代替它
2、ReplicaSet
其跟ReplicationController沒有什么本質區別,只是名字不一樣,並且ReplicaSet支持集合式的selector(支持根據條件批量刪除或創建)
3、Deployment(推薦)
雖然ReplicaSet可以獨立使用,但一般還是建議使用Deployment來自動管理ReplicaSet,這樣就無需擔心跟其他機制的不兼容問題(比如ReplicaSet不支持rolling-update滾動更新但Deployment支持)
典型的應用場景包括:
定義Deployment來創建Pod和ReplicaSet
滾動升級和回滾應用
擴容和縮容
暫停和繼續Deployment
滾動更新流程
4、HPA(HorizontalPodAutoScale)
Horizontal Pod AutoScaling 僅適用於Depolyment和ReplicaSet,在V1版本中僅支持根據Pod的CPU利用率擴縮容,在vlalpha版本中,支持根據內存和用戶自定義的metric擴縮容
5、StatefullSet
StatefullSet是為了解決有狀態服務的問題(對應Depolyment和ReplicaSets是為無狀態服務而設計),其應用場景包括:
穩定的持久化儲存,即Pod重新調度后還能訪問到相同的持久化數據,基於PVC來實現
穩定的網絡標志,即Pod重新調度其PodName和HostName不變,基於Headless Service(即沒有Cluster IP 的 Service)來實現
有序部署,有序擴展,即Pod是有順序的,在部署或者擴展的時候還要依據定義的順序依次進行(即從0到N-1,在下一個Pod運行之前所有的Pod必須都是Running和Ready狀態),基於init containers來實現
有序收縮,有序刪除(從N-1到0)
6、DaemonSet
DaemonSet確保全部(或者一些)Node上運行一個Pod的副本。當有Node加入集群時,也會為它們新增一個Pod。當有Node從集群中移除時,這些Pod也會被回收。刪除DaemonSet會刪除它創建的所有Pod
典型用法:
運行集群存儲daemon,例如在每個Node上運行glusterd、ceph
在每個Node上運行日志收集daemon,例如Logstash、Fluentd
在每個Node上運行監控daemon,例如Prometheus Node Exporter
7、Job、Cron Job(類似於Linux的at和crontab)
Job負責批處理任務,即僅執行一次任務,它保證批處理任務的一個或多個Pod成功結束
Cron Job管理基於時間的Job,即
在給定時間點僅運行一次
周期性的給定時間點運行
不同情況下網絡通信方式
1、同一個Pod內部通訊:
>> 同一個Pod共享同一個網絡命名空間(pause容器),同一個Linux協議棧
2、Pod1至Pod2
>> Pod1與Pod2不在同一台主機,Pod的地址是與docker0在同一個網段的,但docker0網段與宿主機網卡是兩個完全不同的IP網段,並且不同的Node之間的通信只能通過宿主機的物理網卡進行,將Pod的IP和所在Node的IP關聯起來,通過這個關聯讓Pod可以互相訪問,使用的是Flannel網絡規划服務如下圖:
etcd在Flannel中的作用:
存儲管理Flannel可分配的IP地址段資源
監控ETCD中每個Pod的實際地址,並在內存中建立維護Pod節點路由器
>> Pod1與Pod2在同一台機器中,由docker0網橋直接轉發請求至Pod2
3、Pod至Service的網絡
>> 目前基於性能考慮,全部用iptables(舊版本)和LVS(新版本)維護和轉發
4、Pod到外網
>> Pod向外網發送請求,查找路由表,轉發數據包到宿主機網卡,宿主機網卡完成路由選擇后,iptables執行Masquerade(SNAT),把源地址更改為宿主機網卡地址,向外網發送請求
5、外網訪問Pod
>> 通過Service網絡,nodeport 類型