帶著問題學 Kubernetes 架構!

来源:https://www.cnblogs.com/javastack/archive/2020/06/24/13188702.html
-Advertisement-
Play Games

作者:jasonGeng88 www.github.com/jasonGeng88/blog 打開這篇文章的同學,想必對 docker 都不會陌生。docker 是一種虛擬容器技術,它上手比較簡單,只需在宿主機上起一個 docker engine,然後就能愉快的玩耍了,如:拉鏡像、起容器、掛載數據、 ...


作者:jasonGeng88
www.github.com/jasonGeng88/blog

打開這篇文章的同學,想必對 docker 都不會陌生。docker 是一種虛擬容器技術,它上手比較簡單,只需在宿主機上起一個 docker engine,然後就能愉快的玩耍了,如:拉鏡像、起容器、掛載數據、映射埠等等。

相對於 Kubernetes(K8S)的上手,可謂簡單很多。那麼 K8S 是什麼,又為什麼上手難度大?

K8S 是一個基於容器技術的分散式集群管理系統,是谷歌幾十年來大規模應用容器技術的經驗積累和升華的一個重要成果。

所以為了能夠支持大規模的集群管理,它承載了很多的組件,而且分散式本身的複雜度就很高。又因為 K8S 是谷歌出品的,依賴了很多谷歌自己的鏡像,所以對於國內的同學環境搭建的難度又增加了一層。

下麵,我們帶著問題,一步步來看 K8S 中到底有哪些東西?

首先,既然是個分散式系統,那勢必有多個 Node 節點(物理主機或虛擬機),它們共同組成一個分散式集群,並且這些節點中會有一個 Master 節點,由它來統一管理 Node 節點。

問題一:主節點和工作節點是如何通信的呢?

首先,Master 節點啟動時,會運行一個 kube-apiserver 進程,它提供了集群管理的 API 介面,是集群內各個功能模塊之間數據交互和通信的中心樞紐,並且它頁提供了完備的集群安全機制(後面還會講到)。

在 Node 節點上,使用 K8S 中的 kubelet 組件,在每個 Node 節點上都會運行一個 kubelet 進程,它負責向 Master 彙報自身節點的運行情況,如 Node 節點的註冊、終止、定時上報健康狀況等,以及接收 Master 發出的命令,創建相應 Pod。

在 K8S 中,Pod 是最基本的操作單元,它與 docker 的容器有略微的不同,因為 Pod 可能包含一個或多個容器(可以是 docker 容器),這些內部的容器是共用網路資源的,即可以通過 localhost 進行相互訪問。

關於 Pod 內是如何做到網路共用的,每個 Pod 啟動,內部都會啟動一個 pause 容器(google的一個鏡像),它使用預設的網路模式,而其他容器的網路都設置給它,以此來完成網路的共用問題。

問題二:Master 是如何將 Pod 調度到指定的 Node 上的?

該工作由 kube-scheduler 來完成,整個調度過程通過執行一些列複雜的演算法最終為每個 Pod 計算出一個最佳的目標 Node,該過程由 kube-scheduler 進程自動完成。常見的有輪詢調度(RR)。

當然也有可能,我們需要將 Pod 調度到一個指定的 Node 上,我們可以通過節點的標簽(Label)和 Pod 的 nodeSelector 屬性的相互匹配,來達到指定的效果。

關於標簽(Label)與選擇器(Selector)的概念,後面會進一步介紹

問題三:各節點、Pod 的信息都是統一維護在哪裡的,由誰來維護?

從上面的 Pod 調度的角度看,我們得有一個存儲中心,用來存儲各節點資源使用情況、健康狀態、以及各 Pod 的基本信息等,這樣 Pod 的調度來能正常進行。

在 K8S 中,採用 etcd 組件 作為一個高可用強一致性的存儲倉庫,該組件可以內置在 K8S 中,也可以外部搭建供 K8S 使用。推薦看下:圖文詳解 Kubernetes

集群上的所有配置信息都存儲在了 etcd,為了考慮各個組件的相對獨立,以及整體的維護性,對於這些存儲數據的增、刪、改、查,統一由 kube-apiserver 來進行調用,apiserver 也提供了 REST 的支持,不僅對各個內部組件提供服務外,還對集群外部用戶暴露服務。

外部用戶可以通過 REST 介面,或者 kubectl 命令行工具進行集群管理,其內在都是與 apiserver 進行通信。

問題四:外部用戶如何訪問集群內運行的 Pod ?

前面講了外部用戶如何管理 K8S,而我們更關心的是內部運行的 Pod 如何對外訪問。使用過 docker 的同學應該知道,如果使用 bridge 模式,在容器創建時,都會分配一個虛擬 IP,該 IP 外部是沒法訪問到的,我們需要做一層埠映射,將容器內埠與宿主機埠進行映射綁定,這樣外部通過訪問宿主機的指定埠,就可以訪問到內部容器埠了。

那麼,K8S 的外部訪問是否也是這樣實現的?答案是否定的,K8S 中情況要複雜一些。因為上面講的 docker 是單機模式下的,而且一個容器對外就暴露一個服務。在分散式集群下,一個服務往往由多個 Application 提供,用來分擔訪問壓力,而且這些 Application 可能會分佈在多個節點上,這樣又涉及到了跨主機的通信。

