k8s概述
Kubernetes(簡(jiǎn)稱K8s,是因?yàn)?k 和 s 之間有八個(gè)字符)是一個(gè)開源的容器編排平臺(tái),用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化應(yīng)用程序。它提供了一種機(jī)制,用于自動(dòng)化部署、擴(kuò)展和管理容器化應(yīng)用程序的集群。Kubernetes的目標(biāo)是讓部署容器化應(yīng)用程序變得簡(jiǎn)單高效。它提供了應(yīng)用程序部署、規(guī)劃、更新和維護(hù)的基本機(jī)制,同時(shí)具備強(qiáng)大的擴(kuò)展性和可靠性。Kubernetes采用主從設(shè)備模型(Master-Slave架構(gòu)),其中Master節(jié)點(diǎn)負(fù)責(zé)核心的調(diào)度、管理和運(yùn)維任務(wù),而Slave節(jié)點(diǎn)負(fù)責(zé)運(yùn)行應(yīng)用程序的容器。通過Kubernetes,開發(fā)人員可以更輕松地管理和擴(kuò)展他們的容器化應(yīng)用程序,從而提高應(yīng)用程序的可靠性和可伸縮性。
特性
主要特性:
自動(dòng)化容器編排:彈性伸縮,Kubernetes可以自動(dòng)化地管理和編排容器,根據(jù)定義的規(guī)則和策略來調(diào)度和部署應(yīng)用程序。
服務(wù)發(fā)現(xiàn)和負(fù)載均衡:Kubernetes提供了內(nèi)置的服務(wù)發(fā)現(xiàn)機(jī)制,可以自動(dòng)為應(yīng)用程序創(chuàng)建穩(wěn)定的網(wǎng)絡(luò)地址,并通過負(fù)載均衡將流量分發(fā)到不同的容器實(shí)例。
自動(dòng)擴(kuò)展和彈性伸縮:Kubernetes可以根據(jù)負(fù)載情況自動(dòng)調(diào)整容器的數(shù)量,實(shí)現(xiàn)應(yīng)用程序的彈性伸縮,確保始終具有所需的資源。
自我修復(fù)和健康檢查:Kubernetes具有自我修復(fù)機(jī)制,可以監(jiān)測(cè)容器的健康狀態(tài),并在出現(xiàn)故障或異常時(shí)自動(dòng)進(jìn)行恢復(fù)或重啟。
配置和存儲(chǔ)管理:Kubernetes提供了集中化的配置管理工具,可以輕松管理應(yīng)用程序的配置信息。支持外部存儲(chǔ)系統(tǒng)的掛載,并對(duì)外部存儲(chǔ)資源進(jìn)行編排。無(wú)論是本地存儲(chǔ)、公有云提供的存儲(chǔ)服務(wù)(如AWS)還是網(wǎng)絡(luò)存儲(chǔ)(如NFS、Glusterfs、Ceph),都可以作為集群資源使用,提高存儲(chǔ)的靈活性。
集中化配置管理和密鑰管理:Kubernetes提供了集中化的配置管理工具,可以管理敏感數(shù)據(jù)和應(yīng)用程序配置,提高數(shù)據(jù)安全性。同時(shí),它還支持密鑰管理,用于安全地存儲(chǔ)和使用敏感信息。
滾動(dòng)更新和回滾:Kubernetes支持滾動(dòng)更新,可以逐步替換舊版本的容器,確保應(yīng)用程序的平滑升級(jí)。如果出現(xiàn)問題,還可以回滾到之前的版本。
多租戶支持:Kubernetes支持多租戶的部署模式,可以將不同的應(yīng)用程序或團(tuán)隊(duì)隔離開來,確保安全性和資源隔離。
可擴(kuò)展性和插件機(jī)制:Kubernetes具有高度可擴(kuò)展的架構(gòu),并提供了插件機(jī)制,可以根據(jù)需要添加自定義功能或集成其他工具。
跨平臺(tái)和多云支持:Kubernetes可以在各種云平臺(tái)和基礎(chǔ)設(shè)施上運(yùn)行,包括公有云、私有云和混合云環(huán)境。
聲明式配置和版本控制:Kubernetes采用聲明式配置的方式,通過定義期望的狀態(tài)來管理應(yīng)用程序,同時(shí)支持版本控制和回滾。
任務(wù)批處理運(yùn)行:Kubernetes支持一次性任務(wù)和定時(shí)任務(wù),適用于批量數(shù)據(jù)處理和分析的場(chǎng)景,滿足批處理需求。
作用(為什么使用)
傳統(tǒng)的后端部署方式:把程序包(包括可執(zhí)行二進(jìn)制文件、配置文件等)放到服務(wù)器上,接著運(yùn)行啟動(dòng)腳本把程序跑起來,同時(shí)啟動(dòng)守護(hù)腳本定期檢查程序運(yùn)行狀態(tài)、必要的話重新拉起程序。
設(shè)想,如果服務(wù)的請(qǐng)求量較多,已部署的服務(wù)響應(yīng)不過來怎么辦?如果請(qǐng)求量、內(nèi)存、CPU超過閾值做了告警,運(yùn)維人員馬上再加幾臺(tái)服務(wù)器,部署好服務(wù)之后,接入負(fù)載均衡來分擔(dān)已有服務(wù)的壓力。
但是,從監(jiān)控告警到部署服務(wù),中間需要人力介入!那么,有沒有辦法自動(dòng)完成服務(wù)的部署、更新、卸載和擴(kuò)容、縮容呢?
k8s就是為了解決這些問題設(shè)計(jì)的:
它提供了自動(dòng)化的容器編排和管理功能,使得部署、更新、擴(kuò)容和縮容等操作更加簡(jiǎn)單和高效。
通過使用Kubernetes,可以將容器化的應(yīng)用程序打包成鏡像,并通過Kubernetes進(jìn)行部署。Kubernetes會(huì)自動(dòng)管理容器的運(yùn)行狀態(tài),監(jiān)控容器的健康狀況,并在需要時(shí)進(jìn)行自動(dòng)恢復(fù)。當(dāng)請(qǐng)求量增加時(shí),Kubernetes可以根據(jù)負(fù)載情況自動(dòng)擴(kuò)展容器的數(shù)量,以滿足高負(fù)載需求。而當(dāng)請(qǐng)求量減少時(shí),Kubernetes也可以自動(dòng)縮減容器的數(shù)量,以節(jié)省資源和成本。
此外,Kubernetes還提供了服務(wù)發(fā)現(xiàn)和負(fù)載均衡的功能,使得容器化的應(yīng)用程序可以方便地進(jìn)行服務(wù)間通信,并實(shí)現(xiàn)負(fù)載均衡,提高應(yīng)用程序的可用性和性能。
總之,Kubernetes的目標(biāo)是簡(jiǎn)化容器化應(yīng)用程序的部署和管理,提供自動(dòng)化的運(yùn)維能力,減少人工介入,提高效率和可靠性。它是現(xiàn)代化應(yīng)用程序架構(gòu)的重要組成部分,可以幫助更好地應(yīng)對(duì)不斷增長(zhǎng)的業(yè)務(wù)需求和流量壓力。
Kubernetes(K8S)的目標(biāo)是簡(jiǎn)化和高效地部署容器化應(yīng)用程序。它解決了使用裸跑Docker時(shí)的一些問題,包括:
單機(jī)使用無(wú)法有效地進(jìn)行集群管理。
隨著容器數(shù)量增加,管理成本也隨之上升。
缺乏有效的容災(zāi)和自愈機(jī)制。
沒有預(yù)設(shè)的編排模板,無(wú)法實(shí)現(xiàn)快速、大規(guī)模的容器調(diào)度。
缺乏統(tǒng)一的配置管理中心工具。
缺乏容器生命周期的管理工具。
缺乏圖形化的運(yùn)維管理工具。
Kubernetes是由Google開源的容器集群管理系統(tǒng),它在Docker等容器技術(shù)的基礎(chǔ)上提供了一系列完整的功能,包括應(yīng)用程序的部署運(yùn)行、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等。它提高了大規(guī)模容器集群管理的便捷性。其主要功能包括:
使用Docker等容器技術(shù)對(duì)應(yīng)用程序進(jìn)行打包、實(shí)例化和運(yùn)行。
以集群的方式運(yùn)行和管理分布在多臺(tái)機(jī)器上的容器。
解決了跨機(jī)器容器之間通信的問題。
Kubernetes的自我修復(fù)機(jī)制確保容器集群始終處于用戶期望的狀態(tài)。
k8s架構(gòu)
Kubernetes(簡(jiǎn)稱K8s)是一個(gè)開源的容器編排平臺(tái),用于自動(dòng)化部署、擴(kuò)展和管理容器化應(yīng)用程序。Kubernetes的架構(gòu)由多個(gè)組件組成,每個(gè)組件負(fù)責(zé)不同的任務(wù),協(xié)同工作以實(shí)現(xiàn)高可用性和彈性。
以下是Kubernetes的主要組件和其功能:
API Server(API服務(wù)器):作為Kubernetes的網(wǎng)關(guān),接收和處理所有的指令請(qǐng)求。它提供了一組RESTful API,用于管理和操作Kubernetes集群中的資源對(duì)象。
Scheduler(調(diào)度器):負(fù)責(zé)根據(jù)預(yù)定義的調(diào)度算法,將容器化應(yīng)用程序的資源請(qǐng)求調(diào)度到合適的節(jié)點(diǎn)上運(yùn)行。調(diào)度器考慮節(jié)點(diǎn)的資源利用率、健康狀態(tài)和親和性等因素來做出決策。
Controller Manager(控制器管理器):維護(hù)Kubernetes中的各種控制器,用于管理和控制資源對(duì)象的生命周期??刂破骺梢员O(jiān)視資源對(duì)象的狀態(tài)變化,并根據(jù)預(yù)定義的規(guī)則執(zhí)行相應(yīng)的操作,如創(chuàng)建、刪除、更新和修改資源對(duì)象。
etcd:是Kubernetes的分布式鍵值存儲(chǔ)系統(tǒng),用于存儲(chǔ)集群的配置數(shù)據(jù)和狀態(tài)信息。etcd提供高可用性和一致性,可以用于服務(wù)注冊(cè)、發(fā)現(xiàn)和配置同步等功能。
Kubelet:運(yùn)行在每個(gè)節(jié)點(diǎn)上的代理程序,負(fù)責(zé)管理節(jié)點(diǎn)上的容器和容器化應(yīng)用程序。Kubelet與API Server通信,接收指令并執(zhí)行相應(yīng)的操作,如創(chuàng)建、銷毀和監(jiān)控容器。
Container Runtime(容器運(yùn)行時(shí)):負(fù)責(zé)在節(jié)點(diǎn)上運(yùn)行容器,如Docker、containerd等。容器運(yùn)行時(shí)提供了容器的生命周期管理、資源隔離和安全性等功能。
kube-proxy:負(fù)責(zé)在集群中實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡。它維護(hù)網(wǎng)絡(luò)規(guī)則,將服務(wù)請(qǐng)求轉(zhuǎn)發(fā)到正確的目標(biāo)容器。
這些組件共同協(xié)作,實(shí)現(xiàn)了Kubernetes的核心功能,包括容器編排、自動(dòng)伸縮、服務(wù)發(fā)現(xiàn)、負(fù)載均衡和故障恢復(fù)等。通過這種架構(gòu),Kubernetes能夠提供高度可靠和可擴(kuò)展的容器化應(yīng)用程序管理平臺(tái)
k8s工作流程
運(yùn)維人員向API Server發(fā)出創(chuàng)建Pod的請(qǐng)求,告訴它我想干什么,我的期望是什么。
API Server響應(yīng)請(qǐng)求,并通過一系列認(rèn)證和授權(quán)過程,將請(qǐng)求存儲(chǔ)到etcd(分布式鍵值存儲(chǔ)系統(tǒng)),并通知Controller Manager。
Controller Manager通過API Server讀取etcd中的請(qǐng)求,并按照預(yù)設(shè)的模板去創(chuàng)建Pod。創(chuàng)建完成后,將Pod的數(shù)據(jù)寫入etcd。
Controller Manager通過API Server去找Scheduler,為新創(chuàng)建的Pod選擇最適合的Node節(jié)點(diǎn)。Scheduler會(huì)根據(jù)預(yù)算策略在所有Node節(jié)點(diǎn)中挑選最優(yōu)的節(jié)點(diǎn)。
Scheduler選擇合適的Node節(jié)點(diǎn)后,將選擇結(jié)果返回給Controller Manager。
Controller Manager將選擇結(jié)果通過API Server寫入etcd,更新Pod的狀態(tài)。
Kubelet(運(yùn)行在每個(gè)節(jié)點(diǎn)上的代理程序)通過API Server獲取到更新后的Pod狀態(tài),并根據(jù)狀態(tài)執(zhí)行相應(yīng)的操作,如創(chuàng)建、銷毀和監(jiān)控容器。
Container Runtime(容器運(yùn)行時(shí))在選定的Node節(jié)點(diǎn)上運(yùn)行容器,如Docker、containerd等。容器運(yùn)行時(shí)負(fù)責(zé)容器的生命周期管理、資源隔離和安全性等功能。
kube-proxy負(fù)責(zé)在集群中實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡。它維護(hù)網(wǎng)絡(luò)規(guī)則,將服務(wù)請(qǐng)求轉(zhuǎn)發(fā)到正確的目標(biāo)容器。
通過這個(gè)工作流程,Kubernetes實(shí)現(xiàn)了自動(dòng)化的容器編排和管理,確保應(yīng)用程序的高可用性、彈性和可擴(kuò)展性。各個(gè)組件之間的協(xié)作和通信,使得Kubernetes能夠有效地管理容器化應(yīng)用程序,并提供強(qiáng)大的功能和服務(wù)。
k8s集群架構(gòu)與組件
Kubernetes(K8S)是一個(gè)分布式系統(tǒng),它的集群架構(gòu)由多個(gè)組件組成,每個(gè)組件負(fù)責(zé)不同的任務(wù)。Kubernetes(K8S)的架構(gòu)采用了主從設(shè)備模型(Master-Slave 架構(gòu))。在 K8S 中,Master 節(jié)點(diǎn)負(fù)責(zé)集群的調(diào)度、管理和運(yùn)維,而 Worker Node 節(jié)點(diǎn)則承載著實(shí)際的工作負(fù)載。
Master節(jié)點(diǎn)(控制平面):
kube-apiserver:提供Kubernetes API的前端接口,用于與其他組件通信。
etcd:可靠的分布式鍵值存儲(chǔ),用于存儲(chǔ)集群的配置數(shù)據(jù)和狀態(tài)信息。
kube-scheduler:負(fù)責(zé)根據(jù)資源需求和約束條件,將Pod調(diào)度到合適的工作節(jié)點(diǎn)上運(yùn)行。
kube-controller-manager:包含多個(gè)控制器,負(fù)責(zé)監(jiān)控和管理集群的各種資源和控制器。
cloud-controller-manager(可選):用于與云平臺(tái)提供商集成,管理云資源。
工作節(jié)點(diǎn)(計(jì)算節(jié)點(diǎn)):
kubelet:與Master節(jié)點(diǎn)通信,負(fù)責(zé)管理并執(zhí)行Pod的生命周期,包括創(chuàng)建、啟動(dòng)、監(jiān)控和銷毀Pod。
kube-proxy:負(fù)責(zé)為Pod提供網(wǎng)絡(luò)代理和負(fù)載均衡功能,實(shí)現(xiàn)Kubernetes服務(wù)的訪問和通信。
網(wǎng)絡(luò)插件:
Kubernetes使用網(wǎng)絡(luò)插件來實(shí)現(xiàn)容器之間和容器與外部網(wǎng)絡(luò)的通信。不同的網(wǎng)絡(luò)插件可以提供不同的網(wǎng)絡(luò)解決方案,如Overlay網(wǎng)絡(luò)、主機(jī)網(wǎng)絡(luò)等。
存儲(chǔ)插件:
Kubernetes支持不同的存儲(chǔ)插件,用于提供持久化存儲(chǔ)的功能,如本地存儲(chǔ)、網(wǎng)絡(luò)存儲(chǔ)、云存儲(chǔ)等。
DNS插件:
Kubernetes集群通常會(huì)配置一個(gè)DNS插件,用于為Pod提供域名解析服務(wù),使得Pod可以通過域名進(jìn)行相互通信。
Dashboard(可選):
Kubernetes提供了一個(gè)Web界面,稱為Dashboard,用于可視化地管理和監(jiān)控集群中的應(yīng)用程序和資源。
核心組件詳解
Master節(jié)點(diǎn)
Kube-apiserver
kube-apiserver是Kubernetes集群中的一個(gè)核心組件,它是Kubernetes API的前端接口,負(fù)責(zé)處理來自用戶和其他組件的請(qǐng)求,并將其轉(zhuǎn)發(fā)到相應(yīng)的組件進(jìn)行處理。
API接口:kube-apiserver提供了一組RESTful API接口,用于管理和操作Kubernetes集群中的各種資源,如Pod、Service、Deployment等。通過這些API接口,用戶和其他組件可以與集群進(jìn)行交互。
認(rèn)證和授權(quán):kube-apiserver支持多種認(rèn)證和授權(quán)機(jī)制,如基于Token的認(rèn)證、基于證書的認(rèn)證、OpenID Connect等。它可以驗(yàn)證用戶的身份,并根據(jù)配置的訪問控制策略對(duì)請(qǐng)求進(jìn)行授權(quán)。
數(shù)據(jù)存儲(chǔ):kube-apiserver使用etcd作為后端存儲(chǔ),將集群的配置數(shù)據(jù)和狀態(tài)信息持久化保存在etcd中。etcd是一個(gè)可靠的分布式鍵值存儲(chǔ)系統(tǒng),確保集群的元數(shù)據(jù)在節(jié)點(diǎn)故障或重啟后仍然可用。
高可用性:為了提高kube-apiserver的可用性,可以運(yùn)行多個(gè)kube-apiserver實(shí)例,并使用負(fù)載均衡器將請(qǐng)求分發(fā)到這些實(shí)例上。這樣即使其中一個(gè)實(shí)例發(fā)生故障,其他實(shí)例仍然可以繼續(xù)提供服務(wù)。
安全性:kube-apiserver提供了一些安全機(jī)制來保護(hù)API的訪問和數(shù)據(jù)的安全性。它支持TLS加密通信,可以配置訪問控制策略來限制用戶的權(quán)限,還可以啟用審計(jì)日志記錄API的訪問和操作。
擴(kuò)展性:kube-apiserver具有良好的擴(kuò)展性,可以通過自定義資源定義(Custom Resource Definition)和自定義控制器(Custom Controller)來擴(kuò)展API,以滿足特定的業(yè)務(wù)需求。
kube-apiserver是Kubernetes集群中非常重要的組件,用于暴露 Kubernetes API,任何資源請(qǐng)求或調(diào)用操作都是通過 kube-apiserver 提供的接口進(jìn)行。以 HTTP Restful API 提供接口服務(wù),所有對(duì)象資源的增刪改查和監(jiān)聽操作都交給 API Server 處理后再提交給 Etcd 存儲(chǔ)。 可以理解成 API Server 是 K8S 的請(qǐng)求入口服務(wù)。API Server 負(fù)責(zé)接收 K8S 所有請(qǐng)求(來自 UI 界面或者 CLI 命令行工具), 然后根據(jù)用戶的具體請(qǐng)求,去通知其他組件干活??梢哉f API Server 是 K8S 集群架構(gòu)的大腦。
Kube-controller-manager
kube-controller-manager是Kubernetes集群中的一個(gè)核心組件,它是控制器的集合,負(fù)責(zé)管理和運(yùn)行多個(gè)控制器,以確保集群中的各種資源處于期望的狀態(tài)。
控制器集合:kube-controller-manager包含了多個(gè)控制器,每個(gè)控制器負(fù)責(zé)監(jiān)控和管理集群中的不同資源。常見的控制器包括副本控制器(Replication Controller)、節(jié)點(diǎn)控制器(Node Controller)、服務(wù)控制器(Service Controller)等。
副本控制器:副本控制器負(fù)責(zé)確保Pod的副本數(shù)量與期望的副本數(shù)量保持一致。它會(huì)監(jiān)控Pod的狀態(tài),并在需要時(shí)創(chuàng)建、刪除或重新調(diào)度Pod,以滿足用戶定義的副本數(shù)量。
節(jié)點(diǎn)控制器:節(jié)點(diǎn)控制器負(fù)責(zé)監(jiān)控集群中的節(jié)點(diǎn)狀態(tài),并根據(jù)需要進(jìn)行節(jié)點(diǎn)的添加、刪除或重新調(diào)度。它會(huì)檢測(cè)節(jié)點(diǎn)的健康狀態(tài),并根據(jù)節(jié)點(diǎn)的可用性和資源情況來進(jìn)行節(jié)點(diǎn)管理。
服務(wù)控制器:服務(wù)控制器負(fù)責(zé)監(jiān)控Service資源的變化,并確保集群中的服務(wù)始終具有穩(wěn)定的網(wǎng)絡(luò)地址。它會(huì)自動(dòng)為Service創(chuàng)建對(duì)應(yīng)的負(fù)載均衡器,并將流量分發(fā)到后端的Pod實(shí)例。
控制循環(huán):每個(gè)控制器都遵循控制循環(huán)(Control Loop)的模式,不斷地監(jiān)控資源的狀態(tài),并根據(jù)期望的狀態(tài)進(jìn)行調(diào)整??刂蒲h(huán)包括觀察資源狀態(tài)、比較當(dāng)前狀態(tài)和期望狀態(tài)、執(zhí)行操作來調(diào)整資源狀態(tài)等步驟。
高可用性:為了提高kube-controller-manager的可用性,可以運(yùn)行多個(gè)實(shí)例,并使用負(fù)載均衡器將請(qǐng)求分發(fā)到這些實(shí)例上。這樣即使其中一個(gè)實(shí)例發(fā)生故障,其他實(shí)例仍然可以繼續(xù)提供服務(wù)。
自定義控制器:除了內(nèi)置的控制器,kube-controller-manager還支持自定義控制器的擴(kuò)展。用戶可以根據(jù)自己的需求編寫自定義控制器,以實(shí)現(xiàn)特定的業(yè)務(wù)邏輯和資源管理。
運(yùn)行管理控制器,是 K8S 集群中處理常規(guī)任務(wù)的后臺(tái)線程,是 K8S 集群里所有資源對(duì)象的自動(dòng)化控制中心。在 K8S 集群中,一個(gè)資源對(duì)應(yīng)一個(gè)控制器,而 Controller manager 就是負(fù)責(zé)管理這些控制器的。 由一系列控制器組成,通過 API Server 監(jiān)控整個(gè)集群的狀態(tài),并確保集群處于預(yù)期的工作狀態(tài),比如當(dāng)某個(gè) Node 意外宕機(jī)時(shí),Controller Manager 會(huì)及時(shí)發(fā)現(xiàn)并執(zhí)行自動(dòng)化修復(fù)流程,確保集群始終處于預(yù)期的工作狀態(tài)。
Kube-scheduler
kube-scheduler是Kubernetes集群中的一個(gè)核心組件,它負(fù)責(zé)根據(jù)預(yù)定義的調(diào)度策略,為新創(chuàng)建的Pod選擇合適的節(jié)點(diǎn)進(jìn)行調(diào)度。
節(jié)點(diǎn)選擇:kube-scheduler會(huì)根據(jù)一系列的調(diào)度策略和規(guī)則,選擇最適合的節(jié)點(diǎn)來運(yùn)行Pod。這些策略包括資源需求、親和性(Affinity)和反親和性(Anti-Affinity)、節(jié)點(diǎn)親和性(Node Affinity)、節(jié)點(diǎn)親和性預(yù)選(Node Affinity Preemption)等。
資源需求:kube-scheduler會(huì)考慮Pod的資源需求(如CPU、內(nèi)存等),并選擇具有足夠資源的節(jié)點(diǎn)來運(yùn)行Pod,以避免資源競(jìng)爭(zhēng)和過載。
親和性和反親和性:kube-scheduler支持親和性和反親和性規(guī)則,可以將Pod調(diào)度到與其他Pod或節(jié)點(diǎn)具有特定關(guān)系的節(jié)點(diǎn)上。例如,可以將具有相同標(biāo)簽的Pod調(diào)度到同一個(gè)節(jié)點(diǎn)上,或者將Pod調(diào)度到與特定Pod或節(jié)點(diǎn)具有反親和性的節(jié)點(diǎn)上。
節(jié)點(diǎn)親和性:kube-scheduler支持節(jié)點(diǎn)親和性規(guī)則,可以將Pod調(diào)度到與特定節(jié)點(diǎn)具有特定關(guān)系的節(jié)點(diǎn)上。例如,可以將Pod調(diào)度到與具有特定標(biāo)簽的節(jié)點(diǎn)具有親和性的節(jié)點(diǎn)上。
節(jié)點(diǎn)親和性預(yù)選:kube-scheduler支持節(jié)點(diǎn)親和性預(yù)選規(guī)則,可以在調(diào)度過程中優(yōu)先考慮具有特定標(biāo)簽或特定條件的節(jié)點(diǎn)。這可以用于實(shí)現(xiàn)高級(jí)調(diào)度策略,如將Pod調(diào)度到具有特定硬件或軟件配置的節(jié)點(diǎn)上。
可擴(kuò)展性:kube-scheduler具有良好的可擴(kuò)展性,可以通過自定義調(diào)度器(Custom Scheduler)來擴(kuò)展其功能。用戶可以根據(jù)自己的需求編寫自定義調(diào)度器,以實(shí)現(xiàn)特定的調(diào)度策略和資源管理。
高可用性:為了提高kube-scheduler的可用性,可以運(yùn)行多個(gè)實(shí)例,并使用負(fù)載均衡器將請(qǐng)求分發(fā)到這些實(shí)例上。這樣即使其中一個(gè)實(shí)例發(fā)生故障,其他實(shí)例仍然可以繼續(xù)提供調(diào)度服務(wù)。
可以理解成 K8S 所有 Node 節(jié)點(diǎn)的調(diào)度器。當(dāng)用戶要部署服務(wù)時(shí),Scheduler 會(huì)根據(jù)調(diào)度算法選擇最合適的 Node 節(jié)點(diǎn)來部署 Pod。 ?預(yù)選策略(predicate) ?優(yōu)選策略(priorities)
API Server 接收到請(qǐng)求創(chuàng)建一批 Pod ,API Server 會(huì)讓 Controller-manager 按照所預(yù)設(shè)的模板去創(chuàng)建 Pod,Controller-manager 會(huì)通過 API Server 去找 Scheduler 為新創(chuàng)建的 Pod 選擇最適合的 Node 節(jié)點(diǎn)。比如運(yùn)行這個(gè) Pod 需要 2C4G 的資源,Scheduler 會(huì)通過預(yù)選策略過濾掉不滿足策略的 Node 節(jié)點(diǎn)。Node 節(jié)點(diǎn)中還剩多少資源是通過匯報(bào)給 API Server 存儲(chǔ)在 etcd 里,API Server 會(huì)調(diào)用一個(gè)方法找到 etcd 里所有 Node 節(jié)點(diǎn)的剩余資源,再對(duì)比 Pod 所需要的資源,如果某個(gè) Node 節(jié)點(diǎn)的資源不足或者不滿足 預(yù)選策略的條件則無(wú)法通過預(yù)選。預(yù)選階段篩選出的節(jié)點(diǎn),在優(yōu)選階段會(huì)根據(jù)優(yōu)先策略為通過預(yù)選的 Node 節(jié)點(diǎn)進(jìn)行打分排名, 選擇得分最高的 Node。例如,資源越富裕、負(fù)載越小的 Node 可能具有越高的排名。
存儲(chǔ)中心
etcd
etcd是一個(gè)開源的分布式鍵值存儲(chǔ)系統(tǒng),它被廣泛應(yīng)用于Kubernetes集群中作為存儲(chǔ)和同步集群配置數(shù)據(jù)的后端。
分布式鍵值存儲(chǔ):etcd提供了一個(gè)簡(jiǎn)單而強(qiáng)大的分布式鍵值存儲(chǔ)系統(tǒng),類似于一個(gè)分布式的字典或數(shù)據(jù)庫(kù)。它允許用戶存儲(chǔ)和檢索鍵值對(duì),并支持對(duì)數(shù)據(jù)的高效查詢和事務(wù)操作。
一致性和可靠性:etcd使用Raft一致性算法來確保數(shù)據(jù)的一致性和可靠性。Raft算法通過選舉和復(fù)制日志的方式,保證了集群中的節(jié)點(diǎn)之間的數(shù)據(jù)一致性,并在節(jié)點(diǎn)故障或網(wǎng)絡(luò)分區(qū)的情況下保持系統(tǒng)的可用性。
高可用性:etcd支持多節(jié)點(diǎn)部署,可以運(yùn)行多個(gè)etcd實(shí)例組成一個(gè)集群。這樣即使其中一個(gè)節(jié)點(diǎn)發(fā)生故障,其他節(jié)點(diǎn)仍然可以繼續(xù)提供服務(wù),保證了系統(tǒng)的高可用性。
集群配置存儲(chǔ):在Kubernetes中,etcd被用作存儲(chǔ)和同步集群的配置數(shù)據(jù),包括節(jié)點(diǎn)信息、Pod和Service的狀態(tài)、配置文件等。etcd存儲(chǔ)了整個(gè)集群的元數(shù)據(jù),確保集群中的各個(gè)組件和資源的狀態(tài)保持一致。
監(jiān)控和調(diào)試:etcd提供了一些工具和接口,用于監(jiān)控和調(diào)試集群的狀態(tài)和性能。用戶可以通過etcd的API接口或命令行工具來查詢和監(jiān)控存儲(chǔ)的數(shù)據(jù),并進(jìn)行故障排除和性能優(yōu)化。
安全性:etcd支持TLS加密通信,可以配置訪問控制策略來限制對(duì)存儲(chǔ)數(shù)據(jù)的訪問權(quán)限。它還提供了身份驗(yàn)證和授權(quán)機(jī)制,確保只有經(jīng)過授權(quán)的用戶才能訪問和修改存儲(chǔ)的數(shù)據(jù)。
K8S 的存儲(chǔ)服務(wù)。etcd 是分布式鍵值存儲(chǔ)系統(tǒng),存儲(chǔ)了 K8S 的關(guān)鍵配置和用戶配置,K8S 中僅 API Server 才具備讀寫權(quán)限,其他組件必須通過 API Server 的接口才能讀寫數(shù)據(jù)。
Node
Kubelet
kubelet是Kubernetes集群中每個(gè)節(jié)點(diǎn)上的主要組件之一,它負(fù)責(zé)管理和監(jiān)控節(jié)點(diǎn)上的容器。
容器生命周期管理:kubelet負(fù)責(zé)管理節(jié)點(diǎn)上的容器的生命周期,包括創(chuàng)建、啟動(dòng)、停止和銷毀容器。它會(huì)監(jiān)控容器的狀態(tài),并根據(jù)需要執(zhí)行相應(yīng)的操作,以確保容器按預(yù)期運(yùn)行。
Pod和容器配置:kubelet根據(jù)來自Kubernetes API Server的指令,負(fù)責(zé)創(chuàng)建和管理Pod。它會(huì)根據(jù)Pod的配置信息,如容器鏡像、資源需求、環(huán)境變量等,來創(chuàng)建和配置容器。
資源管理:kubelet會(huì)監(jiān)控節(jié)點(diǎn)上的資源使用情況,包括CPU、內(nèi)存、存儲(chǔ)等,并根據(jù)Pod的資源需求進(jìn)行資源分配和管理。它會(huì)確保節(jié)點(diǎn)上的容器不會(huì)超出資源限制,以避免資源競(jìng)爭(zhēng)和過載。
健康檢查和自愈機(jī)制:kubelet會(huì)定期對(duì)容器進(jìn)行健康檢查,檢測(cè)容器的運(yùn)行狀態(tài)和健康狀況。如果容器出現(xiàn)故障或異常,kubelet會(huì)嘗試重新啟動(dòng)容器,以恢復(fù)容器的正常運(yùn)行。
日志和監(jiān)控:kubelet會(huì)收集容器的日志和監(jiān)控?cái)?shù)據(jù),并將其發(fā)送到集中化的日志和監(jiān)控系統(tǒng),以便用戶和管理員進(jìn)行查看和分析。這有助于故障排除和性能優(yōu)化。
安全性:kubelet負(fù)責(zé)確保節(jié)點(diǎn)上的容器的安全性。它會(huì)執(zhí)行容器的安全策略,如限制容器的權(quán)限、隔離容器的網(wǎng)絡(luò)等,以保護(hù)節(jié)點(diǎn)和集群的安全。
與其他組件的通信:kubelet與其他Kubernetes組件,如kube-apiserver、kube-proxy等進(jìn)行通信,以獲取指令、報(bào)告狀態(tài)和接收更新。它通過與這些組件的交互,實(shí)現(xiàn)了集群的協(xié)調(diào)和管理。
在 Kubernetes 集群中,在每個(gè) Node(又稱 Worker Node)上都會(huì)啟動(dòng)一個(gè) kubelet 服務(wù)進(jìn)程。該進(jìn)程用于處理 Master 下發(fā)到本節(jié)點(diǎn)的任務(wù),管理 Pod 及 Pod 中的容器。每個(gè) kubelet 進(jìn)程都會(huì)在 API Server 上注冊(cè)節(jié)點(diǎn)自身的信息,定期向 Master 匯報(bào)節(jié)點(diǎn)資源的使用情況,并通過 cAdvisor 監(jiān)控容器和節(jié)點(diǎn)資源。
Kube-Proxy
服務(wù)代理:kube-proxy通過監(jiān)聽Kubernetes API Server上的Service和Endpoint對(duì)象的變化,動(dòng)態(tài)地維護(hù)一個(gè)服務(wù)代理表。它會(huì)為每個(gè)Service創(chuàng)建一個(gè)虛擬IP,并將流量轉(zhuǎn)發(fā)到后端的Pod實(shí)例。
負(fù)載均衡:kube-proxy使用負(fù)載均衡算法將流量分發(fā)到后端的Pod實(shí)例。它支持多種負(fù)載均衡模式,如輪詢、隨機(jī)、最少連接等,以確保流量在Pod之間均勻分布。
在每個(gè) Node 節(jié)點(diǎn)上實(shí)現(xiàn) Pod 網(wǎng)絡(luò)代理,是 Kubernetes Service 資源的載體,負(fù)責(zé)維護(hù)網(wǎng)絡(luò)規(guī)則和四層負(fù)載均衡工作。 負(fù)責(zé)寫入規(guī)則至iptables、ipvs實(shí)現(xiàn)服務(wù)映射訪問的。 Kube-Proxy 本身不是直接給 Pod 提供網(wǎng)絡(luò),Pod 的網(wǎng)絡(luò)是由 Kubelet 提供的,Kube-Proxy 實(shí)際上維護(hù)的是虛擬的 Pod 集群網(wǎng)絡(luò)。 Kube-apiserver 通過監(jiān)控 Kube-Proxy 進(jìn)行對(duì) Kubernetes Service 的更新和端點(diǎn)的維護(hù)。 在 K8S 集群中微服務(wù)的負(fù)載均衡是由 Kube-proxy 實(shí)現(xiàn)的。Kube-proxy 是 K8S 集群內(nèi)部的負(fù)載均衡器。它是一個(gè)分布式代理服務(wù)器,在 K8S 的每個(gè)節(jié)點(diǎn)上都會(huì)運(yùn)行一個(gè) Kube-proxy 組件。
網(wǎng)絡(luò)通信模型
在Kubernetes(K8S)中,網(wǎng)絡(luò)模型是用于管理和組織容器之間通信的一種架構(gòu)。Kubernetes使用了一種稱為"容器網(wǎng)絡(luò)接口"(Container Network Interface,CNI)的標(biāo)準(zhǔn),來定義和實(shí)現(xiàn)容器之間的網(wǎng)絡(luò)通信。
Pod內(nèi)部容器之間的網(wǎng)絡(luò)通信:在同一個(gè)Pod中的容器可以通過localhost進(jìn)行直接通信,它們共享相同的網(wǎng)絡(luò)命名空間和IP地址。
Pod之間的網(wǎng)絡(luò)通信:不同Pod中的容器之間的通信需要通過網(wǎng)絡(luò)進(jìn)行。每個(gè)Pod都被分配一個(gè)唯一的IP地址,可以通過該IP地址進(jìn)行通信。Pod之間的通信是通過網(wǎng)絡(luò)插件(如Flannel、Calico、Weave等)來實(shí)現(xiàn)的。
Pod到Service之間的網(wǎng)絡(luò)通信:Kubernetes中的Service是一種抽象,用于將一組Pod封裝為一個(gè)邏輯服務(wù)。Service會(huì)為這些Pod分配一個(gè)虛擬IP地址,并通過負(fù)載均衡將流量分發(fā)到這些Pod上。其他Pod可以通過Service的虛擬IP地址來訪問該服務(wù)。
集群外部與內(nèi)部組件之間的網(wǎng)絡(luò)通信:Kubernetes集群外的組件(如外部服務(wù)、其他集群、云服務(wù)等)可以通過Kubernetes提供的網(wǎng)絡(luò)代理或Ingress來與集群內(nèi)的服務(wù)進(jìn)行通信。網(wǎng)絡(luò)代理和Ingress可以將外部流量轉(zhuǎn)發(fā)到集群內(nèi)部的Service或Pod。
具體的網(wǎng)絡(luò)實(shí)現(xiàn)取決于所選擇的網(wǎng)絡(luò)插件和配置。常見的網(wǎng)絡(luò)插件包括Flannel、Calico、Weave等,它們提供了不同的網(wǎng)絡(luò)方案和功能,以滿足不同的需求和環(huán)境。這些網(wǎng)絡(luò)插件通過創(chuàng)建虛擬網(wǎng)絡(luò)、路由規(guī)則和網(wǎng)絡(luò)策略等方式,實(shí)現(xiàn)了Kubernetes中的網(wǎng)絡(luò)模型。
在Kubernetes中,有三個(gè)與IP地址相關(guān)的概念:Node IP、Pod IP和Cluster IP。
Node IP(節(jié)點(diǎn)IP):Node IP是指Kubernetes集群中每個(gè)節(jié)點(diǎn)(Node)所分配的IP地址。每個(gè)節(jié)點(diǎn)都有一個(gè)唯一的Node IP,用于標(biāo)識(shí)和訪問該節(jié)點(diǎn)。Node IP通常用于集群外部與節(jié)點(diǎn)進(jìn)行通信,例如從外部網(wǎng)絡(luò)訪問節(jié)點(diǎn)上運(yùn)行的服務(wù)。
Pod IP(容器組IP):Pod IP是指Kubernetes集群中每個(gè)Pod所分配的IP地址。Pod是Kubernetes中最小的可調(diào)度和可管理的單元,每個(gè)Pod都有一個(gè)唯一的Pod IP。Pod IP用于容器之間的通信,不同Pod中的容器可以通過Pod IP進(jìn)行網(wǎng)絡(luò)通信。
Cluster IP(集群IP):Cluster IP是指Kubernetes集群中Service所分配的虛擬IP地址。Service是Kubernetes中用于封裝一組Pod的邏輯服務(wù),為這些Pod提供一個(gè)統(tǒng)一的入口。Cluster IP是Service的虛擬IP地址,用于在集群內(nèi)部進(jìn)行服務(wù)發(fā)現(xiàn)和訪問。其他Pod可以通過Cluster IP來訪問Service提供的服務(wù)。
這些IP地址在Kubernetes中起著不同的作用,Node IP用于集群外部與節(jié)點(diǎn)通信,Pod IP用于容器之間的通信,而Cluster IP用于集群內(nèi)部的服務(wù)發(fā)現(xiàn)和訪問。它們共同構(gòu)成了Kubernetes中的網(wǎng)絡(luò)基礎(chǔ)設(shè)施。
容器引擎
在Kubernetes(K8S)中,并沒有單獨(dú)的容器引擎。Kubernetes本身并不提供容器運(yùn)行時(shí),而是通過與容器運(yùn)行時(shí)接口(Container Runtime Interface,CRI)兼容的容器運(yùn)行時(shí)來運(yùn)行和管理容器。
CRI是Kubernetes定義的一種接口規(guī)范,用于與容器運(yùn)行時(shí)進(jìn)行通信和交互。它允許Kubernetes與不同的容器運(yùn)行時(shí)進(jìn)行集成,例如Docker、Containerd、CRI-O等。這些容器運(yùn)行時(shí)負(fù)責(zé)實(shí)際的容器創(chuàng)建、管理和執(zhí)行工作。
常見的Kubernetes容器運(yùn)行時(shí)包括:
Docker:Docker是最常用的容器運(yùn)行時(shí)之一,它提供了廣泛的功能和工具,用于創(chuàng)建、打包和運(yùn)行容器。在較早的Kubernetes版本中,Docker是默認(rèn)的容器運(yùn)行時(shí)。
Containerd:Containerd是一個(gè)輕量級(jí)的容器運(yùn)行時(shí),它是Docker的核心組件之一。Containerd提供了基本的容器管理功能,可以與Kubernetes集成,作為Kubernetes的容器運(yùn)行時(shí)。
CRI-O:CRI-O是一個(gè)專門為Kubernetes設(shè)計(jì)的輕量級(jí)容器運(yùn)行時(shí),它符合CRI規(guī)范,并專注于提供最小化的容器運(yùn)行時(shí)功能。CRI-O使用runc作為底層容器執(zhí)行器,與Kubernetes緊密集成。
除了上述容器運(yùn)行時(shí),還有其他一些實(shí)現(xiàn)了CRI規(guī)范的容器運(yùn)行時(shí),如rkt(現(xiàn)已停止開發(fā))、frakti等。這些容器運(yùn)行時(shí)都可以與Kubernetes集成,作為Kubernetes的容器運(yùn)行時(shí)。
k8s核心概念詳解
Kubernetes 包含多種類型的資源對(duì)象:Pod、Label、Service、Replication Controller 等。
Pod(容器組):Pod是Kubernetes中最小的可調(diào)度和可管理的單元,它可以包含一個(gè)或多個(gè)容器,并共享相同的網(wǎng)絡(luò)和存儲(chǔ)資源。Pod是部署和擴(kuò)展應(yīng)用程序的基本單位。
Label(標(biāo)簽):Label是用于標(biāo)識(shí)和組織Kubernetes資源的鍵值對(duì)。通過為資源對(duì)象添加標(biāo)簽,可以對(duì)它們進(jìn)行分類、選擇和操作。標(biāo)簽可以用于實(shí)現(xiàn)資源的分組、服務(wù)發(fā)現(xiàn)、負(fù)載均衡等功能。
Service(服務(wù)):Service是一種抽象,用于封裝一組Pod,并為它們提供一個(gè)統(tǒng)一的入口。Service為這些Pod分配一個(gè)虛擬IP地址,并通過負(fù)載均衡將流量分發(fā)到這些Pod上,實(shí)現(xiàn)了服務(wù)的訪問和通信。
Namespace(命名空間):Namespace是用于在Kubernetes集群中創(chuàng)建多個(gè)虛擬集群的一種機(jī)制。通過使用命名空間,可以將不同的資源對(duì)象隔離開來,實(shí)現(xiàn)資源的多租戶和資源隔離。
Controller(控制器):Controller是一種用于管理和控制資源對(duì)象的機(jī)制。Kubernetes提供了多種類型的控制器,如副本控制器、服務(wù)控制器等,用于監(jiān)控和管理集群中的各種資源。
Replication Controller(副本控制器):Replication Controller用于確保Pod的副本數(shù)量與期望的副本數(shù)量保持一致。它會(huì)監(jiān)控Pod的狀態(tài),并在需要時(shí)創(chuàng)建、刪除或重新調(diào)度Pod,以滿足用戶定義的副本數(shù)量。
Kubernetes通過這些核心概念和機(jī)制,實(shí)現(xiàn)了容器化應(yīng)用程序的部署、管理和擴(kuò)展。它提供了豐富的功能和工具,使得應(yīng)用程序的部署和運(yùn)維變得更加簡(jiǎn)單和高效。
所有的資源對(duì)象都可以通過 Kubernetes 提供的 kubectl 工具進(jìn)行增、刪、改、查等操作,并將其保存在 etcd 中持久化存儲(chǔ)。 Kubernets其實(shí)是一個(gè)高度自動(dòng)化的資源控制系統(tǒng),通過跟蹤對(duì)比etcd存儲(chǔ)里保存的資源期望狀態(tài)與當(dāng)前環(huán)境中的實(shí)際資源狀態(tài)的差異,來實(shí)現(xiàn)自動(dòng)控制和自動(dòng)糾錯(cuò)等高級(jí)功能。
Pod
它是最小的可部署單元。一個(gè)Pod可以包含一個(gè)或多個(gè)容器,這些容器共享相同的網(wǎng)絡(luò)和存儲(chǔ)資源,并在同一主機(jī)上運(yùn)行。
Pod提供了一個(gè)抽象層,用于封裝應(yīng)用程序的運(yùn)行環(huán)境。它可以包含應(yīng)用程序所需的所有組件,如主應(yīng)用程序容器、輔助容器(如日志收集器、輔助工具等)以及共享的存儲(chǔ)卷。
Pod具有以下特點(diǎn):
網(wǎng)絡(luò)共享:Pod中的所有容器共享相同的網(wǎng)絡(luò)命名空間和IP地址,它們可以通過localhost相互通信。
存儲(chǔ)共享:Pod中的所有容器可以訪問共享的存儲(chǔ)卷,這使得它們可以共享數(shù)據(jù)和文件。
生命周期:Pod具有自己的生命周期,它可以被創(chuàng)建、啟動(dòng)、停止和銷毀。當(dāng)Pod被銷毀時(shí),其中的所有容器也會(huì)被終止。
調(diào)度和部署:Pod可以由Kubernetes調(diào)度器在集群中的節(jié)點(diǎn)上進(jìn)行部署。調(diào)度器會(huì)考慮節(jié)點(diǎn)的資源和約束條件,選擇適合的節(jié)點(diǎn)來運(yùn)行Pod。
Pod是臨時(shí)性的,它可以根據(jù)需要?jiǎng)?chuàng)建和銷毀。如果需要長(zhǎng)期運(yùn)行的實(shí)例,可以使用Pod控制器(如Deployment、ReplicaSet等)來管理Pod的生命周期和副本數(shù)量。
Pod 控制器
Pod控制器是Kubernetes中的一種資源對(duì)象,用于管理和控制Pod的創(chuàng)建、更新和刪除。Pod控制器包括以下幾種類型:
ReplicaSet(副本集):ReplicaSet確保指定數(shù)量的Pod副本在集群中運(yùn)行。它可以根據(jù)需要進(jìn)行自動(dòng)擴(kuò)展或縮減Pod的數(shù)量,以滿足應(yīng)用程序的需求。
Deployment(部署):Deployment建立在ReplicaSet之上,它用于定義應(yīng)用程序的期望狀態(tài),并確保該狀態(tài)得到維持。Deployment支持滾動(dòng)更新和回滾操作,可以方便地進(jìn)行應(yīng)用程序的發(fā)布和更新。
StatefulSet(有狀態(tài)副本集):StatefulSet用于管理有狀態(tài)應(yīng)用程序的Pod副本。它為每個(gè)Pod分配一個(gè)唯一的標(biāo)識(shí)符,并提供穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)和存儲(chǔ)卷,確保有狀態(tài)應(yīng)用程序的數(shù)據(jù)持久性和順序性。
DaemonSet(守護(hù)進(jìn)程集):DaemonSet用于在集群中的每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)Pod副本。它通常用于運(yùn)行一些系統(tǒng)級(jí)別的服務(wù),如日志收集、監(jiān)控等。
Job(作業(yè)):Job用于運(yùn)行一次性任務(wù)或批處理任務(wù)。它確保任務(wù)成功完成,并可以設(shè)置重試策略和并行度。
這些Pod控制器提供了不同的功能和用途,可以根據(jù)應(yīng)用程序的需求選擇合適的控制器來管理Pod的生命周期。它們通過監(jiān)控和調(diào)整Pod的數(shù)量和狀態(tài),確保應(yīng)用程序的高可用性和可靠性。
Label
在Kubernetes中,Label(標(biāo)簽)是一種用于標(biāo)識(shí)和組織資源的關(guān)鍵概念。它是一個(gè)鍵值對(duì)的元數(shù)據(jù),可以附加到Kubernetes對(duì)象(如Pod、Service、Deployment等)上。
以下是一些關(guān)于標(biāo)簽的重要信息:
標(biāo)簽的結(jié)構(gòu):標(biāo)簽由鍵值對(duì)組成,例如"app=frontend"或"tier=backend"。鍵和值都是字符串類型,且鍵必須是唯一的。
標(biāo)簽的作用:標(biāo)簽可以用于對(duì)資源進(jìn)行分類、篩選和選擇。通過為資源添加標(biāo)簽,可以更方便地管理和操作它們。
標(biāo)簽的用途:標(biāo)簽可以用于多種用途,例如:
選擇器(Selector):可以使用標(biāo)簽選擇器來選擇具有特定標(biāo)簽的資源。這在創(chuàng)建Service、Deployment等對(duì)象時(shí)非常有用。
資源組織:可以使用標(biāo)簽將相關(guān)的資源進(jìn)行分組和組織。例如,可以為所有屬于同一應(yīng)用程序的資源添加相同的標(biāo)簽。
資源管理:可以使用標(biāo)簽來跟蹤和管理資源。通過為資源添加標(biāo)簽,可以更容易地識(shí)別和操作它們。
標(biāo)簽的添加和修改:可以在創(chuàng)建資源時(shí)為其添加標(biāo)簽,也可以在后續(xù)的操作中對(duì)標(biāo)簽進(jìn)行修改。例如,可以使用kubectl命令行工具為Pod添加或修改標(biāo)簽。
標(biāo)簽的查詢和選擇:可以使用標(biāo)簽選擇器來查詢和選擇具有特定標(biāo)簽的資源。選擇器可以使用等于、不等于、存在、不存在等操作符進(jìn)行條件篩選。
通過使用標(biāo)簽,可以更靈活地管理和操作Kubernetes中的資源。它提供了一種簡(jiǎn)單而強(qiáng)大的方式來組織、選擇和管理資源,使得應(yīng)用程序的部署和管理更加靈活和可靠。
Label 選擇器
在Kubernetes中,標(biāo)簽選擇器(Label selector)是一種用于查詢和篩選具有特定標(biāo)簽的資源對(duì)象的機(jī)制。
標(biāo)簽選擇器有兩種類型:基于等值關(guān)系和基于集合關(guān)系。
基于等值關(guān)系的標(biāo)簽選擇器:
=:選擇具有指定標(biāo)簽鍵和值相等的資源對(duì)象。
!=:選擇具有指定標(biāo)簽鍵但值不等于指定值的資源對(duì)象。
基于集合關(guān)系的標(biāo)簽選擇器:
in:選擇具有指定標(biāo)簽鍵且值在指定值列表中的資源對(duì)象。
notin:選擇具有指定標(biāo)簽鍵但值不在指定值列表中的資源對(duì)象。
exists:選擇具有指定標(biāo)簽鍵的資源對(duì)象。
!exists:選擇沒有指定標(biāo)簽鍵的資源對(duì)象。
以下是一個(gè)示例,展示如何使用標(biāo)簽選擇器查詢和篩選具有特定標(biāo)簽的Pod:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
labels:
app: my-app
environment: production
要查詢和篩選具有特定標(biāo)簽的Pod,可以使用標(biāo)簽選擇器表達(dá)式,例如:
app=my-app:選擇具有標(biāo)簽app的值為my-app的Pod。
environment!=development:選擇具有標(biāo)簽environment的值不為development的Pod。
app in (my-app, your-app):選擇具有標(biāo)簽app的值為my-app或your-app的Pod。
Service 服務(wù)
Service(服務(wù))是一種抽象的概念,用于定義一組Pod的訪問方式和網(wǎng)絡(luò)連接。Service為Pod提供了一個(gè)穩(wěn)定的網(wǎng)絡(luò)地址和DNS名稱,使得其他應(yīng)用程序可以通過該地址和名稱與Pod進(jìn)行通信。
Service的主要作用是實(shí)現(xiàn)負(fù)載均衡和服務(wù)發(fā)現(xiàn)。它將流量分發(fā)到后端的Pod,可以確保請(qǐng)求被均勻地分發(fā)到可用的Pod上,從而提高應(yīng)用程序的可用性和性能。
在Kubernetes(K8S)集群中,每個(gè)Pod都有一個(gè)單獨(dú)的IP地址。然而,由于Pod具有生命周期,可能會(huì)因?yàn)闃I(yè)務(wù)變更而銷毀并重新創(chuàng)建,導(dǎo)致其IP地址也會(huì)改變。
為了解決這個(gè)問題,K8S引入了Service作為核心概念。在K8S中,Service并不是傳統(tǒng)意義上的"服務(wù)",而更像是一個(gè)網(wǎng)關(guān)層,用于提供一組Pod的對(duì)外訪問接口和流量均衡。
Service通過標(biāo)簽選擇器來確定作用于哪些Pod。在K8S集群中,客戶端需要訪問的服務(wù)就是Service對(duì)象。每個(gè)Service都有一個(gè)固定的虛擬IP(也稱為Cluster IP),它會(huì)自動(dòng)綁定到后端的Pod,并將所有網(wǎng)絡(luò)請(qǐng)求轉(zhuǎn)發(fā)給這些Pod。
除了提供穩(wěn)定的對(duì)外訪問方式,Service還具備負(fù)載均衡的功能,可以自動(dòng)將請(qǐng)求流量分發(fā)到后端的所有Pod上。Service還能夠?qū)崿F(xiàn)透明的水平擴(kuò)展,對(duì)客戶端來說是無(wú)感知的。
實(shí)現(xiàn)Service功能的關(guān)鍵是kube-proxy。kube-proxy在每個(gè)節(jié)點(diǎn)上運(yùn)行,監(jiān)聽API Server中服務(wù)對(duì)象的變化,并通過三種流量調(diào)度模式(userspace、iptables、ipvs)來實(shí)現(xiàn)網(wǎng)絡(luò)轉(zhuǎn)發(fā)。
Service是K8S服務(wù)的核心,它屏蔽了服務(wù)的細(xì)節(jié),統(tǒng)一對(duì)外暴露服務(wù)接口,實(shí)現(xiàn)了真正的"微服務(wù)"。對(duì)于用戶來說,只需要關(guān)注一個(gè)Service的入口,而不需要關(guān)心具體請(qǐng)求哪個(gè)Pod。
這樣做的優(yōu)勢(shì)非常明顯:外部用戶不需要關(guān)注Pod意外崩潰或K8S重新創(chuàng)建Pod導(dǎo)致的IP變化,也不需要關(guān)注升級(jí)或變更服務(wù)導(dǎo)致的Pod替換和IP變化。
以下是一些關(guān)鍵的Service特性和概念:
ClusterIP:每個(gè)Service都有一個(gè)ClusterIP,它是Service在集群內(nèi)部的虛擬IP地址。其他Pod或Service可以通過該IP地址與Service進(jìn)行通信。
Service類型:Kubernetes支持多種Service類型,包括ClusterIP、NodePort、LoadBalancer和ExternalName。每種類型都有不同的用途和配置方式。
Selector:Service使用Selector來標(biāo)識(shí)它所關(guān)聯(lián)的Pod。通過標(biāo)簽選擇器,Service可以將流量轉(zhuǎn)發(fā)到具有特定標(biāo)簽的Pod上。
端口映射:Service可以將外部請(qǐng)求的端口映射到后端Pod的端口。這樣,外部應(yīng)用程序可以通過Service的IP地址和映射的端口與Pod進(jìn)行通信。
Headless Service:除了普通的Service類型,Kubernetes還支持Headless Service。Headless Service不會(huì)分配ClusterIP,而是直接暴露后端Pod的網(wǎng)絡(luò)地址。
Ingress
在Kubernetes集群中,Service主要負(fù)責(zé)集群內(nèi)部的網(wǎng)絡(luò)拓?fù)?,它提供了一種抽象的方式來訪問一組Pod。但是,如果要從集群外部訪問集群內(nèi)部的服務(wù),就需要使用Ingress。
Ingress充當(dāng)了整個(gè)Kubernetes集群的接入層,它負(fù)責(zé)處理集群內(nèi)外的通信。作為第7層應(yīng)用層的組件,Ingress可以通過HTTP/HTTPS等協(xié)議對(duì)外暴露服務(wù)。
與Service不同,Service只能進(jìn)行第4層的流量調(diào)度,使用IP地址和端口進(jìn)行訪問。而Ingress可以根據(jù)不同的業(yè)務(wù)域和URL訪問路徑來調(diào)度業(yè)務(wù)流量。
用于將外部流量路由到集群內(nèi)部的服務(wù)。它充當(dāng)了集群和外部網(wǎng)絡(luò)之間的入口點(diǎn)。
具體來說,Ingress定義了一組規(guī)則,用于將外部請(qǐng)求路由到集群內(nèi)部的服務(wù)。它可以根據(jù)請(qǐng)求的主機(jī)名、路徑或其他標(biāo)識(shí)符將流量轉(zhuǎn)發(fā)到相應(yīng)的服務(wù)。通過使用Ingress,可以實(shí)現(xiàn)負(fù)載均衡、SSL終止、路徑基礎(chǔ)的路由等功能。
在使用Ingress之前,需要先部署一個(gè)Ingress控制器。Ingress控制器是一個(gè)運(yùn)行在集群中的組件,負(fù)責(zé)監(jiān)視Ingress資源的變化,并根據(jù)規(guī)則配置負(fù)載均衡器或代理服務(wù)器來處理外部流量。
一旦Ingress控制器部署好并配置了相應(yīng)的規(guī)則,外部流量就可以通過Ingress路由到集群內(nèi)部的服務(wù)。這樣,可以通過一個(gè)統(tǒng)一的入口點(diǎn)來訪問多個(gè)服務(wù),而無(wú)需暴露每個(gè)服務(wù)的具體地址。
總之,Ingress是Kubernetes中用于管理外部流量訪問的一種機(jī)制,它通過定義規(guī)則將外部請(qǐng)求路由到集群內(nèi)部的服務(wù),提供了更靈活和可擴(kuò)展的流量管理方式。
Name
在Kubernetes中,每個(gè)資源都有自己的名稱,通常定義在資源的元數(shù)據(jù)(metadata)中。元數(shù)據(jù)包含了一些描述資源的屬性,其中包括名稱(name)屬性。
名稱在同一個(gè)命名空間(namespace)中必須是唯一的,這意味著在同一個(gè)命名空間中不能存在相同名稱的資源。這樣可以確保在集群中對(duì)資源進(jìn)行唯一標(biāo)識(shí)和引用。
除了名稱,元數(shù)據(jù)還可以包含其他屬性,如標(biāo)簽(labels)和注釋(annotations)。標(biāo)簽用于對(duì)資源進(jìn)行分類和組織,而注釋則是一些額外的描述性信息。
通過名稱和其他元數(shù)據(jù)屬性,可以在Kubernetes中對(duì)資源進(jìn)行識(shí)別、查詢和操作。這些屬性在定義資源的清單文件或通過Kubernetes API進(jìn)行編程時(shí)非常重要。
Namespace 命名空間
Namespace(命名空間),用于在集群中創(chuàng)建虛擬的工作環(huán)境,將資源進(jìn)行隔離和分類。它可以幫助不同的團(tuán)隊(duì)或項(xiàng)目在同一個(gè)集群中共享資源,同時(shí)保持彼此之間的隔離。
使用Namespace可以將集群中的資源劃分為邏輯上獨(dú)立的單元,每個(gè)Namespace都有自己的資源配額、網(wǎng)絡(luò)和存儲(chǔ)資源。不同的Namespace可以擁有相同名稱的資源,但它們彼此之間是隔離的,不會(huì)相互干擾。
Namespace的主要作用包括:
隔離和分類:通過將資源劃分到不同的Namespace中,可以將不同的團(tuán)隊(duì)、項(xiàng)目或環(huán)境隔離開來,避免資源沖突和干擾。
訪問控制:可以使用RBAC(Role-Based Access Control)等機(jī)制對(duì)不同的Namespace進(jìn)行權(quán)限控制,限制用戶或團(tuán)隊(duì)對(duì)資源的訪問和操作。
資源配額:可以為每個(gè)Namespace設(shè)置資源配額,限制其使用的計(jì)算、存儲(chǔ)和網(wǎng)絡(luò)資源的數(shù)量,以避免資源被某個(gè)Namespace過度占用。
管理和監(jiān)控:通過將資源按照Namespace進(jìn)行分類,可以更方便地管理和監(jiān)控集群中的資源使用情況,進(jìn)行故障排查和性能優(yōu)化。
在Kubernetes中,默認(rèn)會(huì)創(chuàng)建一個(gè)名為"default"的Namespace,如果沒有顯式指定Namespace,資源將被分配到"default" Namespace中。除了"default" Namespace外,還可以創(chuàng)建自定義的Namespace,根據(jù)實(shí)際需求進(jìn)行資源的劃分和管理。
不同 Namespace 內(nèi)的 “資源” 名稱可以相同,相同 Namespace 內(nèi)的同種 “資源”,“名稱” 不能相同。 合理的使用 K8S 的 Namespace,可以使得集群管理員能夠更好的對(duì)交付到 K8S 里的服務(wù)進(jìn)行分類管理和瀏覽。查詢 K8S 里特定 “資源” 要帶上相應(yīng)的 Namespace。
Kubernetes(簡(jiǎn)稱K8s,是因?yàn)?k 和 s 之間有八個(gè)字符)是一個(gè)開源的容器編排平臺(tái),用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化應(yīng)用程序。它提供了一種機(jī)制,用于自動(dòng)化部署、擴(kuò)展和管理容器化應(yīng)用程序的集群。Kubernetes的目標(biāo)是讓部署容器化應(yīng)用程序變得簡(jiǎn)單高效。它提供了應(yīng)用程序部署、規(guī)劃、更新和維護(hù)的基本機(jī)制,同時(shí)具備強(qiáng)大的擴(kuò)展性和可靠性。Kubernetes采用主從設(shè)備模型(Master-Slave架構(gòu)),其中Master節(jié)點(diǎn)負(fù)責(zé)核心的調(diào)度、管理和運(yùn)維任務(wù),而Slave節(jié)點(diǎn)負(fù)責(zé)運(yùn)行應(yīng)用程序的容器。通過Kubernetes,開發(fā)人員可以更輕松地管理和擴(kuò)展他們的容器化應(yīng)用程序,從而提高應(yīng)用程序的可靠性和可伸縮性。
特性
主要特性:
自動(dòng)化容器編排:彈性伸縮,Kubernetes可以自動(dòng)化地管理和編排容器,根據(jù)定義的規(guī)則和策略來調(diào)度和部署應(yīng)用程序。
服務(wù)發(fā)現(xiàn)和負(fù)載均衡:Kubernetes提供了內(nèi)置的服務(wù)發(fā)現(xiàn)機(jī)制,可以自動(dòng)為應(yīng)用程序創(chuàng)建穩(wěn)定的網(wǎng)絡(luò)地址,并通過負(fù)載均衡將流量分發(fā)到不同的容器實(shí)例。
自動(dòng)擴(kuò)展和彈性伸縮:Kubernetes可以根據(jù)負(fù)載情況自動(dòng)調(diào)整容器的數(shù)量,實(shí)現(xiàn)應(yīng)用程序的彈性伸縮,確保始終具有所需的資源。
自我修復(fù)和健康檢查:Kubernetes具有自我修復(fù)機(jī)制,可以監(jiān)測(cè)容器的健康狀態(tài),并在出現(xiàn)故障或異常時(shí)自動(dòng)進(jìn)行恢復(fù)或重啟。
配置和存儲(chǔ)管理:Kubernetes提供了集中化的配置管理工具,可以輕松管理應(yīng)用程序的配置信息。支持外部存儲(chǔ)系統(tǒng)的掛載,并對(duì)外部存儲(chǔ)資源進(jìn)行編排。無(wú)論是本地存儲(chǔ)、公有云提供的存儲(chǔ)服務(wù)(如AWS)還是網(wǎng)絡(luò)存儲(chǔ)(如NFS、Glusterfs、Ceph),都可以作為集群資源使用,提高存儲(chǔ)的靈活性。
集中化配置管理和密鑰管理:Kubernetes提供了集中化的配置管理工具,可以管理敏感數(shù)據(jù)和應(yīng)用程序配置,提高數(shù)據(jù)安全性。同時(shí),它還支持密鑰管理,用于安全地存儲(chǔ)和使用敏感信息。
滾動(dòng)更新和回滾:Kubernetes支持滾動(dòng)更新,可以逐步替換舊版本的容器,確保應(yīng)用程序的平滑升級(jí)。如果出現(xiàn)問題,還可以回滾到之前的版本。
多租戶支持:Kubernetes支持多租戶的部署模式,可以將不同的應(yīng)用程序或團(tuán)隊(duì)隔離開來,確保安全性和資源隔離。
可擴(kuò)展性和插件機(jī)制:Kubernetes具有高度可擴(kuò)展的架構(gòu),并提供了插件機(jī)制,可以根據(jù)需要添加自定義功能或集成其他工具。
跨平臺(tái)和多云支持:Kubernetes可以在各種云平臺(tái)和基礎(chǔ)設(shè)施上運(yùn)行,包括公有云、私有云和混合云環(huán)境。
聲明式配置和版本控制:Kubernetes采用聲明式配置的方式,通過定義期望的狀態(tài)來管理應(yīng)用程序,同時(shí)支持版本控制和回滾。
任務(wù)批處理運(yùn)行:Kubernetes支持一次性任務(wù)和定時(shí)任務(wù),適用于批量數(shù)據(jù)處理和分析的場(chǎng)景,滿足批處理需求。
作用(為什么使用)
傳統(tǒng)的后端部署方式:把程序包(包括可執(zhí)行二進(jìn)制文件、配置文件等)放到服務(wù)器上,接著運(yùn)行啟動(dòng)腳本把程序跑起來,同時(shí)啟動(dòng)守護(hù)腳本定期檢查程序運(yùn)行狀態(tài)、必要的話重新拉起程序。
設(shè)想,如果服務(wù)的請(qǐng)求量較多,已部署的服務(wù)響應(yīng)不過來怎么辦?如果請(qǐng)求量、內(nèi)存、CPU超過閾值做了告警,運(yùn)維人員馬上再加幾臺(tái)服務(wù)器,部署好服務(wù)之后,接入負(fù)載均衡來分擔(dān)已有服務(wù)的壓力。
但是,從監(jiān)控告警到部署服務(wù),中間需要人力介入!那么,有沒有辦法自動(dòng)完成服務(wù)的部署、更新、卸載和擴(kuò)容、縮容呢?
k8s就是為了解決這些問題設(shè)計(jì)的:
它提供了自動(dòng)化的容器編排和管理功能,使得部署、更新、擴(kuò)容和縮容等操作更加簡(jiǎn)單和高效。
通過使用Kubernetes,可以將容器化的應(yīng)用程序打包成鏡像,并通過Kubernetes進(jìn)行部署。Kubernetes會(huì)自動(dòng)管理容器的運(yùn)行狀態(tài),監(jiān)控容器的健康狀況,并在需要時(shí)進(jìn)行自動(dòng)恢復(fù)。當(dāng)請(qǐng)求量增加時(shí),Kubernetes可以根據(jù)負(fù)載情況自動(dòng)擴(kuò)展容器的數(shù)量,以滿足高負(fù)載需求。而當(dāng)請(qǐng)求量減少時(shí),Kubernetes也可以自動(dòng)縮減容器的數(shù)量,以節(jié)省資源和成本。
此外,Kubernetes還提供了服務(wù)發(fā)現(xiàn)和負(fù)載均衡的功能,使得容器化的應(yīng)用程序可以方便地進(jìn)行服務(wù)間通信,并實(shí)現(xiàn)負(fù)載均衡,提高應(yīng)用程序的可用性和性能。
總之,Kubernetes的目標(biāo)是簡(jiǎn)化容器化應(yīng)用程序的部署和管理,提供自動(dòng)化的運(yùn)維能力,減少人工介入,提高效率和可靠性。它是現(xiàn)代化應(yīng)用程序架構(gòu)的重要組成部分,可以幫助更好地應(yīng)對(duì)不斷增長(zhǎng)的業(yè)務(wù)需求和流量壓力。
Kubernetes(K8S)的目標(biāo)是簡(jiǎn)化和高效地部署容器化應(yīng)用程序。它解決了使用裸跑Docker時(shí)的一些問題,包括:
單機(jī)使用無(wú)法有效地進(jìn)行集群管理。
隨著容器數(shù)量增加,管理成本也隨之上升。
缺乏有效的容災(zāi)和自愈機(jī)制。
沒有預(yù)設(shè)的編排模板,無(wú)法實(shí)現(xiàn)快速、大規(guī)模的容器調(diào)度。
缺乏統(tǒng)一的配置管理中心工具。
缺乏容器生命周期的管理工具。
缺乏圖形化的運(yùn)維管理工具。
Kubernetes是由Google開源的容器集群管理系統(tǒng),它在Docker等容器技術(shù)的基礎(chǔ)上提供了一系列完整的功能,包括應(yīng)用程序的部署運(yùn)行、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等。它提高了大規(guī)模容器集群管理的便捷性。其主要功能包括:
使用Docker等容器技術(shù)對(duì)應(yīng)用程序進(jìn)行打包、實(shí)例化和運(yùn)行。
以集群的方式運(yùn)行和管理分布在多臺(tái)機(jī)器上的容器。
解決了跨機(jī)器容器之間通信的問題。
Kubernetes的自我修復(fù)機(jī)制確保容器集群始終處于用戶期望的狀態(tài)。
k8s架構(gòu)
Kubernetes(簡(jiǎn)稱K8s)是一個(gè)開源的容器編排平臺(tái),用于自動(dòng)化部署、擴(kuò)展和管理容器化應(yīng)用程序。Kubernetes的架構(gòu)由多個(gè)組件組成,每個(gè)組件負(fù)責(zé)不同的任務(wù),協(xié)同工作以實(shí)現(xiàn)高可用性和彈性。
以下是Kubernetes的主要組件和其功能:
API Server(API服務(wù)器):作為Kubernetes的網(wǎng)關(guān),接收和處理所有的指令請(qǐng)求。它提供了一組RESTful API,用于管理和操作Kubernetes集群中的資源對(duì)象。
Scheduler(調(diào)度器):負(fù)責(zé)根據(jù)預(yù)定義的調(diào)度算法,將容器化應(yīng)用程序的資源請(qǐng)求調(diào)度到合適的節(jié)點(diǎn)上運(yùn)行。調(diào)度器考慮節(jié)點(diǎn)的資源利用率、健康狀態(tài)和親和性等因素來做出決策。
Controller Manager(控制器管理器):維護(hù)Kubernetes中的各種控制器,用于管理和控制資源對(duì)象的生命周期??刂破骺梢员O(jiān)視資源對(duì)象的狀態(tài)變化,并根據(jù)預(yù)定義的規(guī)則執(zhí)行相應(yīng)的操作,如創(chuàng)建、刪除、更新和修改資源對(duì)象。
etcd:是Kubernetes的分布式鍵值存儲(chǔ)系統(tǒng),用于存儲(chǔ)集群的配置數(shù)據(jù)和狀態(tài)信息。etcd提供高可用性和一致性,可以用于服務(wù)注冊(cè)、發(fā)現(xiàn)和配置同步等功能。
Kubelet:運(yùn)行在每個(gè)節(jié)點(diǎn)上的代理程序,負(fù)責(zé)管理節(jié)點(diǎn)上的容器和容器化應(yīng)用程序。Kubelet與API Server通信,接收指令并執(zhí)行相應(yīng)的操作,如創(chuàng)建、銷毀和監(jiān)控容器。
Container Runtime(容器運(yùn)行時(shí)):負(fù)責(zé)在節(jié)點(diǎn)上運(yùn)行容器,如Docker、containerd等。容器運(yùn)行時(shí)提供了容器的生命周期管理、資源隔離和安全性等功能。
kube-proxy:負(fù)責(zé)在集群中實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡。它維護(hù)網(wǎng)絡(luò)規(guī)則,將服務(wù)請(qǐng)求轉(zhuǎn)發(fā)到正確的目標(biāo)容器。
這些組件共同協(xié)作,實(shí)現(xiàn)了Kubernetes的核心功能,包括容器編排、自動(dòng)伸縮、服務(wù)發(fā)現(xiàn)、負(fù)載均衡和故障恢復(fù)等。通過這種架構(gòu),Kubernetes能夠提供高度可靠和可擴(kuò)展的容器化應(yīng)用程序管理平臺(tái)
k8s工作流程
運(yùn)維人員向API Server發(fā)出創(chuàng)建Pod的請(qǐng)求,告訴它我想干什么,我的期望是什么。
API Server響應(yīng)請(qǐng)求,并通過一系列認(rèn)證和授權(quán)過程,將請(qǐng)求存儲(chǔ)到etcd(分布式鍵值存儲(chǔ)系統(tǒng)),并通知Controller Manager。
Controller Manager通過API Server讀取etcd中的請(qǐng)求,并按照預(yù)設(shè)的模板去創(chuàng)建Pod。創(chuàng)建完成后,將Pod的數(shù)據(jù)寫入etcd。
Controller Manager通過API Server去找Scheduler,為新創(chuàng)建的Pod選擇最適合的Node節(jié)點(diǎn)。Scheduler會(huì)根據(jù)預(yù)算策略在所有Node節(jié)點(diǎn)中挑選最優(yōu)的節(jié)點(diǎn)。
Scheduler選擇合適的Node節(jié)點(diǎn)后,將選擇結(jié)果返回給Controller Manager。
Controller Manager將選擇結(jié)果通過API Server寫入etcd,更新Pod的狀態(tài)。
Kubelet(運(yùn)行在每個(gè)節(jié)點(diǎn)上的代理程序)通過API Server獲取到更新后的Pod狀態(tài),并根據(jù)狀態(tài)執(zhí)行相應(yīng)的操作,如創(chuàng)建、銷毀和監(jiān)控容器。
Container Runtime(容器運(yùn)行時(shí))在選定的Node節(jié)點(diǎn)上運(yùn)行容器,如Docker、containerd等。容器運(yùn)行時(shí)負(fù)責(zé)容器的生命周期管理、資源隔離和安全性等功能。
kube-proxy負(fù)責(zé)在集群中實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡。它維護(hù)網(wǎng)絡(luò)規(guī)則,將服務(wù)請(qǐng)求轉(zhuǎn)發(fā)到正確的目標(biāo)容器。
通過這個(gè)工作流程,Kubernetes實(shí)現(xiàn)了自動(dòng)化的容器編排和管理,確保應(yīng)用程序的高可用性、彈性和可擴(kuò)展性。各個(gè)組件之間的協(xié)作和通信,使得Kubernetes能夠有效地管理容器化應(yīng)用程序,并提供強(qiáng)大的功能和服務(wù)。
k8s集群架構(gòu)與組件
Kubernetes(K8S)是一個(gè)分布式系統(tǒng),它的集群架構(gòu)由多個(gè)組件組成,每個(gè)組件負(fù)責(zé)不同的任務(wù)。Kubernetes(K8S)的架構(gòu)采用了主從設(shè)備模型(Master-Slave 架構(gòu))。在 K8S 中,Master 節(jié)點(diǎn)負(fù)責(zé)集群的調(diào)度、管理和運(yùn)維,而 Worker Node 節(jié)點(diǎn)則承載著實(shí)際的工作負(fù)載。
Master節(jié)點(diǎn)(控制平面):
kube-apiserver:提供Kubernetes API的前端接口,用于與其他組件通信。
etcd:可靠的分布式鍵值存儲(chǔ),用于存儲(chǔ)集群的配置數(shù)據(jù)和狀態(tài)信息。
kube-scheduler:負(fù)責(zé)根據(jù)資源需求和約束條件,將Pod調(diào)度到合適的工作節(jié)點(diǎn)上運(yùn)行。
kube-controller-manager:包含多個(gè)控制器,負(fù)責(zé)監(jiān)控和管理集群的各種資源和控制器。
cloud-controller-manager(可選):用于與云平臺(tái)提供商集成,管理云資源。
工作節(jié)點(diǎn)(計(jì)算節(jié)點(diǎn)):
kubelet:與Master節(jié)點(diǎn)通信,負(fù)責(zé)管理并執(zhí)行Pod的生命周期,包括創(chuàng)建、啟動(dòng)、監(jiān)控和銷毀Pod。
kube-proxy:負(fù)責(zé)為Pod提供網(wǎng)絡(luò)代理和負(fù)載均衡功能,實(shí)現(xiàn)Kubernetes服務(wù)的訪問和通信。
網(wǎng)絡(luò)插件:
Kubernetes使用網(wǎng)絡(luò)插件來實(shí)現(xiàn)容器之間和容器與外部網(wǎng)絡(luò)的通信。不同的網(wǎng)絡(luò)插件可以提供不同的網(wǎng)絡(luò)解決方案,如Overlay網(wǎng)絡(luò)、主機(jī)網(wǎng)絡(luò)等。
存儲(chǔ)插件:
Kubernetes支持不同的存儲(chǔ)插件,用于提供持久化存儲(chǔ)的功能,如本地存儲(chǔ)、網(wǎng)絡(luò)存儲(chǔ)、云存儲(chǔ)等。
DNS插件:
Kubernetes集群通常會(huì)配置一個(gè)DNS插件,用于為Pod提供域名解析服務(wù),使得Pod可以通過域名進(jìn)行相互通信。
Dashboard(可選):
Kubernetes提供了一個(gè)Web界面,稱為Dashboard,用于可視化地管理和監(jiān)控集群中的應(yīng)用程序和資源。
核心組件詳解
Master節(jié)點(diǎn)
Kube-apiserver
kube-apiserver是Kubernetes集群中的一個(gè)核心組件,它是Kubernetes API的前端接口,負(fù)責(zé)處理來自用戶和其他組件的請(qǐng)求,并將其轉(zhuǎn)發(fā)到相應(yīng)的組件進(jìn)行處理。
API接口:kube-apiserver提供了一組RESTful API接口,用于管理和操作Kubernetes集群中的各種資源,如Pod、Service、Deployment等。通過這些API接口,用戶和其他組件可以與集群進(jìn)行交互。
認(rèn)證和授權(quán):kube-apiserver支持多種認(rèn)證和授權(quán)機(jī)制,如基于Token的認(rèn)證、基于證書的認(rèn)證、OpenID Connect等。它可以驗(yàn)證用戶的身份,并根據(jù)配置的訪問控制策略對(duì)請(qǐng)求進(jìn)行授權(quán)。
數(shù)據(jù)存儲(chǔ):kube-apiserver使用etcd作為后端存儲(chǔ),將集群的配置數(shù)據(jù)和狀態(tài)信息持久化保存在etcd中。etcd是一個(gè)可靠的分布式鍵值存儲(chǔ)系統(tǒng),確保集群的元數(shù)據(jù)在節(jié)點(diǎn)故障或重啟后仍然可用。
高可用性:為了提高kube-apiserver的可用性,可以運(yùn)行多個(gè)kube-apiserver實(shí)例,并使用負(fù)載均衡器將請(qǐng)求分發(fā)到這些實(shí)例上。這樣即使其中一個(gè)實(shí)例發(fā)生故障,其他實(shí)例仍然可以繼續(xù)提供服務(wù)。
安全性:kube-apiserver提供了一些安全機(jī)制來保護(hù)API的訪問和數(shù)據(jù)的安全性。它支持TLS加密通信,可以配置訪問控制策略來限制用戶的權(quán)限,還可以啟用審計(jì)日志記錄API的訪問和操作。
擴(kuò)展性:kube-apiserver具有良好的擴(kuò)展性,可以通過自定義資源定義(Custom Resource Definition)和自定義控制器(Custom Controller)來擴(kuò)展API,以滿足特定的業(yè)務(wù)需求。
kube-apiserver是Kubernetes集群中非常重要的組件,用于暴露 Kubernetes API,任何資源請(qǐng)求或調(diào)用操作都是通過 kube-apiserver 提供的接口進(jìn)行。以 HTTP Restful API 提供接口服務(wù),所有對(duì)象資源的增刪改查和監(jiān)聽操作都交給 API Server 處理后再提交給 Etcd 存儲(chǔ)。 可以理解成 API Server 是 K8S 的請(qǐng)求入口服務(wù)。API Server 負(fù)責(zé)接收 K8S 所有請(qǐng)求(來自 UI 界面或者 CLI 命令行工具), 然后根據(jù)用戶的具體請(qǐng)求,去通知其他組件干活??梢哉f API Server 是 K8S 集群架構(gòu)的大腦。
Kube-controller-manager
kube-controller-manager是Kubernetes集群中的一個(gè)核心組件,它是控制器的集合,負(fù)責(zé)管理和運(yùn)行多個(gè)控制器,以確保集群中的各種資源處于期望的狀態(tài)。
控制器集合:kube-controller-manager包含了多個(gè)控制器,每個(gè)控制器負(fù)責(zé)監(jiān)控和管理集群中的不同資源。常見的控制器包括副本控制器(Replication Controller)、節(jié)點(diǎn)控制器(Node Controller)、服務(wù)控制器(Service Controller)等。
副本控制器:副本控制器負(fù)責(zé)確保Pod的副本數(shù)量與期望的副本數(shù)量保持一致。它會(huì)監(jiān)控Pod的狀態(tài),并在需要時(shí)創(chuàng)建、刪除或重新調(diào)度Pod,以滿足用戶定義的副本數(shù)量。
節(jié)點(diǎn)控制器:節(jié)點(diǎn)控制器負(fù)責(zé)監(jiān)控集群中的節(jié)點(diǎn)狀態(tài),并根據(jù)需要進(jìn)行節(jié)點(diǎn)的添加、刪除或重新調(diào)度。它會(huì)檢測(cè)節(jié)點(diǎn)的健康狀態(tài),并根據(jù)節(jié)點(diǎn)的可用性和資源情況來進(jìn)行節(jié)點(diǎn)管理。
服務(wù)控制器:服務(wù)控制器負(fù)責(zé)監(jiān)控Service資源的變化,并確保集群中的服務(wù)始終具有穩(wěn)定的網(wǎng)絡(luò)地址。它會(huì)自動(dòng)為Service創(chuàng)建對(duì)應(yīng)的負(fù)載均衡器,并將流量分發(fā)到后端的Pod實(shí)例。
控制循環(huán):每個(gè)控制器都遵循控制循環(huán)(Control Loop)的模式,不斷地監(jiān)控資源的狀態(tài),并根據(jù)期望的狀態(tài)進(jìn)行調(diào)整??刂蒲h(huán)包括觀察資源狀態(tài)、比較當(dāng)前狀態(tài)和期望狀態(tài)、執(zhí)行操作來調(diào)整資源狀態(tài)等步驟。
高可用性:為了提高kube-controller-manager的可用性,可以運(yùn)行多個(gè)實(shí)例,并使用負(fù)載均衡器將請(qǐng)求分發(fā)到這些實(shí)例上。這樣即使其中一個(gè)實(shí)例發(fā)生故障,其他實(shí)例仍然可以繼續(xù)提供服務(wù)。
自定義控制器:除了內(nèi)置的控制器,kube-controller-manager還支持自定義控制器的擴(kuò)展。用戶可以根據(jù)自己的需求編寫自定義控制器,以實(shí)現(xiàn)特定的業(yè)務(wù)邏輯和資源管理。
運(yùn)行管理控制器,是 K8S 集群中處理常規(guī)任務(wù)的后臺(tái)線程,是 K8S 集群里所有資源對(duì)象的自動(dòng)化控制中心。在 K8S 集群中,一個(gè)資源對(duì)應(yīng)一個(gè)控制器,而 Controller manager 就是負(fù)責(zé)管理這些控制器的。 由一系列控制器組成,通過 API Server 監(jiān)控整個(gè)集群的狀態(tài),并確保集群處于預(yù)期的工作狀態(tài),比如當(dāng)某個(gè) Node 意外宕機(jī)時(shí),Controller Manager 會(huì)及時(shí)發(fā)現(xiàn)并執(zhí)行自動(dòng)化修復(fù)流程,確保集群始終處于預(yù)期的工作狀態(tài)。
Kube-scheduler
kube-scheduler是Kubernetes集群中的一個(gè)核心組件,它負(fù)責(zé)根據(jù)預(yù)定義的調(diào)度策略,為新創(chuàng)建的Pod選擇合適的節(jié)點(diǎn)進(jìn)行調(diào)度。
節(jié)點(diǎn)選擇:kube-scheduler會(huì)根據(jù)一系列的調(diào)度策略和規(guī)則,選擇最適合的節(jié)點(diǎn)來運(yùn)行Pod。這些策略包括資源需求、親和性(Affinity)和反親和性(Anti-Affinity)、節(jié)點(diǎn)親和性(Node Affinity)、節(jié)點(diǎn)親和性預(yù)選(Node Affinity Preemption)等。
資源需求:kube-scheduler會(huì)考慮Pod的資源需求(如CPU、內(nèi)存等),并選擇具有足夠資源的節(jié)點(diǎn)來運(yùn)行Pod,以避免資源競(jìng)爭(zhēng)和過載。
親和性和反親和性:kube-scheduler支持親和性和反親和性規(guī)則,可以將Pod調(diào)度到與其他Pod或節(jié)點(diǎn)具有特定關(guān)系的節(jié)點(diǎn)上。例如,可以將具有相同標(biāo)簽的Pod調(diào)度到同一個(gè)節(jié)點(diǎn)上,或者將Pod調(diào)度到與特定Pod或節(jié)點(diǎn)具有反親和性的節(jié)點(diǎn)上。
節(jié)點(diǎn)親和性:kube-scheduler支持節(jié)點(diǎn)親和性規(guī)則,可以將Pod調(diào)度到與特定節(jié)點(diǎn)具有特定關(guān)系的節(jié)點(diǎn)上。例如,可以將Pod調(diào)度到與具有特定標(biāo)簽的節(jié)點(diǎn)具有親和性的節(jié)點(diǎn)上。
節(jié)點(diǎn)親和性預(yù)選:kube-scheduler支持節(jié)點(diǎn)親和性預(yù)選規(guī)則,可以在調(diào)度過程中優(yōu)先考慮具有特定標(biāo)簽或特定條件的節(jié)點(diǎn)。這可以用于實(shí)現(xiàn)高級(jí)調(diào)度策略,如將Pod調(diào)度到具有特定硬件或軟件配置的節(jié)點(diǎn)上。
可擴(kuò)展性:kube-scheduler具有良好的可擴(kuò)展性,可以通過自定義調(diào)度器(Custom Scheduler)來擴(kuò)展其功能。用戶可以根據(jù)自己的需求編寫自定義調(diào)度器,以實(shí)現(xiàn)特定的調(diào)度策略和資源管理。
高可用性:為了提高kube-scheduler的可用性,可以運(yùn)行多個(gè)實(shí)例,并使用負(fù)載均衡器將請(qǐng)求分發(fā)到這些實(shí)例上。這樣即使其中一個(gè)實(shí)例發(fā)生故障,其他實(shí)例仍然可以繼續(xù)提供調(diào)度服務(wù)。
可以理解成 K8S 所有 Node 節(jié)點(diǎn)的調(diào)度器。當(dāng)用戶要部署服務(wù)時(shí),Scheduler 會(huì)根據(jù)調(diào)度算法選擇最合適的 Node 節(jié)點(diǎn)來部署 Pod。 ?預(yù)選策略(predicate) ?優(yōu)選策略(priorities)
API Server 接收到請(qǐng)求創(chuàng)建一批 Pod ,API Server 會(huì)讓 Controller-manager 按照所預(yù)設(shè)的模板去創(chuàng)建 Pod,Controller-manager 會(huì)通過 API Server 去找 Scheduler 為新創(chuàng)建的 Pod 選擇最適合的 Node 節(jié)點(diǎn)。比如運(yùn)行這個(gè) Pod 需要 2C4G 的資源,Scheduler 會(huì)通過預(yù)選策略過濾掉不滿足策略的 Node 節(jié)點(diǎn)。Node 節(jié)點(diǎn)中還剩多少資源是通過匯報(bào)給 API Server 存儲(chǔ)在 etcd 里,API Server 會(huì)調(diào)用一個(gè)方法找到 etcd 里所有 Node 節(jié)點(diǎn)的剩余資源,再對(duì)比 Pod 所需要的資源,如果某個(gè) Node 節(jié)點(diǎn)的資源不足或者不滿足 預(yù)選策略的條件則無(wú)法通過預(yù)選。預(yù)選階段篩選出的節(jié)點(diǎn),在優(yōu)選階段會(huì)根據(jù)優(yōu)先策略為通過預(yù)選的 Node 節(jié)點(diǎn)進(jìn)行打分排名, 選擇得分最高的 Node。例如,資源越富裕、負(fù)載越小的 Node 可能具有越高的排名。
存儲(chǔ)中心
etcd
etcd是一個(gè)開源的分布式鍵值存儲(chǔ)系統(tǒng),它被廣泛應(yīng)用于Kubernetes集群中作為存儲(chǔ)和同步集群配置數(shù)據(jù)的后端。
分布式鍵值存儲(chǔ):etcd提供了一個(gè)簡(jiǎn)單而強(qiáng)大的分布式鍵值存儲(chǔ)系統(tǒng),類似于一個(gè)分布式的字典或數(shù)據(jù)庫(kù)。它允許用戶存儲(chǔ)和檢索鍵值對(duì),并支持對(duì)數(shù)據(jù)的高效查詢和事務(wù)操作。
一致性和可靠性:etcd使用Raft一致性算法來確保數(shù)據(jù)的一致性和可靠性。Raft算法通過選舉和復(fù)制日志的方式,保證了集群中的節(jié)點(diǎn)之間的數(shù)據(jù)一致性,并在節(jié)點(diǎn)故障或網(wǎng)絡(luò)分區(qū)的情況下保持系統(tǒng)的可用性。
高可用性:etcd支持多節(jié)點(diǎn)部署,可以運(yùn)行多個(gè)etcd實(shí)例組成一個(gè)集群。這樣即使其中一個(gè)節(jié)點(diǎn)發(fā)生故障,其他節(jié)點(diǎn)仍然可以繼續(xù)提供服務(wù),保證了系統(tǒng)的高可用性。
集群配置存儲(chǔ):在Kubernetes中,etcd被用作存儲(chǔ)和同步集群的配置數(shù)據(jù),包括節(jié)點(diǎn)信息、Pod和Service的狀態(tài)、配置文件等。etcd存儲(chǔ)了整個(gè)集群的元數(shù)據(jù),確保集群中的各個(gè)組件和資源的狀態(tài)保持一致。
監(jiān)控和調(diào)試:etcd提供了一些工具和接口,用于監(jiān)控和調(diào)試集群的狀態(tài)和性能。用戶可以通過etcd的API接口或命令行工具來查詢和監(jiān)控存儲(chǔ)的數(shù)據(jù),并進(jìn)行故障排除和性能優(yōu)化。
安全性:etcd支持TLS加密通信,可以配置訪問控制策略來限制對(duì)存儲(chǔ)數(shù)據(jù)的訪問權(quán)限。它還提供了身份驗(yàn)證和授權(quán)機(jī)制,確保只有經(jīng)過授權(quán)的用戶才能訪問和修改存儲(chǔ)的數(shù)據(jù)。
K8S 的存儲(chǔ)服務(wù)。etcd 是分布式鍵值存儲(chǔ)系統(tǒng),存儲(chǔ)了 K8S 的關(guān)鍵配置和用戶配置,K8S 中僅 API Server 才具備讀寫權(quán)限,其他組件必須通過 API Server 的接口才能讀寫數(shù)據(jù)。
Node
Kubelet
kubelet是Kubernetes集群中每個(gè)節(jié)點(diǎn)上的主要組件之一,它負(fù)責(zé)管理和監(jiān)控節(jié)點(diǎn)上的容器。
容器生命周期管理:kubelet負(fù)責(zé)管理節(jié)點(diǎn)上的容器的生命周期,包括創(chuàng)建、啟動(dòng)、停止和銷毀容器。它會(huì)監(jiān)控容器的狀態(tài),并根據(jù)需要執(zhí)行相應(yīng)的操作,以確保容器按預(yù)期運(yùn)行。
Pod和容器配置:kubelet根據(jù)來自Kubernetes API Server的指令,負(fù)責(zé)創(chuàng)建和管理Pod。它會(huì)根據(jù)Pod的配置信息,如容器鏡像、資源需求、環(huán)境變量等,來創(chuàng)建和配置容器。
資源管理:kubelet會(huì)監(jiān)控節(jié)點(diǎn)上的資源使用情況,包括CPU、內(nèi)存、存儲(chǔ)等,并根據(jù)Pod的資源需求進(jìn)行資源分配和管理。它會(huì)確保節(jié)點(diǎn)上的容器不會(huì)超出資源限制,以避免資源競(jìng)爭(zhēng)和過載。
健康檢查和自愈機(jī)制:kubelet會(huì)定期對(duì)容器進(jìn)行健康檢查,檢測(cè)容器的運(yùn)行狀態(tài)和健康狀況。如果容器出現(xiàn)故障或異常,kubelet會(huì)嘗試重新啟動(dòng)容器,以恢復(fù)容器的正常運(yùn)行。
日志和監(jiān)控:kubelet會(huì)收集容器的日志和監(jiān)控?cái)?shù)據(jù),并將其發(fā)送到集中化的日志和監(jiān)控系統(tǒng),以便用戶和管理員進(jìn)行查看和分析。這有助于故障排除和性能優(yōu)化。
安全性:kubelet負(fù)責(zé)確保節(jié)點(diǎn)上的容器的安全性。它會(huì)執(zhí)行容器的安全策略,如限制容器的權(quán)限、隔離容器的網(wǎng)絡(luò)等,以保護(hù)節(jié)點(diǎn)和集群的安全。
與其他組件的通信:kubelet與其他Kubernetes組件,如kube-apiserver、kube-proxy等進(jìn)行通信,以獲取指令、報(bào)告狀態(tài)和接收更新。它通過與這些組件的交互,實(shí)現(xiàn)了集群的協(xié)調(diào)和管理。
在 Kubernetes 集群中,在每個(gè) Node(又稱 Worker Node)上都會(huì)啟動(dòng)一個(gè) kubelet 服務(wù)進(jìn)程。該進(jìn)程用于處理 Master 下發(fā)到本節(jié)點(diǎn)的任務(wù),管理 Pod 及 Pod 中的容器。每個(gè) kubelet 進(jìn)程都會(huì)在 API Server 上注冊(cè)節(jié)點(diǎn)自身的信息,定期向 Master 匯報(bào)節(jié)點(diǎn)資源的使用情況,并通過 cAdvisor 監(jiān)控容器和節(jié)點(diǎn)資源。
Kube-Proxy
服務(wù)代理:kube-proxy通過監(jiān)聽Kubernetes API Server上的Service和Endpoint對(duì)象的變化,動(dòng)態(tài)地維護(hù)一個(gè)服務(wù)代理表。它會(huì)為每個(gè)Service創(chuàng)建一個(gè)虛擬IP,并將流量轉(zhuǎn)發(fā)到后端的Pod實(shí)例。
負(fù)載均衡:kube-proxy使用負(fù)載均衡算法將流量分發(fā)到后端的Pod實(shí)例。它支持多種負(fù)載均衡模式,如輪詢、隨機(jī)、最少連接等,以確保流量在Pod之間均勻分布。
在每個(gè) Node 節(jié)點(diǎn)上實(shí)現(xiàn) Pod 網(wǎng)絡(luò)代理,是 Kubernetes Service 資源的載體,負(fù)責(zé)維護(hù)網(wǎng)絡(luò)規(guī)則和四層負(fù)載均衡工作。 負(fù)責(zé)寫入規(guī)則至iptables、ipvs實(shí)現(xiàn)服務(wù)映射訪問的。 Kube-Proxy 本身不是直接給 Pod 提供網(wǎng)絡(luò),Pod 的網(wǎng)絡(luò)是由 Kubelet 提供的,Kube-Proxy 實(shí)際上維護(hù)的是虛擬的 Pod 集群網(wǎng)絡(luò)。 Kube-apiserver 通過監(jiān)控 Kube-Proxy 進(jìn)行對(duì) Kubernetes Service 的更新和端點(diǎn)的維護(hù)。 在 K8S 集群中微服務(wù)的負(fù)載均衡是由 Kube-proxy 實(shí)現(xiàn)的。Kube-proxy 是 K8S 集群內(nèi)部的負(fù)載均衡器。它是一個(gè)分布式代理服務(wù)器,在 K8S 的每個(gè)節(jié)點(diǎn)上都會(huì)運(yùn)行一個(gè) Kube-proxy 組件。
網(wǎng)絡(luò)通信模型
在Kubernetes(K8S)中,網(wǎng)絡(luò)模型是用于管理和組織容器之間通信的一種架構(gòu)。Kubernetes使用了一種稱為"容器網(wǎng)絡(luò)接口"(Container Network Interface,CNI)的標(biāo)準(zhǔn),來定義和實(shí)現(xiàn)容器之間的網(wǎng)絡(luò)通信。
Pod內(nèi)部容器之間的網(wǎng)絡(luò)通信:在同一個(gè)Pod中的容器可以通過localhost進(jìn)行直接通信,它們共享相同的網(wǎng)絡(luò)命名空間和IP地址。
Pod之間的網(wǎng)絡(luò)通信:不同Pod中的容器之間的通信需要通過網(wǎng)絡(luò)進(jìn)行。每個(gè)Pod都被分配一個(gè)唯一的IP地址,可以通過該IP地址進(jìn)行通信。Pod之間的通信是通過網(wǎng)絡(luò)插件(如Flannel、Calico、Weave等)來實(shí)現(xiàn)的。
Pod到Service之間的網(wǎng)絡(luò)通信:Kubernetes中的Service是一種抽象,用于將一組Pod封裝為一個(gè)邏輯服務(wù)。Service會(huì)為這些Pod分配一個(gè)虛擬IP地址,并通過負(fù)載均衡將流量分發(fā)到這些Pod上。其他Pod可以通過Service的虛擬IP地址來訪問該服務(wù)。
集群外部與內(nèi)部組件之間的網(wǎng)絡(luò)通信:Kubernetes集群外的組件(如外部服務(wù)、其他集群、云服務(wù)等)可以通過Kubernetes提供的網(wǎng)絡(luò)代理或Ingress來與集群內(nèi)的服務(wù)進(jìn)行通信。網(wǎng)絡(luò)代理和Ingress可以將外部流量轉(zhuǎn)發(fā)到集群內(nèi)部的Service或Pod。
具體的網(wǎng)絡(luò)實(shí)現(xiàn)取決于所選擇的網(wǎng)絡(luò)插件和配置。常見的網(wǎng)絡(luò)插件包括Flannel、Calico、Weave等,它們提供了不同的網(wǎng)絡(luò)方案和功能,以滿足不同的需求和環(huán)境。這些網(wǎng)絡(luò)插件通過創(chuàng)建虛擬網(wǎng)絡(luò)、路由規(guī)則和網(wǎng)絡(luò)策略等方式,實(shí)現(xiàn)了Kubernetes中的網(wǎng)絡(luò)模型。
在Kubernetes中,有三個(gè)與IP地址相關(guān)的概念:Node IP、Pod IP和Cluster IP。
Node IP(節(jié)點(diǎn)IP):Node IP是指Kubernetes集群中每個(gè)節(jié)點(diǎn)(Node)所分配的IP地址。每個(gè)節(jié)點(diǎn)都有一個(gè)唯一的Node IP,用于標(biāo)識(shí)和訪問該節(jié)點(diǎn)。Node IP通常用于集群外部與節(jié)點(diǎn)進(jìn)行通信,例如從外部網(wǎng)絡(luò)訪問節(jié)點(diǎn)上運(yùn)行的服務(wù)。
Pod IP(容器組IP):Pod IP是指Kubernetes集群中每個(gè)Pod所分配的IP地址。Pod是Kubernetes中最小的可調(diào)度和可管理的單元,每個(gè)Pod都有一個(gè)唯一的Pod IP。Pod IP用于容器之間的通信,不同Pod中的容器可以通過Pod IP進(jìn)行網(wǎng)絡(luò)通信。
Cluster IP(集群IP):Cluster IP是指Kubernetes集群中Service所分配的虛擬IP地址。Service是Kubernetes中用于封裝一組Pod的邏輯服務(wù),為這些Pod提供一個(gè)統(tǒng)一的入口。Cluster IP是Service的虛擬IP地址,用于在集群內(nèi)部進(jìn)行服務(wù)發(fā)現(xiàn)和訪問。其他Pod可以通過Cluster IP來訪問Service提供的服務(wù)。
這些IP地址在Kubernetes中起著不同的作用,Node IP用于集群外部與節(jié)點(diǎn)通信,Pod IP用于容器之間的通信,而Cluster IP用于集群內(nèi)部的服務(wù)發(fā)現(xiàn)和訪問。它們共同構(gòu)成了Kubernetes中的網(wǎng)絡(luò)基礎(chǔ)設(shè)施。
容器引擎
在Kubernetes(K8S)中,并沒有單獨(dú)的容器引擎。Kubernetes本身并不提供容器運(yùn)行時(shí),而是通過與容器運(yùn)行時(shí)接口(Container Runtime Interface,CRI)兼容的容器運(yùn)行時(shí)來運(yùn)行和管理容器。
CRI是Kubernetes定義的一種接口規(guī)范,用于與容器運(yùn)行時(shí)進(jìn)行通信和交互。它允許Kubernetes與不同的容器運(yùn)行時(shí)進(jìn)行集成,例如Docker、Containerd、CRI-O等。這些容器運(yùn)行時(shí)負(fù)責(zé)實(shí)際的容器創(chuàng)建、管理和執(zhí)行工作。
常見的Kubernetes容器運(yùn)行時(shí)包括:
Docker:Docker是最常用的容器運(yùn)行時(shí)之一,它提供了廣泛的功能和工具,用于創(chuàng)建、打包和運(yùn)行容器。在較早的Kubernetes版本中,Docker是默認(rèn)的容器運(yùn)行時(shí)。
Containerd:Containerd是一個(gè)輕量級(jí)的容器運(yùn)行時(shí),它是Docker的核心組件之一。Containerd提供了基本的容器管理功能,可以與Kubernetes集成,作為Kubernetes的容器運(yùn)行時(shí)。
CRI-O:CRI-O是一個(gè)專門為Kubernetes設(shè)計(jì)的輕量級(jí)容器運(yùn)行時(shí),它符合CRI規(guī)范,并專注于提供最小化的容器運(yùn)行時(shí)功能。CRI-O使用runc作為底層容器執(zhí)行器,與Kubernetes緊密集成。
除了上述容器運(yùn)行時(shí),還有其他一些實(shí)現(xiàn)了CRI規(guī)范的容器運(yùn)行時(shí),如rkt(現(xiàn)已停止開發(fā))、frakti等。這些容器運(yùn)行時(shí)都可以與Kubernetes集成,作為Kubernetes的容器運(yùn)行時(shí)。
k8s核心概念詳解
Kubernetes 包含多種類型的資源對(duì)象:Pod、Label、Service、Replication Controller 等。
Pod(容器組):Pod是Kubernetes中最小的可調(diào)度和可管理的單元,它可以包含一個(gè)或多個(gè)容器,并共享相同的網(wǎng)絡(luò)和存儲(chǔ)資源。Pod是部署和擴(kuò)展應(yīng)用程序的基本單位。
Label(標(biāo)簽):Label是用于標(biāo)識(shí)和組織Kubernetes資源的鍵值對(duì)。通過為資源對(duì)象添加標(biāo)簽,可以對(duì)它們進(jìn)行分類、選擇和操作。標(biāo)簽可以用于實(shí)現(xiàn)資源的分組、服務(wù)發(fā)現(xiàn)、負(fù)載均衡等功能。
Service(服務(wù)):Service是一種抽象,用于封裝一組Pod,并為它們提供一個(gè)統(tǒng)一的入口。Service為這些Pod分配一個(gè)虛擬IP地址,并通過負(fù)載均衡將流量分發(fā)到這些Pod上,實(shí)現(xiàn)了服務(wù)的訪問和通信。
Namespace(命名空間):Namespace是用于在Kubernetes集群中創(chuàng)建多個(gè)虛擬集群的一種機(jī)制。通過使用命名空間,可以將不同的資源對(duì)象隔離開來,實(shí)現(xiàn)資源的多租戶和資源隔離。
Controller(控制器):Controller是一種用于管理和控制資源對(duì)象的機(jī)制。Kubernetes提供了多種類型的控制器,如副本控制器、服務(wù)控制器等,用于監(jiān)控和管理集群中的各種資源。
Replication Controller(副本控制器):Replication Controller用于確保Pod的副本數(shù)量與期望的副本數(shù)量保持一致。它會(huì)監(jiān)控Pod的狀態(tài),并在需要時(shí)創(chuàng)建、刪除或重新調(diào)度Pod,以滿足用戶定義的副本數(shù)量。
Kubernetes通過這些核心概念和機(jī)制,實(shí)現(xiàn)了容器化應(yīng)用程序的部署、管理和擴(kuò)展。它提供了豐富的功能和工具,使得應(yīng)用程序的部署和運(yùn)維變得更加簡(jiǎn)單和高效。
所有的資源對(duì)象都可以通過 Kubernetes 提供的 kubectl 工具進(jìn)行增、刪、改、查等操作,并將其保存在 etcd 中持久化存儲(chǔ)。 Kubernets其實(shí)是一個(gè)高度自動(dòng)化的資源控制系統(tǒng),通過跟蹤對(duì)比etcd存儲(chǔ)里保存的資源期望狀態(tài)與當(dāng)前環(huán)境中的實(shí)際資源狀態(tài)的差異,來實(shí)現(xiàn)自動(dòng)控制和自動(dòng)糾錯(cuò)等高級(jí)功能。
Pod
它是最小的可部署單元。一個(gè)Pod可以包含一個(gè)或多個(gè)容器,這些容器共享相同的網(wǎng)絡(luò)和存儲(chǔ)資源,并在同一主機(jī)上運(yùn)行。
Pod提供了一個(gè)抽象層,用于封裝應(yīng)用程序的運(yùn)行環(huán)境。它可以包含應(yīng)用程序所需的所有組件,如主應(yīng)用程序容器、輔助容器(如日志收集器、輔助工具等)以及共享的存儲(chǔ)卷。
Pod具有以下特點(diǎn):
網(wǎng)絡(luò)共享:Pod中的所有容器共享相同的網(wǎng)絡(luò)命名空間和IP地址,它們可以通過localhost相互通信。
存儲(chǔ)共享:Pod中的所有容器可以訪問共享的存儲(chǔ)卷,這使得它們可以共享數(shù)據(jù)和文件。
生命周期:Pod具有自己的生命周期,它可以被創(chuàng)建、啟動(dòng)、停止和銷毀。當(dāng)Pod被銷毀時(shí),其中的所有容器也會(huì)被終止。
調(diào)度和部署:Pod可以由Kubernetes調(diào)度器在集群中的節(jié)點(diǎn)上進(jìn)行部署。調(diào)度器會(huì)考慮節(jié)點(diǎn)的資源和約束條件,選擇適合的節(jié)點(diǎn)來運(yùn)行Pod。
Pod是臨時(shí)性的,它可以根據(jù)需要?jiǎng)?chuàng)建和銷毀。如果需要長(zhǎng)期運(yùn)行的實(shí)例,可以使用Pod控制器(如Deployment、ReplicaSet等)來管理Pod的生命周期和副本數(shù)量。
Pod 控制器
Pod控制器是Kubernetes中的一種資源對(duì)象,用于管理和控制Pod的創(chuàng)建、更新和刪除。Pod控制器包括以下幾種類型:
ReplicaSet(副本集):ReplicaSet確保指定數(shù)量的Pod副本在集群中運(yùn)行。它可以根據(jù)需要進(jìn)行自動(dòng)擴(kuò)展或縮減Pod的數(shù)量,以滿足應(yīng)用程序的需求。
Deployment(部署):Deployment建立在ReplicaSet之上,它用于定義應(yīng)用程序的期望狀態(tài),并確保該狀態(tài)得到維持。Deployment支持滾動(dòng)更新和回滾操作,可以方便地進(jìn)行應(yīng)用程序的發(fā)布和更新。
StatefulSet(有狀態(tài)副本集):StatefulSet用于管理有狀態(tài)應(yīng)用程序的Pod副本。它為每個(gè)Pod分配一個(gè)唯一的標(biāo)識(shí)符,并提供穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)和存儲(chǔ)卷,確保有狀態(tài)應(yīng)用程序的數(shù)據(jù)持久性和順序性。
DaemonSet(守護(hù)進(jìn)程集):DaemonSet用于在集群中的每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)Pod副本。它通常用于運(yùn)行一些系統(tǒng)級(jí)別的服務(wù),如日志收集、監(jiān)控等。
Job(作業(yè)):Job用于運(yùn)行一次性任務(wù)或批處理任務(wù)。它確保任務(wù)成功完成,并可以設(shè)置重試策略和并行度。
這些Pod控制器提供了不同的功能和用途,可以根據(jù)應(yīng)用程序的需求選擇合適的控制器來管理Pod的生命周期。它們通過監(jiān)控和調(diào)整Pod的數(shù)量和狀態(tài),確保應(yīng)用程序的高可用性和可靠性。
Label
在Kubernetes中,Label(標(biāo)簽)是一種用于標(biāo)識(shí)和組織資源的關(guān)鍵概念。它是一個(gè)鍵值對(duì)的元數(shù)據(jù),可以附加到Kubernetes對(duì)象(如Pod、Service、Deployment等)上。
以下是一些關(guān)于標(biāo)簽的重要信息:
標(biāo)簽的結(jié)構(gòu):標(biāo)簽由鍵值對(duì)組成,例如"app=frontend"或"tier=backend"。鍵和值都是字符串類型,且鍵必須是唯一的。
標(biāo)簽的作用:標(biāo)簽可以用于對(duì)資源進(jìn)行分類、篩選和選擇。通過為資源添加標(biāo)簽,可以更方便地管理和操作它們。
標(biāo)簽的用途:標(biāo)簽可以用于多種用途,例如:
選擇器(Selector):可以使用標(biāo)簽選擇器來選擇具有特定標(biāo)簽的資源。這在創(chuàng)建Service、Deployment等對(duì)象時(shí)非常有用。
資源組織:可以使用標(biāo)簽將相關(guān)的資源進(jìn)行分組和組織。例如,可以為所有屬于同一應(yīng)用程序的資源添加相同的標(biāo)簽。
資源管理:可以使用標(biāo)簽來跟蹤和管理資源。通過為資源添加標(biāo)簽,可以更容易地識(shí)別和操作它們。
標(biāo)簽的添加和修改:可以在創(chuàng)建資源時(shí)為其添加標(biāo)簽,也可以在后續(xù)的操作中對(duì)標(biāo)簽進(jìn)行修改。例如,可以使用kubectl命令行工具為Pod添加或修改標(biāo)簽。
標(biāo)簽的查詢和選擇:可以使用標(biāo)簽選擇器來查詢和選擇具有特定標(biāo)簽的資源。選擇器可以使用等于、不等于、存在、不存在等操作符進(jìn)行條件篩選。
通過使用標(biāo)簽,可以更靈活地管理和操作Kubernetes中的資源。它提供了一種簡(jiǎn)單而強(qiáng)大的方式來組織、選擇和管理資源,使得應(yīng)用程序的部署和管理更加靈活和可靠。
Label 選擇器
在Kubernetes中,標(biāo)簽選擇器(Label selector)是一種用于查詢和篩選具有特定標(biāo)簽的資源對(duì)象的機(jī)制。
標(biāo)簽選擇器有兩種類型:基于等值關(guān)系和基于集合關(guān)系。
基于等值關(guān)系的標(biāo)簽選擇器:
=:選擇具有指定標(biāo)簽鍵和值相等的資源對(duì)象。
!=:選擇具有指定標(biāo)簽鍵但值不等于指定值的資源對(duì)象。
基于集合關(guān)系的標(biāo)簽選擇器:
in:選擇具有指定標(biāo)簽鍵且值在指定值列表中的資源對(duì)象。
notin:選擇具有指定標(biāo)簽鍵但值不在指定值列表中的資源對(duì)象。
exists:選擇具有指定標(biāo)簽鍵的資源對(duì)象。
!exists:選擇沒有指定標(biāo)簽鍵的資源對(duì)象。
以下是一個(gè)示例,展示如何使用標(biāo)簽選擇器查詢和篩選具有特定標(biāo)簽的Pod:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
labels:
app: my-app
environment: production
要查詢和篩選具有特定標(biāo)簽的Pod,可以使用標(biāo)簽選擇器表達(dá)式,例如:
app=my-app:選擇具有標(biāo)簽app的值為my-app的Pod。
environment!=development:選擇具有標(biāo)簽environment的值不為development的Pod。
app in (my-app, your-app):選擇具有標(biāo)簽app的值為my-app或your-app的Pod。
Service 服務(wù)
Service(服務(wù))是一種抽象的概念,用于定義一組Pod的訪問方式和網(wǎng)絡(luò)連接。Service為Pod提供了一個(gè)穩(wěn)定的網(wǎng)絡(luò)地址和DNS名稱,使得其他應(yīng)用程序可以通過該地址和名稱與Pod進(jìn)行通信。
Service的主要作用是實(shí)現(xiàn)負(fù)載均衡和服務(wù)發(fā)現(xiàn)。它將流量分發(fā)到后端的Pod,可以確保請(qǐng)求被均勻地分發(fā)到可用的Pod上,從而提高應(yīng)用程序的可用性和性能。
在Kubernetes(K8S)集群中,每個(gè)Pod都有一個(gè)單獨(dú)的IP地址。然而,由于Pod具有生命周期,可能會(huì)因?yàn)闃I(yè)務(wù)變更而銷毀并重新創(chuàng)建,導(dǎo)致其IP地址也會(huì)改變。
為了解決這個(gè)問題,K8S引入了Service作為核心概念。在K8S中,Service并不是傳統(tǒng)意義上的"服務(wù)",而更像是一個(gè)網(wǎng)關(guān)層,用于提供一組Pod的對(duì)外訪問接口和流量均衡。
Service通過標(biāo)簽選擇器來確定作用于哪些Pod。在K8S集群中,客戶端需要訪問的服務(wù)就是Service對(duì)象。每個(gè)Service都有一個(gè)固定的虛擬IP(也稱為Cluster IP),它會(huì)自動(dòng)綁定到后端的Pod,并將所有網(wǎng)絡(luò)請(qǐng)求轉(zhuǎn)發(fā)給這些Pod。
除了提供穩(wěn)定的對(duì)外訪問方式,Service還具備負(fù)載均衡的功能,可以自動(dòng)將請(qǐng)求流量分發(fā)到后端的所有Pod上。Service還能夠?qū)崿F(xiàn)透明的水平擴(kuò)展,對(duì)客戶端來說是無(wú)感知的。
實(shí)現(xiàn)Service功能的關(guān)鍵是kube-proxy。kube-proxy在每個(gè)節(jié)點(diǎn)上運(yùn)行,監(jiān)聽API Server中服務(wù)對(duì)象的變化,并通過三種流量調(diào)度模式(userspace、iptables、ipvs)來實(shí)現(xiàn)網(wǎng)絡(luò)轉(zhuǎn)發(fā)。
Service是K8S服務(wù)的核心,它屏蔽了服務(wù)的細(xì)節(jié),統(tǒng)一對(duì)外暴露服務(wù)接口,實(shí)現(xiàn)了真正的"微服務(wù)"。對(duì)于用戶來說,只需要關(guān)注一個(gè)Service的入口,而不需要關(guān)心具體請(qǐng)求哪個(gè)Pod。
這樣做的優(yōu)勢(shì)非常明顯:外部用戶不需要關(guān)注Pod意外崩潰或K8S重新創(chuàng)建Pod導(dǎo)致的IP變化,也不需要關(guān)注升級(jí)或變更服務(wù)導(dǎo)致的Pod替換和IP變化。
以下是一些關(guān)鍵的Service特性和概念:
ClusterIP:每個(gè)Service都有一個(gè)ClusterIP,它是Service在集群內(nèi)部的虛擬IP地址。其他Pod或Service可以通過該IP地址與Service進(jìn)行通信。
Service類型:Kubernetes支持多種Service類型,包括ClusterIP、NodePort、LoadBalancer和ExternalName。每種類型都有不同的用途和配置方式。
Selector:Service使用Selector來標(biāo)識(shí)它所關(guān)聯(lián)的Pod。通過標(biāo)簽選擇器,Service可以將流量轉(zhuǎn)發(fā)到具有特定標(biāo)簽的Pod上。
端口映射:Service可以將外部請(qǐng)求的端口映射到后端Pod的端口。這樣,外部應(yīng)用程序可以通過Service的IP地址和映射的端口與Pod進(jìn)行通信。
Headless Service:除了普通的Service類型,Kubernetes還支持Headless Service。Headless Service不會(huì)分配ClusterIP,而是直接暴露后端Pod的網(wǎng)絡(luò)地址。
Ingress
在Kubernetes集群中,Service主要負(fù)責(zé)集群內(nèi)部的網(wǎng)絡(luò)拓?fù)?,它提供了一種抽象的方式來訪問一組Pod。但是,如果要從集群外部訪問集群內(nèi)部的服務(wù),就需要使用Ingress。
Ingress充當(dāng)了整個(gè)Kubernetes集群的接入層,它負(fù)責(zé)處理集群內(nèi)外的通信。作為第7層應(yīng)用層的組件,Ingress可以通過HTTP/HTTPS等協(xié)議對(duì)外暴露服務(wù)。
與Service不同,Service只能進(jìn)行第4層的流量調(diào)度,使用IP地址和端口進(jìn)行訪問。而Ingress可以根據(jù)不同的業(yè)務(wù)域和URL訪問路徑來調(diào)度業(yè)務(wù)流量。
用于將外部流量路由到集群內(nèi)部的服務(wù)。它充當(dāng)了集群和外部網(wǎng)絡(luò)之間的入口點(diǎn)。
具體來說,Ingress定義了一組規(guī)則,用于將外部請(qǐng)求路由到集群內(nèi)部的服務(wù)。它可以根據(jù)請(qǐng)求的主機(jī)名、路徑或其他標(biāo)識(shí)符將流量轉(zhuǎn)發(fā)到相應(yīng)的服務(wù)。通過使用Ingress,可以實(shí)現(xiàn)負(fù)載均衡、SSL終止、路徑基礎(chǔ)的路由等功能。
在使用Ingress之前,需要先部署一個(gè)Ingress控制器。Ingress控制器是一個(gè)運(yùn)行在集群中的組件,負(fù)責(zé)監(jiān)視Ingress資源的變化,并根據(jù)規(guī)則配置負(fù)載均衡器或代理服務(wù)器來處理外部流量。
一旦Ingress控制器部署好并配置了相應(yīng)的規(guī)則,外部流量就可以通過Ingress路由到集群內(nèi)部的服務(wù)。這樣,可以通過一個(gè)統(tǒng)一的入口點(diǎn)來訪問多個(gè)服務(wù),而無(wú)需暴露每個(gè)服務(wù)的具體地址。
總之,Ingress是Kubernetes中用于管理外部流量訪問的一種機(jī)制,它通過定義規(guī)則將外部請(qǐng)求路由到集群內(nèi)部的服務(wù),提供了更靈活和可擴(kuò)展的流量管理方式。
Name
在Kubernetes中,每個(gè)資源都有自己的名稱,通常定義在資源的元數(shù)據(jù)(metadata)中。元數(shù)據(jù)包含了一些描述資源的屬性,其中包括名稱(name)屬性。
名稱在同一個(gè)命名空間(namespace)中必須是唯一的,這意味著在同一個(gè)命名空間中不能存在相同名稱的資源。這樣可以確保在集群中對(duì)資源進(jìn)行唯一標(biāo)識(shí)和引用。
除了名稱,元數(shù)據(jù)還可以包含其他屬性,如標(biāo)簽(labels)和注釋(annotations)。標(biāo)簽用于對(duì)資源進(jìn)行分類和組織,而注釋則是一些額外的描述性信息。
通過名稱和其他元數(shù)據(jù)屬性,可以在Kubernetes中對(duì)資源進(jìn)行識(shí)別、查詢和操作。這些屬性在定義資源的清單文件或通過Kubernetes API進(jìn)行編程時(shí)非常重要。
Namespace 命名空間
Namespace(命名空間),用于在集群中創(chuàng)建虛擬的工作環(huán)境,將資源進(jìn)行隔離和分類。它可以幫助不同的團(tuán)隊(duì)或項(xiàng)目在同一個(gè)集群中共享資源,同時(shí)保持彼此之間的隔離。
使用Namespace可以將集群中的資源劃分為邏輯上獨(dú)立的單元,每個(gè)Namespace都有自己的資源配額、網(wǎng)絡(luò)和存儲(chǔ)資源。不同的Namespace可以擁有相同名稱的資源,但它們彼此之間是隔離的,不會(huì)相互干擾。
Namespace的主要作用包括:
隔離和分類:通過將資源劃分到不同的Namespace中,可以將不同的團(tuán)隊(duì)、項(xiàng)目或環(huán)境隔離開來,避免資源沖突和干擾。
訪問控制:可以使用RBAC(Role-Based Access Control)等機(jī)制對(duì)不同的Namespace進(jìn)行權(quán)限控制,限制用戶或團(tuán)隊(duì)對(duì)資源的訪問和操作。
資源配額:可以為每個(gè)Namespace設(shè)置資源配額,限制其使用的計(jì)算、存儲(chǔ)和網(wǎng)絡(luò)資源的數(shù)量,以避免資源被某個(gè)Namespace過度占用。
管理和監(jiān)控:通過將資源按照Namespace進(jìn)行分類,可以更方便地管理和監(jiān)控集群中的資源使用情況,進(jìn)行故障排查和性能優(yōu)化。
在Kubernetes中,默認(rèn)會(huì)創(chuàng)建一個(gè)名為"default"的Namespace,如果沒有顯式指定Namespace,資源將被分配到"default" Namespace中。除了"default" Namespace外,還可以創(chuàng)建自定義的Namespace,根據(jù)實(shí)際需求進(jìn)行資源的劃分和管理。
不同 Namespace 內(nèi)的 “資源” 名稱可以相同,相同 Namespace 內(nèi)的同種 “資源”,“名稱” 不能相同。 合理的使用 K8S 的 Namespace,可以使得集群管理員能夠更好的對(duì)交付到 K8S 里的服務(wù)進(jìn)行分類管理和瀏覽。查詢 K8S 里特定 “資源” 要帶上相應(yīng)的 Namespace。
付費(fèi)1元即可閱讀全文