Kubernetes是一個可移植、可擴充套件的開源平臺,用於管理容器化的工作負載和服務,有助於宣告式配置和自動化。目前,Kubernetes正在以強勁的勢頭持續發展,其相關的生態也在不斷完善。本文中,我們列出了所有Kubernetes入門者對於部署和管理Kubernetes容器不得不關注的17個方面。

1、 設定Kubernetes叢集

Kubernetes有多個開源元件組合而成,這些元件由不同的公司開發,這給使用Kubernetes增加了難度——因為難以找到所有相關的軟體包,而且難以安裝、配置。幸運的是,市場上有一些解決方案和工具可以讓Kubernetes叢集高效執行。因此,強烈推薦您使用類似的工具在您的環境中設定Kubernetes叢集,如企業級的Kubernetes管理平臺Rancher等。

2、透過CLI或RESTful API使用K8S

現在你可以開始在Kubernetes上建立不同型別的資源。為了在微服務架構中實現您的應用程式,深入瞭解Kubernetes命令列介面(CLI)將有助於理解Kubernetes資源並加以整合。當您在Kubernetes中部署應用程式之後,您可以進行可擴充套件且高效的容器管理,還可以完成微服務的DevOps交付過程。

無論是使用CLI還是API(RESTful),都能讓使用Kubernetes變得輕鬆。當您安裝了Kubernetes master之後,您可以執行一個kubectl 命令列來檢視系統版本或進行其他互動。Kubectl是Kubernetes唯一的命令列工具,它可以控制Kubernetes叢集管理器。任何叢集或Kubernetes叢集的操作都能夠透過kubectl命令列執行。此外,kubectl允許透過命令列的可選引數或檔案(使用-f選項)輸入資訊。

關於kubectl的基礎介紹以及詳細教程,可參見以下文章:

使用Kubectl管理Kubernetes的全解教程

你一定會用到的7條kubectl命令

3、 連結Pod和容器

Pod是一組包含一個或多個容器,還是Kubernetes中最小的部署單元。Pod始終位於同一位置、統一排程,並在共享上下文中執行。每個Pod都被以下Linux名稱空間隔離:程序 ID(PID)名稱空間、網路名稱空間、程序間通訊(IPC)名稱空間、Unix時間共享(UTS)名稱空間。在容器出現之前,它們將在同一物理機或虛擬機器上執行。構建混合了不同Docker映象的應用程式堆疊pod(如,web伺服器和資料庫)十分有用。

為了能夠提升資源的利用率,Kubernetes提供了一個強大的功能,它能在執行的服務上進行編碼並配置彈性伸縮,這一功能稱為Pod水平自動擴充套件(HPA)。在Rancher 2。3中,已經集成了HPA功能,使用者可以透過Rancher UI使用。關於HPA的詳細內容,可參見以下文章:

如何為Kubernetes配置Pod水平自動擴充套件

kubectl+HPA!提升K8S容器資源利用的關鍵解決方案

4、 使用ReplicaSets管理Pod

ReplicaSet是Kubernetes中用於引用Pod副本的API物件的術語。它主要的目的是控制一組Pod的行為。ReplicaSet可以保證執行使用者所指定的數量Pod。如果ReplicaSet中的某些Pod崩潰並終止,系統將在執行狀況良好的節點上自動使用初始配置重新建立Pod,並且保持一定數量的程序在持續執行。在更改一組Pod規模時,使用者可以輕鬆地伸縮應用程式。根據這一特性,無論是否需要Pod的副本,都可以始終依靠ReplicaSet來實現自動恢復和彈性伸縮。

5、 Deployment API

早在Kubernetes 1。2版本的時候就引入了Deployment API,它可以更加方便地管理Pod和ReplicaSet。透過Replication Controller進行滾動更新和回滾的功能是透過客戶端(kubectl命令和REST API)實現的,kubectl在更新replication controller時需要保持連線。另一方面,deployment負責伺服器端的滾動更新和回滾過程。接受該請求後,客戶端可以立即斷開連線。因此,Deployment API被設計為管理ReplicaSet物件的高階API。

6、 使用服務

