您好,登錄后才能下訂單哦!
這篇文章主要介紹“有關(guān)Kubernetes的詳細(xì)介紹”,在日常操作中,相信很多人在有關(guān)Kubernetes的詳細(xì)介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”有關(guān)Kubernetes的詳細(xì)介紹”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
Kubernetes: 歷史
Kubernetes,也被稱為k8s(k... 8個(gè)字母...和s)或kube,是希臘語中的單詞,意為州長、舵手或船長。拿真正的航海的情景來理解,大型船舶裝載著大量現(xiàn)實(shí)生活的容器,而船長或舵手則是負(fù)責(zé)船舶的人。因此,在信息技術(shù)的語境下,Kubernetes就是Docker容器的船長、編排者。
Kubernetes最初是谷歌公司在內(nèi)部使用的,基于谷歌運(yùn)行容器15年的經(jīng)驗(yàn),Kubernetes于2014年開始作為Google的開源項(xiàng)目提供給社區(qū)。四年過去,Kubernetes飛速發(fā)展,下載及使用量驚人,被大量的中小型企業(yè)用戶用于開發(fā)或生產(chǎn)環(huán)境,并已成為業(yè)界公認(rèn)的容器編排管理的標(biāo)準(zhǔn)框架。
Kubernetes的發(fā)展勢頭
Kubernetes的增長態(tài)勢驚人,在GitHub上擁有超過40,000顆星,在2018年擁有超過60,000個(gè)commit,并且比GitHub上的任何其他項(xiàng)目都有更多的pull request和issue。其增長背后的部分原因是其不凡的可擴(kuò)展性和強(qiáng)大的設(shè)計(jì)模式,這些我們將在后文中進(jìn)一步解讀。您可以在此鏈接了解一些大型軟件公司的Kubernetes應(yīng)用案例:
https://kubernetes.io/case-studies/
Kubernetes提供的服務(wù)
讓我們來看看是什么功能及特性讓Kubernetes吸引到業(yè)界的如此關(guān)注。
Kubernetes的核心是以容器為中心的管理環(huán)境。它代表用戶的工作負(fù)載來編排計(jì)算、網(wǎng)絡(luò)和存儲基礎(chǔ)架構(gòu)。這提供了平臺即服務(wù)(PaaS)的簡單性和基礎(chǔ)架構(gòu)即服務(wù)(IaaS)的靈活性,并實(shí)現(xiàn)了跨基礎(chǔ)架構(gòu)提供商的可移植性。Kubernetes不僅僅是一個(gè)編排系統(tǒng)。實(shí)際上,它讓用戶不再需要“編排”。“編排”的技術(shù)定義是“執(zhí)行定義的工作流程”:首先執(zhí)行A,然后運(yùn)行B,然后運(yùn)行C。而有了Kubernetes之后,Kubernetes由一組獨(dú)立的、可組合的控制流程組成,這些流程可將當(dāng)前狀態(tài)持續(xù)推向所需狀態(tài)。而你是如何從A進(jìn)行到C的,在此無關(guān)緊要。而且,用戶也不再需要集中控制,整個(gè)系統(tǒng)也變得更易于使用、功能更強(qiáng)大、可擴(kuò)展性更佳。
Kubernetes的基本概念
要使用Kubernetes,您可以使用Kubernetes API對象來描述集群的所需狀態(tài):您想要運(yùn)行的應(yīng)用程序或服務(wù),它們使用的容器鏡像、副本數(shù)量,您希望提供的網(wǎng)絡(luò)和磁盤資源等等。您可以通過使用Kubernetes API——kubectl(通常通過命令行界面)創(chuàng)建對象來設(shè)置所需的狀態(tài)。您還可以直接使用Kubernetes API與集群交互,并設(shè)置或修改所需的狀態(tài)。
設(shè)置完所需狀態(tài)后,Kubernetes控制面板會讓集群的當(dāng)前狀態(tài)與所需狀態(tài)相匹配。為此,Kubernetes會自動執(zhí)行各種任務(wù),例如啟動或重新啟動容器、擴(kuò)展給定應(yīng)用程序的副本數(shù)量等等。
基本的Kubernetes對象包括: - 節(jié)點(diǎn) - Pod - 服務(wù) - 卷 - 命名空間
此外,Kubernetes包含許多稱為controller的高級抽象。controller基于基本對象構(gòu)建,并提供其他功能和便利的特性。它們包括:
ReplicaSet
Deployment
StatefulSet
DaemonSet
Job
下文中我們會逐個(gè)介紹這些概念,然后再嘗試一些動手練習(xí)。
節(jié) 點(diǎn)
節(jié)點(diǎn)( Node)是Kubernetes中的worker machine,以前稱為minion。節(jié)點(diǎn)可以是虛擬機(jī)(VM)或物理機(jī)(具體取決于集群)。每個(gè)節(jié)點(diǎn)都包含運(yùn)行pod所需的服務(wù),并由主組件管理。你可以這樣理解節(jié)點(diǎn):節(jié)點(diǎn)對于pod就像是Hypervisor對于虛擬機(jī)。
Pod
Pod是Kubernetes的基本構(gòu)建塊,它是您創(chuàng)建或部署的Kubernetes對象模型中最小和最簡單的單元。一個(gè)Pod代表著一個(gè)部署單元:Kubernetes中的單個(gè)應(yīng)用程序?qū)嵗?,可能包含單個(gè)容器或少量緊密組合并共享資源的容器。
Docker是Kubernetes Pod中最常用的容器運(yùn)行時(shí),但Pods也支持其他容器運(yùn)行時(shí)。
Kubernetes集群中的Pod主要以兩種方式使用:第一種是運(yùn)行單個(gè)容器的Pod 。“one-container-per-Pod”模式是最常見的Kubernetes用例; 在這種情況下,您可以將Pod視為單個(gè)容器的打包,由Kubernetes而非容器來管理 Pods。第二種是運(yùn)行多個(gè)需要協(xié)同工作的容器的Pod。一個(gè)Pod可能包含了一個(gè)應(yīng)用程序,這個(gè)應(yīng)用程序是由多個(gè)緊密耦合并且需要共享資源的容器組成的。這些共存的容器可能形成一個(gè)單一的內(nèi)聚服務(wù)單元——一個(gè)容器負(fù)責(zé)從共享卷將文件公開,而另一個(gè)單獨(dú)的“sidecar”容器負(fù)責(zé)刷新或更新這些文件。該P(yáng)od 將這些容器和存儲資源一起封裝為一個(gè)可管理的實(shí)體。
Pod為其組成容器提供兩種共享資源:網(wǎng)絡(luò)和存儲。
網(wǎng)絡(luò):每個(gè)Pod都分配了一個(gè)唯一的IP地址。一個(gè)Pod中的所有容器都共享網(wǎng)絡(luò)命名空間,包括IP地址和網(wǎng)絡(luò)端口。Pod內(nèi)的容器可以使用localhost相互通信。當(dāng)Pod內(nèi)的容器與Pod外的實(shí)體通信時(shí),它們必須協(xié)調(diào)如何使用共享網(wǎng)絡(luò)資源(例如端口)。
存儲:Pod可以指定一組共享存儲卷。Pod中的所有容器都可以訪問共享卷,允許這些容器共享數(shù)據(jù)。如果需要重新啟動其中一個(gè)容器,卷還可以讓Pod中的持久數(shù)據(jù)一直保存著。
服 務(wù)
Kubernetes Pods不是不變的,它們被創(chuàng)建又被殺死后并不會重生。即使每個(gè)Pod都有自己的IP地址,你也不能完全指望它會隨著時(shí)間推移卻永不改變。這會產(chǎn)生一個(gè)問題,如果一組Pods(比如說后端)為Kubernetes集群中的另一組Pods(比如說前端)提供了功能,那些前端pod如何能夠與后端pod保持可靠的通信?
這就是服務(wù)發(fā)揮作用的地方。
Kubernetes服務(wù)定義了一個(gè)邏輯集Pods和訪問它們的策略(有時(shí)稱為微服務(wù)),通常由Label Selector確定。
例如,如果你有一個(gè)帶有3個(gè)Pod的后端應(yīng)用程序,那些pod是可替代的,前端并不關(guān)心它們使用哪個(gè)后端。雖然Pods組成后端集的實(shí)際情況可能會發(fā)生變化,但前端客戶端不應(yīng)該知道這一點(diǎn),也不需要跟蹤后端列表本身。該Service抽象可實(shí)現(xiàn)這種分離。
對那些處于同樣的Kubernetes集群中的應(yīng)用,Kubernetes提供了一個(gè)簡單的Endpoints API,每當(dāng)服務(wù)中的一套Pods改變時(shí),API就會相應(yīng)地更新。對于集群外的應(yīng)用程序,Kubernetes提供基于虛擬IP的橋接器,Services可將其重定向到后端Pods。
卷
容器中的磁盤文件是不是永久的,這會給運(yùn)行在容器中的應(yīng)用程序帶來一些問題。首先,當(dāng)容器崩潰時(shí),它將由Kubernetes重新啟動,但文件會丟失,因?yàn)槿萜骺偸且愿蓛魻顟B(tài)啟動的。其次,當(dāng)在一個(gè)pod中運(yùn)行多個(gè)容器時(shí),通常需要在這些容器之間共享文件。Kubernetes Volume就是來解決這兩個(gè)問題的。
從本質(zhì)上講,卷只是一個(gè)目錄,可能包含一些數(shù)據(jù),在Pod中,它可以訪問容器。該目錄是如何形成的、支持它的介質(zhì)是什么以及它的內(nèi)容,是由所使用的特定卷類型決定的。
Kubernetes卷具有明確的生命周期,與創(chuàng)建它的Pod的生命周期相同??偠灾粋€(gè)卷超過了在Pod中運(yùn)行的任何容器,并且在容器重啟時(shí)保留了數(shù)據(jù)。通常,當(dāng)一個(gè)Pod不再存在時(shí),卷也將不復(fù)存在。Kubernetes支持多種類型的卷,并且Pod可以同時(shí)使用任意數(shù)量的卷。
命名空間
Kubernetes支持由同一物理集群支持的多個(gè)虛擬集群。這些虛擬集群稱為命名空間。
命名空間提供了名稱范圍。在一個(gè)命名空間內(nèi),每個(gè)資源名稱都需要是唯一的,不過跨命名空間時(shí)就沒有這種要求了。
沒有必要只是為了分離略有不同的資源而使用多個(gè)命名空間,比如說同一軟件的不同版本:可以用標(biāo)簽來區(qū)分同一命名空間內(nèi)的不同資源。
ReplicaSet
ReplicaSet確保一次運(yùn)行指定數(shù)量的pod副本。換句話說,ReplicaSet確保pod或同類pod組始終可用。但是,Deployment是一個(gè)更高級別的概念,它可以管理ReplicaSets,并為Pods提供聲明性更新以及許多其他有用的功能。因此,除非您需要自定義更新編排或根本不需要更新,否則我建議您使用Deployments而不是直接使用ReplicaSets。
這實(shí)際上意味著您可能永遠(yuǎn)不需要直接操縱ReplicaSet對象,而是可以使用Deployment作為替代。
Deployment
Deployment controller為Pods和ReplicaSets提供聲明性更新。
您在Deployment對象中描述了所需狀態(tài),Deployment controller就將以受控速率將現(xiàn)階段實(shí)際狀態(tài)更改為所需狀態(tài)。您可以定義Deployments來創(chuàng)建新的ReplicaSets,或刪除現(xiàn)有的Deployments并使用新的Deployments來使用所有資源。
StatefulSets
StatefulSet用于管理有狀態(tài)應(yīng)用程序,它管理一組Pods的部署和擴(kuò)展,并提供有關(guān)這些Pod 的排序和唯一性的保證。
StatefulSet的運(yùn)行模式和controller相同。您可以在StatefulSet對象中定義所需的狀態(tài),StatefulSet controller就會進(jìn)行各種必要的更新以從當(dāng)前狀態(tài)到達(dá)更新為所需狀態(tài)。和Deployment類似,StatefulSet管理那些基于相同容器規(guī)范的Pods。與Deployment不同的是,StatefulSet為每個(gè)Pods保留一個(gè)粘性身份。這些Pods是根據(jù)相同的規(guī)范創(chuàng)建的,但不可互換:每個(gè)都有一個(gè)永久的標(biāo)識符,不論如何重新調(diào)度,這個(gè)標(biāo)識都保持不變。
DaemonSet
DaemonSet確保所有(或某些)節(jié)點(diǎn)運(yùn)行Pod的副本。隨著節(jié)點(diǎn)添加到群集中,Pod會隨之添加。當(dāng)將節(jié)點(diǎn)從集群中刪除后,Pods就成為了垃圾。此時(shí),刪除一個(gè)DaemonSet就將清理它所創(chuàng)建的Pods。
DaemonSet的一些典型用途有:
在每個(gè)節(jié)點(diǎn)上運(yùn)行集群存儲daemon,例如glusterd、ceph。
在每個(gè)節(jié)點(diǎn)上運(yùn)行日志收集daemon,例如fluentd或logstash。
在每個(gè)節(jié)點(diǎn)上運(yùn)行節(jié)點(diǎn)監(jiān)控daemon,例如Prometheus Node Exporter或collectd。
Job
job創(chuàng)建一個(gè)或多個(gè)pod,并確保在需要的時(shí)候成功終止指定數(shù)量的pod。Pods成功完成后,job會追蹤順利完成的情況。當(dāng)達(dá)到指定數(shù)量時(shí),job本身的任務(wù)就完成了。刪除Job將清除它所創(chuàng)建的Pods。
一個(gè)簡單的例子是創(chuàng)建一個(gè)Job對象,以便可靠地運(yùn)行一個(gè)對象Pod。如果第一個(gè)Pod失敗或被刪除(例如由于節(jié)點(diǎn)硬件故障或節(jié)點(diǎn)重啟),那么該Job對象將啟動一個(gè)新Pod。
實(shí)際操作中的挑戰(zhàn)
現(xiàn)在您已經(jīng)了解了Kubernetes中的關(guān)鍵對象及概念了,很明顯,想要玩轉(zhuǎn)Kubernetes需要了解大量的信息。當(dāng)你嘗試使用Kubernetes時(shí),可能會遇到如下挑戰(zhàn):
如何在不同的基礎(chǔ)架構(gòu)中一致地部署?
如何跨多個(gè)集群(和名稱空間)實(shí)現(xiàn)和管理訪問控制?
如何與中央身份驗(yàn)證系統(tǒng)集成?
如何分區(qū)集群以更有效地使用資源?
如何管理多租戶、多個(gè)專用和共享集群?
如何創(chuàng)建高可用集群?
如何跨集群/命名空間實(shí)施安全策略?
如何良好地進(jìn)行監(jiān)控,以確保有足夠的可見性來檢測和解決問題?
如何跟上Kubernetes快速發(fā)展的步伐?
這就是Rancher可以幫助您的地方。Rancher是一個(gè)100%開源的容器管理平臺,用于在生產(chǎn)中運(yùn)行Kubernetes。通過Rancher,你可以:
擁有易于使用的kubernetes配置和部署界面;
跨多個(gè)集群和云的基礎(chǔ)架構(gòu)管理;
自動部署最新的kubernetes版本;
工作負(fù)載、RBAC、政策和項(xiàng)目管理;
24x7企業(yè)級支持。
Rancher可以成為一個(gè)單一控制點(diǎn),而您可以在多種、多個(gè)基礎(chǔ)架構(gòu)上運(yùn)行多個(gè)Kubernetes集群:
上手Rancher和Kubernetes
現(xiàn)在讓我們看看如何在Rancher的幫助下輕松使用前文描述的Kubernetes對象。首先,您需要一個(gè)Rancher實(shí)例。按照本指南,在幾分鐘之內(nèi)即可啟動一個(gè)Rancher實(shí)例并使用它創(chuàng)建一個(gè)Kubernetes集群:
https://rancher.com/docs/rancher/v2.x/en/quick-start-guide/deployment/quickstart-manual-setup/
啟動集群后,您應(yīng)該在Rancher中看到Kubernetes集群的資源:
要從第一個(gè)Kubernetes對象——節(jié)點(diǎn)開始,請單擊頂部菜單上的Nodes。你應(yīng)該可以組成了你的Kubernetes集群的Nodes的整體情況:
在那里,您還可以看到已從Kubernetes集群部署到每個(gè)節(jié)點(diǎn)的pod的數(shù)量。這些pod由Kubernetes和Rancher內(nèi)部系統(tǒng)使用。通常情況下你不需要處理那些。
下面讓我們繼續(xù)Pod的例子。要做到這一點(diǎn),轉(zhuǎn)到Kubernetes集群的Default項(xiàng)目,然后進(jìn)入Workloads選項(xiàng)卡。下面讓我們部署一個(gè)工作負(fù)載。點(diǎn)擊Deploy并將Name和Docker image設(shè)置為nginx,剩下的一切都使用默認(rèn)值,然后點(diǎn)擊Launch。
創(chuàng)建后,Workloads選項(xiàng)卡會顯示nginx工作負(fù)載。
如果單擊nginx工作負(fù)載,您將會看到Rancher實(shí)際創(chuàng)建了一個(gè)Deployment,就像Kubernetes推薦的那樣用來管理ReplicaSet,您還將看到該ReplicaSet創(chuàng)建的Pod:
現(xiàn)在你有一個(gè)Deployment,它將確保我們所需的狀態(tài)在集群中正確顯示?,F(xiàn)在,點(diǎn)擊Scale附近+號,將此Workload擴(kuò)容到3。一旦你這樣做,你應(yīng)該能立即看到另外2個(gè)Pods被創(chuàng)建出來,另外還多了2個(gè)ReplicaSet來縮放事件。使用Pod右側(cè)菜單,嘗試刪除其中一個(gè)pod,并注意ReplicaSet是如何重新創(chuàng)建它以匹配所需狀態(tài)的。
現(xiàn)在,您的應(yīng)用程序已啟動并運(yùn)行,并且已經(jīng)擴(kuò)展到3個(gè)實(shí)例。下一個(gè)問題是,您如何訪問它?在這里,我們將嘗試使用下一個(gè)Kubernetes對象——服務(wù)。為了暴露我們的nginx工作負(fù)載,我們需要先編輯它,從Workload右側(cè)菜單中選擇Edit。您將看到Deploy Workload頁面,且已填好了您的nginx工作負(fù)載的詳細(xì)信息:
請注意,現(xiàn)在您有3個(gè)pod在Scalable Deployment旁邊,但是當(dāng)您啟動時(shí),默認(rèn)值為1。這是因?yàn)槟愕臄U(kuò)展工作剛完成不久。
現(xiàn)在單擊Add Port,并按如下所示填充值:
將Publish the container port值設(shè)置為80;
Protocol仍為TCP;
將As a值設(shè)置為Layer-4 Load Balancer;
將On listening port值設(shè)置為80。
然后自信地點(diǎn)擊Upgrade吧!這將在您的云提供商中創(chuàng)建一個(gè)外部負(fù)載均衡器,并將流量引至您的Kubernetes集群內(nèi)的nginx Pods中。要對此進(jìn)行測試,請?jiān)俅卧L問nginx工作負(fù)載概述頁面,現(xiàn)在您應(yīng)該看到Endpoints旁的80/tcp鏈接:
如果點(diǎn)擊80/tcp,它會導(dǎo)向您剛剛創(chuàng)建的負(fù)載均衡器的外部IP,并且向您展示一個(gè)默認(rèn)的nginx頁面,確認(rèn)一切都按預(yù)期正常工作。
至此,你已經(jīng)搞定了上半篇文章中介紹的大多數(shù)Kubernetes對象。你可以在Rancher中好好玩玩卷和命名空間,相信您一定能很快掌握如何通過Rancher更簡單快捷地使用它們。至于StatefulSet、DaemonSet和Job,它們和Deployments非常類似,你同樣可以在Workloads選項(xiàng)卡中通過選擇Workload type來創(chuàng)建它們。
結(jié) 語
讓我們回顧一下你在上面的動手練習(xí)中所做的一切。你已經(jīng)創(chuàng)建了我們描述的大多數(shù)Kubernetes對象:
1、最開始,你在Rancher中創(chuàng)建了kubernetes集群;
2、然后你瀏覽了集群的Nodes;
3、你創(chuàng)造了一個(gè)Workload;
4、你已經(jīng)看到了一個(gè)Workload實(shí)際上創(chuàng)建了3個(gè)獨(dú)立的Kubernetes對象:一個(gè)Deployment管理著 ReplicaSet,同時(shí)按需保持著所需數(shù)量的Pods正常運(yùn)行;
5、在那之后你擴(kuò)展了你的Deployment數(shù)量,并觀察它是如何改變了ReplicaSet并相應(yīng)地?cái)U(kuò)展Pods的數(shù)量的;
6、最后你創(chuàng)建了一個(gè)Load Balancer類型的Service類型,用于平衡Pods之間的客戶端請求。
到此,關(guān)于“有關(guān)Kubernetes的詳細(xì)介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。