(二)容器從入門到深入-初識Kubernetes

Kubernetes 是什么

Kubernetes 脫胎于 Google 的 Borg 系統,是一個功能強大的容器編排系統。Kubernetes 及其整個生態系統(工具、模塊、插件等)均使用 Go 語言編寫,從而構成一套面向 API、可高速運行的程序集合,這些程序文檔精良、易于參與貢獻或在其上構建應用程序。

每個開發、運維或感興趣的讀者都應熟悉它的一些核心概念,以便理解這個系統及其不同的功能,以及為什么幾乎所有人都在使用它。

在繼續之前,我想提一下 Kubernetes 的幾個頂級朋友(或競爭對手):ECS、Nomad 和 Mesos。ECS 是 AWS 自己的編排解決方案,最近它又推出了托管在 AWS 上的 Kubernetes 系統——EKS。兩者都支持 FARGATE,讓用戶無須關心所運行的物理資源。

Kubernetes 毫無疑問是最大贏家,作為一個開源系統,三大主流云服務商都以托管的方式提供了這項功能。但是,它比其他幾個產品都要來得復雜和混亂。Kubernetes 可以處理幾乎任何類型的容器負載,也有很多技巧,但這并不意味著每個人都應該使用它。其他解決方案或許也能滿足某些公司的要求,例如,完全部署在 AWS 上的互聯網產品公司,使用 ECS 會比 Kubernetes 具有更佳的生產環境體驗,是的,也好于 EKS。

話雖如此,Kubernetes 的魔力在于:它可以部署在任何地方、它擁有一個活躍的社區,有數百個核心開發人員及數千個生態系統開源貢獻者。它運行快速、具有創新性、模塊化且面向 API,是一個對構建插件或服務非常友好的系統。

好了,閑話少說,開始我們的旅程。

Kubernetes 的 11 個部分

1. Pod
Pod 是 Kubernetes 中最小的可互動單元。一個 Pod 可以由多個容器組成,這些容器共同部署在單個節點上形成一個單元。一個 Pod 具有一個 IP,該 IP 在其容器之間共享。

在微服務世界中,一個 Pod 可以是執行后臺工作或服務請求的微服務的單個實例。

2. Node(節點)
Node 是機器。它們是 Kubernetes 用于部署 Pod 的“裸機”(或虛擬機)。Node 為 Kubernetes 提供可用的集群資源用于以保持數據、運行作業、維護工作負載、創建網絡路由等。

3. Label(標簽)與 Annotation(注解)

Label 是 Kubernetes 及其最終用戶用于過濾系統中相似資源的方式,也是資源與資源相互“訪問”或關聯的粘合劑。比如說,為 Deployment 打開端口的 Service。不論是監控、日志、調試或是測試,任何 Kubernetes 資源都應打上標簽以供后續查驗。例如,給系統中所有 Worker Pod 打上標簽:app=worker,之后即可在 kubectl 或 Kubernetes API 中使用 --selector 字段對其進行選擇。

Annotation 與 Label 非常相似,但通常用于以自由的字符串形式保存不同對象的元數據,例如“更改原因: 安全補丁升級”。

4. Service Discovery(服務發現)
作為編排系統,Kubernetes 控制著不同工作負載的眾多資源,負責管理 Pod、作業及所有需要通信的物理資源的網絡。為此,Kubernetes 使用了 ETCD。

ETCD 是 Kubernetes 的“內部”數據庫,Master 通過它來獲取所有資源的位置。Kubernetes 還為服務提供了實際的“服務發現”——所有 Pod 使用了一個自定義的 DNS 服務器,通過解析其他服務的名稱以獲取其 IP 地址和端口。它在 Kubernetes 集群中“開箱即用”,無須進行設置。

5. ReplicaSet(副本集)
雖然 Pod 是一個物理性的運行任務,但通常使用單個實例是不夠的。為了冗余并處理負載,出于某種原因(比如“伸縮”)需要對 Pod 進行復制。為了實現負責擴展和復制的層,Kubernetes 使用了 ReplicaSet。這個層以副本的數量表示系統的期望狀態,并在任意給定時刻保持該系統的當前狀態。

這也是配置自動伸縮的所在,在系統高負載時創建額外的副本,并在不再需要這些資源來支撐所運行的工作負載時進行縮容。

