1. 程式人生 > 其它 >2.k8s基礎概念

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)

本機之間完成


三層網路(是虛擬的網路 ,只有節點網路才是對的, 只要一個物理網絡卡就好了)