之前我曾經(jīng)提到了一系列關(guān)于服務(wù)網(wǎng)格的內(nèi)容。然而,我意識到有些同學(xué)可能對Kubernetes的了解相對較少,更不用說應(yīng)用服務(wù)網(wǎng)格這個概念了。因此,今天我決定帶著大家快速理解Kubernetes中的一些專有名詞,以便在短時間內(nèi)入門,并減少學(xué)習(xí)的時間。我將在接下來的5分鐘內(nèi)為你介紹這些名詞,希望你能從中獲得一些收獲。如果你覺得有所幫助,請給個贊來鼓勵我吧!你的支持是我前進(jìn)的動力~
Kubernetes
首先,我想強(qiáng)調(diào)的是,在學(xué)習(xí)任何一項知識時,官方文檔都是最重要的資源:https://kubernetes.io/zh-cn/docs/home/
官方文檔提供了詳盡、準(zhǔn)確的信息,幫助我們深入了解和掌握這個技術(shù)。因此,如果你真的對Kubernetes感興趣,我強(qiáng)烈建議你花些時間仔細(xì)閱讀官方文檔。
談到Kubernetes,它是一個開源的容器編排引擎,旨在實現(xiàn)容器化應(yīng)用的自動化部署、擴(kuò)縮和管理。簡而言之,它能夠集中控制多個Docker容器,而不僅限于單獨操作每個容器。在沒有Kubernetes之前,如果我們想要同時操作多個Docker容器,可能需要學(xué)習(xí)并執(zhí)行Shell腳本,這需要花費一些時間。因此,如果你希望實現(xiàn)批量管理Docker容器,Kubernetes就是一個不錯的選擇,當(dāng)然也可以考慮其他類似的產(chǎn)品。
Kubernetes 組件
假設(shè)你已經(jīng)順利完成Kubernetes的安裝。一旦你部署好Kubernetes,你就擁有了一個完整的集群。下面是官方提供的架構(gòu)圖,我們可以參考一下。圖中列出了許多組件的名稱,包括:Node、Pod、kubelet、kube-proxy、kube-apiserver、etcd、kube-scheduler、kube-controller-manager、cloud-controller-manager等一系列專有名詞。接下來,我們將逐一解釋這些名詞的含義。
Node
根據(jù)架構(gòu)圖,你可能已經(jīng)猜到Node實際上就是一臺機(jī)器,它負(fù)責(zé)運行容器化的應(yīng)用程序。然而,一個Node上可以運行多個Pod。Pod是Kubernetes的最小調(diào)度單位,通常情況下,一個Pod代表一個微服務(wù)。下面是一個Pod的YAML示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
然而,這并不意味著一個Pod只能支持一個docker鏡像。例如,我們的服務(wù)網(wǎng)格中存在邊車模式,允許在同一個Pod中定義多個微服務(wù)。但為什么不在同一個Pod中定義多個微服務(wù)呢?這是因為Pod是最小的調(diào)度單位,它們需要一起啟動和重啟。這種綁定關(guān)系非常嚴(yán)格,因此如果你已經(jīng)有一個集群,為什么不將它們分開定義呢?因此,即使定義多個鏡像,也只需要定義一些輔助功能,如日志收集等。
kubelet
kubelet這個組件在整個Kubernetes系統(tǒng)中扮演著重要的角色。具體而言,控制平面將Pod的定義發(fā)送給kubelet,然后kubelet根據(jù)這些定義來創(chuàng)建和管理Pod中的容器。kubelet負(fù)責(zé)監(jiān)控Pod和容器的狀態(tài),并將這些狀態(tài)信息報告給控制平面??刂破矫婵梢愿鶕?jù)這些狀態(tài)信息來做出調(diào)度和管理決策,以確保整個系統(tǒng)的高效運行。
你可以將kubelet理解為每個項目組的招聘HR,類似于一個項目的招聘負(fù)責(zé)人。而控制平面則可以理解為上層的公司領(lǐng)導(dǎo),他們制定了招聘要求和招聘人數(shù),具體的招聘工作由HR來執(zhí)行。HR的職責(zé)是確保項目有足夠的人員,并且符合公司領(lǐng)導(dǎo)的要求。他們會持續(xù)監(jiān)視項目的人員情況,一旦有人離職,他們會向上級報告,滿足上層的控制平面要求。同時,上層的公司領(lǐng)導(dǎo)與項目人員是沒有直接溝通的,所有的溝通都通過HR進(jìn)行。HR在這個過程中起到了項目人員與上層領(lǐng)導(dǎo)之間的聯(lián)絡(luò)人的作用,負(fù)責(zé)傳遞信息、解決問題和協(xié)調(diào)工作。
kube-proxy
我們在架構(gòu)圖中看到kube-proxy也是與上層有聯(lián)系的。它通過服務(wù)代理和負(fù)載均衡功能,實現(xiàn)了集群內(nèi)部的網(wǎng)絡(luò)通信和流量轉(zhuǎn)發(fā),確保了服務(wù)的可用性和可靠性。
在我們的項目組中,他是誰呢?他是那位真正指導(dǎo)Pod要執(zhí)行哪些任務(wù)的人??梢哉f,他擔(dān)任著項目組中開發(fā)leader的角色,或者像項目經(jīng)理一樣的角色。他負(fù)責(zé)指導(dǎo)我們要做什么任務(wù),一旦有需求,他會負(fù)責(zé)轉(zhuǎn)發(fā)和分配工作。
然而,需要注意的是,他并不直接與Pod進(jìn)行網(wǎng)絡(luò)通信,而是與Service對象進(jìn)行溝通。
Service
在上述情況中,我們引入了Service對象。實際上,Service對象代表了一組Pod資源。在生產(chǎn)環(huán)境中,我們通常不會只部署一個服務(wù)來處理請求,而是會有多個Pod副本同時處理。因此,我們需要一個Service對象將它們歸類在一起,以便kube-proxy可以進(jìn)行負(fù)載均衡轉(zhuǎn)發(fā)等操作。只要Pod中的labels標(biāo)簽后面的key:value匹配,就可以將請求轉(zhuǎn)發(fā)給相應(yīng)的Pod副本。metadata下的labels字段可以包含任何鍵值對,只要符合key:value的格式即可。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app.kubernetes.io/name: proxy
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
name: http-web-svc
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app.kubernetes.io/name: proxy
ports:
- name: name-of-service-port
protocol: TCP
port: 80
targetPort: http-web-svc
控制平面組件
控制平面組件在集群中扮演著重要角色,它們負(fù)責(zé)做出全局決策,例如資源的調(diào)度,以及監(jiān)測和響應(yīng)集群事件,比如當(dāng)部署的replicas字段不滿足時,啟動新的Pod??刂破矫娼M件可以在集群中的任何節(jié)點上運行。然而,為了簡化設(shè)置和管理,通常會在同一臺計算機(jī)上啟動所有控制平面組件,并且不會在該計算機(jī)上運行用戶容器??梢詫⑵漕惐葹楣径聲?,他們負(fù)責(zé)決策和管理,與實際執(zhí)行工作的Pod之間關(guān)系不直接。
kube-apiserver
通過這個名字,你可以推斷出他負(fù)責(zé)處理并調(diào)用其他組件來完成所有API請求。舉個例子,我們之前定義了一個Pod的YAML格式文件。通過在后臺執(zhí)行kubectl apply -f your-pod.yaml,kube-apiserver就會接收到你的請求,并將其轉(zhuǎn)發(fā)給誰呢?正如我們之前提到的,它會將請求轉(zhuǎn)發(fā)給kubelet,kubelet負(fù)責(zé)與Docker進(jìn)行交互并進(jìn)行創(chuàng)建等操作。因此,kube-apiserver就像是我們的控制器一樣,直接接收請求但不處理它們。
etcd
etcd是一種用作Kubernetes所有集群數(shù)據(jù)的后臺數(shù)據(jù)庫。不僅可以存儲你能想到的所有數(shù)據(jù),而且采用分布式存儲方式,基于Raft算法確保數(shù)據(jù)的一致性。這使得所有節(jié)點都能保持?jǐn)?shù)據(jù)的一致性,因為etcd存儲了集群的配置數(shù)據(jù)、狀態(tài)信息和元數(shù)據(jù)。作為集群的“大腦”,etcd存儲了關(guān)于容器、節(jié)點、Pod、服務(wù)和其他資源的信息。通過監(jiān)視etcd中的數(shù)據(jù)變化,服務(wù)發(fā)現(xiàn)機(jī)制能夠?qū)崿F(xiàn)自動的服務(wù)注冊和發(fā)現(xiàn)。當(dāng)新的Pod或服務(wù)被創(chuàng)建時,它們會在etcd中注冊相關(guān)信息。其他組件或應(yīng)用程序可以通過查詢etcd來獲取這些信息,從而實現(xiàn)服務(wù)之間的通信和協(xié)調(diào)。
kube-scheduler
我們當(dāng)時說kubelet是負(fù)責(zé)管理該節(jié)點上的容器和Pod,那么誰來調(diào)度呢?就是由kube-scheduler負(fù)責(zé)。kube-scheduler的主要職責(zé)是從可用節(jié)點中選擇最優(yōu)節(jié)點來運行Pod,以確保資源的均衡分配,避免機(jī)器資源的浪費。由于控制平面組件較多,為了更好地理解它們各自的作用,我還額外準(zhǔn)備了一張圖來清晰地展示。
kube-controller-manager
kube-controller-manager是Kubernetes集群中不可或缺的核心組件之一,它的主要職責(zé)是運行一系列控制器,以確保集群的狀態(tài)始終維持在預(yù)期的狀態(tài)。為了更好地理解其功能,我們以Deployment Controller管理器為例進(jìn)行說明,而其他控制器的詳細(xì)信息則可以通過自行查詢來獲取。
Deployment Controller是一個負(fù)責(zé)管理應(yīng)用部署的組件。它的主要功能是根據(jù)用戶定義的期望狀態(tài)來控制ReplicaSet的創(chuàng)建、更新和刪除操作,從而實現(xiàn)應(yīng)用的滾動升級和回滾。舉一個例子。當(dāng)一個Pod掛掉時,kubelet會首先監(jiān)測到該Pod的狀態(tài)改變,并將這個信息傳遞給kube-controller-manager中的Replication Controller(如果該Pod是由Replication Controller創(chuàng)建的)。Replication Controller是負(fù)責(zé)維護(hù)Pod副本數(shù)量的控制器之一。
一旦Replication Controller接收到關(guān)于Pod狀態(tài)改變的通知,它將檢查集群中當(dāng)前的Pod副本數(shù)量,并根據(jù)其定義的副本數(shù)量進(jìn)行調(diào)整。如果發(fā)現(xiàn)當(dāng)前的Pod數(shù)量少于所需的副本數(shù)量,Replication Controller將發(fā)出指令給kubelet,在相應(yīng)的節(jié)點上重新創(chuàng)建缺失的Pod來滿足副本數(shù)量的要求。之前我們不是一直說將kubelet比作是HR嗎?上層領(lǐng)導(dǎo)找到了就是Deployment Controller。
注意不管是什么管理層Controller都要走kube-apiserver這一層。只有他才有資格調(diào)用其他組件kube-apiserver。
cloud-controller-manager
cloud-controller-manager是一個可選的組件,它提供了與云平臺相關(guān)的控制器。對于我們來說,它可能看起來與我們的工作無關(guān)。cloud-controller-manager在與云平臺的API進(jìn)行交互時,能夠管理云資源,例如負(fù)載均衡器、節(jié)點組、存儲卷等。這使得我們能夠獲得更豐富的云資源管理功能。需要注意的是,cloud-controller-manager的具體功能和行為是根據(jù)所使用的云平臺而定的。因此,它可以根據(jù)我們所用的云平臺提供適當(dāng)?shù)慕鉀Q方案。文章來源:http://www.zghlxwxcb.cn/news/detail-752631.html
總結(jié)
在本文中,我向大家介紹了Kubernetes中的一些專有名詞。Kubernetes是一個非常強(qiáng)大的容器編排引擎,可以幫助我們自動化部署、擴(kuò)展和管理容器化應(yīng)用程序。通過了解這些專有名詞,我們可以更好地理解Kubernetes的工作原理和架構(gòu)。因為大家的時間都很寶貴,所以我盡量減少閱讀時間帶大家快速入門Kubernetes,覺得不錯,給個贊吧~文章來源地址http://www.zghlxwxcb.cn/news/detail-752631.html
到了這里,關(guān)于5分鐘搞懂Kubernetes:輕松理解所有組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!