0. kubernetes 初識

0. kubernetes 初識

一、簡介

官網(wǎng): https://kubernetes.io/zh-cn/

什么是容器編排引擎

基于容器的應(yīng)用一般會采用微服務(wù)架構(gòu),在這種架構(gòu)下,應(yīng)用被劃分為不同的組件,并以服務(wù)的形式運(yùn)行在各自的容器中,通過API對外提供服務(wù),為了保證應(yīng)用的高可用,每個組件可能會運(yùn)行多個相同的容器。這些容器會組成集群,集群中的容器會根據(jù)業(yè)務(wù)需要被動態(tài)地創(chuàng)建、遷移和銷毀。

基于微服務(wù)的應(yīng)用系統(tǒng)實(shí)際上是一個可動態(tài)伸縮的系統(tǒng),因此就需要一種高效的方法來管理容器集群,這就是容器編排引擎要做的事。

kubernetes是什么

Kubernetes 是一個可移植、可擴(kuò)展的開源平臺,用于管理容器化的工作負(fù)載和服務(wù),方便進(jìn)行聲明式配置和自動化。Kubernetes 擁有一個龐大且快速增長的生態(tài)系統(tǒng),其服務(wù)、支持和工具的使用范圍廣泛。

Kubernetes 這個名字源于希臘語,意為“舵手”或“飛行員”。k8s 這個縮寫是因?yàn)?k 和 s 之間有八個字符的關(guān)系。 Google 在 2014 年開源了 Kubernetes 項(xiàng)目。 Kubernetes 建立在Google 大規(guī)模運(yùn)行生產(chǎn)工作負(fù)載十幾年經(jīng)驗(yàn)的基礎(chǔ)上, 結(jié)合了社區(qū)中最優(yōu)秀的想法和實(shí)踐。

kubernetes能做什么

能力 描述
服務(wù)發(fā)現(xiàn)與負(fù)載均衡 Kubernetes 可以使用 DNS 名稱或自己的 IP 地址來曝露容器。
如果進(jìn)入容器的流量很大, Kubernetes 可以負(fù)載均衡并分配網(wǎng)絡(luò)流量,從而使部署穩(wěn)定。
存儲編排 Kubernetes 允許你自動掛載你選擇的存儲系統(tǒng),例如本地存儲、公共云提供商等。
自動部署與回滾 你可以使用 Kubernetes 描述已部署容器的所需狀態(tài), 它可以以受控的速率將實(shí)際狀態(tài)更改為期望狀態(tài)。
例如,你可以自動化 Kubernetes 來為你的部署創(chuàng)建新容器, 刪除現(xiàn)有容器并將它們的所有資源用于新容器。
自動完成裝箱計(jì)算 Kubernetes 允許你指定每個容器所需 CPU 和內(nèi)存(RAM)。
當(dāng)容器指定了資源請求時,Kubernetes 可以做出更好的決策來為容器分配資源。
自我修復(fù) Kubernetes 將重新啟動失敗的容器、替換容器、殺死不響應(yīng)用戶定義的運(yùn)行狀況檢查的容器,
并且在準(zhǔn)備好服務(wù)之前不將其通告給客戶端。
密鑰與配置管理 Kubernetes 允許你存儲和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。
你可以在不重建容器鏡像的情況下部署和更新密鑰和應(yīng)用程序配置,也無需在堆棧配置中暴露密鑰。
image.png
image.png

kubectl是什么

kubectl是一個平臺,使用該平臺將命令傳遞給集群,提供了k8s集群運(yùn)行命名的方法,以及創(chuàng)建和管理k8s組件的方法。k8s的命令行工具,用于遠(yuǎn)程管理集群。我們很長時間都是和kubectl打交道。

kubelet是什么

kubelet是一個代理服務(wù),它在每個節(jié)點(diǎn)上運(yùn)行,并使Node和Master進(jìn)行通信,kubelet是唯一沒有以容器形式運(yùn)行的kubernetes組件。

kubernetes對象

在 Kubernetes 系統(tǒng)中,Kubernetes 對象 是持久化的實(shí)體。 Kubernetes 使用這些實(shí)體去表示整個集群的狀態(tài)。 比較特別地是,它們描述了如下信息:

  • 哪些容器化應(yīng)用正在運(yùn)行(以及在哪些節(jié)點(diǎn)上運(yùn)行)
  • 可以被應(yīng)用使用的資源
  • 關(guān)于應(yīng)用運(yùn)行時表現(xiàn)的策略,比如重啟策略、升級策略,以及容錯策略

我在網(wǎng)上找了幾張圖可以很好的描述kubernetes 各個對象之間的關(guān)系:

