生產環境
生產級 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 證書和要求。
- 為 apiserver 配置負載均衡器:配置負載均衡器以將外部 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 節點或虛擬機器隔離。
- 驗證節點:請參閱有效節點設定,瞭解如何確保節點滿足加入 Kubernetes 叢集的要求。
- 將節點新增到叢集:如果你正在管理自己的叢集,你可以透過設定自己的機器並手動新增它們,或者讓它們自行註冊到叢集的 apiserver 來新增節點。有關如何設定 Kubernetes 以這些方式新增節點的資訊,請參閱節點部分。
- 擴縮節點:制定計劃來擴充套件叢集最終所需的容量。請參閱大型叢集注意事項,根據你需要執行的 Pod 和容器數量,幫助確定你需要的節點數量。如果你自行管理節點,這可能意味著購買和安裝自己的物理裝置。
- 自動擴縮節點:閱讀節點自動擴縮,瞭解可用於自動管理節點及其提供的容量的工具。
- 設定節點健康檢查:對於重要的工作負載,你需要確保節點及其上執行的 Pod 健康。使用節點問題檢測器守護程式,可以確保你的節點健康。
生產使用者管理
在生產環境中,你可能從一個由你或少數幾個人訪問叢集的模型,轉變為可能有多達數十或數百人訪問叢集的模型。在學習環境或平臺原型中,你可能只有一個管理賬戶來處理所有事務。在生產環境中,你將需要更多賬戶,它們對不同的名稱空間具有不同級別的訪問許可權。
部署生產級叢集意味著要決定如何選擇性地允許其他使用者訪問。特別是,你需要選擇驗證嘗試訪問叢集的使用者身份(身份驗證)以及決定他們是否有許可權執行請求的操作(授權)的策略。
- 身份驗證:apiserver 可以使用客戶端證書、不記名令牌、身份驗證代理或 HTTP 基本身份驗證來驗證使用者。你可以選擇要使用的身份驗證方法。透過使用外掛,apiserver 可以利用你組織現有的身份驗證方法,例如 LDAP 或 Kerberos。請參閱身份驗證,瞭解這些不同的 Kubernetes 使用者身份驗證方法的說明。
- 授權:當你開始授權普通使用者時,你可能會在 RBAC 和 ABAC 授權之間進行選擇。請參閱授權概述,檢視授權使用者賬戶(以及服務賬戶訪問你的叢集)的不同模式。
- 基於角色的訪問控制(RBAC):允許你透過向經過身份驗證的使用者授予特定許可權集來分配對叢集的訪問許可權。許可權可以分配給特定名稱空間(Role)或整個叢集(ClusterRole)。然後,透過使用 RoleBindings 和 ClusterRoleBindings,可以將這些許可權附加到特定使用者。
- 基於屬性的訪問控制(ABAC):允許你根據叢集中的資源屬性建立策略,並根據這些屬性允許或拒絕訪問。策略檔案的每一行都標識版本控制屬性(apiVersion 和 kind)以及一個 spec 屬性對映,以匹配主體(使用者或組)、資源屬性、非資源屬性(/version 或 /apis)和只讀。有關詳細資訊,請參閱示例。
作為在生產級 Kubernetes 叢集上設定身份驗證和授權的人員,以下是一些需要考慮的事項:
- 設定授權模式:當 Kubernetes API 伺服器(kube-apiserver)啟動時,必須使用 --authorization-config 檔案或 --authorization-mode 標誌設定支援的授權模式。例如,在 kube-adminserver.yaml 檔案(位於 /etc/kubernetes/manifests)中,該標誌可以設定為 Node,RBAC。這將允許對經過身份驗證的請求進行節點和 RBAC 授權。
- 建立使用者證書和角色繫結 (RBAC):如果你正在使用 RBAC 授權,使用者可以建立證書籤名請求 (CSR),該請求可以由叢集 CA 簽名。然後,你可以將角色和叢集角色繫結到每個使用者。有關詳細資訊,請參閱證書籤名請求。
- 建立組合屬性的策略 (ABAC):如果你正在使用 ABAC 授權,你可以分配屬性組合以形成策略,以授權選定的使用者或組訪問特定資源(例如 Pod)、名稱空間或 apiGroup。有關更多資訊,請參閱示例。
- 考慮准入控制器:透過 API 伺服器傳入的請求的其他形式的授權包括Webhook 令牌認證。Webhook 和其他特殊授權型別需要透過將准入控制器新增到 API 伺服器來啟用。
設定工作負載資源限制
生產工作負載的需求可能對 Kubernetes 控制平面內外造成壓力。在為叢集工作負載需求進行設定時,請考慮以下事項:
- 設定名稱空間限制:設定每個名稱空間的記憶體和 CPU 等配額。有關詳細資訊,請參閱管理記憶體、CPU 和 API 資源。
- 為 DNS 需求做準備:如果你預計工作負載將大規模擴容,你的 DNS 服務也必須準備好擴容。請參閱在叢集中自動擴縮 DNS 服務。
- 建立額外的服務賬戶:使用者賬戶決定了使用者可以在叢集上做什麼,而服務賬戶定義了特定名稱空間內的 Pod 訪問許可權。預設情況下,Pod 採用其名稱空間的預設服務賬戶。有關建立新服務賬戶的資訊,請參閱管理服務賬戶。例如,你可能希望:
- 新增 Pod 可以用來從特定容器登錄檔拉取映象的秘密。有關示例,請參閱為 Pod 配置服務賬戶。
- 為服務賬戶分配 RBAC 許可權。有關詳細資訊,請參閱服務賬戶許可權。