如何水平自动缩放 Kubernetes 部署

Posted

技术标签:

【中文标题】如何水平自动缩放 Kubernetes 部署【英文标题】:How to Horizontal Autoscaler a Kubernetes Deployment 【发布时间】:2019-08-29 21:19:50 【问题描述】:

编辑:

解决方案:我忘记将target_cpu_utilization_percentage 添加到autoscaler.tf 文件中


我想要一个在 Kubernetes 上运行但具有自动缩放功能的 Python(或其他语言)网络服务。

我创建了一个Deployment 和一个Horizontal Autoscaler,但没有工作。

我正在使用 Terraform 来配置 Kubernetes。

我有这些文件:

Deployments.tf

resource "kubernetes_deployment" "rui-test" 
  metadata 
    name = "rui-test"
    labels 
      app  = "rui-test"
    
  
  spec 
    strategy = 
      type = "RollingUpdate"
      rolling_update = 
        max_unavailable = "26%" # This is not working
      
    
    selector = 
        match_labels = 
            app = "rui-test"
        
    
    template = 
      metadata = 
        labels = 
          app = "rui-test"
        
      
      spec = 
        container 
          name              = "python-test1"
          image             = "***************************"
        
      
    
  

Autoscaler.tf

resource "kubernetes_horizontal_pod_autoscaler" "test-rui"     
  metadata 
    name = "test-rui"
  
  spec 
    max_replicas = 10 # THIS IS NOT WORKING
    min_replicas = 3  # THIS IS NOT WORKING

    scale_target_ref 
      kind = "Deployment"
      name = "test-rui" # Name of deployment
    
  

Service.tf

resource "kubernetes_service" "rui-test" 
  metadata 
    name = "rui-test"
    labels 
      app  = "rui-test"
    
  
  spec 
    selector 
      app  = "rui-test"
    
    type = "LoadBalancer"  # Use 'cluster_ip = "None"' or 'type = "LoadBalancer"'
    port 
      name = "http"
      port = 8080
    
  

当我运行kubectl get hpa 时,我看到了这个:

NAME       REFERENCE             TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
rui-test   Deployment/rui-test   <unknown>/80%   1         3         1          1h

代替:

rui-test   Deployment/rui-test   <unknown>/79%   3         10        1          1h

这就是我想要的。

但如果我运行 kubectl autoscale deployment rui-test --min=3 --max=10 --cpu-percent=81 我会看到:

Error from server (AlreadyExists): horizontalpodautoscalers.autoscaling "rui-test" already exists

在 kubernetes 中出现这个

【问题讨论】:

【参考方案1】:

您缺少metrics server。 Kubernetes 需要确定当前的 CPU/内存使用情况,以便它可以自动扩展和缩减。

了解您是否安装了指标服务器的一种方法是运行:

$ kubectl top node
$ kubectl top pod

【讨论】:

我运行了这些命令并工作了,然后我猜 Google Cloud Platform 已经预装了一个指标服务器【参考方案2】:

Horizo​​ntal Pod AutoScaler 取决于为您的部署配置的资源限制。

来自documentation:

请注意,如果某些 pod 的容器没有设置相关的资源请求,则不会定义 pod 的 CPU 利用率,并且自动缩放器不会对该指标采取任何行动。

【讨论】:

但是 Google Cloud Platform 中的 Kubernetes 还没有安装这个?我搜索了文档,我认为我不需要配置更多设置。如果我需要,我不知道我需要改变哪里...... 不,这些不是默认设置的。 Kubernetes 不知道您的应用程序使用了多少资源,但要让 Pod AutoScaler 工作,它需要知道何时进行扩展,例如何时达到 Pod 的 CPU 限制的 70%。要设置这些约束,请查看此处的文档:kubernetes.io/docs/concepts/configuration/…。将资源部分添加到部署中应该很容易。

以上是关于如何水平自动缩放 Kubernetes 部署的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Kubernetes 水平自动扩缩器缩容?

如何在 GKE 自动驾驶仪中基于自定义指标实现水平自动缩放

如何使用 kubectl 命令在 Kubernetes 中关闭自动缩放?

是否可以自动缩放除 Kind 之外的其他种类:在 Kubernetes 中部署?

[kubernetes] HPA实现自动水平伸缩POD

在自动缩放条件下重新部署时,Kubernetes 滚动更新不遵守“maxUnavailable”副本