问题描述
我有一个集群,其中一个集群已激活集群自动扩缩器,并为我的部署之一提供了 HPA。
这是 HPA 定义:
kind: HorizontalPodAutoscaler
Metadata:
name: hpa-resource-metrics-cpu
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: ReplicationController
name: hello-hpa-cpu
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageutilization: 50
现在,在我的集群使用率很低的情况下,这意味着此部署将只有 1 个可用副本。
而且由于集群的使用率并不高,因此可能会安排删除包含该副本的节点(缩减规模)。
在这种情况下,它会使我的部署停机(当集群节点被删除时,部署的唯一副本也被删除,因此需要在新的 pod 中重新调度)。我不希望这种情况发生(停机时间)。
从这个问题:https://github.com/kubernetes/kubernetes/issues/48307 看来,Pod disruption Budgets 似乎不适用于只有 1 个副本的部署。
所以我的问题的唯一解决方案是将 minReplicas
设置为 2?
或者我还能做些什么来防止这种停机时间,并且仍然让 minReplicas
为 1?
解决方法
Kubernetes 有 disruption 的概念。使节点脱机的集群自动缩放器(或管理员)是一种“自愿”中断(与节点断电不同),因此您可以对其进行一些控制。如果您create a pod disruption budget:
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: hello-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app: hello
您已指定,当集群尝试执行自愿中断时,不应少于一个带有标签 app: hello
的 pod。
这样做可以防止集群自动缩放器实际删除节点。 PDB 文档中的示例通常有多个副本,并且可以容忍其中一些处于离线状态,因此可以删除 3 个副本中的 1 个副本并在不同节点上重新创建它。有一个扩展示例,集群中没有容量来启动重新调度的 pod,这会阻止破坏节点。您可以将 HPA 设置为 minReplicas: 3
以避免这种情况,即使这意味着您的系统将在最安静的时候过度配置。