Kubernetes/k8s的核心概念

一、什么是 Kubernetes

Kubernetes,從官方網站上可以看到,它是一個工業級的容器編排平臺。Kubernetes 這個單詞是希臘語,它的中文翻譯是“舵手”或者“飛行員”。在一些常見的資料中也會看到“ks”這個詞,也就是“k8s”,它是通過將8個字母“ubernete ”替換為“8”而導致的一個縮寫。
Kubernetes 為什么要用“舵手”來命名呢?大家可以看一下這張圖:
在這里插入圖片描述
這是一艘載著一堆集裝箱的輪船,輪船在大海上運著集裝箱奔波,把集裝箱送到它們該去的地方。我們之前其實介紹過一個概念叫做 container,container 這個英文單詞也有另外的一個意思就是“集裝箱”。Kubernetes 也就借著這個寓意,希望成為運送集裝箱的一個輪船,來幫助我們管理這些集裝箱,也就是管理這些容器。
這個就是為什么會選用 Kubernetes 這個詞來代表這個項目的原因。更具體一點地來說:Kubernetes 是一個自動化的容器編排平臺,它負責應用的部署、應用的彈性以及應用的管理,這些都是基于容器的。

二、Kubernetes 有如下幾個核心的功能:

  • 服務的發現與負載的均衡;

  • 容器的自動裝箱,我們也會把它叫做 scheduling,就是“調度”,把一個容器放到一個集群的某一個機器上,Kubernetes 會幫助我們去做存儲的編排,讓存儲的聲明周期與容器的生命周期能有一個連接;

  • Kubernetes 會幫助我們去做自動化的容器的恢復。在一個集群中,經常會出現宿主機的問題或者說是 OS 的問題,導致容器本身的不可用,Kubernetes 會自動地對這些不可用的容器進行恢復;

  • Kubernetes 會幫助我們去做應用的自動發布與應用的回滾,以及與應用相關的配置密文的管理;

  • 對于 job 類型任務,Kubernetes 可以去做批量的執行;

  • 為了讓這個集群、這個應用更富有彈性,Kubernetes 也支持水平的伸縮。
    在這里插入圖片描述

1、調度

Kubernetes 可以把用戶提交的容器放到 Kubernetes 管理的集群的某一臺節點上去。Kubernetes 的調度器是執行這項能力的組件,它會觀察正在被調度的這個容器的大小、規格。

比如說它所需要的 CPU以及它所需要的 memory,然后在集群中找一臺相對比較空閑的機器來進行一次 placement,也就是一次放置的操作。在這個例子中,它可能會把紅顏色的這個容器放置到第二個空閑的機器上,來完成一次調度的工作。
在這里插入圖片描述

2、自動修復

Kubernetes 有一個節點健康檢查的功能,它會監測這個集群中所有的宿主機,當宿主機本身出現故障,或者軟件出現故障的時候,這個節點健康檢查會自動對它進行發現。

下面 Kubernetes 會把運行在這些失敗節點上的容器進行自動遷移,遷移到一個正在健康運行的宿主機上,來完成集群內容器的一個自動恢復。
在這里插入圖片描述

3、水平伸縮

Kubernetes 有業務負載檢查的能力,它會監測業務上所承擔的負載,如果這個業務本身的 CPU 利用率過高,或者響應時間過長,它可以對這個業務進行一次擴容。

比如說在下面的例子中,黃顏色的過度忙碌,Kubernetes 就可以把黃顏色負載從一份變為三份。接下來,它就可以通過負載均衡把原來打到第一個黃顏色上的負載平均分到三個黃顏色的負載上去,以此來提高響應的時間。
在這里插入圖片描述

三、Kubernetes 的架構

Kubernetes 架構是一個比較典型的二層架構和 server-client 架構。Master 作為中央的管控節點,會去與 Node 進行一個連接。

