延展性概念
尋找調整解決方案之前,您必須了解什麼是延展性,以及其如何套用至 Kubernetes 應用程式。
在此單元中,我們會檢閱一些延展性概念。
延展性
延展性 描述應用程式或系統藉由將更多資源新增至應用程式或系統來處理不斷增加的工作能力。
在我們的範例案例中,增加的工作量是客戶要求的數目。 新增的資源數量可以用兩種方式來表示:垂直延展性和水準延展性。
垂直延展性
垂直延展性或 相應增加是指藉由新增更多實體資源來調整系統,例如記憶體或 CPU 電源。 例如,如果您的公司網站耗用太多記憶體,您可以將 VM 實例更新為包含更多記憶體,同時保留相同的基礎應用程式。
簡言之,垂直調整牽涉到增加 VM 大小,同時保留相同的應用程式數目。 如果您有 需要大量計算能力的整合型應用程式,但成本太高,無法分解成較小的元件,這個方法就很實用。 這些應用程式大多裝載在 VM 中,而不是分散式系統。
儘管成本更可管理,但非常大的 VM 可能會變得非常昂貴。 增加更多計算能力的成本高於複製小型 VM 的成本。 您可以新增至單一 VM 的資源數目有上限,這表示一旦達到上限,您最終必須複製 VM。
水平可擴縮性
水平延展性或 向外延展是指藉由複製應用程式並平衡應用程式實例之間的負載來調整系統。
水平調整對於 分散式應用程式而言非常重要,例如部署在 AKS 中的應用程式,以及無狀態系統,因為您可以在單一 VM 中以相同應用程式啟動數個容器。 相應放大可讓您擷取最多資源,同時支付單一 VM 的費用。
在我們的範例案例中,您的公司網站是無狀態的。 這表示相應放大是最佳行動路線。 Kubernetes 提供現成的資源,稱為 HorizontalPodAutoscaler (HPA),可讓您相應放大部署。
Kubernetes 上的手動延展性
在討論 HPA 之前,讓我們先檢閱如何手動調整 Kubernetes 應用程式。
每個部署都會系結至另一個 稱為 ReplicaSet 的資源。 ReplicaSet 負責維護「所需的複本狀態」,以及相應縮小或相應放大實際應用程式,以讓所需的狀態與實際狀態相同。 您可以透過 spec.replicas
部署規格中的索引鍵來控制部署中的複本數目。 此金鑰會設定基礎 ReplicaSet 中所需的複本數目,並強制複寫控制器隨時保留此數目的複本。
您也可以使用 kubectl scale deploy/contoso-website --replicas <number>
命令控制部署中的複本數目。 此命令會動態變更部署中所需的複本數量,以及縮減或擴增應用程式。
HorizontalPodAutoscaler (HPA)
HPA 是原生 Kubernetes 1.8+ 資源,可為叢集中的 Pod 提供水平延展性。 其每隔 30 秒會監視計量 API,以瞭解所需的複本計數中是否有任何變更。 如果所需的複本計數與目前的復本計數不同,則管理HPA物件的控制器管理員會相應縮小或相應放大部署。
HPA 使用 autoscaling
Kubernetes 中的 API 群組。 此 API 群組有兩個版本: v1
和 v2
。 版本 v1
可讓部署僅根據 CPU 計量進行調整。 版本 v2
允許原生監視 CPU 和記憶體。 在此課程模組中,我們使用 v2
版本。
每個 HPA 都會附加至縮放參考,其定義於 HPA 資訊清單的 spec.scaleTargetRef
索引鍵中。 此規模調整參考必須有要調整規模的基礎 Pod,否則 HPA 將不會運作,因為無法對不能調整規模的物件套用規模調整,例如 DaemonSet。
每個 Pod 務必在其規格中都有一個資源要求集。沒有此設定,HPA 演算法無法正確計算計量,並判斷資源使用率。 您可以透過 spec.template.spec.containers[].resources
部署指令清單中的索引鍵來設定此限制,如下列範例所示:
spec:
template:
spec:
containers:
- resources:
requests:
cpu: 250m
memory: 256M
limits:
cpu: 500m
memory: 512M
HPA 指令清單範例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50