-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
kubernetes架構(gòu)(kubernetes架構(gòu)圖)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于kubernetes架構(gòu)的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、kubelet 架構(gòu)淺析
kubelet 是運行在每個節(jié)點上的主要的“節(jié)點代理”,每個節(jié)點都會啟動 kubelet進(jìn)程,用來處理 Master 節(jié)點下發(fā)到本節(jié)點的任務(wù),按照 PodSpec 描述來管理Pod 和其中的容器(PodSpec 是用來描述一個 pod 的 YAML 或者 JSON 對象)。
kubelet 通過各種機(jī)制(主要通過 apiserver )獲取一組 PodSpec 并保證在這些 PodSpec 中描述的容器健康運行。
1、kubelet 默認(rèn)監(jiān)聽四個端口,分別為 10250 、10255、10248、4194。
2、kubelet 主要功能:
上圖展示了 kubelet 組件中的模塊以及模塊間的劃分。
在 v1.12 中,kubelet 組件有18個主要的 manager(kubernetes/pkg/kubelet/kubelet.go):
其中比較重要的模塊后面會進(jìn)行一一分析。
本片文章主要講解了 kubelet 在 kubernetes 系統(tǒng)中的功能,所監(jiān)聽四個端口的主要作用,自身架構(gòu)中包含的組件以及各組件的用途。
參考:
微軟資深工程師詳解 K8S 容器運行時
kubernetes 簡介: kubelet 和 pod
Kubelet 組件解析
二、kubernetes控制平面組件:etcd
--listen-peer-urls
--listen-client-urls
--initial-advertise-peer-urls
--initial-cluster
--initial-cluster-state
--advertise-client-urls
1.code
headless svc, 像DNS RR ClusterIP:None
kubectl -n stg1 get endpoints
client 怎么訪問:
2.配置文件
3.apply
官方的code有兩個問題
本地訪問
擴(kuò)容
利用反親和性 分布etcd pod到不同節(jié)點
~ ❯❯❯ etcdctl get / --prefix
從 etcd 的架構(gòu)圖中我們可以看到,etcd 主要分為四個部分。
etcd 目前支持 V2 和 V3 兩個大版本,這兩個版本在實現(xiàn)上有比較大的不同,一方面是對外提供接口的方式,另一方面就是底層的存儲引擎,V2 版本的實例是一個純內(nèi)存的實現(xiàn),所有的數(shù)據(jù)都沒有存儲在磁盤上,而 V3 版本的實例就支持了數(shù)據(jù)的持久化。
v3默認(rèn)boltdb
consortium etcd2+mysql
數(shù)據(jù)默認(rèn)會存放在 /var/lib/etcd/default/ 目錄。我們會發(fā)現(xiàn)數(shù)據(jù)所在的目錄,會被分為兩個文件夾中,分別是 snap 和 wal目錄。
解決三個問題:節(jié)點選舉、日志復(fù)制以及安全性 。
每一個 Raft 集群中都包含多個服務(wù)器,在任意時刻,每一臺服務(wù)器只可能處于 Leader 、 Follower 以及 Candidate 三種狀態(tài);在處于正常的狀態(tài)時,集群中只會存在一個 Leader 狀態(tài),其余的服務(wù)器都是 Follower 狀態(tài)。
所有的 Follower 節(jié)點都是被動的,它們不會主動發(fā)出任何的請求 ,只會響應(yīng) Leader 和 Candidate 發(fā)出的請求。對于每一個用戶的可變操作,都會被路由給 Leader 節(jié)點進(jìn)行處理,除了 Leader 和 Follower 節(jié)點之外,Candidate 節(jié)點其實只是集群運行過程中的一個臨時狀態(tài)。
每一個服務(wù)器都會存儲當(dāng)前集群的最新任期,它就像是一個單調(diào)遞增的邏輯時鐘,能夠同步各個節(jié)點之間的狀態(tài),當(dāng)前節(jié)點持有的任期會隨著每一個請求被傳遞到其他的節(jié)點上。Raft 協(xié)議在每一個任期的開始時都會從一個集群中選出一個節(jié)點作為集群的 Leader 節(jié)點,這個節(jié)點會負(fù)責(zé)集群中的日志的復(fù)制以及管理工作。
客戶端通過 監(jiān)聽指定的key可以迅速感知key的變化并作出相應(yīng)處理 ,watch機(jī)制的實現(xiàn)依賴于 資源版本號revision的設(shè)計 ,每一次key的更新都會使得revision原子遞增,因此根據(jù)不同的版本號revision的對比就可以感知新事件的發(fā)生。etcd watch機(jī)制有著廣泛的應(yīng)用,比如利用etcd實現(xiàn)分布式鎖; k8s中監(jiān)聽各種資源的變化 ,從而實現(xiàn)各種controller邏輯等。
watch機(jī)制的實現(xiàn)主要可分為三個部分
client使用 watchClient 的watch接口發(fā)起watch請求,與server端建立一個 gRPCStream 連接。
server端會為每個client生成唯一一個watch id,并記錄每個client也就是watcher監(jiān)聽的key或者key range,通過recvLoop接收client請求,通過sendLoop發(fā)送請求,server端只負(fù)責(zé)收發(fā)請求和響應(yīng)。
主要的實現(xiàn)都放在了watchalbStore層,watchalbStore會監(jiān)聽key的變化,然后通過syncWatchersLoop和syncVictimsLoop兩個處理流程將key的更新變化包裝成event,通過channel發(fā)送給gRPC server。
MVCC(Multiversion Concurrency Control)多版本并發(fā)控制機(jī)制
場景1:
這就是悲觀鎖
悲觀鎖:悲觀得認(rèn)為并發(fā)事務(wù)會沖突,所以要先拿鎖,拿到鎖的作修改操作
場景2
數(shù)據(jù)庫:寫回磁盤,A寫好了。哎,B和C都是version 13,我咋寫?算了,報錯吧。。
就是樂觀鎖,默認(rèn)不加鎖,你盡管寫,沖突我認(rèn)慫!樂觀鎖其實不是鎖,只是相對悲觀鎖來定義,適合讀多寫少。
樂觀鎖:樂觀得認(rèn)為數(shù)據(jù)不會沖突,但發(fā)生沖突時要能檢測到。
場景3
這就是MVCC,在 MVCC 數(shù)據(jù)庫中,你更新一個 key-value 數(shù)據(jù)的時候,它并不會直接覆蓋原數(shù)據(jù),而是 新增一個版本來存儲新的數(shù)據(jù),每個數(shù)據(jù)都有一個版本號 ,版本號是一個邏輯時鐘,不會因為服務(wù)器時間的差異而受影響。
MVCC不等于樂觀鎖!
--rev 查的是main
在底層boltdb里,實際分布是這樣的:
底層的key是revision,/奧特曼是用戶key,“他很帥”就是用戶value
刪除
之前有delete動作,但是依然有版本記錄。為什么?
刪除這個動作,其實etcd是在blotdb里寫了一條,“刪除用戶/奧特曼”
此時有個問題:用戶說我的確刪除了啊,真的不要了!請把空間還給我啊!
回收 compact(壓縮)
etcdctl compact {version}
compact 需要一個版本號。這個版本號就是寫事務(wù)遞增的那個版本號,compact 12345,就是說把版本12345以前的 標(biāo)記刪除了的數(shù)據(jù) 釋放掉,用戶沒刪除的數(shù)據(jù)肯定不能回收。
如何壓縮:
注意修改go.mod
Watch
服務(wù)發(fā)現(xiàn)要解決的也是分布式系統(tǒng)中最常見的問題之一,即在同一個分布式集群中的進(jìn)程或服務(wù),要如何才能找到對方并建立連接。本質(zhì)上來說,服務(wù)發(fā)現(xiàn)就是想要了解集群中是否有進(jìn)程在監(jiān)聽 udp 或 tcp 端口,并且通過名字就可以查找和連接。
需要實現(xiàn)的功能;
discover.go
eBay payment
ebay kubernetes 控制面架構(gòu)
問題
三、Kuboard 從微服務(wù)視角理解 Kubernetes
當(dāng)我們談?wù)撐⒎?wù)的時候,總避免不了說 Spring Cloud / Dubbo,這些微服務(wù)架構(gòu)的采用,確實達(dá)到了我們對他的期許:分布式、熔斷/限流、高可用、可擴(kuò)展、分離關(guān)注、鏈路追蹤、小團(tuán)隊快速迭代。
然而,微服務(wù)架構(gòu)的引入在解決單體應(yīng)用的一些問題的同時,也給我們帶來了新的復(fù)雜度:
作者在落地 Spring Cloud 微服務(wù)架構(gòu)的過程中,設(shè)計了如下圖所示的微服務(wù)參考架構(gòu):
該圖的左側(cè)是 DevOps 平臺,涵蓋構(gòu)建、測試、包管理、部署及運維、監(jiān)控及評估。右側(cè)是運行時平臺,分成互聯(lián)網(wǎng)層、展現(xiàn)層、微服務(wù)層、數(shù)據(jù)層。
運行時環(huán)境采納了微服務(wù)架構(gòu)后,因為技術(shù)組件的多樣性、業(yè)務(wù)領(lǐng)域的多樣性,導(dǎo)致了微服務(wù)拆分之后,產(chǎn)生了數(shù)十個微服務(wù)可部署單元。這個情況給技術(shù)團(tuán)隊帶來了前所未有的挑戰(zhàn):
在解決這些問題的過程中,最終摸索出了一套以 Kubernetes 為關(guān)鍵環(huán)節(jié)的微服務(wù) DevOps 平臺。
如上圖所示,假設(shè)有20+ 開發(fā)人員,
在單體應(yīng)用的時候,即使是手工打包也是能夠完成每天發(fā)布新版本的要求的。但是在微服務(wù)環(huán)境下,這個工作就必須交給 DevOps 的 Pipe Line 來完成。
DevOps 在構(gòu)建階段的主角是 GitLab、npm、maven、docker、Harbor等工具集,在部署和運維環(huán)節(jié)的主角就是Kubernetes了。
最開始嘗試容器化的時候,使用了 docker、docker-compose,但是docker-compose的編排能力有限,在考慮分布式方案時,從 docker swarm、kuberenetes 之中選擇了 Kubernetes,然而,Kubernetes 相較于 docker-compose,有一個很高的學(xué)習(xí)門檻,集群的安裝管理、YAML 文件的編寫、多環(huán)境(開發(fā)環(huán)境、測試環(huán)境、準(zhǔn)生產(chǎn)環(huán)境、生產(chǎn)環(huán)境)的配置、分布式環(huán)境下的問題診斷和性能優(yōu)化等,一系列的問題需要解決,團(tuán)隊中也出現(xiàn)一些抵觸情緒,對新事物持觀望的態(tài)度。
Kubernetes在諸多大廠的成功實施,仍然讓我們堅信這條道路的正確性。為了解決 Kubernetes 學(xué)習(xí)門檻高、YAML 文件編寫復(fù)雜等一系列現(xiàn)實中的困難,我們研發(fā)了 Kuboard ,一款 Kubernetes 的圖形化管理控制工具。
Kuboard 誕生于 Spring Cloud 微服務(wù)落地的實踐過程中,他在管理和使用 Kubernetes 的時候,也更多地是從微服務(wù)的視角來看待 Kubernetes。
具體體現(xiàn)在如下三個視角:
從管理和部署微服務(wù)的視角來看,微服務(wù)應(yīng)用是分布式應(yīng)用,應(yīng)該部署在一個分布式集群當(dāng)中,這個集群由諸多計算資源和存儲資源組成,微服務(wù)本身不應(yīng)該關(guān)心最終使用了哪個計算節(jié)點,持久化存儲被存放在什么位置;為了更好地利用資源,一個集群應(yīng)該被劃分成多個名稱空間,每個名稱空間內(nèi)可以部署一整套微服務(wù)應(yīng)用,名稱空間之間不應(yīng)相互干擾。
如下圖所示: Kuboard 集群概覽界面
Kuboard 集群概覽視角,映射了 Kubernetes 中的如下幾個重要概念:
在集群概覽界面中,點擊一個名稱空間,可以進(jìn)入 Kuboard 名稱空間界面。一個名稱空間內(nèi)部,是微服務(wù)部署相關(guān)的所有重要元素。與本文開頭的微服務(wù)參考架構(gòu)相匹配, Kuboard 認(rèn)為,微服務(wù)的主要分層包括:
如下圖所示: Kuboard 名稱空間截圖
Kuboard 名稱空間視角,映射了 Kubernetes 中的如下幾個重要概念:
Kuboard 名稱空間界面中,還為典型的運維場景提供了便捷的操作入口,例如:
從名稱空間界面中點擊一個工作負(fù)載(微服務(wù)),可進(jìn)入 Kuboard 工作負(fù)載編輯器界面。 Kuboard 當(dāng)前已經(jīng)支持的工作負(fù)載 Workload 類型有:Deployment / StatefulSet / DaemonSet。
Kubernetes 中,與 Workload 相關(guān)的概念非常多, Kuboard 從微服務(wù)部署的實際需要出發(fā),按照下圖所示的方式理解這些相關(guān)概念:
Kuboard 工作負(fù)載視圖中,關(guān)聯(lián)的 Kubernetes 中如下幾個重要的概念:
Kuboard 認(rèn)為,掌握這些概念并正確理解這些概念的關(guān)系之后,就可以勝任使用 Kubernetes 部署微服務(wù)的工作,為了使事情變得更簡單,避免編寫冗長的 YAML 文件, Kuboard 以此概念為基礎(chǔ),設(shè)計了 Kuboard 工作負(fù)載編輯器,如下圖所示:
如何監(jiān)控和評估微服務(wù)的運行狀況,并根據(jù)監(jiān)控結(jié)果進(jìn)行問題的定位和診斷?基于 Kubernetes / Spring Cloud / Java 等,開源社區(qū)已經(jīng)提供了非常豐富的監(jiān)控組件,例如:
各種監(jiān)控系統(tǒng)各有側(cè)重,如果想要取得比較好的監(jiān)控效果,必須克服如下幾個困難:
Kuboard 認(rèn)為,應(yīng)該以微服務(wù)視角的視角快速查看到該無服務(wù)在不同層面的監(jiān)控結(jié)果。因此,在 Kuboard 的工作負(fù)載(微服務(wù))查看界面中,可以直接點擊進(jìn)入不同監(jiān)控系統(tǒng)對應(yīng)的監(jiān)控結(jié)果,無需再監(jiān)控系統(tǒng)內(nèi)反復(fù)查找。如一下截圖所示:
點擊圖中 Nginx 監(jiān)控 、 容器組監(jiān)控 、 所在節(jié)點監(jiān)控 等按鈕,可以直接打開該容器組對應(yīng)的監(jiān)控界面。因為篇幅的限制,此處不再展開描述,請到 www.kuboard.cn Kuboard 官網(wǎng) 提供的在線Demo體驗具體的監(jiān)控效果。
Kuboard 產(chǎn)生于 Spring Cloud 微服務(wù)落地的實踐中,并在許多的實際項目中投入了使用,以微服務(wù)的視角理解和審視了 Kubernetes,并基于Kubernetes為用戶提供了4個微服務(wù)視圖:
目前 Kuboard 已經(jīng)可以免費供大家使用,感性的朋友可訪問 www.kuboard.cn 獲得詳細(xì)的信息。
四、高可用kubernetes集群搭建
架構(gòu)說明
Kubernetes集群組件:
k8s集群高可用,一般是etcd,kube-apiserver,kube-controller-manager,kube-scheduler服務(wù)組件的高可用。
規(guī)劃:
3個master節(jié)點,2個worker節(jié)點,使用keepalived+haproxy做高可用
一、前期環(huán)境準(zhǔn)備
Kubernetes 1.8開始要求關(guān)閉系統(tǒng)的Swap,如果不關(guān)閉,默認(rèn)配置下kubelet將無法啟動。
方法一 通過kubelet的啟動參數(shù)–fail-swap-on=false更改這個限制。
方法二 關(guān)閉系統(tǒng)的Swap, swapoff -a
修改/etc/fstab文件,注釋掉SWAP的自動掛載,使用free -m確認(rèn)swap已經(jīng)關(guān)閉。
二、docker安裝
安裝docker-ce,所有節(jié)點都要安裝
yum-utils 提供yum-config-manager工具,devicemapper存儲需要device-mapper-persistent-data和lvm2
添加yum源倉庫
官方倉庫
安裝docker
配置docker中國鏡像加速器,修改cgroup driver為systemd,k8s建議使用systemd,配置后重啟docker
三、安裝haproxy,keepalived
安裝haproxy和keepalived,實現(xiàn)kube-apiserver高可用
psmisc提供killall命令
配置haproxy
配置keepalived
注意:在另外兩個節(jié)點,設(shè)置state為BACKUP,priority設(shè)置為110,100
啟動所有節(jié)點的haproxy和keepalived
查看VIP
注意,使用ifconfig命令是看不到的,必須使用ip addr命令
這時候vip在130.252.10.235上,我們關(guān)閉235上的haproxy,驗證vip是否會漂移到其他節(jié)點
四、kubeadm/kubelet/kubectl安裝
master節(jié)點安裝:kubeadm、kubelet、kubectl
node節(jié)點安裝:kubeadm、kubelet
安裝
五、使用kubeadm初始化cluster
step1 準(zhǔn)備初始化配置文件
根據(jù)自己的環(huán)境修改配置.
step2 處理kubernetes依賴的鏡像
master需要的鏡像為
node節(jié)點需要的鏡像為
查看需要的鏡像版本
拉取鏡像
六、初始化第一個master節(jié)點
注意:如果你禁用了swap分區(qū),則不需要加--ignore-preflight-errors=Swap
配置kubectl
啟用kubectl的自動補(bǔ)全命令
七、安裝Pod網(wǎng)絡(luò)flannel
八、將其他master節(jié)點添加到cluster
將node1證書文件復(fù)制到其他master節(jié)點node2,node3
分別在master1和master2 執(zhí)行下面的命令
九、將node節(jié)點添加到cluster
十、檢查集群運行 健康
在master節(jié)點查看節(jié)點狀態(tài)
所有的節(jié)點都是NotReady,這是因為每個節(jié)點都需要啟動若干組件,這些組件都是在pod中運行,需要從Google下載鏡像
查看pod的狀態(tài)
查看集群信息
查看etcd集群
查看集群是否 健康
查看集群的leader
注意 :因為是3個節(jié)點的ETCD集群,所以只能有一個宕機(jī),如果同時又2個節(jié)點宕機(jī),則會出現(xiàn)問題Unable to connect to the server: EOF
etd集群需要大多數(shù)節(jié)點(仲裁)才能就集群狀態(tài)的更新達(dá)成一致,所以ETCD集群節(jié)點一般是奇數(shù)個,而且只有存活節(jié)點個數(shù)大于下線節(jié) 點個數(shù)才能正常運行,5個節(jié)點的ETCD集群,允許同時2個節(jié)點故障。
一般建議5個節(jié)點,超過五個雖然容錯性更高,但是集群寫入性就會差。
檢查IPVS
以上就是關(guān)于kubernetes架構(gòu)相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
日本購物網(wǎng)站kakaku(日本購物網(wǎng)站可直郵)
抖音怎么關(guān)閉七天無理由退貨(抖音怎么關(guān)閉七天無理由退貨呢)