6. DaemonSet(守護進程集)
有時候,應用程序每個節點需要的實例不超過一個。比如 FileBeat 這類日志收集器就是個很好的例子。為了從各個節點收集日志,其代理需要運行在所有節點上,但每個節點只需要一個實例。Kubernetes 的 DaemonSet 即可用于創建這樣的工作負載。

7. StatefulSet(有狀態集)
盡管多數微服務涉及的都是不可變的無狀態應用程序,但也有例外。有狀態的工作負載有賴于磁盤卷的可靠支持。雖然應用程序容器本身可以是不可變的,可以使用更新的版本或更健康的實例來替代,但是所有副本還是需要數據的持久化。StatefulSet 即是用于這類需要在整個生命周期內使用同一節點的應用程序的部署。

它還保留了它的“名稱”:容器內的 hostname 以及整個集群中服務發現的名稱。3 個 ZooKeeper 構成的 StatefulSet 可以被命名 zk-1、zk-2 及 zk-3,也可以擴展到更多的成員 zk-4、zk-5 等等…… StatefulSets 還負責管理 PersistentVolumeClaim(Pod 上連接的磁盤)。

8. Job(任務)
Kubernetes 核心團隊考慮了大部分使用編排系統的應用程序。雖然多數應用程序要求持續運行以同時處理服務器請求(比如 Web 服務器),但有時還是需要生成一批作業并在其完成后進行清理。比如,一個迷你的無服務器環境。

為了在 Kubernetes 中實現這一點,可以使用 Job 資源。正如其名,Job 的工作是生成容器來完成特定的工作,并在成功完成時銷毀。舉個例子,一組 Worker 從待處理和存儲的數據隊列中讀取作業。一旦隊列空了,就不再需要這些 Worker 了,直到下個批次準備好。

9. ConfigMap(配置映射)及 Secret(機密配置)
如果你還不熟悉十二要素應用清單,請先行了解。現代應用程序的一個關鍵概念是無環境,并可通過注入的環境變量進行配置。應用程序應與其位置完全無關。為了在 Kubernetes 中實現這個重要的概念,就有了 ConfigMap。實際上這是一個環境變量鍵值列表,它們會被傳遞給正在運行的工作負載以確定不同的運行時行為。在同樣的范疇下,Secret 與正常的配置條目類似,只是會進行加密以防類似密鑰、密碼、證書等敏感信息的泄漏。

我個人認為 Hashicorp 的 Vault 是使用機密配置的最佳方案。請務必閱讀一下我去年寫的有關文章,文章講述了將 Vault 作為生產環境一部分的原因,以及我的一位同事寫的另一篇更技術性的文章。

10. Deployment(部署)
一切看起來都很美好,Pod 可以正常運行,如果上層有 ReplicaSet,還可以根據負載進行伸縮。不過,大家蜂擁而來,為的是能用新版本快速替換應用程序。我們想小規模地進行構建、測試和發布,以縮短反饋周期。使用 Deployments 即可持續地部署新軟件,這是一組描述特定運行工作負載新需求的元數據。舉個例子,發布新版本、錯誤修復,甚至是回滾(這是 Kubernetes 的另一個內部選項)。

在 Kubernetes 中部署軟件可使用 2 個主要策略:

  • 替換——正如其名,使用新需求替換全部負載,自然會強制停機。對于快速替換非生產環境的資源,這很有幫助。
  • 滾動升級——通過監聽兩個特定配置慢慢地將容器替換成新的:

MaxAvailable——設置在部署新版本時可用的工作負載比例(或具體數量),100% 表示“我有 2 個容器,在部署時要保持 2 個存活以服務請求”;
b. MaxSurge——設置在當前存活容器的基礎上部署的工作負載比例(或數量),100% 表示“我有 X 個容器,部署另外 X 個容器,然后開始滾動移除舊容器”。

11. Storage(存儲)
Kubernetes 在存儲之上添加了一層抽象。工作負載可以為不同任務請求特定存儲,甚至可以管理超過 Pod 生命周期的持久化。為簡短起見,請閱讀作者之前發布的關于 Kubernetes 存儲的文章,特別重點看看為什么它不能完全解決類似數據庫部署這樣的數據持久性要求。

概念性理解

Kubernetes(現在仍然)是根據一些指導原則進行設計和開發的,構建在系統里的每個功能、概念和想法都考慮了社區因素。此外,最終用戶會被引導以某種方式使用該系統,但這不是強迫的;最佳實踐也是公開的,但作為一個開源免費的系統,你完全可以根據自身需要進行操作。

