2.k8s基礎概念
1.pod概念
我這裡分為兩種:
-
自主Pod(不是被管理的pod): 容器死了就死了
-
控制器管理的Pod(被管理的pod)
只要有pod 就會啟動pause容器 ,在根據數量啟動其他的容器 ,
1、 其他的容器會共用pause 網路棧 容器之間的埠不能衝突
2、 其他的容器會共用pause 儲存卷
控制器控制的pod:
1、Replicationcontroller&replicaset&deployment
replicationcontroller:用來確保容器應用的副本數始終保持在使用者定義的副本,即如果有容器異常退出 , 會自動建立新的pod來替代;而如果異常多出來的容器也會自動回收在新版本的kubernetes中建議使用replicaset來取代replicationcontroller
replicaset:跟replicationcontroller沒有本質的不同 , 只是名字不一樣 , 並且replicaset支援集合式的selector
雖然replicaset可以獨立使用 , 但一般還是建議使用deployment來自動管理replicaset , 這樣就無需擔心跟其他機制的不相容問題 (比如replicaset不支援rolling-update 但是deployment支援)
HPA(Horizontal pod autoscaling): 僅適用於deployment和replicaset ,在v1版本中僅支援根據pod的cpu利用率擴容 , 在vlalpha版本中, 支援根據記憶體和使用者自定義的metric擴縮容
指定監控指標如cpu>80% , 定義pod最大數量(max),定義pod最小數量(min)
2、Statefulset 是為了解決有狀態服務的問題(對應deployments和replicasets是為無狀態服務而設計的),其應用場景包括
statefulset實現垂直擴充套件
-
穩定的持久化儲存, 即pod重新排程後還是能訪問相同的持久化資料 , 基於pvc來實現
-
穩定的網路標誌,即pod重新排程後其podname和hostname不變, 基於headless service(即沒有cluster IP的service)來實現
-
有序部署 , 有序擴充套件 , 即pod是有順序的 , 在部署或者擴充套件的時候要依據定義的順序依次依次進行(即從0到N-1 , 在下一個pod執行之前所有的pod必須都是running和ready狀態),基於init contaiers來實現
-
有序收縮 , 有序刪除(即從N-1到0)
3、daemonset 確保全部(或者一些)node上執行的pod副本 , 當有node加入叢集時 , 也會為他們新增一個pod , 當有node從叢集移除時 , 這些pod 也會被回收,刪除daemonset 將會刪除它建立的所有pod
使用deemonset的一些典型用法:
-
執行叢集儲存daemon,例如在每個node上執行glusterd ,ceph。
-
在每個node上執行日誌蒐集 daemon , 例如fluentd ,logstash
-
在每個node上執行監控daemon, 例如prometheus node exporter
4、job
job負責批處理任務 , 即僅執行一次的任務 , 它保證屁處理任務的一個或多個pod成功結束(判斷指令碼沒有正常退出會重複執行)
5、Cron job 管理基於時間的job ,即:
- 在給定時間點只執行一次
週期性的在給定時間點執行
6.服務發現
Service 收集pod 是通過標籤
服務發現是通過輪詢(RR)
2.網路通訊方式
Kubernetes 的網路模型假定了所有pod都在一個可以直接連通的扁平的網路空間中, 這在GCE(google compute engine)裡面是現場的網路模型 , kubernetes假定這個網路已經存在 ,而在私有云裡搭建kubernetes叢集 ,就不能假定這個網路已經存在了 , 我們需要自己實現這個網路假定 ,將不同節點上的docker容器之間的互相訪問先打通, 然後執行kubetnetes
同一個pod內的多個容器之間:lo(同一個pod共用pause)
各pod之間的通行:overlay network
pod與service之間的通行:各節點的iptables規則
Flannel :是coreOS團隊針對kubernetes設計的一個網路規劃服務 , 簡單來說 , 他的功能是讓叢集的不同節點主機建立的docker容器都具有全域性唯一的虛擬IP地址 , 而且他還能再這些IP地址之間建立一個覆蓋網路(overlay network),通過這個覆蓋網路, 將資料包原封不動地傳遞到目標容器內
ETCD之Flannel提供說明:
儲存管理Flannel 可分配的IP動作資源
監控ETCD中每個pod的實際地址 , 並在記憶體中建立維護pod節點路由表
總結:
同一個Pod內部通行:同一個pod共享一個網路名稱空間 , 共享同一個linux協議棧
Pod1至Pod2
》pod1與pod2不在同一臺主機, pod的地址是與doker0在同一個網段的 , 但dokcer0網段的宿主機網絡卡是兩個完全不同的IP網段, 並且不同node之間的通訊智慧通過宿主機的物理網絡卡進行 。 將pod的IP和所有node的IP關聯起來 , 通過這個關聯讓pod可以互相訪問
》pod1與pod2在同一臺機器 , 由docker0網橋直接轉發請求至pod2 , 不需要經過flannel
pod至service的網路:目前基於效能考慮 , 全部為iptables維護和轉發(新版可以通過lvs轉發)
pod到外網:pod向外網傳送請求 , 查詢路由表 , 轉發資料包到宿主機的網絡卡 , 宿主機網絡卡完成路由選擇後 , iptables執行masquerade 把源IP更改為宿主機網絡卡的IP , 然後向外網伺服器傳送請求
外網訪問pod:service (Nodeport)
本機之間完成
三層網路(是虛擬的網路 ,只有節點網路才是對的, 只要一個物理網絡卡就好了)