所有 UI 的、clients、這些 user 側的組件,只會和 Master 進行連接,把希望的狀態或者想執行的命令下發給 Master,Master 會把這些命令或者狀態下發給相應的節點,進行最終的執行。
在這里插入圖片描述
Kubernetes 的 Master 包含四個主要的組件:API Server、Controller、Scheduler 以及 etcd。如下圖所示:
在這里插入圖片描述

  • API Server:顧名思義是用來處理 API 操作的,Kubernetes 中所有的組件都會和 API Server 進行連接,組件與組件之間一般不進行獨立的連接,都依賴于 API Server 進行消息的傳送;

  • Controller:是控制器,它用來完成對集群狀態的一些管理。比如剛剛我們提到的兩個例子之中,第一個自動對容器進行修復、第二個自動進行水平擴張,都是由 Kubernetes 中的 Controller 來進行完成的;

  • Scheduler:是調度器,“調度器”顧名思義就是完成調度的操作,就是我們剛才介紹的第一個例子中,把一個用戶提交的 Container,依據它對 CPU、對 memory 請求大小,找一臺合適的節點,進行放置;

  • etcd:是一個分布式的一個存儲系統,API Server 中所需要的這些原信息都被放置在 etcd 中,etcd 本身是一個高可用系統,通過 etcd 保證整個 Kubernetes 的 Master 組件的高可用性。

我們剛剛提到的 API Server,它本身在部署結構上是一個可以水平擴展的一個部署組件;Controller 是一個可以進行熱備的一個部署組件,它只有一個 active,它的調度器也是相應的,雖然只有一個 active,但是可以進行熱備。

Kubernetes 的架構:Node

Kubernetes 的 Node 是真正運行業務負載的,每個業務負載會以 Pod 的形式運行。等一下我會介紹一下 Pod 的概念。一個 Pod 中運行的一個或者多個容器,真正去運行這些 Pod 的組件的是叫做 kubelet,也就是 Node 上最為關鍵的組件,它通過 API Server 接收到所需要 Pod 運行的狀態,然后提交到我們下面畫的這個 Container Runtime 組件中。
在這里插入圖片描述
在 OS 上去創建容器所需要運行的環境,最終把容器或者 Pod 運行起來,也需要對存儲跟網絡進行管理。Kubernetes 并不會直接進行網絡存儲的操作,他們會靠 Storage Plugin 或者是網絡的 Plugin 來進行操作。用戶自己或者云廠商都會去寫相應的 Storage Plugin 或者 Network Plugin,去完成存儲操作或網絡操作。

在 Kubernetes 自己的環境中,也會有 Kubernetes 的 Network,它是為了提供 Service network 來進行搭網組網的。(等一下我們也會去介紹“service”這個概念。)真正完成 service 組網的組件的是 Kube-proxy,它是利用了 iptable 的能力來進行組建 Kubernetes 的 Network,就是 cluster network,以上就是 Node 上面的四個組件。

Kubernetes 的 Node 并不會直接和 user 進行 interaction,它的 interaction 只會通過 Master。而 User 是通過 Master 向節點下發這些信息的。Kubernetes 每個 Node 上,都會運行我們剛才提到的這幾個組件。

下面我們以一個例子再去看一下 Kubernetes 架構中的這些組件,是如何互相進行 interaction 的。
在這里插入圖片描述
用戶可以通過 UI 或者 CLI 提交一個 Pod 給 Kubernetes 進行部署,這個 Pod 請求首先會通過 CLI 或者 UI 提交給 Kubernetes API Server,下一步 API Server 會把這個信息寫入到它的存儲系統 etcd,之后 Scheduler 會通過 API Server 的 watch 或者叫做 notification 機制得到這個信息:有一個 Pod 需要被調度。

這個時候 Scheduler 會根據它的內存狀態進行一次調度決策,在完成這次調度之后,它會向 API Server report 說:“OK!這個 Pod 需要被調度到某一個節點上。”

這個時候 API Server 接收到這次操作之后,會把這次的結果再次寫到 etcd 中,然后 API Server 會通知相應的節點進行這次 Pod 真正的執行啟動。相應節點的 kubelet 會得到這個通知,kubelet 就會去調 Container runtime 來真正去啟動配置這個容器和這個容器的運行環境,去調度 Storage Plugin 來去配置存儲,network Plugin 去配置網絡。

這個例子我們可以看到:這些組件之間是如何相互溝通相互通信,協調來完成一次Pod的調度執行操作的。

四、Kubernetes 的核心概念