圖片1:

image.png

圖片2:

image.png

kubernetes一覽

image.png

二、kubernetes基礎(chǔ)組件

1. 控制平面組件(Control Plane Components)

控制平面的組件對集群做出全局決策(比如調(diào)度),以及檢測和響應(yīng)集群事件(例如,當(dāng)不滿足部署的replicas 字段時,啟動新的 pod)??刂破矫娼M件可以在集群中的任何節(jié)點(diǎn)上運(yùn)行。然而,為了簡單起見,設(shè)置腳本通常會在同一個計(jì)算機(jī)上啟動所有控制平面組件,并且不會在此計(jì)算機(jī)上運(yùn)行用戶容器。

1.1 kube-apiserver

主節(jié)點(diǎn)上負(fù)責(zé)提供 Kubernetes API 服務(wù)的組件;它是 Kubernetes 控制面的前端。

  1. kube-apiserver是Kubernetes最重要的核心組件之一
  2. 提供集群管理的REST API接口,包括認(rèn)證授權(quán),數(shù)據(jù)校驗(yàn)以及集群狀態(tài)變更等
  3. 提供其他模塊之間的數(shù)據(jù)交互和通信的樞紐(其他模塊通過API Server查詢或修改數(shù)據(jù),只有API Server才直接操作etcd)
  4. 生產(chǎn)環(huán)境可以為apiserver做LB。在設(shè)計(jì)上考慮了水平擴(kuò)縮的需要。 換言之,通過部署多個實(shí)例可以實(shí)現(xiàn)擴(kuò)縮。或構(gòu)造高可用集群。

1.2 etcd

etcd 是兼具一致性和高可用性的鍵值數(shù)據(jù)庫,可以作為保存 Kubernetes 所有集群數(shù)據(jù)的后臺數(shù)據(jù)庫。

Kubernetes 集群的 etcd 數(shù)據(jù)庫通常需要有個備份計(jì)劃。要了解 etcd 更深層次的信息,請參考 etcd 文檔。也可以使用外部的ETCD集群

  1. kubernetes需要存儲很多東西,像它本身的節(jié)點(diǎn)信息,組件信息,還有通過kubernetes運(yùn)行的pod,deployment,service等等。都需要持久化。etcd就是它的數(shù)據(jù)中心。生產(chǎn)環(huán)境中為了保證數(shù)據(jù)中心的高可用和數(shù)據(jù)的一致性,一般會部署最少三個節(jié)點(diǎn)。
  2. 這里只部署一個節(jié)點(diǎn)在master。etcd也可以部署在kubernetes每一個節(jié)點(diǎn)。組成etcd集群。
  3. 如果已經(jīng)有etcd外部的服務(wù),kubernetes直接使用外部etcd服務(wù)

1.3 kube-schedule

主節(jié)點(diǎn)上的組件,該組件監(jiān)視那些新創(chuàng)建的未指定運(yùn)行節(jié)點(diǎn)的 Pod,并選擇節(jié)點(diǎn)讓 Pod 在上面運(yùn)行。

  1. kube-scheduler負(fù)責(zé)分配調(diào)度Pod到集群內(nèi)的節(jié)點(diǎn)上,它監(jiān)聽kube-apiserver,查詢還未分配Node的Pod,然后根據(jù)調(diào)度策略為這些Pod分配節(jié)點(diǎn)。

1.4 kube-controller-manager

在主節(jié)點(diǎn)上運(yùn)行控制器的組件, 負(fù)責(zé)運(yùn)行控制器進(jìn)程。

Controller Manager由kube-controller-manager和cloud-controller-manager組成,是Kubernetes的大腦,它通過apiserver監(jiān)控整個集群的狀態(tài),并確保集群處于預(yù)期的工作狀態(tài)。 kube-controller-manager由一系列的控制器組成,像Replication Controller控制副本,Node Controller節(jié)點(diǎn)控制Deployment Controller管理deployment等等。 cloud-controller-manager在Kubernetes啟用Cloud Provider的時候才需要,用來配合云服務(wù)提供商的控制

1.5 kubectl

主節(jié)點(diǎn)上的組件

kubectl是Kubernetes的命令行工具,是Kubernetes用戶和管理員必備的管理工具。kubectl提供了大量的子命令,方便管理Kubernetes集群中的各種功能。

我們在部署集群時為了方便操作,通常也會在需要操作的節(jié)點(diǎn)上配置kubectl。

2. Node組件

2.1 kubelet

kubelet 會在集群中每個節(jié)點(diǎn)(node)上運(yùn)行。 它保證容器(containers)都運(yùn)行在 Pod 中。