面向 API——系統每個部分構建時通過優良的文檔和可操作的 API 來實現可交互性。核心開發人員會確保最終用戶可以進行更改、查詢和更新,以免將其阻擋在外或有不想要的過濾器。

歡迎包裝工具——作為前一點的衍生產品,Kubernetes 對在其 API 之上構建的工具和包裝器表示歡迎。作為一個原始平臺,Kubernetes 是以一個非常可定制的方式進行構建的,以便他人使用,并進一步開發用于不同用例的工具。有些工具已經變得非常有名并被廣泛使用,比如 Spinnaker、Istio 等等。

聲明性狀態——鼓勵用戶在系統中使用聲明性描述而非命令式描述。這意味著,系統的狀態和組件最好被描述為在某種版本控制(如 Git)中管理的代碼,以此避免手工修改造成的困擾。因此,Kubernetes 減少了災難恢復的難度、更易于在團隊之間分享并傳遞責任。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444560.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444560.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記一次海外大型SLG游戲服務器進程被OOM的修復經歷

事情經過 最近剛接手一個多次獲得海外GooglePlay推薦的SLG的游戲項目,服務器是java的netty框架寫的,客戶端是cocos lua。 好吧既然服務器進程運行在jvm之上,吃內存倒是挺厲害的,我一個16G內存的服務器被吃的滿滿的,這個時候為了解決內存不足,我開啟了4G的虛擬內存,方法…

leetcode50. Pow(x, n)

實現 pow(x, n) &#xff0c;即計算 x 的 n 次冪函數。 示例 1: 輸入: 2.00000, 10 輸出: 1024.00000 示例 2: 輸入: 2.10000, 3 輸出: 9.26100 示例 3: 輸入: 2.00000, -2 輸出: 0.25000 解釋: 2-2 1/22 1/4 0.25 說明: -100.0 < x < 100.0 n 是 32 位有符號整數…

GCC在C語言中內嵌匯編 asm __volatile__

在內嵌匯編中,可以將C語言表達式指定為匯編指令的操作數,而且不用去管如何將C語言表達式的值讀入哪個寄存器,以及如何將計算結果寫回C 變量,你只要告訴程序中C語言表達式與匯編指令操作數之間的對應關系即可, GCC會自動插入代碼完成必要的操作。 1、簡單的內嵌匯編 例: …

MYSQL增量備份和全量備份腳本

首先配置下mysql增量備份: server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog-ignore-db = sys, mysql, information_schema, performance_schema #設置日志格式 binlog_format = mixed #設置日志路徑,注意路經需要mysql用戶…

MYSQL增量備份和全量備份腳本分享

mysql的全量備份與增量備份全量備份&#xff1a;可以使用mysqldump直接備份整個庫或者是備份其中某一個庫或者一個庫中的某個表。增量備份&#xff1a;增量備份是針對于數據庫的bin-log日志進行備份的&#xff0c;需要開始數據庫的bin-log日志。增量備份是在全量的基礎上進行操…

leetcode48. 旋轉圖像

給定一個 n n 的二維矩陣表示一個圖像。 將圖像順時針旋轉 90 度。 說明&#xff1a; 你必須在原地旋轉圖像&#xff0c;這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉圖像。 示例 1: 給定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋轉…

(一)nodejs循序漸進-nodejs環境安裝(基礎篇)

目錄 Node Node的優點 Node.js 安裝配置 使用nvm管理不同版本的 node 與 npm nvm 與 n 的區別 卸載全局安裝的 node/npm Windows 安裝 Linux 安裝 安裝多版本 node/npm 在不同版本間切換 列出已安裝實例 在多環境中&#xff0c;npm該如何使用呢&#xff1f; 其他命…

leetcode49. 字母異位詞分組

給定一個字符串數組&#xff0c;將字母異位詞組合在一起。字母異位詞指字母相同&#xff0c;但排列不同的字符串。 示例: 輸入: ["eat", "tea", "tan", "ate", "nat", "bat"], 輸出: [ ["ate",&quo…

(二)nodejs循序漸進-nodejs基本類型和循環條件語法篇(基礎篇)

目錄 入門之helloworld 進階之helloworld http服務器 步驟一、引入 required 模塊 步驟二、創建服務器 基本語法篇 變量聲明 基礎類型 if else 循環語句 for for ... in while do和do while 運算符 加減乘除 , , !, ! typeof null&#xff0c;undefine…

(三)nodejs循序漸進-值傳遞和引用傳遞,深拷貝和淺拷貝(基礎篇)