核心概念
第一個概念:Pod
Pod 是 Kubernetes 的一個最小調度以及資源單元。用戶可以通過 Kubernetes 的 Pod API 生產一個 Pod,讓 Kubernetes 對這個 Pod 進行調度,也就是把它放在某一個 Kubernetes 管理的節點上運行起來。一個 Pod 簡單來說是對一組容器的抽象,它里面會包含一個或多個容器。

比如像下面的這幅圖里面,它包含了兩個容器,每個容器可以指定它所需要資源大小。比如說,一個核一個 G,或者說 0.5 個核,0.5 個 G。

當然在這個 Pod 中也可以包含一些其他所需要的資源:比如說我們所看到的 Volume 卷這個存儲資源;比如說我們需要 100 個 GB 的存儲或者 20GB 的另外一個存儲。
在這里插入圖片描述
在 Pod 里面,我們也可以去定義容器所需要運行的方式。比如說運行容器的 Command,以及運行容器的環境變量等等。Pod 這個抽象也給這些容器提供了一個共享的運行環境,它們會共享同一個網絡環境,這些容器可以用 localhost 來進行直接的連接。而 Pod 與 Pod 之間,是互相有 isolation 隔離的。
第二個概念:Volume

Volume 就是卷的概念,它是用來管理 Kubernetes 存儲的,是用來聲明在 Pod 中的容器可以訪問文件目錄的,一個卷可以被掛載在 Pod 中一個或者多個容器的指定路徑下面。

而 Volume 本身是一個抽象的概念,一個 Volume 可以去支持多種的后端的存儲。比如說 Kubernetes 的 Volume 就支持了很多存儲插件,它可以支持本地的存儲,可以支持分布式的存儲,比如說像 ceph,GlusterFS ;它也可以支持云存儲,比如說阿里云上的云盤、AWS 上的云盤、Google 上的云盤等等。
在這里插入圖片描述
第三個概念:Deployment

Deployment 是在 Pod 這個抽象上更為上層的一個抽象,它可以定義一組 Pod 的副本數目、以及這個 Pod 的版本。一般大家用 Deployment 這個抽象來做應用的真正的管理,而 Pod 是組成 Deployment 最小的單元。

Kubernetes 是通過 Controller,也就是我們剛才提到的控制器去維護 Deployment 中 Pod 的數目,它也會去幫助 Deployment 自動恢復失敗的 Pod。

比如說我可以定義一個 Deployment,這個 Deployment 里面需要兩個 Pod,當一個 Pod 失敗的時候,控制器就會監測到,它重新把 Deployment 中的 Pod 數目從一個恢復到兩個,通過再去新生成一個 Pod。通過控制器,我們也會幫助完成發布的策略。比如說進行滾動升級,進行重新生成的升級,或者進行版本的回滾。
在這里插入圖片描述
第四個概念:Service

Service 提供了一個或者多個 Pod 實例的穩定訪問地址。

比如在上面的例子中,我們看到:一個 Deployment 可能有兩個甚至更多個完全相同的 Pod。對于一個外部的用戶來講,訪問哪個 Pod 其實都是一樣的,所以它希望做一次負載均衡,在做負載均衡的同時,我只想訪問某一個固定的 VIP,也就是 Virtual IP 地址,而不希望得知每一個具體的 Pod 的 IP 地址。

我們剛才提到,這個 pod 本身可能 terminal go(終止),如果一個 Pod 失敗了,可能會換成另外一個新的。

對一個外部用戶來講,提供了多個具體的 Pod 地址,這個用戶要不停地去更新 Pod 地址,當這個 Pod 再失敗重啟之后,我們希望有一個抽象,把所有 Pod 的訪問能力抽象成一個第三方的一個 IP 地址,實現這個的 Kubernetes 的抽象就叫 Service。

實現 Service 有多種方式,Kubernetes 支持 Cluster IP,上面我們講過的 kuber-proxy 的組網,它也支持 nodePort、 LoadBalancer 等其他的一些訪問的能力。
在這里插入圖片描述

第五個概念:Namespace