這裡,K8S 引入了 service 的概念,將多個相同的 Pod 包裝成一個完整的 service 對外提供服務,至於獲取到這些相同的 Pod,每個 Pod 啟動時都會設置 labels 屬性,在 service 中我們通過選擇器 selector,選擇具有相同 name 標簽屬性的 Pod,作為整體服務,並將服務信息通過 apiserver 存入 etcd 中,該工作由 Service Controller 來完成。同時,每個節點上會啟動一個 kube-proxy 進程,由它來負責服務地址到 Pod 地址的代理以及負載均衡等工作。

問題五:Pod 如何動態擴容和縮放?

既然知道了服務是由 Pod 組成的,那麼服務的擴容也就意味著 Pod 的擴容。通俗點講,就是在需要時將 Pod 複製多份,在不需要後,將 Pod 縮減至指定份數。

K8S 中通過 Replication Controller 來進行管理,為每個 Pod 設置一個期望的副本數,當實際副本數與期望不符時,就動態的進行數量調整,以達到期望值。期望數值可以由我們手動更新,或自動擴容代理來完成。

問題六:各個組件之間是如何相互協作的?

最後,講一下 kube-controller-manager 這個進程的作用。我們知道了 ectd 是作為集群數據的存儲中心, apiserver 是管理數據中心,作為其他進程與數據中心通信的橋梁。

而 Service Controller、Replication Controller 這些統一交由 kube-controller-manager 來管理,kube-controller-manager 作為一個守護進程,每個 Controller 都是一個控制迴圈,通過 apiserver 監視集群的共用狀態,並嘗試將實際狀態與期望不符的進行改變。關於 Controller,manager 中還包含了 Node 節點控制器(Node Controller)、資源配額管控制器(ResourceQuota Controller)、命名空間控制器(Namespace Controller)等。

總結

本文通過問答的方式,沒有涉及任何深入的實現細節,從整體的角度,概念性的介紹了 K8S 中涉及的基本概念,其中使用相關的包括有:

  • Node

  • Pod

  • Label

  • Selector

  • Replication Controller

  • Service Controller

  • ResourceQuota Controller

  • Namespace Controller

  • Node Controller

以及運行進程相關的有:

  • kube-apiserver

  • kube-controller-manager

  • kube-scheduler

  • kubelet

  • kube-proxy

  • pause

這也是我學習 K8S 後對其整體架構的一次總結,因為在剛上手時,閱讀官方文檔,確實被如此多的內容搞得有點暈,所在在這裡進行了簡單的梳理。文中有理解不到位的地方,歡迎指正!

關註公眾號Java技術棧回覆"面試"獲取我整理的2020最全面試題及答案。

推薦去我的博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿裡巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內部類(Inner Class),是 Java 中對類的一種定義方式,是嵌套類的一個分類,即非靜態嵌套類(Non-Static Nested Class)。內部類(非靜態嵌套類)分為成員內部類、局部內部類和匿名內部類三種。Java 編程語言允許一個類被定義在另一個類中,這樣的類就稱為嵌套類。嵌套類分... ...
  • ​ 程式員往往一心撲在編程技術上面,學習編程語言,演算法,網路,自己子領域相關的知識等等。這非常正確,也是作為coder的核心競爭力所在,姑且稱之為“硬技能”吧。 對於有一個程式員來說除了日常碼代碼之外,其實也需要很多編程之外的軟體能,非專業上面的技能可以更好的展現你的情商,與人合作的能力等。 以程式 ...
  • ​ Python是一種跨平臺的電腦程式設計語言。是一個高層次的結合瞭解釋性、編譯性、互動性和麵向對象的腳本語言。最初被設計用於編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越多被用於獨立的、大型項目的開發。 Python現如今已成為真正的萬金油語言,哪裡需要哪裡用,不管是做w ...
  • ​ 軟體測試是伴隨著軟體的產生而產生的。早期的軟體開發過程中軟體規模都很小、複雜程度低,軟體開發的過程混亂無序、相當隨意,測試的含義比較狹窄,開發人員將測試等同於“調試”,目的是糾正軟體中已經知道的故障,常常由開發人員自己完成這部分的工作。 對測試的投入極少,測試介入也晚,常常是等到形成代碼,產品已 ...
  • ​ 黃小斜寫了一年多的代碼,漸漸地代碼量也上來了,但是,代碼寫的多就是好嗎,簡單的數量堆積似乎並不能起到太好的效果,畢竟我們CRUD寫多了,也不怎麼需要架構設計,甚至連個設計模式都不怎麼需要用到。如何開始代碼精進之路,其實有很多的過來人早就已經給出了答案,今天就給大家推薦幾本幫你精進代碼的優質書籍, ...
  • 前言 ok,今天就有一個網友說預測說阿裡巴巴可能是要步入百度的後塵,3年到5年後阿裡巴巴就會像百度一樣沒落,未來互聯網的競爭將會是騰訊和位元組跳動的,然後引髮網友各種各樣的聲音和問題。 隨後確實有很多人都打了1,表示認同樓主的說法。 尤其是阿裡內部這位網友,那是挺實在的一小伙啊。打了幾個1,鬼知道他經 ...
  • 7.分散式框架dubbo的好處,不⽤dubbo可不可以。為什麼要使⽤分散式 8.七個垃圾回收器之間如何搭配使⽤ 9.接⼝限流⽅案 10.ConcurrentHashMap使⽤原理 11.解決map的併發問題⽅案 12.什麼是協程,以及實現要點 13.lru cache 使⽤hash ma... ...
  • 1、新建一個dockerfile文件 touch test.Dockerfile 2、找一個centos基礎鏡像 可以去docker hub上尋找,鏈接:docker-hub 在搜索框搜索'centos',或者直接點擊docker-hub-centos。裡面有從centos 6 到最新的centos ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...