专栏首页charlierorokubernetes实现用户自定义扩缩容

kubernetes实现用户自定义扩缩容

本文章主要参考walkthroughaggregationauth。涉及custom metric API的注册认证以及API server aggregation的相关知识。walkthrough中主要实现了Prometheus adapter的功能,Prometheus adapter主要从Prometheus以一定间隔收集可用的metrics,然后以特定的格式暴露该metrics。

强烈建议阅读官方文档:setup an extension API server

HorizontalPodAutoscaler控制器可以通过两种方式获取metrics:通过Heapster接入方式和REST client接入方式。其中REST client方式即获取custom metrics的方式(参见:Horizontal Pod Autoscaler)

walkthrough中的主要步骤如下:

  • 使能aggregation

  API server的flag中启用如下内容:

  kube-controller-manager的flag中启用如下内容:

--horizontal-pod-autoscaler-use-rest-clients=true
--horizontal-pod-autoscaler-sync-period=10s //default 30s
--master=<apiserver-address>:<port> //port should be 8080
  • 下载prometheus和prometheus adapter镜像
  • 在prom命名空间下部署prometheus和prometheus adapter,创建名称为prometheus的configmap,包含prometheus的配置,后续mount到prometheus容器中;prom命名空间中创建service,名称为prom-cm-adapter,该serviceaccount用在prometheus和prometheus adapter的deploment中。最终输出prom-adapter.deployment.yaml文件。注意还需要在该文件中添加adapter容器描述(文章第二段有)
  • 创建rolebing prom-ext-auth-reader使得prom:prom-cm-adapter service有权限获取extension-apiserver-authentication的configmap;同时创建一个名为serving-cm-adapter的tls secret,用于https通信(adapter需要与apiserver通信);创建名为cm-adapter-resource-lister的clusterrolebinding,使得prom:prom-cm-adapter有权限列出集群的资源信息
  • 创建Prometheus和adapter的deploment,并创建名为prometheus的clusterip service,暴露端口为--tcp=443:443,该端口为访问apiserver的端口
  • 创建APIServer,注册API到custom.metrics.k8s.io/v1beta1(1.10中为custom.metrics.k8s.io/v1),该操作对应的yaml文件中的caBundle为aggregator用于认证serving证书的ca(--tls-cert-file和--tls-private-key-file指定的),使用命令导出: base64 --w 0 < /tmp/ca.crt,最后创建该apiservice,metadata.name中包含了后面定义的version和group
  • 使用命令检查:kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1
  • 创建一个产生custom metrics的APP service,可以使用文章中描述的,也可以自己实现annotations的配置需要与prometheus中获取kubernetes的配置一致,如下

# * `prometheus.io/scrape`: Only scrape pods that have a value of `true` # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. # * `prometheus.io/port`: Scrape the pod on the indicated port instead of the

  • 创建HPA,HPA的yaml文件中需要用于产生custom metrics的app名称

注:根据官方文档setup an extension API server,需要给serviceaccount绑定ClusterRole system:auth-delegator,该ClusterRole是为了插件API server向main API server请求认证和授权检查,认证方式为Webhook Token Authentication。绑定方式参考custom-metrics.yaml

上述流程中主要涉及的难点有:Prometheus和adapter的原理,证书的生成,extension-apiserver-authentication-role和aggregation

  • Prometheus和adapter的原理

prometheus获取用户metrics使用的是service-discovery机制,参见kubernetes_sd_config(The service role discovers a target for each service port for each service. This is generally useful for blackbox monitoring of a service. The address will be set to the Kubernetes DNS name of the service and respective service port)

Prometheus adapter的原理类似heapster,请求收集各prometheus的数据,并通过REST发送给HPA controller。prometheus的数据可以由prometheus client产生

  • 相关证书主要是两个,serving CA和RequestHeader client CA,证书描述参见kubernete的证书总结。文章中所说的Serving Certificates可以使用kube-apiserver配置中--tls-cert-file --tls-private-key-file指定的值,也可以使用不同的CA,用于https通信认证。注意:serving证书的hosts字段需要包含<service>.<namespace>.svc,其中service和namespace为APIService注册时指定的service和namespace,生成参见aggregation

同时还有--proxy-client-cert-file 和--proxy-client-key-file指定的代理证书。更多描述参见Configure the aggregation layer (There are a few setup requirements for getting the aggregation layer working in your environment to support mutual TLS auth between the proxy and extension apiservers. Kubernetes and the kube-apiserver have multiple CAs, so make sure that the proxy is signed by the aggregation layer CA and not by something else, like the master CA),也可以在插件的API server flag中传入--authentication-skip-lookup,但这样会同时关闭client认证,可以通过手动传入--client-ca-file启用client认证

  • extension-apiserver-authentication-role