Namespace 是用來做一個集群內部的邏輯隔離的,它包括鑒權、資源管理等。Kubernetes 的每個資源,比如剛才講的 Pod、Deployment、Service 都屬于一個 Namespace,同一個 Namespace 中的資源需要命名的唯一性,不同的 Namespace 中的資源可以重名。

Namespace 一個用例,比如像在阿里巴巴,我們內部會有很多個 business units,在每一個 business units 之間,希望有一個視圖上的隔離,并且在鑒權上也不一樣,在 cuda 上面也不一樣,我們就會用 Namespace 來去給每一個 BU 提供一個他所看到的這么一個看到的隔離的機制。
在這里插入圖片描述

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

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

相關文章

如何解決代理ip服務器連接問題

在當今的數字化時代,互聯網連接已成為生活和工作中不可或缺的一部分。然而,在嘗試訪問互聯網資源時,用戶有時會遇到“代理服務器可能有問題,或地址不正確(你尚未連接)”的錯誤提示。這種情況通常表明計算機的網絡設置存在問題&…

自然語言處理之語言模型(LM):用c++通過自然語言處理技術分析語音信號音高

要通過自然語言處理技術分析語音信號音高,我們可以采用以下步驟: 首先,我們需要獲取語音信號的原始音頻數據。可以使用C中的音頻處理庫(例如PortAudio或ALSA)來捕獲音頻輸入并將其轉換為數字音頻數據。 接下來&#x…

python統計分析——廣義線性模型的評估

參考資料:用python動手學統計學 殘差是表現數據與模型不契合的程度的重要指標。 1、導入庫 # 導入庫 # 用于數值計算的庫 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 導入繪圖的庫 import matplotlib.pyplot as plt i…

mybatis中if的test如何判斷雙等號(==)

我們在寫mybatis.xml時往往會寫!&#xff0c;如&#xff1a; <if test"validType ! null and validType ! "> </if>當時如何判斷等于某一個值呢&#xff0c;如下將test的雙引號改為單引號&#xff0c;值用雙引號&#xff1a; <if testvalidType &q…

面經 | Java創建線程的三種方式

利用JUC包創建線程的三種方式&#xff1a; 通過繼承Thread類創建線程類實現Runnable接口創建線程類通過Callable和Future接口創建線程 繼承Thread類創建線程 class Thread1 extends Thread {Overridepublic void run() {System.out.println("啟動線程1");} }實現R…

第七篇:微信小程序的跳轉頁面

前提&#xff1a;建議還沒學HTML、CSS、JavaScript、JSON、vue、Ajax的兄弟姐妹們&#xff0c;先去把這些基礎補好過一遍&#xff0c;不然不好理解微信小程序 前面這一篇已經講過一次<navigator>跳轉頁面的用法了&#xff0c;今天詳細講解一下 回顧&#xff1a; 小程序…

Lesson 1 introduction of machine /deep learning

聽課&#xff08;李宏毅老師的&#xff09;筆記&#xff0c;方便梳理框架&#xff0c;以作復習之用。本節課主要介紹了什么是機器學習&#xff0c;機器學習的類型和流程&#xff0c;用一個現實中的例子詳細地展示了整個工作流程。 1. 機器學習的定義 2. 不同的函數類型 預測數…

MyBatis 學習(四)之 SQL 映射文件

目錄 1 SQL 映射文件介紹 2 select 元素 3 insert 元素 4 update 和 delete 元素 5 sql 元素 6 parameterType 元素 7 resultType 元素 8 resultMap 元素&#xff08;重要&#xff09; 9 參考文檔 1 SQL 映射文件介紹 映射器是 MyBatis 中最復雜并且是最重要的…

【軟考中級】系統集成項目管理工程師—案例分析基礎

軟考中級——系統集成項目管理工程師 案例分析基礎 考試時間及要求 中級考試案例分析5道題&#xff0c;時間150分鐘&#xff0c;時間充裕。&#xff08;高級考試案例分析3道題【高級一般第一題都是找錯、第二題改錯、第三題默寫】&#xff0c;時間90分鐘、平均每道題花30分鐘…

Vue(3.3.4)+three.js(0.161.0)實現3D可視化地圖

