HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營
CASE 服務(wù)案例
NEWS 熱點資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    kubernetes架構(gòu)(kubernetes架構(gòu)圖)

    發(fā)布時間:2023-04-14 05:03:15     稿源: 創(chuàng)意嶺    閱讀: 69        

    大家好!今天讓創(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

    本文目錄:

    kubernetes架構(gòu)(kubernetes架構(gòu)圖)

    一、kubelet 架構(gòu)淺析

    kubelet 是運(yùn)行在每個節(jié)點上的主要的“節(jié)點代理”,每個節(jié)點都會啟動 kubelet進(jìn)程,用來處理 Master 節(jié)點下發(fā)到本節(jié)點的任務(wù),按照 PodSpec 描述來管理Pod 和其中的容器(PodSpec 是用來描述一個 pod 的 YAML 或者 JSON 對象)。

    kubelet 通過各種機(jī)制(主要通過 apiserver )獲取一組 PodSpec 并保證在這些 PodSpec 中描述的容器健康運(yùn)行。

    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 容器運(yùn)行時

    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é)點其實只是集群運(yùn)行過程中的一個臨時狀態(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)建、測試、包管理、部署及運(yùn)維、監(jiān)控及評估。右側(cè)是運(yùn)行時平臺,分成互聯(lián)網(wǎng)層、展現(xiàn)層、微服務(wù)層、數(shù)據(jù)層。

    運(yùn)行時環(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等工具集,在部署和運(yùn)維環(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 名稱空間界面中,還為典型的運(yùn)維場景提供了便捷的操作入口,例如:

    從名稱空間界面中點擊一個工作負(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ù)的運(yùn)行狀況,并根據(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

    十、檢查集群運(yùn)行 健康

    在master節(jié)點查看節(jié)點狀態(tài)

    所有的節(jié)點都是NotReady,這是因為每個節(jié)點都需要啟動若干組件,這些組件都是在pod中運(yùn)行,需要從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ù)才能正常運(yùn)行,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)站可直郵)

    一個店鋪多少SKU合適(一個店鋪sku一般是多少)

    什么是Sku

    直播話語怎么說(直播必備的200條順口溜)

    抖音怎么關(guān)閉七天無理由退貨(抖音怎么關(guān)閉七天無理由退貨呢)