资源指标(metrics)和自定义指标(prometheus)
k8s的资源指标分类:
- 资源指标 metrics-server内建API
- 自定义指标 prometheus来采集,需要组件k8s-prometheus-adapter
新一代架构:
核心指标流水线: 由kubelet、metrics-server以及由API server提供的api组成;CPU累计使用率、内存的实时使用率、pod的资源占用率及容器的磁盘占用率
监控流水线:需要在集群上部署监控工具,用于从系统收集各种指标数据并提供终端用户、存储 系统以及HPA,他们包含核心指标及许多非核心指标;非核心指标本身不能被k8s所解析,需要第三方工具
♦ https://github.com/kubernetes/kubernetes/tree/master/cluster/addons k8s插件
一、核心指标获取
metrics-server: API server
♦ kubectl api-versions 中默认不包含metrics.k8s.io/v1beta1;使用时需要添加kube-aggregator前缀
♦ metrics部署文件: https://github.com/kubernetes-incubator/metrics-server/tree/master/deploy/1.8%2B
下载到本地并应用之后就可以使用 kubectl api-versions查询,看到metrics.k8s.io/v1beta1已经存在了
应用之前需要修改metrics-server-deployment.yaml文件,添加如下:
- Warming: metrics-server这个容器不能通过CoreDNS 10.96.0.10:53 解析各Node的主机名,metrics-server连节点时默认是连接节点的主机名,需要加个参数,让它连接节点的IP:“–kubelet-preferred-address-types=InternalIP”
因为10250是https端口,连接它时需要提供证书,所以加上–kubelet-insecure-tls,表示不验证客户端证书,此前的版本中使用–source=这个参数来指定不验证客户端证书
执行kukectl apply -f ./
然后就可以使用kubetctl top nodes来获取信息了
♦ 也可以使用kubectl proxy --port=xxxx代理后使用curl http://localhost:xxxx/apis/metrics.k8s.io/v1beta1/ 接口来获取数据
二、自定义指标 --- Prometheus
♦ node_exporter用来暴露node信息,还有其他的exporter
♦ PromQL查询语句,不能直接被k8s直接解析,需要通过kube-state-metrics组件转k8s-promethues-adpater转为Custom Metrics API
安装node-exporter:
# kubectl apply -f node-exporter-ds.yml # kubectl apply -f node-exporter-service.yaml ♦ Prometheus需要先创建pv ♦ pv始终处于“Terminating”状态,而且delete不掉。直接删除k8s中的记录:kubectl patch pv xxx -p '{"metadata":{"finalizers":null}}' ♦ Prometheus service 需要修改type:NodePort以便外部访问
安装prometheus: # kubectl apply -f prometheus-rbac.yaml # kubectl apply -f prometheus-configmap.yaml # kubectl apply -f prometheus-service.yaml # kubectl apply -f prometheus-statefulset.yaml
到目前为止们就可以使用http://nodeip:serviceport登陆prometheus了
![](https://img2018.cnblogs.com/blog/1141456/201908/1141456-20190809170130253-201803967.png)
安装k8s-prometheus-adapter:
♦ https://github.com/DirectXMan12/k8s-prometheus-adapter
把adapterdeploy文件下载到本地服务器
首先需要自建证书:
♦ Create a secret calledcm-adapter-serving-certs
with two values:serving.crt
andserving.key
. These are the serving certificates used by the adapter for serving HTTPS traffic.
# cd /etc/kubernetes/pki
# (umask 077;openssl genrsa -out serving.key 2048)
# openssl req -new -key serving.key -out serving.csr -subj "/CN=serving"
# openssl x509 -days 1000 -req -in serving.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out serving.crt
# openssl x509 -in serving.crt -text -noout
创建secret:
# kubectl create secret generic cm-adapter-serving-certs --from-file=serving.crt=./serving.crt --from-file=serving.key=./serving.key
修改custom-metrics-config-map.yaml custom-metrics-apiserver-deployment.yaml中namespace为自己规划的namespace,然后运行
# kubectl apply -f custom-metrics-config-map.yaml
# kubectl apply -f custom-metrics-apiserver-deployment.yaml
创建grafana,grafana.yaml influxdb.yaml中namespace为自己规划的namespace,并且gfannao中的添加“type: NodePort”,然后运行
# kubectl apply -f influxdb.yaml
# kubectl apply -f grafana.yaml
grafana接入prometheus数据
首先找到grafana的service暴露出来的端口通过http://ip:port进入grafana主页,左侧设置按键Configration->Data Sources->Add data source
![](https://img2018.cnblogs.com/blog/1141456/201908/1141456-20190812105311679-1088985399.png)
然后点击save&Test,点击上方Dashboards默认存在几个dashborad,点击右侧import即可导入。
然后在dashboard home中点击刚刚导入的dashboard即可看到视图, 也可以自行到grafana模板中心下载自己想要的模板导入,或者自定义模板都可以
三、HPA --- 基于资源值指标的伸缩,默认是使用v1控制器,也可以指定使用v2版本
指定Deployment、ReplicaSet或ReplicationController,并创建已经定义好资源的自动伸缩器。使用自动伸缩器可以根据需要自动增加或减少系统中部署的pod数量.
部署一个deploy服务
# kubectl run ngx-autoscale --image=nginx --replicas=1 --requests='cpu=20m,memory=256Mi' --limits='cpu=30m,memory=256Mi' --labels='app=myapp' --expose --port=80 -n develop
# kubectl patch svc ngx-autoscale -p '{"spec":{"type":"NodePort"}}' -n develop
![](https://img2018.cnblogs.com/blog/1141456/201908/1141456-20190812142537198-871234917.png)
# kubectl autoscale deploy deploy-autoscale-test --min=1 --max=4 --cpu-percent=60 -n develop
使用ab压力测试工具测试
# ab -c 100 -n 50000 http://34.240.13.92:32541/index.html
测试完成之后,pod会自动伸缩,有一定的延迟。
♦ 也可以根据自定义的merics参数来定义参考值