天天看點

Kubernetes基礎概念

1、由google公司開發,google有10年容器化基礎架構經驗,自身的borg容器在公司内部使用,對外開源的是kubernetes,由go語言開發,基于http協定的c/s架構,是一種資料總管

2、特點

(1)go語言為靜态編譯性語言,是以k8s特點之一輕量級:消耗資源小

(2)開源

(3)彈性伸縮

(4)負載均衡:ipvs

1、k8s架構

Kubernetes基礎概念

2、master節點

(1)scheduler:任務發起角色,選擇合适的節點進行配置設定任務,它将任務交給api server,api server将請求寫入etcd,它并不會與etcd直接互動

(2)replication controller manager:rc,副本管理器,根據設定的pod數,使整個k8s一直保持這個pod數

(3)api server:一切服務通路的入口,為避免api server過于繁忙,各服務元件在本地生成一定的緩存,同樣的通路需求讀取緩存

(4)etcd:鍵值對資料庫,存儲k8s的參數資訊,是一種可信賴的分布式存儲服務,有自己的叢集化方案,擴容友善,實作了k8s整個架構的持久化方案。v2将資料寫入記憶體,v3會将資料寫入磁盤,類似于redis,k8s v1.11已經棄用v2,對于仍在使用v2版的etcd,需要注意備份操作

etcd結構圖

Kubernetes基礎概念

<2>etcd基于http協定

<3>raft:存放etcd的讀寫資訊

<4>wal:預寫日志,當對資料産生更改,産生日志放入entry進行存儲記錄,并且利用snapshot對這些日志定時的進行完整備份

<5>store:raft會将資料以及日志,實時的寫入本地磁盤store,進行持久化設定

3、node節點

(1)container:容器,現大多數使用docker作為容器平台

(2)kubelet:會與docker進行互動,操作docker建立對應的容器,維持pod生命周期

(3)kube proxy:負責寫入規則至iptables或者ipvs,實作服務映射通路

4、其他插件

(1)coredns:為急群衆的svc建立一個域名-ip的對應關系解析

(2)dashboard:給k8s叢集提供一個b/s結構通路體系

(3)ingress controller:官方隻能實作四層代理,ingress可以實作七層代理

(4)fedetation:提供一個可以跨叢集中心多k8s統一管理功能

(5)prometheus:提供一個k8s叢集的監控能力

(6)elk:提供k8s叢集日志統一分析介入平台

5、高可用叢集副本資料最好是>=3奇數個

6、有狀态服務和無狀态服務

(1)有狀态服務:需要資料存儲功能的服務、或者指多線程類型的服務,隊列等,每個執行個體都需要自己獨立的持久化存儲,比如說mysql資料庫

(2)無狀态服務:是指該服務運作的執行個體不會在本地存儲需要持久化的資料,并且多個執行個體對于同一個請求響應的結果是完全一緻的。多個執行個體可以共享相同的持久化資料,例如nginx、tomcat

1、pod分為兩種:

自主式pod:不被控制器管理的pod,pod挂掉後不會被重新開機

控制器管理的pod

2、同一個pod中,容器之間的端口不能沖突,它們既共用同一個網絡棧,又共享同一個存儲卷

3、pod控制器類型

(1)replicationcontroller、replicaset、deployment、hpa,前三種控制器具有一定組合性而放在一起,hpa僅适用于replicaset和deployment

<1>replicationcontroller:rc,用來確定容器應用的副本數,始終保持在使用者定義的副本數,如果有容器異常退出,會自動建立新的pod來替代,如果異常多出來的容器也會自動回收,在新版本的k8s中建議使用replicaset來取代該項

<2>replicaset:rs,與replicationcontroller沒有本質不同,隻是名字不一樣,并且replicaset支援集合式的selector,新版本中已經抛棄了rc

<3>deployment:一般建議用deployment自動管理replicaset,這樣無需擔心跟其他機制的不相容問題,比如rs不支援rolling-update滾動更新,但deployment支援。本項不支援pod建立,但它可以定義rs

滾動更新:假設deployment下有個rs,rs下有3個pod,需要将pod中的内容進行更新

Kubernetes基礎概念

現在開始更新,在deployment下會生成一個新的rs

Kubernetes基礎概念

由于我們設定一共有3個pod,是以更新的過程是rs1去掉一個v1,在rs2處新加一個v2,保持總數不變

Kubernetes基礎概念

以此類推,最後所有pod更新完成

Kubernetes基礎概念