关于extension-apiserver-authentication-role的表述参见Serving Certificates, Authentication, and Authorization,该role用于插件API server在默认条件下获取kube-system命名空间中的extension-apiserver-authentication ConfigMap,extension-apiserver-authentication ConfigMap中包含了main api server使用--client-ca-file指定的client CA和--requestheader-client-ca-file指定的RequestHeader client CA 。这种方式下,相同的client证书既可以用于k8s的认证,也可以用于插件API server的认证。

  • aggregation

    用于注册custom API,作为代理使用。参见aggregation

总结:

产生custom metrics的app模板中的annotations字段定义了暴露给prometheus的metrics的端口和路径;prometheus的配置中的scrape_configs字段通过标签定义了需要抓取的内容,与app中的annotations字段相呼应;custom metric API注册模板中指定了API的组和版本,以及该API对应的prometheus和prometheus adapter的service; 这样整个流程可以描述为:app产生custom metrics;prometheus抓取app产生的custom metrics;prometheus adapter请求并缓存更新prometheus的metrics,后续上报给kubernetes。从配置中可以看到prometheus并没有配置认证,而prometheus adapter则配置了与kubernetes交互的认证信息

流程图如下,aggregator通过service名称连接到APIService中指定的服务获取metric

参考:

prometheus relabel说明

How to build a Kubernetes Horizontal Pod Autoscaler using custom metrics

Configure Kubernetes Autoscaling With Custom Metrics

Monitoring Kubernetes performance metrics

Horizontal Pod Autoscaler

kubernetes聚合层概念

https://github.com/slok/prometheus-python/tree/master/examples

https://www.slideshare.net/brianbrazil/python-ireland-monitoring-your-python-with-prometheus

https://godoc.org/github.com/prometheus/client_golang/prometheus https://www.cnblogs.com/gaorong/p/7881203.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • docker内存和cpu调试

    本地启动了一个sshd的容器服务,但该容器经常会被重启导致ssh连接失败,使用kubectl describe pod命令查看改命令发现有容器返回值为137,...

    charlieroro
  • redis 6源码解析之 ziplist

    ziplist中的每个entry都使用一个元数据作为前缀,该元数据包含两部分的信息:首先保存了前一个entry的长度,用于倒序查找;再者保存了entry的编码类...

    charlieroro
  • linux和docker的capabilities介绍

    在linux 2.2版本之前,当内核对进程进行权限验证的时候,可以将进程划分为两类:privileged(UID=0)和unprivilege(UID!=0)。...

    charlieroro
  • 爬虫 (十七) 你懂集合? (九)

    最重要的一点就是如果您觉得对您有帮助,希望可以点个在看,或者点一点文章中最下面的广告,给小编我加个鸡腿,毕竟小编写文章也是很辛苦的,非常感谢

    公众号---志学Python
  • 在暗网,你的全套个人信息比一线明星的还贵

    明星信息泄露这个话题,数不清第几次上了热搜,但每一次都能引爆话题。就在前两日,最近因为某剧再度爆红的新晋流量小生发微博吐槽自己的手机号码被泄露,不仅被夺命连环...

    腾讯云安全
  • 日历(Calendar)_java版(某年的日历,某月的日历)_用户完全自定义

    ========================================================

    Hongten
  • KM生存曲线经logRNA检验后也可以计算HR值

    可以很明显看到,根据基因表达量把病人分成高表达组合低表达组,经过log rank 检验,可以看到两组病人的生存是有统计学显著差异的,而且我们可以看到,基因表达量...

    生信技能树
  • 响铃:世界冰箱竞争格局第3次被重塑,海尔牵头迎来“中国时代”

    “暮色苍茫看劲松,乱云飞渡仍从容。”在全球经济下行的今天,全球冰箱行业总体发展进入了一个相对平稳的周期,但个别企业的表现却是逆流而上。

    曾响铃
  • 12.22 php-fpm慢执行日志

    php-fpm慢执行日志目录概要 vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下内容 request_s...

    运维小白
  • 任务调度系统建设迭代计划(二)

    关于任务调度的设计,完成了整体的设计和快速迭代的一个版本,我们需要考虑分布式的方案。

    jeanron100

扫码关注云+社区

领取腾讯云代金券