Kubernetes Notes
  • README
  • 序:Kubernetes之道
  • 搭建开发环境
    • 搭建本地开发测试环境
  • 基本概念
    • Workloads
      • StatefulSet
    • 认证鉴权
      • 理解证书
      • Kubelet配置
    • 垃圾回收
    • Service
  • 基础组件
    • Scheduler
    • 自动扩缩容(HPA)
  • 容器运行时(Container Runtime)
    • CRI
    • Docker
      • 安装配置Docker
      • Docker FAQ
    • Containerd
  • 资源隔离与限制
    • 基础知识
      • Cgroup
      • Namespaces
    • CPU
    • Memory
    • 网络出/入带宽
    • GPU
    • Container
    • FAQ
  • 网络
    • 基础知识
      • Linux network interfaces
      • Iptables
      • Overlay network
    • CNI
    • Flannel
      • Flannel原理
      • host-gw
      • vxlan
      • ipip
    • Calico
    • Cilium
  • Service Mesh
    • Istio
  • 扩展Kubernetes
    • Admission controller
    • Custom resource definition(CRD)
    • Scheduler extender
    • 扩展资源维度
    • Kubectl plugin
    • Aggregator
    • Device plugin
  • 现网问题
    • Kubernetes
    • ETCD
    • Docker
  • 最佳实践
    • 各组件参数配置调优
    • 各大公司生产环境实践
    • 如何打造一个Kubernetes平台
  • 生产力小工具
    • 生成特定权限和配额的kubeconfig
  • 社区贡献
  • 学习资料
  • 附录:RTFSC
    • Informer
    • Pod deletion
Powered by GitBook
On this page
  • 自动扩缩容(HPA)
  • 1. 简介
  • 2. 实践
  • 3. CRD HPA
  • 4. 注意事项
  • 5. 参考资料

Was this helpful?

  1. 基础组件

自动扩缩容(HPA)

PreviousSchedulerNext容器运行时(Container Runtime)

Last updated 5 years ago

Was this helpful?

自动扩缩容(HPA)

1. 简介

HPA controller可以根据以下两种类型的metrics进行自动扩缩容:

  • 通用的metrics

    比如:CPU、Memory的使用情况,这些metrics是通过kubelet上的cAdvisor收集,再聚合这些metrics,然后HPA controller根据metrics server提供的这些信息进行自动扩缩容。

  • 用户自定义metrics(custom metrics)

    Pod可以通过http接口暴露一些自定义的metrics,比如:http请求数,然后通过custom metrics server把这些metrics提供给HPA controller。定义了这些metrics相关的规范,custom metrics server也有一些,例:我们可以通过promethus去收集pod暴露的metrics,然后通过提供符合Custom Metrics API标准的接口,通常我们称这个adaptor为custom metrics server。

2. 实践

  • 通过k8s-prom-hpa很方便地熟悉HPA相关的知识和流程。

    注意:如果在本地运行这个例子的时候必须要改下kubelet node name(具体修改hack/local-up-cluster.sh,如下diff所示),否则custom metrics没法拿到它的metrics。

    -HOSTNAME_OVERRIDE=${HOSTNAME_OVERRIDE:-"127.0.0.1"}
    +HOSTNAME_OVERRIDE=${HOSTNAME_OVERRIDE:-"10.0.2.15"}
    ...
    -KUBELET_HOST=${KUBELET_HOST:-"127.0.0.1"}
    +KUBELET_HOST=${KUBELET_HOST:-"10.0.2.15"}
  • 用stefanprodan/podinfo:0.2.0作为测试的image(用于暴露用户自定义metrics)即可:docker run -it -p 8989:8989 stefanprodan/podinfo:0.2.0。

3. CRD HPA

HPA的是如何起作用的:HPA通过resource的scale接口,设置该resource的replicas数。

Scale subresource的实现

staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go

func (r *ScaleREST) Get(...)
获取scale相关的信息。根据r.specReplicasPath, r.statusReplicasPath, r.labelSelectorPath从custom resource里取值

func (r *ScaleREST) Update(...)
更新scale相关的信息

4. 注意事项

  • 要指定requests资源,要不然不会收集资源信息

  • 配置aggregation layer

    注意:If you are not running kube-proxy on a host running the API server, then you must make sure that the system is enabled with the following apiserver flag: --enable-aggregator-routing=true。如果不配置这个,就需要启动一个kube-proxy。最好启动一个。

5. 参考资料

因此,只要CRD定义了(这个特性是在Kubernetes 1.10版本加入,如要启用,需给kube-apiserver加上参数--feature-gates=CustomResourceSubresources=true,1.11版本后就不用加该参数了),并且实现了相应的接口(即:HPA通过scale接口设置replicas数后,CRD的controller会基于该replicas进行相应地扩缩容),我们就可以通过HPA对该CRD对象进行自动扩缩容。s

Kubernetes autoscaling based on custom metrics without using a host port:

k8s-prom-hpa:

Configure Kubernetes Autoscaling With Custom Metrics:

Kubernetes 1.8: Now with 100% Daily Value of Custom Metrics:

Kubernetes monitoring architecture:

metrics server
Custom Metrics API
开源的实现
promethus adaptor
k8s-prom-hpa
k8s-podinfo
scale subresource
https://kubernetes.io/docs/tasks/access-kubernetes-api/configure-aggregation-layer/
https://medium.com/@marko.luksa/kubernetes-autoscaling-based-on-custom-metrics-without-using-a-host-port-b783ed6241ac
https://github.com/stefanprodan/k8s-prom-hpa
https://docs.bitnami.com/kubernetes/how-to/configure-autoscaling-custom-metrics/
https://blog.openshift.com/kubernetes-1-8-now-custom-metrics/
https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/monitoring_architecture.md