如何让Kubernetes集群具有弹性?

hk8txs48  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(86)

Helo我正在Azure Kubernetes Services中运行一个.NET应用程序作为3 pod集群(每个节点1个pod)。我试图了解如何使我的集群根据负载而具有弹性?我如何配置deployment.yaml,以便在每个pod的CPU利用率达到一定的%和/或内存达到一定的%后,它会生成另一个pod?同样的事情,当负载减少时,我如何关闭示例。
是否有任何指南/教程来根据百分比(理想情况下)设置此功能?

56lgkhnf

56lgkhnf1#

您需要使用的基本功能称为HorizontalPodAutoscaler或简称为HPA。您可以在这里配置CPU或内存限制,如果超过限制,Pod副本数量将增加。例如this walkthrough

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

一旦pod的cpu利用率超过50%,这将扩展php-apache部署。请注意,计算资源利用率和由此产生的副本数量并不直观,因为它可能会接缝。也可以看文档(整个页面也应该很有趣)。您还可以组合合并标准进行横向扩展。
还有一些插件可以帮助您根据其他参数进行扩展,例如队列中的消息数量。看看keda,他们提供不同的缩放器,如RabbitMQ,Kafka,AWS CloudWatch,Azure Monitor等。
既然你写了
每个节点1个pod
您可能正在运行DaemonSet。在这种情况下,扩展的唯一选择就是添加额外的节点,因为对于守护进程集,每个节点总是只有一个pod。如果是这种情况,您可以考虑使用DeploymentPodAntiAffinity组合,请参阅docs。这样您就可以配置pod优先在同一部署的pod尚未运行的节点上运行,例如:

[...]
spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          topologyKey: topology.kubernetes.io/zone
[...]

来自文档:
反亲合规则指出,调度器应尽量避免将Pod调度到与一个或多个标签为security=S2的Pod位于同一区域的节点上。更准确地说,topology.kubernetes.io/zone=R如果同一区域中有其他节点正在运行带有Security=S2 Pod标签的Pod,则调度器应尽量避免将Pod放置在带有www.example.com标签的节点上。
这将使横向扩展更加灵活,因为它是一个daemonset,但你有一个类似的效果,即pod在集群中均匀分布。
如果你想/需要坚持一个守护进程,你可以查看AKS Cluster Autoscaler,它可以用来根据资源消耗自动添加/删除集群中的其他节点。

相关问题