从 v1.8 开始,资源使用情况的度量(如容器的 CPU 和内存使用)可以通过 Metrics API 获取。注意
- Metrics API 只可以查询当前的度量数据,并不保存历史数据
- Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 维护
必须部署 metrics-server 才能使用该 API,metrics-server 通过调用 Kubelet Summary API 获取数据
在部署 metrics-server 之前,需要在 kube-apiserver 中开启 API Aggregation,即增加以下配置
--requestheader-client-ca-file=/etc/ssl/kubernetes/ca.pem \
--requestheader-allowed-names=aggregator \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-group-headers=X-Remote-Group \
--requestheader-username-headers=X-Remote-User \
--proxy-client-cert-file=/etc/ssl/kubernetes/metrics-server.pem \
--proxy-client-key-file=/etc/ssl/kubernetes/metrics-server-key.pem \
--enable-aggregator-routing=true \
参数说明:
--requestheader-XXX、--proxy-client-XXX 是 kube-apiserver 的 aggregator layer 相关的配置参数,metrics-server & HPA 需要使用;
--requestheader-client-ca-file:用于签名 --proxy-client-cert-file 和 --proxy-client-key-file 指定的证书;在启用了 metric aggregator 时使用;
如果 --requestheader-allowed-names 不为空,则--proxy-client-cert-file 证书的 CN 必须位于 allowed-names 中,默认为 aggregator;
如果 kube-apiserver 机器没有运行 kube-proxy,则还需要添加 --enable-aggregator-routing=true 参数;
关于 --requestheader-XXX 相关参数,参考:
https://github.com/kubernetes-incubator/apiserver-builder/blob/master/docs/concepts/auth.md
https://docs.bitnami.com/kubernetes/how-to/configure-autoscaling-custom-metrics/
注意:requestheader-client-ca-file 指定的 CA 证书,必须具有 client auth and server auth;
创建 metrics-server 证书签名请求
vim metrics-server-csr.json
{
"CN": "aggregator",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
注意: CN 名称为 aggregator,需要与 kube-apiserver 的 --requestheader-allowed-names 参数配置一致
cfssl gencert \
-ca=/etc/ssl/kubernetes/ca.pem \
-ca-key=/etc/ssl/kubernetes/ca-key.pem \
-config=/etc/ssl/kubernetes/ca-config.json \
-profile=kubernetes metrics-server-csr.json | cfssljson -bare metrics-server
将生成的证书和私钥文件拷贝到 kube-apiserver 节点
然后重启kube-apiserver服务
kubectl get apiservice v1beta1.metrics.k8s.io -o yaml
小问题总结
这里需要提到的还有一点就是kubelet的服务关闭只读端口,还有如果是二进制的高可用的master,需要有flanneld 的组件,要不在kube-apiserver 访问(metrics-serve)POD 的时候,会提示访问超时,因为默认没有路由规则让你访问的
具体验证方式,就是在 ApiServer 节点直接 ping metric-server pod 的 IP,看能否通信我这里是失败了,因为集群是 HA 模式,master 没有安装flanneld 的插件
如下报错:
23668 available_controller.go:353] v1beta1.metrics.k8s.io failed with: Get https://172.17.19.4:443: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
安装过程这里不表述了,参考我前面的文章
https://www.cnblogs.com/centos-python/articles/10901024.html
最终会生成一个api
kubectl api-versions |egrep metrics.k8s.io/v1beta1
yum install jq -y
直接通过 kubectl 命令来访问这些 API
kubectl get --raw "/apis/metrics.k8s.io/v1beta1" | jq .
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq .
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods" | jq .
kubectl top nodes
kubectl top pods