Kubernetes k8s
一個開源的容器編排引擎,用來對容器化應用進行自動化部署、 擴縮和管理。
從架構設計層面,k8s能很好的解決可用性,伸縮性;從部署運維層面,服務部署,服務監(jiān)控,應用擴容和故障處理,k8s都提供了很好的解決方案。
k8s主要包括以下幾點:
-
服務發(fā)現(xiàn)與調度
- Kubernetes 可以把用戶提交的容器放到 Kubernetes 管理的集群的某一臺節(jié)點上去。Kubernetes 的調度器是執(zhí)行這項能力的組件,它會觀察正在被調度的這個容器的大小、規(guī)格。 比如說容器所需要的 CPU 以及 memory,然后在集群中找一臺相對比較空閑的機器來進行一次 placement,也就是一次放置的操作。
-
存儲編排
-
自動部署和回滾
-
服務自愈
- Kubernetes 有一個節(jié)點健康檢查的功能,它會監(jiān)測這個集群中所有的宿主機,當宿主機本身出現(xiàn)故障,或者軟件出現(xiàn)故障的時候,這個節(jié)點健康檢查會自動對它進行發(fā)現(xiàn)。Kubernetes 會把運行在這些失敗節(jié)點上的容器進行自動遷移,遷移到一個正在健康運行的宿主機上,來完成集群內容器的一個自動恢復。
-
服務彈性擴容
-
橫向擴容
- Kubernetes 有業(yè)務負載檢查的能力,它會監(jiān)測業(yè)務上所承擔的負載,如果這個業(yè)務本身的 CPU 利用率過高,或者響應時間過長,它可以對這個業(yè)務進行一次擴容。比如下面的例子,黃顏色的過度忙碌,Kubernetes 可以把黃顏色負載從一份變?yōu)槿荨=酉聛?,它就可以通過負載均衡把原來打到第一個黃顏色上的負載平均分到三個黃顏色的負載上去,以此來提高響應的時間。
-
存儲卷掛載
一、概述
1. 部署發(fā)展史
二、k8s架構
1. Master
- API Server:處理 API 操作的,Kubernetes 中所有的組件都會和 API Server 進行連接,組件與組件之間一般不進行獨立的連接,都依賴于 API Server 進行消息的傳送;
- Controller:控制器,用來完成對集群狀態(tài)的一些管理。比如剛剛我們提到的兩個例子之中,第一個自動對容器進行修復、第二個自動進行水平擴張,都是由 Kubernetes 中的 Controller 來進行完成的;
- Scheduler:是調度器,完成調度的操作,比如把一個用戶提交的 Container,依據它對 CPU、對 memory 請求大小,找一臺合適的節(jié)點,進行放置;
- etcd:是一個分布式的一個存儲系統(tǒng),API Server 中所需要的這些原信息都被放置在 etcd 中,etcd 本身是一個高可用系統(tǒng),通過 etcd 保證整個 Kubernetes 的 Master 組件的高可用性。
API Server,它本身在部署結構上是一個可以水平擴展的一個部署組件;Controller 是一個可以進行熱備的一個部署組件,它只有一個 active,它的調度器也是相應的,雖然只有一個 active,但是可以進行熱備。
2. 節(jié)點
Kubernetes 的 Node 是真正運行業(yè)務負載的,通過將容器放入在節(jié)點(Node)上運行的 Pod 中來執(zhí)行工作負載。 節(jié)點可以是一個虛擬機或者物理機器,取決于所在的集群配置。 每個節(jié)點包含運行 Pod 所需的服務; 這些節(jié)點由控制面負責管理。
每個業(yè)務負載會以 Pod 的形式運行。
一個 Pod 中運行的一個或者多個容器,真正去運行這些 Pod 的組件的是叫做 kubelet,也就是 Node 上最為關鍵的組件,它通過 API Server 接收到所需要 Pod 運行的狀態(tài),然后提交到下面這個 Container Runtime 組件中。
Node上的四個組件:
- 在 OS 上創(chuàng)建容器所需要運行的環(huán)境,最終把容器或者 Pod 運行起來,也需要對存儲跟網絡進行管理。Kubernetes 并不會直接進行網絡存儲的操作,他們會靠 Storage Plugin 或者是網絡的 Plugin 來進行操作。用戶自己或者云廠商都會去寫相應的 Storage Plugin 或者 Network Plugin,完成存儲操作或網絡操作。
- 在 Kubernetes 自己的環(huán)境中,也會有 Kubernetes 的 Network,它是為了提供 Service network 來進行搭網組網的。真正完成 service 組網的組件的是 Kube-proxy,它是利用了 iptable 的能力來進行組建 Kubernetes 的 Network,就是 cluster network。
Kubernetes 的 Node 不會直接和 user 進行 interaction,它的 interaction 只會通過 Master。而 User 是通過 Master 向節(jié)點下發(fā)這些信息的。Kubernetes 每個 Node 上,都會運行我們剛才提到的這幾個組件。
Kubernetes 架構中的組互相進行 interaction 舉例:
- 用戶通過 UI 或者 CLI 提交一個 Pod 給 Kubernetes 進行部署,這個 Pod 請求首先會通過 CLI 或者 UI 提交給 Kubernetes API Server,下一步 API Server 會把這個信息寫入到它的存儲系統(tǒng) etcd,之后 Scheduler 會通過 API Server 的 watch 或者叫做 notification 機制得到這個信息:有一個 Pod 需要被調度。
- 這個時候 Scheduler 會根據它的內存狀態(tài)進行一次調度決策,在完成這次調度之后,它會向 API Server report 說:“OK!這個 Pod 需要被調度到某一個節(jié)點上?!?/li>
- 這個時候 API Server 接收到這次操作之后,會把這次的結果再次寫到 etcd 中,然后 API Server 會通知相應的節(jié)點進行這次 Pod 真正的執(zhí)行啟動。相應節(jié)點的 kubelet 會得到這個通知,kubelet 就會去調 Container runtime 來真正去啟動配置這個容器和這個容器的運行環(huán)境,去調度 Storage Plugin 來去配置存儲,network Plugin 去配置網絡。
三、Kubernetes 的核心概念與它的 API
1. 核心概念
Pod
- Pod 是 Kubernetes 的一個最小調度以及資源單元
- 由一個或多個容器組成。用戶可以通過 Kubernetes 的 Pod API 生產一個 Pod,讓 Kubernetes 對這個 Pod 進行調度,也就是把它放在某一個 Kubernetes 管理的節(jié)點上運行起來。一個 Pod 簡單來說是對一組容器的抽象,它里面會包含一個或多個容器。
比如這個圖片:包含了兩個容器,每個容器可以指定所需要資源大小。比如說,一個核一個 G,或者2個核2個 G。
在這個 Pod 中也可以包含一些其他所需要的資源:比如說我們所看到的 Volume 卷這個存儲資源;比如說我們需要 100 個 GB 的存儲或者 20GB 的另外一個存儲。
Volume
Volume 就是卷的概念,它是用來管理 Kubernetes 存儲的
- 用來聲明在 Pod 中的容器可以訪問文件目錄的,
- 一個卷可以被掛載在 Pod 中一個或者多個容器的指定路徑下面。
- 一個 Volume 可以支持多種的后端的存儲。比如說 Kubernetes 的 Volume 就支持了很多存儲插件,它可以支持本地的存儲,可以支持分布式的存儲,比如說像 ceph,GlusterFS ;它也可以支持云存儲,比如說阿里云上的云盤、AWS 上的云盤、Google 上的云盤等等。
Deployment
Deployment 是在 Pod 這個抽象上更為上層的一個抽象文章來源:http://www.zghlxwxcb.cn/news/detail-826731.html
- 定義一組 Pod 的副本數目、以及這個 Pod 的版本。一般大家用 Deployment 這個抽象來做應用的真正的管理,而 Pod 是組成 Deployment 最小的單元。
- Kubernetes 是通過 Controller去維護 Deployment 中 Pod 的數目,它也會幫助 Deployment 自動恢復失敗的 Pod。
比如可以定義一個 Deployment,這個 Deployment 里面需要兩個 Pod,當一個 Pod 失敗的時候,控制器就會監(jiān)測到,它重新把 Deployment 中的 Pod 數目從一個恢復到兩個,新生成一個 Pod。 - 通過控制器,完成發(fā)布的策略。比如說進行滾動升級,進行重新生成的升級,或者進行版本的回滾。
Service
- Service 提供了一個或者多個 Pod 實例的穩(wěn)定訪問地址。
比如一個 Deployment 可能有兩個甚至更多個完全相同的 Pod。對于一個外部的用戶來講,訪問哪個 Pod 其實都是一樣的,所以它希望做一次負載均衡,在做負載均衡的同時,我只想訪問某一個固定的 VIP,也就是 Virtual IP 地址,而不希望得知每一個具體的 Pod 的 IP 地址。 - Service 支持多種訪問方式實現(xiàn),Kubernetes 支持 Cluster IP,上面我們講過的 kuber-proxy 的組網,它也支持 nodePort、 LoadBalancer 等其他的一些訪問的能力。
Namespaces
- Namespace 是用來做一個集群內部的邏輯隔離的,它包括鑒權、資源管理等。
- Kubernetes 的每個資源都屬于一個 Namespace,比如剛才講的 Pod、Deployment、Service
- 同一個 Namespace 中的資源需要命名的唯一性
-
不同的 Namespace 中的資源可以重名。
Namespace 一個用例,比如像在阿里巴巴,內部會有很多個 business units,在每一個BU 之間,希望有一個視圖上的隔離,并且在鑒權上也不一樣,在 cuda 上面也不一樣,可以用 Namespace 給每一個 BU 提供一個他所看到的這么一個看到的隔離的機制。
四、Kubernetes 的 API
從 high-level 上看,Kubernetes API 是由 **HTTP+JSON **組成的:用戶訪問的方式是 HTTP,訪問的 API 中 content 的內容是 JSON 格式的。
Kubernetes 的 kubectl 也就是 command tool,Kubernetes UI,或者有時候用 curl,直接與 Kubernetes 進行溝通,都是使用 HTTP + JSON 這種形式。文章來源地址http://www.zghlxwxcb.cn/news/detail-826731.html
到了這里,關于Kubernetes k8s的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!