Kubernetes 提供稱(chēng)為 Pod 的基本資源。Pod 是 Kubernetes 中最小的可部署單元,它實(shí)際上是容器的包裝器。它可以有一個(gè)或多個(gè)容器,共享存儲(chǔ)/網(wǎng)絡(luò),以及如何運(yùn)行容器的規(guī)范。
Kubernetes 是一個(gè)開(kāi)源編排系統(tǒng),用于自動(dòng)部署、擴(kuò)展和管理容器化應(yīng)用程序。
Kubernetes 提供稱(chēng)為 Pod 的基本資源。Pod 是 Kubernetes 中最小的可部署單元,它實(shí)際上是容器的包裝器。它可以有一個(gè)或多個(gè)容器,共享存儲(chǔ)/網(wǎng)絡(luò),以及如何運(yùn)行容器的規(guī)范。
Pod 被認(rèn)為是短暫的實(shí)體。如果 pod 被調(diào)度到的節(jié)點(diǎn)死亡,那么該 pod 將在超時(shí)后被刪除重新調(diào)度。
一個(gè) pod 代表 Kubernetes 中的一個(gè)單元。對(duì)于水平擴(kuò)展(例如運(yùn)行多個(gè)實(shí)例),應(yīng)用程序需要多個(gè) pod。復(fù)制 pod 以實(shí)現(xiàn)水平縮放。復(fù)制的 pod 是通過(guò)Controllers創(chuàng)建和管理的。
用于 Pod 副本管理的 Controller
1. Deployment
Deployment 是部署應(yīng)用程序最簡(jiǎn)單和最常用的資源。它管理 ReplicaSet 的部署。您可以定義 Deployment 以更新、創(chuàng)建新的 ReplicaSet 或刪除現(xiàn)有部署。Deployment 的主要作用是為 pod 和 ReplicaSet 提供聲明式更新。
Deployment 可幫助您實(shí)現(xiàn)以下目標(biāo):
推出 ReplicaSet —它將在后臺(tái)創(chuàng)建 pod。您可以檢查推出的狀態(tài)以檢查它是否成功。
聲明 pod 的新?tīng)顟B(tài) —您可以更新部署清單的 PodTemplateSpec。一個(gè)新的 ReplicaSet 被創(chuàng)建,部署以受控的速率將 Pod 從舊的 ReplicaSet 移動(dòng)到新的 ReplicaSet。現(xiàn)在,每個(gè)新的 ReplicaSet 都將具有部署的更新版本。
回滾到較早的部署修訂版——如果由于某些情況,當(dāng)前狀態(tài)不穩(wěn)定,則可以將部署回滾到較早的部署修訂版。
Deployment 不提供什么?
它不為 pod 提供標(biāo)識(shí)符。
它不為 pods 提供存儲(chǔ),因此它僅用于無(wú)狀態(tài)應(yīng)用程序(那些不關(guān)心正在使用哪個(gè)網(wǎng)絡(luò),并且不需要任何永久存儲(chǔ)的應(yīng)用程序。例如,Apache、Nginx、Tomcat 等 Web 服務(wù)器)。
2. StatefulSet
它是一種 Kubernetes 資源,用于管理有狀態(tài)的應(yīng)用程序。它管理一組 Pod 的部署和擴(kuò)展,并提供 Pod 的順序和唯一性的保證。
與 Deployment 不同,StatefulSet 為每個(gè) pod 維護(hù)一個(gè)身份。每個(gè) pod 都有一個(gè)持久標(biāo)識(shí)符,它在任何調(diào)度中都保持不變。
例如,如果您創(chuàng)建一個(gè)名稱(chēng)為flag的 StatefulSet,它將創(chuàng)建一個(gè)名稱(chēng)為 flag-0 的 pod,并且對(duì)于 StatefulSet 的多個(gè)副本,pod 名稱(chēng)將遞增,如 flag-0、flag-1、flag- 2 等。
每個(gè)節(jié)點(diǎn)都有自己的Persistent Volume。如果刪除或縮小 pod,與它們關(guān)聯(lián)的卷將不會(huì)被刪除,因此數(shù)據(jù)會(huì)保留。
Deployment 和 StatefulSet 中存儲(chǔ)卷的區(qū)別
Deployment:它用于“無(wú)狀態(tài)應(yīng)用程序”。卷 (PVC) 在 pod 之間共享。由于共享的卷中沒(méi)有數(shù)據(jù),因此會(huì)導(dǎo)致數(shù)據(jù)泄露問(wèn)題。
StatefulSet:用于“有狀態(tài)的應(yīng)用程序”。PVC 將在其中存儲(chǔ)信息,這將導(dǎo)致所有 pod 之間的信息共享。
在 Deployment 和 StatefulSet 中使用 PVC
在訪問(wèn)模式的幫助下,PVC 可以跨 Deployment 和 StatefulSet 使用。有 3 種訪問(wèn)模式,即:
ReadWriteOnce:將卷掛載為單個(gè)節(jié)點(diǎn)的讀寫(xiě)。
ReadOnlyMany:將卷以只讀方式安裝到許多節(jié)點(diǎn)。
ReadWriteMany:將卷掛載為許多節(jié)點(diǎn)的讀寫(xiě)。
Deployment
當(dāng)為 Deployment 指定 PVC 時(shí),它會(huì)在所有副本 pod 之間共享。在這種情況下,PVC 必須具有 ReadWriteMany 或 ReadOnlyMany 訪問(wèn)模式(ReadWriteMany 很少見(jiàn),只有少數(shù)存儲(chǔ)提供商支持)。
如果使用 ReadWriteOnce 訪問(wèn)模式創(chuàng)建 PVC,然后嘗試創(chuàng)建運(yùn)行一個(gè)有狀態(tài)應(yīng)用程序,可以正常工作。如果橫向擴(kuò)容,當(dāng)一個(gè)新的 pod 啟動(dòng)時(shí),會(huì)收到一個(gè)錯(cuò)誤,指出該卷已在使用中。
因此,在這種情況下,最好使用只讀卷來(lái)避免錯(cuò)誤。
StatefulSet
當(dāng)為 StatefulSet 指定 PVC 時(shí),必須確保 PVC 具有ReadWriteOnce訪問(wèn)模式。
使用 StatefulSet,定義一個(gè) VolumeClaimTemplate,會(huì)自動(dòng)為每個(gè)副本創(chuàng)建一個(gè) PVC。
另一個(gè)好處是,將擁有一個(gè)定義應(yīng)用程序和持久卷的文件。它將進(jìn)一步增強(qiáng)應(yīng)用程序的可擴(kuò)展性。