<4>hpa:horizontal pod auto scal,在v1版本中僅支援根據pod的cpu使用率擴縮容,即根據cpu使用率的多少,增加或減少容器,個數不會超過最大最小值。在valpha版本中,支援根據記憶體和使用者自定義的門檻值擴縮容。

(2)statefulset:是為了解決有狀态服務的問題,是對應deployment和replicasets的無狀态服務而設計

<1>穩定的持久化存儲,即pod重新排程後還是能通路到相同的持久化資料,基于pvc來實作

<2>穩定的網絡标志,即pod重新排程後,podname和hostname都不變,基于headless service來實作

<3>有序部署,有序擴充,即pod是有順序的,在部署或者擴充的時候要根據定義的順序依次進行,即從0到最後一個,在下一個pod運作之前的所有pod,都必須是running和ready狀态,基于init containers來實作

<4>有序收縮,有序删除,即從倒數第一個到0

(3)daemonset:確定全部或者部分node上運作一個pod的副本。當有node加入叢集時,也會為他們新增一個pod;當有node從叢集移除時,這些pod也會被回收。删除daemonset将會删除它所建立的所有pod。典型用在每個node上運作日志收集daemon,比如說logstash,或者在每個node上運作監控daemon,比如和prometheus node exporter

(4)job,cronjob

<1>job負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個pod成功結束

<2>cron job管理基于時間的job,即在給定時間點隻運作一次、周期性地在給定時間點運作

4、服務發現

(1)當用戶端通路一組pod時,即該組pod提供的是同樣的服務,即被同一個deployment建立,或者擁有同一組标簽,才會被這個service選到。選到以後該service擁有自己的ip和端口,此時用戶端便可以通過通路這個service的ip和端口,間接地通路到這些pod,并存在rr輪循排程算法

(2)pod與pod之間的通路,可以通過通路service方式,或者ingress

1、k8s的網絡模型假定了所有pod都在一個可以直接連通的扁平網絡空間中,也就是說,所有的pod之間都可以依靠ip到達。但如果在私有雲裡搭建k8s叢集,需要實作這個連通的網絡空間,将不同節點上的docker容器之間的互相通路先打通,然後再運作k8s

2、通訊方式

(1)同一個pod内的多個容器之間:lo

(2)各pod之間的通訊:flanneloverlay network,覆寫網絡

<1>在同一台主機上,由docker0網橋直接轉發請求即可,不需要經過

<2>不在同一台主機上,pod的位址是與docker0在同一個網段的,但docker0網段與主控端網卡是兩個完全不同的ip網段,并且不同node之間的統信隻能通過主控端的實體網卡進行,将pod的ip和所在node的ip關聯起來,通過這個關聯可以互相通路

(3)pod與service之間的通訊:各節點的iptables規則、lvs

(4)pod到外網:pod向外網發送請求,查找路由表,轉發資料包到主控端網卡,主控端網卡完成路由選擇後,iptables執行masquerade,把源ip更改為主控端網卡的ip,然後向外網發送請求

(5)外網通路pod:service

3、網絡解決方案:k8s+flannel,不同主機pod之間的通路過程

(1)flannel:讓叢集中的不同節點主機建立的docker容器都具有全叢集唯一的虛拟ip位址,而且它還能在這些ip位址之間建立一個覆寫網絡(overlay network),通過這個覆寫網絡,将資料包原封不懂地傳遞到目标容器内

Kubernetes基礎概念

(2)不同主機pod之間通路過程說明:

<1>圖中若web app2通路web app1,可以直接走docker0網卡即可,即走了pod内的docker之間通路使用lo方式

<2>圖中若web app2通路backend,首先自身ip位址10.1.15.2/24經過docker0,進入flannel0,flanneld中有etcd配置的路由表資訊,之後對資料包進行封裝:

mac

pod源ip,pod目标ip(圖中destination有錯)

利用udp協定在内部區域網路更快的特性

源容器的ip和目标容器的ip

資料包實體

進入目标pod後,flanneld會拆封資料包,将請求轉發到flannel0,flannel0再轉發到docker0,之後進入backend。

(3)etcd與flannel提供的說明

<1>存儲管理flannel可配置設定的ip位址段資源,避免ip沖突

<2>監控etcd中每個pod的實際位址,并在記憶體中建立維護pod節點路由表

3、k8s有3層網絡,分别是service網絡、pod網絡和節點網絡

Kubernetes基礎概念

真實的實體網絡為節點網絡,service網絡和pod網絡為虛拟網絡

節點網絡:構造k8s需要一張實體網絡就可以

繼續閱讀