Kubernetes(K8S)入門基礎(chǔ)內(nèi)容介紹
Introduction basic of kubernetes
我們要學(xué)習(xí) Kubernetes,就有首先了解 Kubernetes 的技術(shù)范圍、基礎(chǔ)理論知識庫等,要學(xué)習(xí) Kubernetes,肯定要有入門過程,在這個(gè)過程中,學(xué)習(xí)要從易到難,先從基礎(chǔ)學(xué)習(xí)。
那么 Kubernetes 的入門基礎(chǔ)內(nèi)容(表示學(xué)習(xí)一門技術(shù)前先了解這門技術(shù))包括哪些?
根據(jù) Linux 開源基金會的認(rèn)證考試,可以確認(rèn)要了解 Kubernetes ,需要達(dá)成以下學(xué)習(xí)目標(biāo):
- Discuss Kubernetes.
- Learn the basic Kubernetes terminology.
- Discuss the configuration tools.
- Learn what community resources are available.
接下來筆者將一一介紹 Kubernetes 的一些概念(Discuss)、技術(shù)術(shù)語(Terminology)、相關(guān)配置工具以及社區(qū)開源資源(Community resources)。
本系列教程將會混雜一些英文,因?yàn)檠芯亢褪褂?Kubernetes 的過程中,會接觸到大量英文,并且 Kubernetes 的國際認(rèn)證考試,都是英文考試,多接觸一些英文單詞,慢慢積累吧。。。
本系列教程主要參考 Linux 開源基金會的課程內(nèi)容及 Kubernetes 文檔,課程內(nèi)容按照 Attribution 3.0 Unported (CC BY 3.0) 協(xié)議,在寫作時(shí)參考、復(fù)制網(wǎng)站內(nèi)容、共享知識庫等。關(guān)于 CC BY 3.0 協(xié)議,其說明如下:
- 共享—以任何媒介或格式復(fù)制和重新分發(fā)材料
- 適應(yīng)-重新混合,變換并在材料上構(gòu)建
- 出于任何目的,甚至出于商業(yè)目的。
Linux 開源基金會認(rèn)證考試與課程學(xué)習(xí)網(wǎng)址:
https://training.linuxfoundation.org/#
使用條款:
https://www.linuxfoundation.org/terms/
學(xué)習(xí) Kubernetes 后,可以進(jìn)一步考取以下認(rèn)證證書:
Kubernetes 管理員認(rèn)證 (CKA)、Kubernetes 應(yīng)用程序開發(fā)者認(rèn)證 (CKAD)、Kubernetes安全專家認(rèn)證 (CKS)。
What Is Kubernetes?
我們先思考一下,運(yùn)行一個(gè) Docker 容器,只需要使用 docker run ...
命令即可,這是相當(dāng)簡單(relatibely simple)的方法。
但是,要實(shí)現(xiàn)以下場景,則是困難的:
- 跨多臺主機(jī)的容器相互連接(connecting containers across multiple hosts)
- 拓展容器(scaling containers)
- 在不停機(jī)的情況下配置應(yīng)用(deploying applications without downtime)
- 在多個(gè)方面進(jìn)行服務(wù)發(fā)現(xiàn)(service discovery among several aspects)
在 2008年,LXC(Linux containers) 發(fā)布第一個(gè)版本,這是最初的容器版本;2013 年,Docker 推出了第一個(gè)版本;而 Google 則在 2014 年推出了 LMCTFY。
為了解決大集群(Cluster)中容器部署、伸縮和管理的各種問題,出現(xiàn)了 Kubernetes、Docker Swarm 等軟件,稱為 容器編排引擎。
Kubernetes 是什么?
"an open-source system for automating deployment, scaling, and management of containerized applications".
“一個(gè)自動(dòng)化部署、可拓展和管理容器應(yīng)用的開源系統(tǒng)”
Google 的基礎(chǔ)設(shè)施在虛擬機(jī)(Virtual machines)技術(shù)普及之前就已經(jīng)達(dá)到了很大的規(guī)模,高效地(Efficiency)使用集群和管理分布式應(yīng)用成為 Google 挑戰(zhàn)的核心。而容器技術(shù)提供了一種高效打包集群的解決方案。
多年來,Google 一直使用 Borg 來管理集群中的容器,積累了大量的集群管理經(jīng)驗(yàn)和運(yùn)維軟件開發(fā)能力,Google 參考 Borg ,開發(fā)出了 Kubernetes,即 Borg 是 Kubernetes 的前身。(但是 Google 目前還是主要使用 Borg)。
Kubernetes 從一開始就通過一組基元(primitives)、強(qiáng)大的和可拓展的 API 應(yīng)對這些挑戰(zhàn),添加新對象和控制器地能力可以很容易地地址各種各樣的產(chǎn)品需求(production needs)。
因?yàn)?Kubernetes 這個(gè)單詞不好發(fā)音,而 k 和 s 之間有 8 個(gè)單詞,因此一般大家都讀 k 8 s。
Kubernetes 是使用 Go 語言編寫的。
當(dāng)然,除了 Kubernetes ,還有 Docker Swarm、Apache Mesos、Nomad、Rancher 等軟件可以監(jiān)控容器狀態(tài)、動(dòng)態(tài)伸縮等。
Components of Kubernetes
Kubernetes 的組件分為兩種,分別是 Control Plane Components(控制平面組件)、Node Components(節(jié)點(diǎn)組件)。
Control Plane Components 用于對集群做出全局決策;
Node Components 在節(jié)點(diǎn)中運(yùn)行,為 Pod 提供 Kubernetes 環(huán)境。
Docker 和 Kubernetes 并不是想上就上的,這可能需要改變開發(fā)模式和系統(tǒng)管理方法(system administration approach)。在傳統(tǒng)環(huán)境中,會在一臺專用服務(wù)器(dedicated server)部署(Deploy)單一的應(yīng)用(a monolithic application),當(dāng)業(yè)務(wù)發(fā)展后,需要更大的流量帶寬、CPU和內(nèi)存,這時(shí)可能對程序進(jìn)行大量的定制(提高性能、緩存優(yōu)化等),同時(shí)也需要更換更大的硬件(hardware)。
而在使用 Kubernetes 的解決方案中,是使用更多的小型服務(wù)器或者使用微服務(wù)的方式,去替代單一的、大型的一臺服務(wù)器模式。
例如,為了保證服務(wù)可靠性,當(dāng)一臺主機(jī)的服務(wù)進(jìn)程掛掉后,會啟用另一臺服務(wù)器去替代服務(wù);如果單臺服務(wù)器配置非常高,那么成本必定也會很高,這種方案的實(shí)現(xiàn)成本會比較高。而使用 Kubernetes 的方案中,當(dāng)一臺服務(wù)器或進(jìn)程掛掉后,啟動(dòng)另一臺服務(wù)器,可能只需要不到 1GB 的內(nèi)存,更何況微服務(wù)可以實(shí)現(xiàn)應(yīng)用模塊解耦(decoupling)。
PS:現(xiàn)在大家使用的 Web 服務(wù)器應(yīng)該大多數(shù)是 Nginx,Nginx 正是支持負(fù)載均衡、反向代理、多服務(wù)器配置等,非常適合微服務(wù)和多主機(jī)部署。而 Apache 的模式是使用許多 httpd 的守護(hù)進(jìn)程(daemons) 去響應(yīng)頁面請求。
將一個(gè)單一應(yīng)用拆分為多個(gè) microservice;將一臺高配置的服務(wù)器改完多態(tài)小型服務(wù)器,即 agent。接著便可以使用 Kubnentes 管理集群。而為了管理多臺服務(wù)器、多個(gè)服務(wù)實(shí)例,Kubernentes 提供了各種各樣的組件。
在 Kubernetes 中,在每臺小型服務(wù)器上的部署的應(yīng)用,我們稱 microservice(邏輯上) 或 agent(等同于一臺服務(wù)器),應(yīng)用的生命周期都是短暫(transient),因?yàn)橐坏┏霈F(xiàn)異常,都可能被替換掉。為了使用集群中的多個(gè) microservice,我們需要服務(wù)和 API 調(diào)用。一個(gè)服務(wù)需要連接到另一個(gè)服務(wù),則需要 agent 跟 agent 之間通訊,例如 Web 需要連接到 數(shù)據(jù)庫。 Kubernetes 和 Consul 都有服務(wù)發(fā)現(xiàn)和網(wǎng)絡(luò)代理或組網(wǎng)的功能,Kubernetes 提供了 kube-proxy ,Consul 提供了 Consul connect ,讀者可以單獨(dú)查閱資料了解。
讀者可以點(diǎn)擊下面的鏈接了解更多 Components of Kubernetes 的知識:
https://www.vmware.com/topics/glossary/content/components-kubernetes
Kubernetes Architecture
上圖是簡單的 kubernetes 結(jié)構(gòu),左側(cè)虛線方框中,稱為 central manager (也叫master) ,意思是中心(central)管理器;而右側(cè)是三個(gè)工作節(jié)點(diǎn)(worker node),這些節(jié)點(diǎn)被稱為 minions 。這兩部分對應(yīng)為 Master-Minions。
在 上圖中, Master 由多個(gè)組件構(gòu)成:
- 一個(gè) API 服務(wù)(kube-apiserver)
- 一個(gè)調(diào)度器(kube-scheduler)
- 各種各樣的控制器(上圖有兩個(gè)控制器)
- 一個(gè)存儲系統(tǒng)(這個(gè)組件稱為etcd),存儲集群的狀態(tài)、容器的設(shè)置、網(wǎng)絡(luò)配置等書籍
接下來我們將圍繞這張圖片,去學(xué)習(xí)那些 Kubernetes 中的術(shù)語和關(guān)鍵字。
Docker cgroup And namespace
我們知道,操作系統(tǒng)是以一個(gè)進(jìn)程為單位進(jìn)行資源調(diào)度的,現(xiàn)代操作系統(tǒng)為進(jìn)程設(shè)置了資源邊界,每個(gè)進(jìn)程使用自己的內(nèi)存區(qū)域等,進(jìn)程之間不會出現(xiàn)內(nèi)存混用。Linux 內(nèi)核中,有 cgroups 和 namespaces 可以為進(jìn)程定義邊界,使得進(jìn)程彼此隔離。
namespace
在容器中,當(dāng)我們使用 top 命令或 ps 命令查看機(jī)器的進(jìn)程時(shí),可以看到進(jìn)程的 Pid,每個(gè)進(jìn)程一個(gè) Pid,而機(jī)器的所有容器都具有一個(gè) Pid = 1 的基礎(chǔ),但是為什么不會發(fā)生沖突?容器中的進(jìn)程可以任意使用所有端口,而不同容器可以使用相同的端口,為什么不會發(fā)生沖突?這些都是命名空間可以設(shè)定邊界的表現(xiàn)。
Linux 中,unshare 可以創(chuàng)建一個(gè)命名空間(實(shí)際上是一個(gè)進(jìn)程,命名空間中的其它進(jìn)程是這個(gè)進(jìn)程的子進(jìn)程),并且創(chuàng)建一些資源(子進(jìn)程)。為了深刻理解 Docker 中的 namespace,我們可以在 Linux 中執(zhí)行:
sudo unshare --fork --pid --mount-proc bash
然后執(zhí)行 ps aux
查看進(jìn)程:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 23612 3556 pts/1 S 21:14 0:00 bash root 13 0.0 0.1 37624 3056 pts/1 R+ 21:14 0:00 ps aux
是不是跟 Docker 容器執(zhí)行命令的結(jié)果相似?我們還可以使用 nsenter 命令進(jìn)入另一個(gè)進(jìn)程的命名空間。
上面的代碼中,--pid
參數(shù)代碼創(chuàng)建 pid 命名空間,但是因?yàn)椴]有隔離網(wǎng)絡(luò),因此當(dāng)我們執(zhí)行 netstat --tlap
命令時(shí),這個(gè)命名空間的網(wǎng)絡(luò)跟其它命名空間的網(wǎng)絡(luò)還不是隔離的。
Linux 中的 namespace 類型有:
- mount :命名空間具有獨(dú)立的掛載文件系統(tǒng);
- ipc:Inter-Process Communication (進(jìn)程間通訊)命名空間,具有獨(dú)立的信號量、共享內(nèi)存等;
- uts:命名空間具有獨(dú)立的 hostname 、domainname;
- net:獨(dú)立的網(wǎng)絡(luò),例如每個(gè) docker 容器都有一個(gè)虛擬網(wǎng)卡;
- pid:獨(dú)立的進(jìn)程空間,空間中的進(jìn)程 Pid 都從 1 開始;
- user:命名空間中有獨(dú)立的用戶體系,例如 Docker 中的 root 跟主機(jī)的用戶不一樣;
- cgroup:獨(dú)立的用戶分組;
Docker 中的命名空間正是依賴 Linux 內(nèi)核實(shí)現(xiàn)的。
cgroups
cgroups 可以限制進(jìn)程可使用的內(nèi)存、CPU大小。cgroups 全稱是 Control Groups,是 Linux 內(nèi)核中的物理資源隔離機(jī)制。
為了避免篇幅過大,讀者只需要知道 Docker 限制容器資源使用量、CPU 核數(shù)等操作,其原理是 Linux 內(nèi)核中的 cgroups 即可,筆者這里不再贅述。
kube-apiserver
Kubernetes 通過 kube-apiserver 暴露一組 API,我們可以通過這些 API 控制 Kubernetes 的行為,而 kubernetes 有一個(gè)調(diào)用了這些 API 的本地客戶端,名為 kubectl。當(dāng)然,我們也可以利用這些 API 開發(fā)出跟 kubectl 一樣強(qiáng)大的工具,例如網(wǎng)格管理工具 istio。
kube-scheduler
當(dāng)要運(yùn)行容器時(shí),發(fā)送的請求會被調(diào)度器(kube-scheduler)轉(zhuǎn)發(fā)到 API;調(diào)度器還可以尋找一個(gè)合適的節(jié)點(diǎn)運(yùn)行這個(gè)容器。
node
集群中的每個(gè)節(jié)點(diǎn)都會運(yùn)行著兩個(gè)進(jìn)程,分別是 kubelet,kube-proxy。(可以留意上圖的 Kubernetes Mimons 里面)
在前面,我們知道當(dāng)要運(yùn)行一個(gè)容器時(shí),需要調(diào)度器轉(zhuǎn)發(fā) API,這個(gè)請求最終會發(fā)送到 node 上的 kubelet,kubelet 可以接收 ”運(yùn)行容器“ 的請求;kubelet 還可以管理那些必需的資源以及在本地節(jié)點(diǎn)上監(jiān)控它們。
kube-proxy 可以創(chuàng)建和管理網(wǎng)絡(luò)規(guī)則,以便在網(wǎng)絡(luò)上公開容器。
Kubernetes Master 只能是 Linux,而 node 則可以是 Linux 和 Windows 等。
Terminology
本章將介紹一些 Kubenetes 的術(shù)語,以便提前了解 kubernetes 中的一些概念。本小節(jié)的內(nèi)容并不會有太多解釋,因?yàn)槊坎糠忠v起來會很復(fù)雜,而這些在后面的 Kubernetes 技術(shù)中,都會單獨(dú)講解到,因此這里只是介紹一些簡明的概念。讀者不需要仔細(xì)看,只需要概覽一遍即可。
Orchestration is managed
編排管理(Orchestration is managed) 是通過一系列的 監(jiān)控循環(huán)(watch-loops)去控制或操作的;每個(gè)控制器(controller interogates) 都向 kube-apiserver 詢問對象狀態(tài),然后修改它,直至達(dá)到條件。
容器編排是管理容器的最主要的技術(shù)。Dockers 也有其官方開發(fā)的 swarm 這個(gè)編排工具,但是在 2017 年的容器編排大戰(zhàn)中,swarm 敗于 Kubernetes。
namespace
Kubernetes 文檔說,對于只有幾到幾十個(gè)用戶的集群,根本不需要?jiǎng)?chuàng)建或考慮名字空間。這里我們只需要知道,集群資源被使用名字劃出來,資源之間可以隔離開,這種名字稱為命名空間。當(dāng)然這個(gè)命名空間跟前面提到的 Linux 內(nèi)核的命名空間技術(shù)不同,讀者只需要了解到兩者的理念相通就行。
Pod
Pod 是 Kubernetes 中創(chuàng)建和管理的、最小的可部署的計(jì)算單元。
在前面的學(xué)習(xí)中,我們已經(jīng)了解到 Kubernetes 是一個(gè)編排系統(tǒng)(orchestration system),用于部署(deploy)和管理容器。而容器,在 一個(gè) Pod 上運(yùn)行,一個(gè) Pod 運(yùn)行著多個(gè) 容器,并且這些容器共享著 IP 地址、訪問存儲系統(tǒng)和命名空間。Kubernetes 通過命名空間讓集群中的對象相互隔離開,實(shí)現(xiàn)資源控制和多租戶(multi-tenant)連接。
Replication Controller
Replication Controller 簡稱 RC,應(yīng)答控制器(Replication Controller) 用來部署和升級 Pod。
ReplicaSet
ReplicaSet 的目的是維護(hù)一組在任何時(shí)候都處于運(yùn)行狀態(tài)的 Pod 副本的穩(wěn)定集合。
如果 Pod 掛了,我們可以手工重啟 Pod,但是這種操作方法肯定不靠譜,不可能人力 24 小時(shí)以及瞬時(shí)執(zhí)行完一系列命令。
Deployments
Deployment 提供了一種對 Pod 和 ReplicaSet 的管理方式。這里不贅述,以后需要時(shí)再提及。
Kubernetes 對象
kubernetes 對象是持久化的實(shí)體,通過這些實(shí)體,可以雕塑整個(gè)集群的狀態(tài)。這里介紹一些對象信息的表示。
- 對象名稱和 IDs:使用名稱、UID來表示其在同類資源中的唯一性;
- 命名空間:即之前提到的 namespace;
- 標(biāo)簽和選擇算符:標(biāo)簽(Labels) 是附加到 Kubernetes 對象(比如 Pods)上的鍵值對;
- 注解:為對象附加的非標(biāo)識的元數(shù)據(jù);
- 字段選擇器:根據(jù)一個(gè)或多個(gè)資源字段的值 篩選 Kubernetes 資源;
到此這篇關(guān)于Kubernetes(K8S)入門基礎(chǔ)內(nèi)容的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
kubectl中g(shù)et命令及使用示例總結(jié)
這篇文章主要為大家介紹了kubectl中g(shù)et命令及使用示例的總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Kubernetes(K8S)容器集群管理環(huán)境完整部署詳細(xì)教程-中篇
本系列文章主要介紹了Kubernetes(K8S)容器集群管理環(huán)境完整部署的詳細(xì)教程,分為上中下三篇文章,此為中篇,需要的朋友可以參考下2022-01-01Kubernetes(K8S)容器集群管理環(huán)境完整部署詳細(xì)教程-上篇
本系列文章主要介紹了Kubernetes(K8S)容器集群管理環(huán)境完整部署的詳細(xì)教程,分為上中下三篇文章,此為上篇,需要的朋友可以參考下2022-01-01Kubernetes(K8S)入門基礎(chǔ)內(nèi)容介紹
這篇文章介紹了Kubernetes(K8S)的入門基礎(chǔ)內(nèi)容,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03KubeSphere接入外部Elasticsearch實(shí)戰(zhàn)示例
這篇文章主要為大家介紹了KubeSphere接入外部Elasticsearch實(shí)戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Kubernetes Informer數(shù)據(jù)存儲Index與Pod分配流程解析
這篇文章主要為大家介紹了Kubernetes Informer數(shù)據(jù)存儲Index與Pod分配流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11