一.前言 由于最近在學習three.js,所以觀摩了一下掘金&#xff0c;csdn等網站上的有關這部分的內容&#xff0c;剛好看到一個帶你入門three.js——從0到1實現一個3d可視化地圖 - 掘金 (juejin.cn)&#xff0c;再加上我的專業屬性是地理相關&#xff0c;可以說是專業對口&#xf…

Java使用ffmpeg指令實現音頻格式轉換

針對Linux環境下如何安裝ffmpeg請看上一篇文章Linux上搭建并使用ffmpeg&#xff08;Java&#xff09;-CSDN博客 public static void voiceChangeFormat(String localPath, String targetPath) {List<String> command new ArrayList<>();command.add("ffmpeg…

存儲xss實現獲取cookie(本地實戰)

實戰更能體驗收獲&#xff01;&#xff01;&#xff01; 環境準備&#xff1a; 1.phpstudy 2.dvwa靶場 實戰 首先我們在phpstudy指定的localhost網站目錄下編寫一個xss.php文件&#xff0c;內容如下&#xff1a; <?php $cookie $_GET[cookie]; $ip getenv (REMOTE_…

electron+vue3全家桶+vite項目搭建【28】封裝窗口工具類【2】窗口組,維護窗口關系

文章目錄 引入實現效果思路主進程模塊渲染進程模塊測試效果 引入 demo項目地址 窗口工具類系列文章&#xff1a; 封裝窗口工具類【1】雛形 我們思考一下窗口間的關系&#xff0c;窗口創建和銷毀的一些動作&#xff0c;例如父子窗口&#xff0c;窗口組合等等&#xff0c;還有…

【前端素材】推薦優質在線高端家具電商網頁Classi平臺模板(附源碼)

一、需求分析 1、系統定義 在線高端家具商城是一個專門銷售高端家具產品的電子商務平臺&#xff0c;旨在為消費者提供購買高品質家具的便捷渠道。 2、功能需求 在線高端家具商城是一個專門銷售高端家具產品的電子商務平臺&#xff0c;旨在為消費者提供購買高品質家具的便捷…

Maven高級(黑馬學習筆記)

Maven 是一款構建和管理 Java 項目的工具。 分模塊設計與開發 介紹 所謂分模塊設計&#xff0c;顧名思義指的就是我們在設計一個 Java 項目的時候&#xff0c;將一個 Java 項目拆分成多個模塊進行開發。 1). 未分模塊設計的問題 如果項目不分模塊&#xff0c;也就意味著所有…

node.js和electron安裝

文章目錄 一、node.js安裝1.node.js下載安裝2.設置鏡像 二、其它問題1.文件夾創建錯誤2.electron安裝錯誤 一、node.js安裝 1.node.js下載安裝 參考B站視頻node.js安裝&#xff0c;沒有按視頻中設置鏡像 2.設置鏡像 參考&#xff1a;https://npmmirror.com/ npm config se…

十八:Java8新特性

文章目錄 01、Java8概述02、Java8新特性的好處03、并行流與串行流04、Lambda表達式4.1、Lambda表達式使用舉例4.2、Lambda表達式語法的使用14.3、Lambda表達式語法的使用2 05、函數式(Functional)接口5.1、函數式接口的介紹5.2、Java內置的函數式接口介紹及使用舉例 06、方法引…

Hgame題解(第二星期)

Hgame題解&#xff08;第二星期&#xff09; Web Select More Courses 打開靶機發現是一個登陸頁面&#xff0c;根據題目提示下載弱密碼字典&#xff0c;通過BP爆破獲得用戶密碼為qwert123 登陸后進入下一個頁面&#xff0c;由于學分已滿無法選課&#xff0c;所以需要先進行…

回歸預測 | Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測

回歸預測 | Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測 目錄 回歸預測 | Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測&#xff08;完整源碼和數據&a…

推薦瑩瑩API管理系統PHP源碼

瑩瑩API管理系統PHP源碼附帶兩套模板,PHP版本要求為5.6至8.0之間&#xff0c;已測試通過的版本為7.4。 需要安裝PHPSG11加密擴展。 已測試&#xff1a;寶塔/主機親測成功搭建&#xff01; 演示地 址 &#xff1a; runruncode.com/php/19698.html 安裝說明&#xff08;適用于寶…