kubelet 接收一組通過各類機(jī)制提供給它的 PodSpecs, 確保這些 PodSpecs 中描述的容器處于運(yùn)行狀態(tài)且健康。 kubelet 不會管理不是由 Kubernetes 創(chuàng)建的容器。

  1. 一個在集群中每個工作節(jié)點(diǎn)上都運(yùn)行一個kubelet服務(wù)進(jìn)程,默認(rèn)監(jiān)聽10250端口,接收并執(zhí)行master發(fā)來的指令,管理Pod及Pod中的容器。每個kubelet進(jìn)程會在API Server上注冊節(jié)點(diǎn)自身信息,定期向master節(jié)點(diǎn)匯報(bào)節(jié)點(diǎn)的資源使用情況,并通過cAdvisor監(jiān)控節(jié)點(diǎn)和容器的資源。

2.2 kube-proxy

kube-proxy 是集群中每個節(jié)點(diǎn)(node)所上運(yùn)行的網(wǎng)絡(luò)代理, 實(shí)現(xiàn) Kubernetes 服務(wù)(Service) 概念的一部分。

kube-proxy 維護(hù)節(jié)點(diǎn)上的一些網(wǎng)絡(luò)規(guī)則, 這些網(wǎng)絡(luò)規(guī)則會允許從集群內(nèi)部或外部的網(wǎng)絡(luò)會話與 Pod 進(jìn)行網(wǎng)絡(luò)通信。

如果操作系統(tǒng)提供了可用的數(shù)據(jù)包過濾層,則 kube-proxy 會通過它來實(shí)現(xiàn)網(wǎng)絡(luò)規(guī)則。 否則,kube-proxy 僅做流量轉(zhuǎn)發(fā)。

一個在集群中每臺工作節(jié)點(diǎn)上都應(yīng)該運(yùn)行一個kube-proxy服務(wù),它監(jiān)聽API server中service和endpoint的變化情況,并通過iptables、ipvs等來為服務(wù)配置負(fù)載均衡,是讓我們的服務(wù)在集群外可以被訪問到的重要方式。

2.3 容器運(yùn)行環(huán)境(Container Runtime)

容器運(yùn)行環(huán)境是負(fù)責(zé)運(yùn)行容器的軟件。

Kubernetes 支持許多容器運(yùn)行環(huán)境,例如 Docker、 containerd、 CRI-O 以及 Kubernetes CRI (容器運(yùn)行環(huán)境接口) 的其他任何實(shí)現(xiàn)。

3. 插件-Addons

插件使用 Kubernetes 資源(DaemonSet、 Deployment 等)實(shí)現(xiàn)集群功能。 因?yàn)檫@些插件提供集群級別的功能,插件中命名空間域的資源屬于 kube-system 命名空間。

下面描述眾多插件中的幾種。有關(guān)可用插件的完整列表,請參見 插件(Addons)。

3.1 kube-dns

盡管其他插件都并非嚴(yán)格意義上的必需組件,但幾乎所有 Kubernetes 集群都應(yīng)該 有集群 DNS, 因?yàn)楹芏嗍纠夹枰?DNS 服務(wù)。

集群 DNS 是一個 DNS 服務(wù)器,和環(huán)境中的其他 DNS 服務(wù)器一起工作,它為 Kubernetes 服務(wù)提供 DNS 記錄。

Kubernetes 啟動的容器自動將此 DNS 服務(wù)器包含在其 DNS 搜索列表中

kube-dns為Kubernetes集群提供命名服務(wù),主要用來解析集群服務(wù)名和Pod的hostname。目的是讓pod可以通過名字訪問到集群內(nèi)服務(wù)。它通過添加A記錄的方式實(shí)現(xiàn)名字和service的解析。普通的service會解析到service-ip。headless service會解析到pod列表。

3.2 dashboard

Dashboard 是 Kubernetes 集群的通用的、基于 Web 的用戶界面。 它使用戶可以管理集群中運(yùn)行的應(yīng)用程序以及集群本身, 并進(jìn)行故障排除。

3.3 容器資源監(jiān)控

容器資源監(jiān)控 將關(guān)于容器的一些常見的時間序列度量值保存到一個集中的數(shù)據(jù)庫中, 并提供瀏覽這些數(shù)據(jù)的界面。

3.4 集群層面日志

集群層面日志 機(jī)制負(fù)責(zé)將容器的日志數(shù)據(jù)保存到一個集中的日志存儲中, 這種集中日志存儲提供搜索和瀏覽接口。

三、附錄

參考資料

kubernetes官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容