一、概述
1.1、Pod概念
1.1.1、自主式
自己定義管理
1.1.2、控制器管理的Pod
ReplicationController& ReplicaSet &Deployment
ReplicationController用來確保容器應用的副本數始終在用戶定義的副本數,即如果有容器異常退出,會自動創建新的Pod來替代;而如果異常多出來的容器也會自動回收。
在新版的k8s中建議使用ReplicaSet來代替ReplicationController。
ReplicaSet跟ReplicationController沒有本質不同,只是名稱不一樣,並且ReplicaSet支持集合式的selector
雖然ReplicaSet可以獨立使用,但一般還是建議使用Deployment來自動管理ReplicaSet,這樣就無需擔心跟其他機制的不兼容問題(比如ReplicaSet不支持rolling-update但Deployment支持)
Deployment 不負責鏡像創建
HPA(Horizontal Pod Auto Scale):僅適用於Deployment和ReplicaSet,在V1版本中僅支持根據Pod的cpu利用率縮容,在vlalpha版本中,支持根據內存和用戶自定義的metric擴縮容
StatefullSet
是為了解決有狀態服務的問題(對應Deployments和ReplicaSets是無狀態服務而設計),應用場景:
穩定的持久化存儲,即Pod重新調度后還是能訪問到相同的持久化數據,基於PVC來實現
穩定的網絡標志,即Pod重新調度后其PodName和HostName不變,基於Headless Service (即沒有ClusterIP的Service)來實現
有序部署,有序擴展,即Pod是有順序的,在部署或者擴展的時候要依據定義的順序依次進行(從0-N-1,在下一個Pod運行之前所有的Pod必須是Running和Ready狀態),基於init containers來實現
有序收縮,有序刪除(即從N-1到0)
DaemonSet
確保全部或者一些Node上運行一個Pod副本。當有Node加入集群時,也會為他們新增一個Pod。當有Node從集群移除時,這些Pod也會被回收。刪除DaemonSet將會刪除它創建的所有的Pod
使用DaemonSet的一些用法
運行集群存儲daemon,例如在每個Node上運行glusterd、ceph
在每個Node上運行日志收集daemon,如fluentd、logstash
在每個Node上運行監控daemon,如Prometheus Node Exporter
Job,Cronjob
Job負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束
Cron Job管理基於時間的Job,即:1》在給定時間點只運行一次;2》周期性地在給定時間點運行
1.2、服務發現
傳統方式改造成k8s部署
1.3、網絡通訊方式
k8s的網絡模型假定了所有Pod都在一個可以直接連通的扁平的網絡空間中,這在GCE(Google Compute Engine)里面是現成的網絡模型,k8s假定這個網絡已經存在。
而在私有雲里搭建k8s集群,就不能假定這個網絡已經存在,需要自己實現這個網絡假設,將不同節點上的docker容器之間的戶型訪問先打通,然后運行k8s
扁平化:所有的Pod都可以直接訪問
1.3.1、同一個Pod內的多個容器之間:localhost
共用容器pause的network,即同一個Pod共享同一個網絡命名空間,共享一個linux協議棧
1.3.2、各個Pod之間的通訊,即Pod1至Pod2:overlay network
Flannel是CoreOS團隊針對k8s設計的一個網絡規划服務,簡單來說,他的功能是讓集群的不同節點創建的Docker容器都具有全集群唯一的虛擬Ip地址。而且他還能在這些Ip地址之間建立一個覆蓋網絡(Overlay network),通過這個覆蓋網絡,將數據包原封不動地傳遞到目標容器。
1.3.2.1、Flannel方案 整體方案
ETCD與Flannel關系:存儲管理Flannel可分配的IP地址段資源;監控ECTD中每個Pod的實際地址,並在內存中建立維護Pod節點路由表
1》Pod1與Pod2不在同一台主機,Pod的地址是與docker0在同一個網段的,但docker0網段與宿主機網卡是兩個完全不同的ip網段,並且不同Node之間的通訊只能通過宿主機的物理網卡進行。將Pod的ip和所在Node的ip關聯起來,通過這個關聯可以讓Pod互相訪問。
2》Pod1與Pod2在同一台主機,由docker0網橋直接轉發請求值Pod2,不需要經過Flannel
示例一、Pod1與Pod2不在同一台主機,跨節點通訊 過程
1.3.3、Pod與Service之間的通訊
各節點的Iptables規則,新版本加入了LVS
1.3.4、Pod到外網
Pod向外網發送請求,查找路由表,轉發數據包到宿主機的網卡,宿主網卡完成路由選擇后,iptables執行masquerade,把源ip更改為宿主網卡的ip,然后轉向外網服務器發送請求
1.3.5、外網訪問Pod
通過service訪問,NodePort映射
1.4、三層網絡
1.5、k8s中Node、Pod、container、service、deployment、rs關系及作用
Node:kubectl get node:一台物理機或虛擬機,內部可以有多個Pod
Pod:kubectl get pod -o wide:一個或多個容器的集合
rs:kubectl get rs:管理pod的控制器ReplicaSet
deployment:kubectl get deployment:管理rs,ReplicaSet
Service:kubectl get svc:用於管理不同pod里面的、具有相同label標簽的容器(把相同label的歸為一類service)
container:具體容器