值傳遞和引用傳遞 值類型變量&#xff1a; 存在內存的堆中&#xff0c;比如:a1引用類型變量 &#xff1a; 1.指針存在于棧中&#xff0c;2.引用類型的具體內容存在于堆中 ex:let a{b:1} a的指針指向 堆中的地址0xffac0ec 正如我在 第二章 說的&#xff0c; numberstringbo…

(四)nodejs循序漸進-函數,類和對象(基礎篇)

上一篇文章講到了基本數據類型和運算符&#xff0c;相信大家都能做簡單的運算&#xff0c;本篇文章將講述函數&#xff0c;類&#xff0c;對象。 函數 在nodejs中&#xff0c;一個函數可以作為另一個函數的參數。我們可以先定義一個函數&#xff0c;然后傳遞&#xff0c;也可…

leetcode38. 外觀數列

「外觀數列」是一個整數序列&#xff0c;從數字 1 開始&#xff0c;序列中的每一項都是對前一項的描述。前五項如下&#xff1a; 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被讀作 "one 1" ("一個一") , 即 11。 11 被讀作 "two …

(五)nodejs循序漸進-回調函數和異常處理(基礎篇)

上篇文章我們講完了類和對象&#xff0c;接下來我們將要說回調函數. 我在第一篇說到nodejs的一個優勢是異步IO&#xff0c;實際上異步IO直接體現就是使用回調函數&#xff0c;當然不是用了回調函數&#xff0c;他就一定是異步IO的&#xff0c;因為inodejs是一個單線程函數&…

(六)nodejs循序漸進-數據流和文件操作(基礎篇)

Buffer JS 語言自身只有字符串數據類型&#xff0c;沒有二進制數據類型&#xff0c;因此 NodeJS 提供了一個與 String 對等的全局構造函數 Buffer 來提供對二進制數據的操作。除了可以讀取文件得到 Buffer 的實例外&#xff0c;還能夠直接構造&#xff0c;Buffer 與字符串類似…

leetcode171. Excel表列序號

給定一個Excel表格中的列名稱&#xff0c;返回其相應的列序號。 例如&#xff0c; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 輸入: "A" 輸出: 1 示例 2: 輸入: "AB" 輸出: 28 …

(七)nodejs循序漸進-模塊系統(進階篇)

模塊系統 為了讓Node.js的文件可以相互調用&#xff0c;Node.js提供了一個簡單的模塊系統。 模塊是Node.js 應用程序的基本組成部分&#xff0c;文件和模塊是一一對應的。換言之&#xff0c;一個 Node.js 文件就是一個模塊&#xff0c;這個文件可能是JavaScript 代碼、JSON 或…

(八)nodejs循序漸進-事件驅動(進階篇)

事件驅動程序 Node.js 使用事件驅動模型&#xff0c;當web server接收到請求&#xff0c;就把它關閉然后進行處理&#xff0c;然后去服務下一個web請求。 當這個請求完成&#xff0c;它被放回處理隊列&#xff0c;當到達隊列開頭&#xff0c;這個結果被返回給用戶。 這個模型…

leetcode304. 二維區域和檢索 - 矩陣不可變

給定一個二維矩陣&#xff0c;計算其子矩形范圍內元素的總和&#xff0c;該子矩陣的左上角為 (row1, col1) &#xff0c;右下角為 (row2, col2)。 上圖子矩陣左上角 (row1, col1) (2, 1) &#xff0c;右下角(row2, col2) (4, 3)&#xff0c;該子矩形內元素的總和為 8。 示例…

(九)nodejs循序漸進-Express框架(進階篇)

Express 框架 Express 是一個簡潔而靈活的 node.js Web應用框架, 提供了一系列強大特性幫助你創建各種 Web 應用&#xff0c;和豐富的 HTTP 工具。 使用 Express 可以快速地搭建一個完整功能的網站。 Express 框架核心特性&#xff1a; 可以設置中間件來響應 HTTP 請求。 定…

leetcode326. 3的冪 如此6的操作你想到了嗎

給定一個整數&#xff0c;寫一個函數來判斷它是否是 3 的冪次方。 示例 1: 輸入: 27 輸出: true 示例 2: 輸入: 0 輸出: false 示例 3: 輸入: 9 輸出: true 示例 4: 輸入: 45 輸出: false 進階&#xff1a; 你能不使用循環或者遞歸來完成本題嗎&#xff1f; 注意最后一句…