這是本節的多頁可打印視圖。 點擊此處打印.
文件
- 1: Kubernetes 文件
- 1.1: 可用的文件版本
- 2: 快速入門
- 3: 教學
- 3.1: Hello Minikube
- 3.2: 學習 Kubernetes 基礎
- 3.3: 配置
- 3.3.1: 使用 ConfigMap 設定 Redis
- 3.4: 叢集管理
- 3.4.1: 使用 DRA 安裝驅動程式並配置裝置
- 4: 參考
- 4.1: 詞彙表
1 - Kubernetes 文件
1.1 - 可用的文件版本
本網站包含 Kubernetes 現行版本與前 4 個版本的說明文件。
Kubernetes 各版本文件的提供情況,與該版本是否仍受支援是兩回事。 請參閱支援週期了解哪些版本的 Kubernetes 受官方支援,以及它的期限。
2 - 快速入門
本節介紹設定與執行 Kubernetes 的各種方式。 安裝 Kubernetes 時,應依據維護難易度、安全性、控制程度、可用資源,以及操作與管理叢集所需的專業能力,選擇適合的安裝方式。
你可以下載 Kubernetes,並將 Kubernetes 叢集部署於本機、雲端,或自有資料中心。
部分 Kubernetes 組件,例如 kube-apiserver 或 kube-proxy,也可以在叢集中以容器映像檔的形式部署。
建議在可行的情況下,將 Kubernetes 組件以容器映像檔的形式執行,並交由 Kubernetes 管理這些組件。 負責執行容器的組件(例如 kubelet)則不適用於此類方式。
若不希望自行管理 Kubernetes 叢集,可以選擇受管服務(managed service),包括經認證的平台。 此外,在各種雲端與裸機環境中,也有多種標準化或客製化的解決方案可供選擇。
學習環境
如果您正在學習 Kubernetes,請使用 Kubernetes 社群支援的工具, 或生態系中的工具,在本機電腦上建立 Kubernetes 叢集。 請參閱學習環境。
正式環境
在評估正式環境的解決方案時, 請考慮在操作 Kubernetes 叢集(或相關抽象)時,哪些部分要自行管理,哪些部分交由提供者處理。
對於自行管理的叢集,官方支援用於部署 Kubernetes 的工具是 kubeadm。
接下來
- 下載 Kubernetes
- 下載並安裝工具,包括
kubectl - 為新叢集選擇容器執行階段
- 了解叢集設定的最佳實務
Kubernetes 的設計是讓其控制平面在 Linux 上運作。 在叢集中,您可以在 Linux 或其他作業系統(包括 Windows)上執行應用程式。
2.1 - 學習環境
如果您正在學習 Kubernetes,您需要一個練習的環境。本頁面將介紹建立 Kubernetes 環境的各種方式,讓您可以進行實驗與學習。
安裝 kubectl
在建立叢集之前,您需要 kubectl 命令列工具。此工具能讓您與 Kubernetes 叢集通訊,並執行指令。
有關安裝說明,請參閱安裝並設定 kubectl。
設定本機 Kubernetes 環境
在本機執行 Kubernetes 能提供您一個安全的學習與實驗環境。您可以隨時建立與移除叢集,而無需擔心成本或影響正式環境。
kind
kind (Kubernetes IN Docker) 使用 Docker 容器作為節點來執行 Kubernetes 叢集。它的設計輕量,專為測試 Kubernetes 本身而打造,也很適合用於學習。
若要開始使用 kind,請參閱 kind 快速入門。
minikube
minikube 可在本機執行單一節點的 Kubernetes 叢集,支援多種容器執行階段,並可在 Linux、macOS 與 Windows 上運作。
若要開始使用 minikube,請參閱 minikube 入門指南。
其他本機選項
以下多個第三方工具也能在本機執行 Kubernetes。Kubernetes 專案不提供這些工具的支援,但它們仍可能適合您的學習需求:
- Docker Desktop 可執行本機 Kubernetes 叢集
- Podman Desktop 可執行本機 Kubernetes 叢集
- Rancher Desktop 在您的電腦上提供 Kubernetes
- MicroK8s 執行輕量級的 Kubernetes 叢集
- Red Hat CodeReady Containers (CRC) 可在本機執行最小化的 OpenShift 叢集(OpenShift 符合 Kubernetes 規範,並通過一致性測試)
有關設定方式與支援資訊,請參閱各工具的文件。
使用線上練習環境
線上 Kubernetes 練習環境讓您無需在電腦上安裝任何軟體,即可體驗 Kubernetes。這些環境可直接在網頁瀏覽器中使用:
- Killercoda 提供互動式 Kubernetes 情境與練習環境
- Play with Kubernetes 在您的瀏覽器中提供一個臨時的 Kubernetes 叢集
這些平台非常適合用於快速實驗,方便您在不需本機設定的情況下跟著教學操作。
使用接近正式環境的叢集來練習
如果您想練習設定更接近正式環境的叢集,可以使用 kubeadm。使用 kubeadm 設定叢集是一項進階任務,需要多台機器(實體或虛擬),並進行仔細的設定。
若想了解有關正式環境的資訊,請參閱正式環境。
說明:
設定接近正式環境的叢集會比上述的學習環境複雜許多。請先從 kind、minikube 或是線上練習環境開始。接下來
- 遵循 Hello Minikube 教學來部署您的第一個應用程式
- 了解 Kubernetes 組件
- 探索 kubectl 指令
2.2 - 正式環境
建立正式環境等級的 Kubernetes 叢集需要事先規劃與準備。 若您的 Kubernetes 叢集需要執行關鍵工作負載,則必須經過適當設定,以具備彈性。 本頁說明如何建立正式環境等級的 Kubernetes 叢集,或將現有叢集調整為可用於正式環境。 若您已熟悉正式環境的設定並只需要相關連結,請直接跳至接下來。
正式環境考量
通常,正式環境中的 Kubernetes 叢集,相較於個人學習、開發或測試環境,會有更多需求。 正式環境可能需要支援多位使用者安全存取、維持穩定的可用性,以及具備因應需求變化的資源。
在決定正式 Kubernetes 環境的部署位置(本地部署或雲端),以及您希望自行管理或交由他人管理的程度時, 請考慮以下因素如何影響您對 Kubernetes 叢集的需求:
- 可用性:單一機器的 Kubernetes 學習環境
存在單點故障的問題。建立高可用叢集時需要考慮:
- 將控制平面與工作節點分開部署。
- 在多個節點上部署控制平面組件的副本
- 對叢集的 API 伺服器 流量進行負載平衡。
- 確保有足夠的工作節點可用,或能在工作負載需求變化時快速擴充。
- 規模:若您預期正式 Kubernetes 環境的需求量維持穩定,或許可以一次性完成所需的容量規劃。 但若您預期需求會隨時間成長,或因季節性或特殊活動等因素而大幅波動, 則需要規劃如何進行擴展,以因應控制平面與工作節點因請求增加所帶來的壓力,或縮減規模以減少閒置資源。
- 安全性與存取管理:在自己的 Kubernetes 學習叢集上,您擁有完整的管理員權限。 但對於承載重要工作負載且有多位使用者的共用叢集,則需要更精細的機制來控管哪些使用者或程序可以存取叢集資源。 您可以使用角色型存取控制(RBAC)及其他安全機制, 確保使用者與工作負載能夠取得所需的資源,同時維持工作負載及叢集本身的安全性。 您可以透過管理政策及 容器資源, 來限制使用者與工作負載可存取的資源。
在自行建立 Kubernetes 正式環境之前,請考慮將部分或全部工作交由雲端整合解決方案提供商 或其他 Kubernetes 合作夥伴處理。可選的方案包括:
- 無伺服器:直接在第三方提供的基礎設施上執行工作負載,無需管理叢集。 費用依 CPU 使用量、記憶體及磁碟請求等計算。
- 受管理的控制平面:由提供商負責管理叢集控制平面的規模與可用性,並處理修補程式和升級作業。
- 受管理的工作節點:設定節點池以符合您的需求,提供商確保節點保持可用, 並在需要時能夠執行升級。
- 整合:部分提供商可將 Kubernetes 與其他所需服務整合, 例如儲存、映像檔儲存庫、身分驗證機制和開發工具。
無論您是自行建立正式 Kubernetes 叢集,或與合作夥伴合作, 請參閱以下章節,以評估與叢集的控制平面、工作節點、使用者存取 及工作負載資源相關的需求。
正式叢集設定
在正式環境等級的 Kubernetes 叢集中,控制平面透過可分散部署於多台電腦上的服務來管理叢集。 每個工作節點則代表一個設定為執行 Kubernetes Pod 的獨立實體。
正式環境控制平面
最簡單的 Kubernetes 叢集是將完整的控制平面和工作節點服務都執行在同一台機器上。 您可以透過新增工作節點來擴展該環境,如 Kubernetes 組件中的示意圖所示。 若叢集僅需在短時間內可用,或在出現嚴重問題時可以直接捨棄,這樣的設定可能已足以滿足您的需求。
但若您需要更持久、高可用的叢集,則應考慮擴展控制平面的方式。 根據設計,執行在單台機器上的控制平面服務並非高可用的。 若維持叢集持續運作、確保出問題時能夠修復對您而言很重要,請考慮以下步驟:
- 選擇部署工具:您可以使用 kubeadm、kops 和 kubespray 等工具來部署控制平面。 請參閱使用部署工具安裝 Kubernetes, 了解如何使用各種部署方法建立正式環境等級的叢集。 您的部署也可以搭配不同的容器執行階段。
- 管理憑證:控制平面服務之間的安全通訊是透過憑證來實現的。 憑證會在部署期間自動產生,或您也可以使用自己的憑證授權機構來產生。 詳情請參閱 PKI 憑證與需求。
- 為 API 伺服器設定負載平衡器:設定負載平衡器, 將外部 API 請求分散至執行於不同節點上的 apiserver 服務實例。 詳情請參閱建立外部負載平衡器。
- 分離並備份 etcd 服務:etcd 服務可以與其他控制平面服務部署於相同的機器上, 也可以部署於獨立的機器上,以提升安全性與可用性。 由於 etcd 儲存叢集的設定資料,應定期備份 etcd 資料庫,以確保在需要時能夠進行修復。 關於設定與使用 etcd 的詳情,請參閱 etcd FAQ。 更多細節請參閱為 Kubernetes 操作 etcd 叢集 及使用 kubeadm 建立高可用 etcd 叢集。
- 建立多個控制平面系統:為了實現高可用性,控制平面不應受限於單一機器。 若控制平面服務由 init 服務(例如 systemd)執行,每個服務至少應在三台機器上執行。 不過,將控制平面服務以 Pod 的方式在 Kubernetes 中執行, 可以確保所需的服務副本數量始終可用。 排程器應具備容錯能力,但不需要具備高可用性。 某些部署工具會使用 Raft 共識演算法進行 Kubernetes 服務的領導者選舉。 若主要服務失效,其他服務會自行選舉並接管。
- 跨多個可用區部署:若確保叢集隨時可用至關重要, 請考慮建立跨多個資料中心的叢集(在雲端環境中稱為可用區)。 多個可用區的集合稱為區域。 將叢集分散至同一區域的多個可用區,可以提高在某個可用區發生故障時叢集仍能持續運作的可能性。 詳情請參閱在多個可用區中執行。
- 持續維護叢集:若您計劃長期維護叢集,需要執行一些工作來維持其健康與安全。 例如,若您使用 kubeadm 安裝,有相關指示可協助您完成 憑證管理 及升級 kubeadm 叢集。 如需更完整的 Kubernetes 管理任務清單,請參閱管理叢集。
如需了解執行控制平面服務時的可用選項,請參閱 kube-apiserver、 kube-controller-manager 及 kube-scheduler 組件參考頁面。 如需高可用控制平面的範例,請參閱 高可用拓撲選項、 使用 kubeadm 建立高可用叢集 及為 Kubernetes 操作 etcd 叢集。 關於 etcd 備份計畫,請參閱 備份 etcd 叢集。
正式工作節點
正式環境等級的工作負載需要具備彈性,其所依賴的組件(例如 CoreDNS)也需要具備彈性。 無論您是自行管理控制平面,或由雲端提供者代為管理, 都需要考慮如何管理工作節點(有時也簡稱為節點)。
- 設定節點:節點可以是實體機或虛擬機。若您想自行建立並管理節點,
可以安裝受支援的作業系統,然後部署並執行適當的節點服務。請考慮:
- 在設定節點時,提供符合工作負載需求的記憶體、CPU 及磁碟速度與儲存容量。
- 通用電腦系統是否足夠,或您的工作負載是否需要 GPU 處理器、Windows 節點或 VM 隔離。
- 驗證節點:請參閱有效的節點設定, 了解如何確保節點符合加入 Kubernetes 叢集的需求。
- 將節點加入叢集:若您自行管理叢集,可以透過設定機器並手動加入, 或讓機器自動向叢集的 apiserver 註冊來新增節點。 請參閱節點章節, 了解如何設定 Kubernetes 以這些方式新增節點。
- 擴縮節點:制定擴充叢集容量的計畫,因為叢集最終會需要這項能力。 請參閱大規模叢集的注意事項, 依據需要執行的 Pod 與容器數量來確定所需的節點數量。 若您自行管理節點,這可能意味著需要購買並部署自己的實體設備。
- 自動擴縮節點:請閱讀節點自動擴縮, 了解可自動管理節點及其提供之容量的工具。
- 設定節點健康狀態檢查:對於重要的工作負載,您需要確保節點以及在其上執行的 Pod 都處於健康狀態。 透過使用 Node Problem Detector 常駐程式, 您可以確保節點維持健康。
正式環境使用者管理
在正式環境中,您的使用情境可能會從僅有您或一小組人員存取叢集, 演變為可能有數十甚至數百人需要存取叢集。 在學習環境或平台原型中,您可能僅使用一個管理帳號處理所有操作。 在正式環境中,則通常需要建立多個帳號,並針對不同命名空間設定不同層級的存取權限。
建立正式環境等級的叢集意味著需要決定如何控管其他使用者的存取權限。 具體而言,您需要選擇驗證嘗試存取叢集之使用者身分(身分驗證), 以及判斷其是否具有執行所請求操作之權限(授權)的策略:
- 身分驗證(Authentication):apiserver 可以使用用戶端憑證、Bearer Token、 身分驗證代理或 HTTP 基本驗證來對使用者進行身分驗證。 您可以選擇要使用的身分驗證方法。 透過外掛程式,apiserver 可以使用您組織現有的身分驗證機制,例如 LDAP 或 Kerberos。 關於驗證 Kubernetes 使用者身分的各種方法, 請參閱身分驗證。
-
授權(Authorization):為一般使用者設定授權時,您可能需要在 RBAC 與 ABAC 之間做選擇。 請參閱授權概述, 了解授權使用者帳號(以及服務帳號存取叢集)的不同模式:
- 角色型存取控制(RBAC): 透過向已通過身分驗證的使用者授予特定的權限集合,以控制叢集的存取。 權限可以針對特定命名空間(Role)或整個叢集(ClusterRole)進行設定。 接著使用 RoleBinding 與 ClusterRoleBinding,可以將這些權限繫結至特定使用者。
作為在正式環境 Kubernetes 叢集上設定身分驗證與授權的負責人,以下是一些需要考慮的事項:
- 設定授權模式:當 Kubernetes API 伺服器
(kube-apiserver)啟動時,
必須透過 --authorization-config 檔案或 --authorization-mode 旗標來設定受支援的授權模式。
例如,在 kube-adminserver.yaml 檔案(位於 /etc/kubernetes/manifests)中,
可將該旗標設定為
Node,RBAC,以對已通過身分驗證的請求啟用 Node 與 RBAC 授權。
- 建立使用者憑證與角色繫結(RBAC):若您使用 RBAC 授權, 使用者可以建立 CertificateSigningRequest(CSR),由叢集 CA 進行簽署。 接著可以將 Role 與 ClusterRole 繫結至各個使用者。 詳情請參閱憑證簽署請求。
- 建立結合屬性的政策(ABAC):若您使用 ABAC 授權, 可以指定屬性組合來形成政策,授權特定使用者或群組存取特定資源(例如 Pod)、 命名空間或 apiGroup。詳情請參閱範例。
- 考慮准入控制器:針對透過 API 伺服器傳入的請求,還有其他形式的授權機制, 例如 Webhook 令牌身分驗證。 Webhook 與其他特殊授權類型需要透過在 API 伺服器中啟用 准入控制器來支援。
設定工作負載資源限制
正式環境中的工作負載可能會對 Kubernetes 控制平面內外造成壓力。 在為叢集的工作負載進行設定時,請考慮以下項目:
- 設定命名空間限制:為每個命名空間設定記憶體與 CPU 等資源的配額。 詳情請參閱管理記憶體、CPU 與 API 資源。
- 為 DNS 需求做準備:若您預期工作負載會大規模擴展, DNS 服務也必須準備好相應地擴展。 請參閱自動擴縮叢集中的 DNS 服務。
- 建立額外的服務帳號:使用者帳號決定使用者在叢集上可以執行的操作,
而服務帳號則定義特定命名空間中 Pod 的存取權限。
預設情況下,Pod 會使用其命名空間中的預設服務帳號。
關於建立新服務帳號的資訊,請參閱管理服務帳號。
例如,您可能需要:
- 為 Pod 新增 Secret,使其能從特定映像檔儲存庫拉取映像檔。 範例請參閱為 Pod 設定服務帳號。
- 為服務帳號指派 RBAC 權限。 詳情請參閱服務帳號權限。
接下來
2.3 - 最佳實務
2.3.1 - 大型叢集的考量事項
叢集是由一組執行 Kubernetes 代理程式的節點 (實體機器或虛擬機器)所組成,並由控制平面進行管理。 Kubernetes v1.35 支援最多 5,000 個節點的叢集。 更具體來說,Kubernetes 的設計可支援符合以下所有準則的配置:
- 每個節點不超過 110 個 Pod
- 不超過 5,000 個節點
- Pod 總數不超過 150,000
- 容器總數不超過 300,000
您可以透過新增或移除節點來調整叢集規模。具體作法取決於叢集的部署方式。
雲端供應商資源配額
為了避免碰到雲端供應商的配額問題,在建立多個節點的叢集時,建議考量:
- 申請提高雲端資源的配額,例如:
- 運算執行個體
- CPU
- 儲存卷
- 使用中的 IP 位址
- 封包過濾規則
- 負載平衡器的數量
- 子網路
- 日誌串流
- 控制叢集的擴展流程,分批啟動新節點,並在各批之間加入間隔, 因為部分雲端供應商會限制新執行個體的建立速率。
控制平面組件
對於大型叢集,您需要一個具備足夠運算及其他資源的控制平面。
通常您會在每個故障區執行一到兩個控制平面執行個體,並優先對這些執行個體進行垂直擴展; 直到垂直擴展達到邊際效益遞減的臨界點後,再進行水平擴展。
您應該在每個故障區執行至少一個執行個體來提供容錯能力。 Kubernetes 節點不會自動將流量導向位於相同故障區的控制平面端點;然而, 您的雲端供應商可能有其獨有的機制來做到這一點。
例如,使用託管的負載平衡器時, 您可以設定此負載平衡器將源於故障區 A 的 kubelet 與 Pod 流量僅導向同樣位於故障區 A 的控制平面主機。 如果故障區 A 內的單一控制平面主機或端點離線,這意味著 A 區節點的所有控制平面流量現在都將改為跨區傳輸。 在每個區域中執行多個控制平面主機可以降低發生這種情況的可能性。
etcd 儲存
為了提升大型叢集的效能,您可以將 Event 物件儲存於一個獨立且專屬的 etcd 執行個體中。
您可以使用自訂工具,在建立叢集時:
- 啟動並設定額外的 etcd 執行個體
- 設定 API 伺服器將 Event 儲存在該執行個體中
請參閱針對 Kubernetes 維運 etcd 叢集 與使用 kubeadm 架設高可用性 etcd 叢集, 以了解為大型叢集設定與管理 etcd 的詳細資訊。
附加元件資源
Kubernetes 資源限制有助於將記憶體洩漏, 以及 Pod 與容器對其他組件的影響降至最低。 這些資源限制同樣適用於附加元件的資源, 也適用於應用程式工作負載。
例如,您可以為日誌組件設定 CPU 與記憶體限制:
...
containers:
- name: fluentd-cloud-logging
image: fluent/fluentd-kubernetes-daemonset:v1
resources:
limits:
cpu: 100m
memory: 200Mi
附加元件的預設限制,通常是基於在小型或中型 Kubernetes 叢集上執行各個附加元件的經驗所蒐集的資料。 當在大型叢集上執行時,某些資源的使用量可能會超過預設限制。若在部署大型叢集時未調整這些數值, 附加元件可能會因為不斷觸及記憶體限制而反覆被終止;或者,附加元件雖能維持執行, 但會受 CPU 時間切片限制影響而效能低落。
為了避免遇到叢集附加元件的資源問題,在建立包含多個節點的叢集時,建議考量以下事項:
- 部分附加元件採垂直擴展 — 整個叢集或每個故障區僅執行一個附加元件副本。 對於此類附加元件,當您擴展叢集規模時,請增加其資源請求與限制。
- 許多附加元件採水平擴展 — 透過增加 Pod 數量來提升容量;但在超大型叢集中,您可能仍需稍微提高 CPU 或記憶體限制。 Vertical Pod Autoscaler 可以以recommender 模式執行,以提供資源請求與限制的建議值。
- 部分附加元件以每個節點一個副本的方式執行,並由 DaemonSet 進行控制: 例如節點級別的日誌聚合器。與水平擴展的附加元件類似,您可能也需要稍微調高 CPU 或記憶體限制。
優先處理叢集關鍵組件
為了確保叢集的必要組件(例如 CoreDNS、metrics-server 與其他關鍵附加元件)優先於其他工作負載進行排程,且不會被較低優先權的 Pod 搶佔,
請使用系統的 PriorityClass 來設定這些組件的優先順序,
例如 system-cluster-critical 或 system-node-critical。
接下來
VerticalPodAutoscaler是一個您可以部署到叢集中的自訂資源,用來協助您管理 Pod 的資源請求與限制。 請參閱 Vertical Pod Autoscaler 以了解更多資訊, 並學習如何使用它來調整叢集組件的規模,包括叢集關鍵的附加元件。
- 請參閱節點自動擴展
- addon resizer 可協助您隨著叢集規模的變化, 自動調整附加元件的資源配置。
2.3.2 - 跨區域執行
本頁面說明如何跨多個區域執行 Kubernetes。
背景
Kubernetes 的設計使單一叢集能夠跨多個故障區(Failure Zone)執行; 這些故障區通常隸屬於一個稱為**「地區」(Region)的邏輯分組。主要的雲端供應商將地區定義為一組故障區,亦稱為可用區(Availability Zone)**, 並提供一致的功能:在同一個地區內,各故障區提供相同的 API 與服務。
典型的雲端架構旨在將單一故障區故障對其他故障區服務的影響降至最低。
控制平面行為
所有控制平面組件都支援以可互換資源池的方式執行, 並為各個組件建立多個副本
當您部署叢集控制平面時,需將控制平面組件的副本分散部署於多個故障區。 若高可用性是重要考量,應選擇至少三個故障區,並為各個控制平面組件(API 伺服器、排程器、etcd、叢集控制器管理器)建立多個副本,分散部署於這些故障區中。 若有使用雲端控制器管理器,也應將它複製到您所選擇的所有故障區中。
說明:
Kubernetes 不會為 API 伺服器端點提供跨故障區的系統韌性。您可以使用多種技術來改善叢集 API 伺服器的可用性, 包括 DNS 輪詢、SRV 記錄,或是具備健康檢查功能的第三方負載平衡方案。節點行為
Kubernetes 會自動將工作負載資源 (例如 Deployment 或 StatefulSet) 的 Pod 分散部署於叢集中的不同節點。這種分散部署有助於降低故障造成的影響。
當節點啟動時,每個節點上的 kubelet 會自動在 Kubernetes API 中代表此特定節點的 Node 物件加上標籤。 這些標籤可以包含區域資訊。
如果您的叢集跨越多個故障區或地區,您可以結合使用節點標籤與 Pod 拓撲散佈限制, 來控制 Pod 在叢集中的各個故障域(地區、故障區,甚至特定節點)之間的分佈方式。 這些提示可讓排程器將 Pod 排程到更有利於可用性的位置, 從而降低相關故障影響整個工作負載的風險。
例如,您可以設定一項限制:確保在可行的情況下,一個 StatefulSet 的 3 個副本分別執行於不同的故障區 您可以透過宣告式的方式來定義此限制,不需要為每個工作負載明確指定使用哪些可用區。
跨區域分散節點
Kubernetes 核心本身不會為您建立節點;您需要自行建立, 或使用像是 Cluster API 的工具來代為管理節點。
透過使用 Cluster API 等工具,您可以定義一組機器,將其分散在多個故障域中作為叢集的工作節點執行, 並定義規則,在發生整個區域的服務中斷時自動修復叢集。
手動為 Pod 指定區域
您可以套用節點選擇器限制到您建立的 Pod, 以及 Deployment、StatefulSet 或 Job 等工作負載資源中的 Pod 模板。
區域的儲存存取
當建立持久卷時,Kubernetes 會自動為連結至特定故障區的 PersistentVolume 加上區域標籤。
接著排程器會透過 NoVolumeZoneConflict 預選規則,
確保使用該 PersistentVolume 的 Pod 只會被排程到與該卷相同的故障區。
請注意到區域標籤的新增方式可能取決於您使用的雲端供應商與儲存佈建器。 請務必參考適用於您環境的特定文件,確保配置正確。
您可以為 PersistentVolumeClaims 指定一個StorageClass, 用來指定該類別中的儲存空間可以使用的故障域(區域)。 要了解配置能夠感知到故障域或區域的 StorageClass,請參閱允許的拓撲。
網路
Kubernetes 本身並不包含故障區感知的網路功能。
您可以使用網路外掛來配置叢集網路,
而選用的網路解決方案可能包含與特定故障區相關的設定。例如,如果您的雲端供應商支援 type=LoadBalancer 的 Service,
負載平衡器可能只會將流量傳送至與處理此連線的負載平衡器位於相同區域的 Pod。請查看您的雲端供應商文件以瞭解詳情。
對於自訂或本地端部署,類似的考量同樣適用。 Service 與 Ingress 的行為,包含對不同故障區的處理方式, 會根據您叢集的實際部署方式而有所不同。
故障復原
當您架設叢集時,還需要考慮:若某個地區內的所有故障區同時離線,您的架構是否能恢復服務,以及應如何恢復。 例如,是否仰賴某個故障區中至少有一個節點能夠執行 Pod? 請確保任何叢集關鍵的修復工作,都不依賴叢集中至少有一個健康節點。例如:如果所有節點皆處於不健康狀態, 您可能需要執行一個帶有特殊 容許 的修復 Job, 使修復能順利完成,並讓至少一個節點恢復運作。
Kubernetes 並未提供此問題的解法;但在規劃時仍需納入考量。
接下來
若想了解排程器如何在叢集中依照設定的限制來排程 Pod, 請參閱排程與驅逐。
3 - 教學
本節收錄了 Kubernetes 的教學。 教學示範了如何完成一個比單一任務更大的目標。 通常一個教學會有幾個小節,每個小節都有一系列的步驟。 在閱讀每個教學之前,建議您將詞彙表頁面加入書籤,以便日後參考。
基礎
- Kubernetes 基礎是一個深入的互動式教學,幫助您了解 Kubernetes 系統並實際嘗試一些基本的 Kubernetes 功能。
- Kubernetes 簡介(edX)
- Hello Minikube
設定
撰寫 Pod
無狀態應用程式
有狀態應用程式
服務
安全性
叢集管理
接下來
如果您想撰寫教學,請參閱 內容頁面類型 以取得有關教學頁面類型的資訊。
3.1 - Hello Minikube
本教學示範如何使用 minikube 在 Kubernetes 上執行一個範例應用程式。 教學提供了一個使用 NGINX 回應所有請求的容器映像檔。
學習目標
- 將範例應用程式部署到 minikube。
- 執行應用程式。
- 查看應用程式日誌。
開始之前
本教學假設您已完成 minikube 的設定。
請參閱 minikube start 中的步驟 1 以取得安裝說明。
說明:
請只執行步驟 1:安裝中的指令,其餘部分將在本頁說明。
您還需要安裝 kubectl。
請參閱安裝工具以取得安裝說明。
建立 minikube 叢集
minikube start
確認 minikube 叢集狀態
確認 minikube 叢集的狀態,以確保所有元件都處於執行狀態。
minikube status
上述指令的輸出應顯示所有元件為 Running 或 Configured,如以下範例輸出所示:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
開啟 Dashboard
開啟 Kubernetes Dashboard,您可以透過以下兩種方式進行:
開啟一個新的終端機,並執行:
# Start a new terminal, and leave this running.
# 開啟新終端機,讓此指令持續執行。
minikube dashboard
接著,切換回您執行 minikube start 的終端機。
說明:
若您不想讓 minikube 自動開啟網頁瀏覽器,請使用 --url 旗標執行 dashboard 子指令。
minikube 會輸出一個 URL,您可以在偏好的瀏覽器中開啟。
開啟一個新的終端機,並執行:
# Start a new terminal, and leave this running.
# 開啟新終端機,讓此指令持續執行。
minikube dashboard --url
接著,您可以使用此 URL 並切換回您執行 minikube start 的終端機。
建立 Deployment
Kubernetes Pod 是由一個或多個容器組成的群組, 以便集中管理並共用網路資源。本教學中的 Pod 只有一個容器。Kubernetes Deployment 會檢查 Pod 的健康狀態, 並在 Pod 的容器終止時將其重新啟動。建議使用 Deployment 來管理 Pod 的建立和擴展。
-
使用
kubectl create指令建立一個管理 Pod 的 Deployment。 Pod 會根據提供的 Docker 映像檔執行容器。# Run a test container image that includes a webserver kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.53 -- /agnhost netexec --http-port=8080
-
查看 Deployment:
kubectl get deployments輸出類似如下:NAME READY UP-TO-DATE AVAILABLE AGE hello-node 1/1 1 1 1m(Pod 可能需要一些時間才能就緒。若看到「0/1」,請稍候幾秒後再試。)
-
查看 Pod:
kubectl get pods輸出類似如下:NAME READY STATUS RESTARTS AGE hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m
-
查看叢集事件:
kubectl get events
-
查看
kubectl設定:kubectl config view
-
查看 Pod 中容器的應用程式日誌(請將 Pod 名稱替換為您從
kubectl get pods取得的名稱)。說明:
請將
kubectl logs指令中的hello-node-5f76cf6ccf-br9b5替換為kubectl get pods輸出中的 Pod 名稱。kubectl logs hello-node-5f76cf6ccf-br9b5輸出類似如下:
I0911 09:19:26.677397 1 log.go:195] Started HTTP server on port 8080 I0911 09:19:26.677586 1 log.go:195] Started UDP server on port 8081
說明:
有關 kubectl 指令的更多資訊,請參閱 kubectl 概述。
建立 Service
預設情況下,Pod 只能透過其在 Kubernetes 叢集內的內部 IP 位址存取。
若要讓 hello-node 容器可從 Kubernetes 虛擬網路外部存取,
您必須將 Pod 公開為 Kubernetes Service。
警告:
agnhost 容器有一個 /shell 端點,這對於除錯很有用,但若暴露於公開網際網路上則相當危險。
請勿在對外公開的叢集或正式環境叢集上執行此指令。
-
使用
kubectl expose指令將 Pod 對外公開:kubectl expose deployment hello-node --type=LoadBalancer --port=8080`--type=LoadBalancer` 旗標表示您希望將 Service 公開至叢集外部。測試映像檔中的應用程式碼只監聽 TCP 通訊埠 8080。若您使用
kubectl expose公開不同的通訊埠,用戶端將無法連線到該通訊埠。
-
查看您建立的 Service:
kubectl get services輸出類似如下:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.108.144.78 <pending> 8080:30369/TCP 21s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23m在支援負載平衡器的雲端供應商上,系統會分配一個外部 IP 位址來存取 Service。在 minikube 上,
LoadBalancer類型讓您可透過minikube service指令存取 Service。
-
執行以下指令:
minikube service hello-node這會開啟一個瀏覽器視窗,顯示您的應用程式及其回應。
啟用附加元件
minikube 工具內建了一組 附加元件,可在本機 Kubernetes 環境中啟用、停用,或在瀏覽器中開啟。
-
列出目前支援的附加元件:
minikube addons list輸出類似如下:addon-manager: enabled dashboard: enabled default-storageclass: enabled efk: disabled freshpod: disabled gvisor: disabled helm-tiller: disabled ingress: disabled ingress-dns: disabled logviewer: disabled metrics-server: disabled nvidia-driver-installer: disabled nvidia-gpu-device-plugin: disabled registry: disabled registry-creds: disabled storage-provisioner: enabled storage-provisioner-gluster: disabled
-
啟用附加元件,例如
metrics-server:minikube addons enable metrics-server輸出類似如下:The 'metrics-server' addon is enabled
-
查看安裝該附加元件後建立的 Pod 和 Service:
kubectl get pod,svc -n kube-system輸出類似如下:NAME READY STATUS RESTARTS AGE pod/coredns-5644d7b6d9-mh9ll 1/1 Running 0 34m pod/coredns-5644d7b6d9-pqd2t 1/1 Running 0 34m pod/metrics-server-67fb648c5 1/1 Running 0 26s pod/etcd-minikube 1/1 Running 0 34m pod/influxdb-grafana-b29w8 2/2 Running 0 26s pod/kube-addon-manager-minikube 1/1 Running 0 34m pod/kube-apiserver-minikube 1/1 Running 0 34m pod/kube-controller-manager-minikube 1/1 Running 0 34m pod/kube-proxy-rnlps 1/1 Running 0 34m pod/kube-scheduler-minikube 1/1 Running 0 34m pod/storage-provisioner 1/1 Running 0 34m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/metrics-server ClusterIP 10.96.241.45 <none> 80/TCP 26s service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 34m service/monitoring-grafana NodePort 10.99.24.54 <none> 80:30002/TCP 26s service/monitoring-influxdb ClusterIP 10.111.169.94 <none> 8083/TCP,8086/TCP 26s
-
查看
metrics-server的輸出:kubectl top pods輸出類似如下:NAME CPU(cores) MEMORY(bytes) hello-node-ccf4b9788-4jn97 1m 6Mi若您看到以下訊息,請等待後再試:error: Metrics API not available
-
停用
metrics-server:minikube addons disable metrics-server輸出類似如下:metrics-server was successfully disabled
清理
現在您可以清理在叢集中建立的資源:
kubectl delete service hello-node
kubectl delete deployment hello-node
停止 Minikube 叢集:
minikube stop
選擇性地刪除 Minikube 虛擬機器:
# Optional
minikube delete
若您想再次使用 minikube 來學習更多 Kubernetes 知識,則不需要刪除它。
結論
本頁說明了啟動並執行 minikube 叢集的基本步驟,您現在已準備好部署應用程式。
接下來
- 教學:使用 kubectl 在 Kubernetes 上部署您的第一個應用程式。
- 深入了解 Deployment 物件。
- 深入了解部署應用程式。
- 深入了解 Service 物件。
3.2 - 學習 Kubernetes 基礎
學習目標
本教學將帶您逐步了解 Kubernetes 叢集編排系統的基礎。 每個模組都包含 Kubernetes 主要功能和概念的背景介紹,以及可供您逐步操作的教學。
透過這些教學,您將學會:
- 在叢集上部署容器化應用程式。
- 擴展 Deployment。
- 將容器化應用程式更新至新的軟體版本。
- 為容器化應用程式除錯。
Kubernetes 能為您做什麼?
在現代 Web 服務中,使用者期望應用程式能夠全天候運作,而開發人員則期望每天能多次部署新版本。 容器化技術有助於封裝軟體以達成這些目標,讓應用程式能夠在不停機的情況下發佈與更新。 Kubernetes 可確保容器化應用程式依照您的需求在指定的位置與時機運行,並協助取得運作所需的資源與相關工具。 Kubernetes 是一個可用於正式環境的開源平台,結合了 Google 在容器編排方面累積的豐富經驗,以及來自社群的最佳實踐。
Kubernetes 基礎模組
接下來
- 請參閱學習環境頁面,以深入了解練習用叢集,以及如何自行建立叢集。
- 教學:使用 Minikube 建立叢集
3.3 - 配置
3.3.1 - 使用 ConfigMap 設定 Redis
本頁提供了一個實際範例,說明如何使用 ConfigMap 設定 Redis,並延伸自設定 Pod 以使用 ConfigMap 任務。
學習目標
- 建立一個包含 Redis 設定值的 ConfigMap
- 建立一個掛載並使用該 ConfigMap 的 Redis Pod
- 驗證設定是否正確套用。
開始之前
您需要有一個 Kubernetes 叢集,且必須設定 kubectl 命令列工具使其能與叢集通訊。 建議在至少有兩個未擔任控制平面主機之節點的叢集上執行本教學。 如果您還沒有叢集,可以使用 Minikube 建立一個, 或使用以下其中一個 Kubernetes 練習環境:
若要確認版本,請輸入 kubectl version.
- 本頁範例需要
kubectl1.14 或以上版本。 - 瞭解設定 Pod 以使用 ConfigMap。
實際範例:使用 ConfigMap 設定 Redis
請按照以下步驟,使用 ConfigMap 中的資料設定 Redis 快取。
首先,建立一個設定區塊為空的 ConfigMap:
cat <<EOF >./example-redis-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: example-redis-config
data:
redis-config: ""
EOF
套用上述建立的 ConfigMap,以及 Redis Pod 的設定檔:
kubectl apply -f example-redis-config.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/pods/config/redis-pod.yaml
查看 Redis Pod 設定檔的內容,並注意以下事項:
spec.volumes[1]建立了一個名為config的卷spec.volumes[1].configMap.items[0]下的key與path,將example-redis-configConfigMap 中的redis-config鍵,以名為redis.conf的檔案形式呈現在config卷中spec.containers[0].volumeMounts[1]接著將config卷掛載至/redis-master
結果會將 example-redis-config ConfigMap 中 data.redis-config 的資料,以 /redis-master/redis.conf 的形式於 Pod 內呈現。
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis:8.0.2
command:
- redis-server
- "/redis-master/redis.conf"
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
resources:
limits:
cpu: "0.1"
volumeMounts:
- mountPath: /redis-master-data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: example-redis-config
items:
- key: redis-config
path: redis.conf
查看已建立的物件:
kubectl get pod/redis configmap/example-redis-config
您應該會看到以下輸出:
NAME READY STATUS RESTARTS AGE
pod/redis 1/1 Running 0 8s
NAME DATA AGE
configmap/example-redis-config 1 14s
回想一下,我們先前將 example-redis-config ConfigMap 中的 redis-config 鍵留白:
kubectl describe configmap/example-redis-config
您應該會看到空的 redis-config 鍵:
Name: example-redis-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
redis-config:
使用 kubectl exec 進入 Pod,並執行 redis-cli 工具以確認目前的設定:
kubectl exec -it pod/redis -- redis-cli
確認 maxmemory:
127.0.0.1:6379> CONFIG GET maxmemory
應顯示預設值 0:
1) "maxmemory"
2) "0"
同樣地,確認 maxmemory-policy:
127.0.0.1:6379> CONFIG GET maxmemory-policy
也應回傳其預設值 noeviction:
1) "maxmemory-policy"
2) "noeviction"
現在,讓我們在 example-redis-config ConfigMap 中新增一些設定值:
apiVersion: v1
kind: ConfigMap
metadata:
name: example-redis-config
data:
redis-config: |
maxmemory 2mb
maxmemory-policy allkeys-lru
套用更新後的 ConfigMap:
kubectl apply -f example-redis-config.yaml
確認 ConfigMap 已更新:
kubectl describe configmap/example-redis-config
您應該會看到剛才新增的設定值:
Name: example-redis-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
redis-config:
----
maxmemory 2mb
maxmemory-policy allkeys-lru
再次透過 kubectl exec 使用 redis-cli 確認 Redis Pod 是否已套用設定:
kubectl exec -it pod/redis -- redis-cli
確認 maxmemory:
127.0.0.1:6379> CONFIG GET maxmemory
它仍為在預設值 0:
1) "maxmemory"
2) "0"
同樣地,maxmemory-policy 仍維持 noeviction 的預設設定:
127.0.0.1:6379> CONFIG GET maxmemory-policy
回傳:
1) "maxmemory-policy"
2) "noeviction"
設定值沒有改變是因為 Pod 需要重新啟動才能取得相關 ConfigMap 更新後的值。讓我們刪除 Pod 並重新建立:
kubectl delete pod redis
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/pods/config/redis-pod.yaml
最後再次確認設定值:
kubectl exec -it pod/redis -- redis-cli
確認 maxmemory:
127.0.0.1:6379> CONFIG GET maxmemory
現在應回傳更新後的值 2097152:
1) "maxmemory"
2) "2097152"
同樣地,maxmemory-policy 也已更新:
127.0.0.1:6379> CONFIG GET maxmemory-policy
現在已反映期望的值 allkeys-lru:
1) "maxmemory-policy"
2) "allkeys-lru"
刪除已建立的資源以清理環境:
kubectl delete pod/redis configmap/example-redis-config
接下來
- 深入瞭解 ConfigMap。
- 參考透過 ConfigMap 更新設定的範例。
3.4 - 叢集管理
3.4.1 - 使用 DRA 安裝驅動程式並配置裝置
Kubernetes v1.35 [stable](enabled by default)本教學示範如何在叢集中安裝動態資源分配(DRA)驅動程式, 以及如何使用 DRA API 將裝置分配給 Pod。 本頁面適合叢集管理員閱讀。
動態資源分配(DRA)讓叢集得以管理硬體資源的可用性與分配情況,從而滿足 Pod 對硬體資源的需求與偏好。
為了支援此功能,Kubernetes 內建組件(如 Kubernetes 排程器、kubelet 和 kube-controller-manager)
與裝置擁有者提供的第三方驅動程式(稱為 DRA 驅動程式)
共同負責在 Pod 生命週期中宣告、分配、準備、掛載、健康檢查、解除準備及清理資源。
這些組件透過 resource.k8s.io API 群組中的一系列 DRA 專用 API 共享資訊,包括 DeviceClasses、ResourceSlices、ResourceClaims,以及 Pod 規格本身的新欄位。
學習目標
- 部署範例 DRA 驅動程式
- 部署使用 DRA API 請求硬體資源的 Pod
- 刪除具有資源請求的 Pod
開始之前
您的叢集應支援 RBAC。 您可以在使用其他授權機制的叢集上嘗試本教學, 但在這種情況下,您需要調整定義角色和權限的步驟。
您需要有一個 Kubernetes 叢集,且必須設定 kubectl 命令列工具使其能與叢集通訊。 建議在至少有兩個未擔任控制平面主機之節點的叢集上執行本教學。 如果您還沒有叢集,可以使用 Minikube 建立一個, 或使用以下其中一個 Kubernetes 練習環境:
本教學已在 Linux 節點上測試,但也可能適用於其他類型的節點。
您的 Kubernetes 伺服器版本必須不低於 v1.34.若要確認版本,請輸入 kubectl version.
若您的叢集目前未執行 Kubernetes 1.35,請查閱您計劃使用的 Kubernetes 版本的文件。
探索叢集的初始狀態
您可以花些時間觀察啟用 DRA 的叢集初始狀態,這對尚未熟悉這些 API 的使用者特別有幫助。 若您為本教學設定了新叢集,且尚未安裝驅動程式也沒有待滿足的 Pod 請求, 這些指令的輸出將不會顯示任何資源。
-
取得 DeviceClasses 清單:
kubectl get deviceclasses輸出類似如下:
No resources found
-
取得 ResourceSlices 清單:
kubectl get resourceslices輸出類似如下:
No resources found
-
取得 ResourceClaims 和 ResourceClaimTemplates 清單:
kubectl get resourceclaims -A kubectl get resourceclaimtemplates -A輸出類似如下:
No resources found No resources found
至此,您已確認 DRA 在叢集中已啟用且設定正確, 且目前尚無 DRA 驅動程式向 DRA API 公告任何資源。
安裝範例 DRA 驅動程式
DRA 驅動程式是在叢集每個節點上執行的第三方應用程式, 用於與該節點的硬體及 Kubernetes 內建 DRA 組件介接。 安裝程序取決於您選擇的驅動程式, 但通常會以 DaemonSet 的形式部署到叢集中的全部或部分節點 (使用選擇器或類似機制)。
請查閱您的驅動程式文件以取得特定安裝說明, 其中可能包含 Helm chart、一組設定檔或其他部署工具。
本教學使用 kubernetes-sigs/dra-example-driver 儲存庫中的範例驅動程式,示範如何安裝驅動程式。 此範例驅動程式會向 Kubernetes 宣告模擬 GPU,讓 Pod 可使用這些 GPU。
準備叢集以安裝驅動程式
為了簡化清理工作,請建立名為 dra-tutorial 的命名空間:
-
建立命名空間:
kubectl create namespace dra-tutorial
在正式環境中,您通常會使用驅動程式廠商或您所屬組織先前發佈或認證的映像檔, 且您的節點需要能夠存取託管驅動程式映像檔的映像檔儲存庫。 在本教學中,您將使用公開發佈的 dra-example-driver 映像檔, 模擬使用 DRA 驅動程式映像檔的情境。
-
在叢集的其中一個節點上執行以下指令,確認節點可以存取映像檔:
docker pull registry.k8s.io/dra-example-driver/dra-example-driver:v0.2.0
部署 DRA 驅動程式組件
在本教學中,您將使用 kubectl 逐一安裝重要的範例資源驅動程式組件。
-
建立代表此 DRA 驅動程式所支援裝置類型的 DeviceClass:
apiVersion: resource.k8s.io/v1 kind: DeviceClass metadata: name: gpu.example.com spec: selectors: - cel: expression: "device.driver == 'gpu.example.com'"kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/deviceclass.yaml
-
建立驅動程式存取此叢集 Kubernetes API 所需的 ServiceAccount、ClusterRole 和 ClusterRoleBinding:
-
建立 ServiceAccount:
apiVersion: v1 kind: ServiceAccount metadata: name: dra-example-driver-service-account namespace: dra-tutorial labels: app.kubernetes.io/name: dra-example-driver app.kubernetes.io/instance: dra-example-driverkubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/serviceaccount.yaml -
建立 ClusterRole:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: dra-example-driver-role rules: - apiGroups: ["resource.k8s.io"] resources: ["resourceclaims"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get"] - apiGroups: ["resource.k8s.io"] resources: ["resourceslices"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/clusterrole.yaml -
建立 ClusterRoleBinding:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dra-example-driver-role-binding subjects: - kind: ServiceAccount name: dra-example-driver-service-account namespace: dra-tutorial roleRef: kind: ClusterRole name: dra-example-driver-role apiGroup: rbac.authorization.k8s.iokubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/clusterrolebinding.yaml
-
-
為 DRA 驅動程式建立 PriorityClass。 PriorityClass 可防止 DRA 驅動程式組件被搶佔,該組件負責處理具有資源請求的 Pod 的重要生命週期操作。 深入了解 Pod 優先權與搶佔。
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: dra-driver-high-priority value: 1000000 globalDefault: false description: "This priority class should be used for DRA driver pods only."kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/priorityclass.yaml
-
將實際的 DRA 驅動程式部署為 DaemonSet,並設定為使用上述已配置的權限執行範例驅動程式二進位檔。 DaemonSet 具有您在前述步驟中授予 ServiceAccount 的權限。
apiVersion: apps/v1 kind: DaemonSet metadata: name: dra-example-driver-kubeletplugin namespace: dra-tutorial labels: app.kubernetes.io/name: dra-example-driver spec: selector: matchLabels: app.kubernetes.io/name: dra-example-driver updateStrategy: type: RollingUpdate template: metadata: labels: app.kubernetes.io/name: dra-example-driver spec: priorityClassName: dra-driver-high-priority serviceAccountName: dra-example-driver-service-account securityContext: {} containers: - name: plugin securityContext: privileged: true image: registry.k8s.io/dra-example-driver/dra-example-driver:v0.2.0 imagePullPolicy: IfNotPresent command: ["dra-example-kubeletplugin"] resources: {} # Production drivers should always implement a liveness probe # For the tutorial we simply omit it # livenessProbe: # grpc: # port: 51515 # service: liveness # failureThreshold: 3 # periodSeconds: 10 env: - name: CDI_ROOT value: /var/run/cdi - name: KUBELET_REGISTRAR_DIRECTORY_PATH value: "/var/lib/kubelet/plugins_registry" - name: KUBELET_PLUGINS_DIRECTORY_PATH value: "/var/lib/kubelet/plugins" - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace # Simulated number of devices the example driver will pretend to have. - name: NUM_DEVICES value: "9" - name: HEALTHCHECK_PORT value: "51515" volumeMounts: - name: plugins-registry mountPath: "/var/lib/kubelet/plugins_registry" - name: plugins mountPath: "/var/lib/kubelet/plugins" - name: cdi mountPath: /var/run/cdi volumes: - name: plugins-registry hostPath: path: "/var/lib/kubelet/plugins_registry" - name: plugins hostPath: path: "/var/lib/kubelet/plugins" - name: cdi hostPath: path: /var/run/cdikubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/daemonset.yamlDaemonSet 設定了與底層容器裝置介面(CDI)目錄互動所需的卷掛載,並透過
kubelet/plugins目錄向kubelet公開其 socket。
驗證 DRA 驅動程式安裝
-
取得所有工作節點上 DRA 驅動程式 DaemonSet 的 Pod 清單:
kubectl get pod -l app.kubernetes.io/name=dra-example-driver -n dra-tutorial輸出類似如下:
NAME READY STATUS RESTARTS AGE dra-example-driver-kubeletplugin-4sk2x 1/1 Running 0 13s dra-example-driver-kubeletplugin-cttr2 1/1 Running 0 13s
-
每個節點本地 DRA 驅動程式的初始職責是透過將其中繼資料發布到 ResourceSlices API, 將該節點上 Pod 可使用的裝置資訊更新到叢集中。 您可以查看該 API,確認每個安裝了驅動程式的節點都在公告其所代表的裝置類別。
查看可用的 ResourceSlices:
kubectl get resourceslices輸出類似如下:
NAME NODE DRIVER POOL AGE kind-worker-gpu.example.com-k69gd kind-worker gpu.example.com kind-worker 19s kind-worker2-gpu.example.com-qdgpn kind-worker2 gpu.example.com kind-worker2 19s
至此,您已成功安裝範例 DRA 驅動程式並確認其初始設定。 您現在可以使用 DRA 來排程 Pod。
請求資源並部署 Pod
若要使用 DRA 請求資源,您需要建立 ResourceClaims 或 ResourceClaimTemplates 來定義 Pod 所需的資源。 在範例驅動程式中,模擬 GPU 裝置會提供記憶體容量屬性。 本節說明如何使用 Common Expression Language 在 ResourceClaim 中表達您的需求、 在 Pod 規格中選取該 ResourceClaim,以及觀察資源分配情況。
本教學僅展示 DRA ResourceClaim 的一個基本範例。 請閱讀動態資源分配以深入了解 ResourceClaims。
建立 ResourceClaim
在本節中,您將建立一個 ResourceClaim 並在 Pod 中引用它。
無論請求內容為何,deviceClassName 都是必填欄位,用於將請求範圍縮小到特定裝置類別。
請求本身可以包含 Common Expression Language 表達式,
用來引用驅動程式針對該裝置類別所公告的屬性。
在本範例中,您將建立一個 ResourceClaim,用來請求任何宣告記憶體容量超過 10Gi 的 GPU。
範例驅動程式用來表示容量的屬性格式為 device.capacity['gpu.example.com'].memory。
另請注意,此請求的名稱設定為 some-gpu。
apiVersion: resource.k8s.io/v1
kind: ResourceClaim
metadata:
name: some-gpu
namespace: dra-tutorial
spec:
devices:
requests:
- name: some-gpu
exactly:
deviceClassName: gpu.example.com
selectors:
- cel:
expression: "device.capacity['gpu.example.com'].memory.compareTo(quantity('10Gi')) >= 0"kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/example/resourceclaim.yaml
建立引用 ResourceClaim 的 Pod
以下是 Pod 設定檔,其 spec.resourceClaims.resourceClaimName 欄位引用了剛建立的 some-gpu ResourceClaim。
該請求的別名 gpu 會在 spec.containers.resources.claims.name 欄位中使用,
以將該請求分配給 Pod 中的容器。
apiVersion: v1
kind: Pod
metadata:
name: pod0
namespace: dra-tutorial
labels:
app: pod
spec:
containers:
- name: ctr0
image: ubuntu:24.04
command: ["bash", "-c"]
args: ["export; trap 'exit 0' TERM; sleep 9999 & wait"]
resources:
claims:
- name: gpu
resourceClaims:
- name: gpu
resourceClaimName: some-gpukubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/example/pod.yaml
-
確認 Pod 已部署:
kubectl get pod pod0 -n dra-tutorial輸出類似如下:
NAME READY STATUS RESTARTS AGE pod0 1/1 Running 0 9s
探索 DRA 狀態
建立 Pod 後,叢集會嘗試將該 Pod 排程到 Kubernetes 可以滿足 ResourceClaim 的節點。 在本教學中,DRA 驅動程式部署在所有節點上,並在所有節點上公告模擬 GPU, 所有節點公告的容量都足以滿足 Pod 的請求, 因此 Kubernetes 可以將此 Pod 排程到任何節點並分配該節點上的任何模擬 GPU。
當 Kubernetes 將模擬 GPU 分配給 Pod 時,範例驅動程式會為每個被分配到該裝置的容器新增環境變數, 用來顯示真實資源驅動程式原本會注入哪些 GPU,以及其設定方式。 您可以查看這些環境變數來了解系統如何處理該 Pod。
-
查看 Pod 日誌,其中記錄了已分配的模擬 GPU 名稱:
kubectl logs pod0 -c ctr0 -n dra-tutorial | grep -E "GPU_DEVICE_[0-9]+=" | grep -v "RESOURCE_CLAIM"輸出類似如下:
declare -x GPU_DEVICE_0="gpu-0"
-
查看 ResourceClaim 物件的狀態:
kubectl get resourceclaims -n dra-tutorial輸出類似如下:
NAME STATE AGE some-gpu allocated,reserved 34s在此輸出中,
STATE欄位顯示 ResourceClaim 已被分配且已保留。
-
查看
some-gpuResourceClaim 的詳細資訊。 ResourceClaim 的status區段包含已分配裝置及其保留對象 Pod 的資訊:kubectl get resourceclaim some-gpu -n dra-tutorial -o yaml輸出類似如下:
1apiVersion: resource.k8s.io/v1 2kind: ResourceClaim 3metadata: 4 creationTimestamp: "2025-08-20T18:17:31Z" 5 finalizers: 6 - resource.kubernetes.io/delete-protection 7 name: some-gpu 8 namespace: dra-tutorial 9 resourceVersion: "2326" 10 uid: d3e48dbf-40da-47c3-a7b9-f7d54d1051c3 11spec: 12 devices: 13 requests: 14 - exactly: 15 allocationMode: ExactCount 16 count: 1 17 deviceClassName: gpu.example.com 18 selectors: 19 - cel: 20 expression: device.capacity['gpu.example.com'].memory.compareTo(quantity('10Gi')) 21 >= 0 22 name: some-gpu 23status: 24 allocation: 25 devices: 26 results: 27 - device: gpu-0 28 driver: gpu.example.com 29 pool: kind-worker 30 request: some-gpu 31 nodeSelector: 32 nodeSelectorTerms: 33 - matchFields: 34 - key: metadata.name 35 operator: In 36 values: 37 - kind-worker 38 reservedFor: 39 - name: pod0 40 resource: pods 41 uid: c4dadf20-392a-474d-a47b-ab82080c8bd7
-
若要查看驅動程式如何處理裝置分配,請取得驅動程式 DaemonSet Pod 的日誌:
kubectl logs -l app.kubernetes.io/name=dra-example-driver -n dra-tutorial輸出類似如下:
I0820 18:17:44.131324 1 driver.go:106] PrepareResourceClaims is called: number of claims: 1 I0820 18:17:44.135056 1 driver.go:133] Returning newly prepared devices for claim 'd3e48dbf-40da-47c3-a7b9-f7d54d1051c3': [{[some-gpu] kind-worker gpu-0 [k8s.gpu.example.com/gpu=common k8s.gpu.example.com/gpu=d3e48dbf-40da-47c3-a7b9-f7d54d1051c3-gpu-0]}]
您現在已成功部署了一個使用 DRA 請求裝置的 Pod,確認該 Pod 已被排程到適當的節點, 並確認相關的 DRA API 物件已反映最新的分配狀態。
刪除具有資源請求的 Pod
當具有資源請求的 Pod 被刪除時,DRA 驅動程式會釋放資源, 使其可用於未來的排程。 為了驗證此行為,請刪除您在前述步驟中建立的 Pod, 並觀察 ResourceClaim 和驅動程式的相應變更。
-
刪除
pod0Pod:kubectl delete pod pod0 -n dra-tutorial輸出類似如下:
pod "pod0" deleted
觀察 DRA 狀態
當 Pod 被刪除時,驅動程式會從 ResourceClaim 中釋放裝置,
並更新 Kubernetes API 中的 ResourceClaim 資源。
ResourceClaim 將保持 pending 狀態,直到它被新的 Pod 引用為止。
-
查看
some-gpuResourceClaim 的狀態:kubectl get resourceclaims -n dra-tutorial輸出類似如下:
NAME STATE AGE some-gpu pending 76s
-
查看驅動程式日誌,確認驅動程式已處理此請求的裝置解除準備作業:
kubectl logs -l app.kubernetes.io/name=dra-example-driver -n dra-tutorial輸出類似如下:
I0820 18:22:15.629376 1 driver.go:138] UnprepareResourceClaims is called: number of claims: 1
您現在已刪除了具有資源請求的 Pod,並觀察到驅動程式已釋放相關硬體資源, 同時更新 DRA API,讓該資源再次可供排程使用。
清理資源
若要清理本教學中建立的資源,請執行以下步驟:
kubectl delete namespace dra-tutorial
kubectl delete deviceclass gpu.example.com
kubectl delete clusterrole dra-example-driver-role
kubectl delete clusterrolebinding dra-example-driver-role-binding
kubectl delete priorityclass dra-driver-high-priority
接下來
4 - 參考
本部分為 Kubernetes 文件的參考內容。
API 參考
- 詞彙表 - Kubernetes 術語的完整標準化清單
- Kubernetes API 參考
- Kubernetes API 單頁參考 v1.35
- 使用 Kubernetes API - Kubernetes API 的概覽
- API 存取控制 - 說明 Kubernetes 如何控管 API 的存取
- 常見標籤、註解與污點
官方支援的用戶端程式庫
若要透過程式語言呼叫 Kubernetes API,可以使用用戶端程式庫。以下為官方支援的用戶端程式庫:
- Kubernetes Go 用戶端程式庫
- Kubernetes Python 用戶端程式庫
- Kubernetes Java 用戶端程式庫
- Kubernetes JavaScript 用戶端程式庫
- Kubernetes C# 用戶端程式庫
- Kubernetes Haskell 用戶端程式庫
CLI
- kubectl - 用於執行指令及管理 Kubernetes 叢集的主要 CLI 工具。
- JSONPath - 說明如何在 kubectl 中使用
JSONPath 表達式 的語法指南。
- JSONPath - 說明如何在 kubectl 中使用
- kubeadm - 用於快速建立安全 Kubernetes 叢集的 CLI 工具。
組件
-
kubelet - 在每個節點上執行的主要代理程式。kubelet 會接收一組 PodSpec,並確保其描述的容器維持正常且健康的運作狀態。
-
kube-apiserver - 提供 REST API,用於驗證與設定 API 物件(例如 Pod、Service 或 ReplicationController)的資料。
-
kube-controller-manager - 執行 Kubernetes 核心控制迴圈的常駐程式。
-
kube-proxy - 可進行簡單的 TCP/UDP 流量轉發,或在一組後端之間進行輪詢式 TCP/UDP 轉發。
-
kube-scheduler - 負責管理資源可用性、效能與容量的排程器。
-
控制平面與工作節點上需開放的連接埠與通訊協定
設定 API
本節提供用於設定 Kubernetes 組件或工具的「未公開」API 文件。 這些 API 雖未透過 RESTful 方式由 API Server 對外提供, 但對於使用者或維運人員管理叢集而言仍相當重要。
- kubeconfig(v1)
- kuberc(v1alpha1)和 kuberc (v1beta1)
- kube-apiserver 准入(v1)
- kube-apiserver 設定(v1alpha1)和 kube-apiserver 設定(v1beta1)和 kube-apiserver 設定(v1)
- kube-apiserver 事件速率限制(v1alpha1)
- kubelet 設定(v1alpha1)、 kubelet 設定(v1beta1)和 kubelet 設定(v1)
- kubelet 憑證提供者(v1)
- kube-scheduler 設定(v1)
- kube-controller-manager 設定(v1alpha1)
- kube-proxy 設定(v1alpha1)
audit.k8s.io/v1API- 用戶端身分驗證 API(v1beta1)及 用戶端身分驗證 API(v1)
- WebhookAdmission 設定(v1)
- ImagePolicy API(v1alpha1)
kubeadm 設定 API
外部 API
這些 API 由 Kubernetes 專案所定義,但並非由核心專案實作:
設計文件
此處彙整 Kubernetes 功能的設計文件。建議可從以下文件開始閱讀: Kubernetes 架構和 Kubernetes 設計概覽
編碼
諸如 kubectl 等工具, 可處理不同的格式與編碼,包括:
- CBOR,用於網路傳輸,但不支援作為 kubectl 的輸出格式。
- 請參閱 CBOR 資源編碼
- JSON,可作為
kubectl的輸出格式,也用於 HTTP 層。 - KYAML,為 Kubernetes 所使用的 YAML 方言。
- KYAML 本質上是一種輸出格式;在任何可提供 KYAML 給 Kubernetes 的情境中, 也可提供其他任何有效的 YAML 輸入。
- YAML,可作為
kubectl的輸出格式,也用於 HTTP 層。
Kubernetes 也提供一種自訂的 protobuf 編碼, 僅用於 HTTP 訊息中。
kubectl 工具也支援其他輸出格式,例如自訂欄位;
詳情請參閱 kubectl 參考文件中的輸出格式。