網路服務用於接收請求並提供解決方案,客戶端透過網路連線訪問服務,他們不必知道服務的架構或其執行方式。客戶端唯一需要驗證的是是否可以訪問服務的端點,然後遵循其使用策略來獲取伺服器的響應。Kubernetes服務也與其類似,它是一種為一組功能相同的pod提供單一不變的接入點的資源。當服務存在時,它的IP地址和埠不會改變。客戶端透過IP地址和埠號建立連線,這些連線會被路由到提供該服務的任意一個pod上。透過這種方式,客戶端不需要知道每個單獨的提供服務的pod的地址,這樣這些pod就可以在叢集中隨時被建立或移除。

7、 使用volumes

容器中的檔案是臨時檔案,當容器終止時,檔案就會消失。Docker引入了資料volume來幫助我們持久化儲存資料。然而,當涉及到多個主機時,作為一個容器叢集,很難管理所有容器和主機之間的分享檔案和動態配置volume。因此Kubernetes也引入了volume,它與Pod的生命週期相同,但與容器的生命週期無關。換言之,當容器終止或重啟時,volume中的資料也不會丟失。Kubernetes中提供了十分豐富的volume型別,如emptyDir等。

如果你想了解更多關於Volume的內容,歡迎參考以下文章:

超長乾貨講透3種K8S儲存:emptyDir、hostPath、local

深入淺出聊聊Kubernetes儲存(一):詳解Kubernetes儲存關鍵概念

深入淺出聊聊Kubernetes儲存(二):搞定持久化儲存

8、 使用Storage Class

在雲計算領域中,人們動態地配置儲存或資料volume。雖然PersistentVolumeClaim是基於管理員提供的現有靜態PersistentVolume,但如果可以在需要時動態請求cloud volume,則也許會有幫助。Storage Class可以解決這一問題。想要讓Storage Class可以在叢集中使用,需要滿足3個條件。首先,必須啟動DefaultStorageClass准入控制器;然後,PersistentVolumeClaim需要請求一個儲存類;最後,管理員必須配置Storage Class才能使動態配置工作。

如果你想了解關於Storage Class的更多內容,請參考以下文章:

深入淺出聊聊Kubernetes儲存(一):詳解Kubernetes儲存關鍵概念

9、 使用Secret

Kubernetes Secret使用key-value格式編碼的值來管理資訊,這些資訊可以是密碼、訪問金鑰或token。使用Secret,使用者無需擔心會在配置檔案中公開敏感資料,它可以降低憑據洩露的風險,並使我們的資源配置更加井井有條。目前,有三種類型的Secret:

Generic/Opaque

Docker registry

TLS

Generic/Opaque是在應用程式中預設使用的secret型別。Docker registry型別可用於儲存私密Docker registry的憑據。TLS secret用於儲存CA證書以進行叢集管理。Kubernetes為用於訪問API伺服器的憑據建立內建的Secret。

在使用Secret之前,我們必須牢記,應在依賴於它的任何Pod之前建立secret,以便pod能夠正確引用它。此外,Secret大小限制為1MB。因此Secret不是為儲存大量資料而設計的。對於配置資料,請考慮使用ConfigMaps;對於大量非敏感資料,請考慮使用Volume。

10、 使用名稱

建立任何Kubernetes物件(例如Pod、Deployment和Service)時,可以為其分配名稱。在Kubernetes中,每個空間的名稱是唯一的,也就是說您不能在Pod中分配相同的名稱。Kubernetes的命名規則如下:

最多253個字元

小寫字母和數字字元

中間可以包含特殊字元,但只能包含破折號(-)和點(。)

11、 使用名稱空間

在Kubernetes叢集中,資源名稱是名稱空間中唯一識別符號。使用Kubernetes名稱空間可以為同一叢集中的不同環境分隔使用者空間。它使您可以靈活地建立隔離環境並將資源分配給不同的專案和團隊。您可以將名稱空間視為虛擬叢集。Pod、服務和Deployment都可以包含在某個名稱空間中。某些低階資源(如節點、persistentVolumes)則不屬於任何名稱空間。在深入研究資源名稱空間之前,讓我們先了解kubeconfig和一些關鍵概念。

