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)用程序配置,也無需在堆棧配置中暴露密鑰。 |


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:

圖片2:

kubernetes一覽

二、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 控制面的前端。
- kube-apiserver是Kubernetes最重要的核心組件之一
- 提供集群管理的REST API接口,包括認(rèn)證授權(quán),數(shù)據(jù)校驗(yàn)以及集群狀態(tài)變更等
- 提供其他模塊之間的數(shù)據(jù)交互和通信的樞紐(其他模塊通過API Server查詢或修改數(shù)據(jù),只有API Server才直接操作etcd)
- 生產(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集群
- kubernetes需要存儲很多東西,像它本身的節(jié)點(diǎn)信息,組件信息,還有通過kubernetes運(yùn)行的pod,deployment,service等等。都需要持久化。etcd就是它的數(shù)據(jù)中心。生產(chǎn)環(huán)境中為了保證數(shù)據(jù)中心的高可用和數(shù)據(jù)的一致性,一般會部署最少三個節(jié)點(diǎn)。
- 這里只部署一個節(jié)點(diǎn)在master。etcd也可以部署在kubernetes每一個節(jié)點(diǎn)。組成etcd集群。
- 如果已經(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)行。
- 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)建的容器。
- 一個在集群中每個工作節(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ù)保存到一個集中的日志存儲中, 這種集中日志存儲提供搜索和瀏覽接口。