Kubeconfig用於呼叫配置Kubernetes叢集訪問許可權的檔案。作為系統的初始配置,Kubernetes將$HOME/。kube/config作為kubeconfig檔案。

Kubeconfig定義了使用者、叢集和上下文:kubeconfig列出了多個用於定義身份認證的使用者,以及多個用於指示Kubernetes API伺服器的叢集。另外,kubeconfig中的上下文由一個使用者和一個叢集組合而成:使用某種身份認證可以訪問特定的Kubernetes叢集。

使用者和叢集可以在上下文之間共享,但是每個上下文只能有一個使用者和一個叢集。

名稱空間可以附加到上下文:可以將每個上下文分配給現有的名稱空間,如果不存在,它將與預設名稱空間一起使用。

當前上下文是客戶端的預設環境:kubeconfig中可能有多個上下文,但當前上下文只有1個。當前上下文和附加的名稱空間將為使用者構建預設的計算環境。

現在你應該瞭解,因為名稱空間可以與kubeconfig一起使用,所以使用者可以透過切換kubeconfig中的當前上下文輕鬆切換預設資源。但是,使用者仍可以使用指定資源啟動其他名稱空間中的任何資源。

關於名稱空間的更多內容,歡迎參考以下文章:

超長乾貨 | Kubernetes名稱空間詳解

12、 使用標籤(label)和selector

標籤是一組鍵/值對,它們會附加到物件元資料。我們可以使用標籤來選擇、組織和分組物件,例如Pod、ReplicaSets和服務。標籤不一定是唯一的,物件可以帶有相同的標籤集。Label selector用於查詢具有以下型別標籤的物件:

基於等式(Equality-based):

使用等於(=或==)或非等於(!=)運算子

基於集合(Set-based):

使用或不使用運算子

13、 彈性伸縮您的容器

根據預定義的標準來伸縮應用程式或服務是一種最有效地最大程度利用計算資源地常用方法。在Kubernetes中,您可以手動伸縮,也可以使用HPA進行自動彈性伸縮。

關於彈性伸縮的更多內容,歡迎查閱以下文章:

6個與彈性伸縮、排程相關的Kubernetes附加元件

14、 更新執行中的容器

為了讓容器執行良好,我們可以透過執行最新的映象輕鬆釋出新程式,並減輕環境設定的麻煩。但是,如何在正在執行的容器上釋出程式呢?在本地管理容器時,我們必須先停止正在執行的容器,然後再啟動具有最新映象和相同配置的新容器。此外,還有一些簡單有效的方法可以在Kubernetes中更新程式。一種稱為滾動更新,這意味著Deployment可以更新其Pod,而不會導致客戶端停機。另一種方法稱為recreate,它只是終止所有Pod,然後建立一個新的集合。

15、 轉發容器埠

您應該學習如何與Kubernetes服務一起在內部和外部轉發容器埠。另外,您需要了解Kubernetes處理內部和外部通訊的方法,在Kubernetes中有4種網路模型:

容器到容器的通訊

Pod到Pod的通訊

Pod到服務的通訊

外部到內部的通訊

如果你想了解更多關於Kubernetes通訊或網路模型的內容,歡迎參考以下文章:

四大模型,搞定Kubernetes網路!

如何在Kubernetes中Pod間共享記憶體以實現高效能通訊?

在Kubernetes環境中,容器間如何進行網路通訊?

16、 在Kubernetes上提交Job

您的容器應用程式不僅適用於諸如nginx之類的守護程序,還適用於某些批處理job,這些job最終會在任務完成時退出。Kubernetes支援這種情況:您可以提交一個容器作為job,而Kubernetes將分派到適當的節點並執行您的job。

17、 使用配置檔案

Kubernetes支援兩種不同的檔案格式,YAML和JSON。每種格式都可以描述Kubernetes的相同功能。

在這篇文章中,我們列出了對於Kubernetes初學者來說,17個十分重要的方面。並儘可能地給出更詳細的教程連結,希望可以幫助你梳理Kubernetes的整體學習架構,也希望能夠讓你可以系統地入門Kubernetes。

Enjoy your sail!

文章來源:RancherLabs