k8s学习笔记-二进制高可用metrics-server安装

https://github.com/kubernetes-sigs/metrics-server
从 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://kubernetes.io/zh/docs/tasks/extend-kubernetes/configure-aggregation-layer/
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

几个特别说明的参数:

--kubelet-insecure-tls # 不认证kubelet的ssl证书

必须满足kubelet 两种配置方式:

非安全的认证方式,一般不推荐,测试环境可以:

kubelet:
  anonymousAuth: true
  authorizationMode: AlwaysAllow

安全认证的方式,生成环境kubelet配置方式

kubelet:
  anonymousAuth: false
  authenticationTokenWebhook: true #必须开启
  authorizationMode: Webhook

--deprecated-kubelet-completely-insecure=true #不使用https连接kubelet,使用http连接,metrics-server本身不推荐,如果你kubete 提供了只读端口可以配置

Flag --deprecated-kubelet-completely-insecure has been deprecated, This is rarely the right option, since it leaves kubelet communication completely insecure.  If you encounter auth errors, make sure you've enabled token webhook auth on the Kubelet, and if you're in a test cluster with self-signed Kubelet certificates, consider using kubelet-insecure-tls instead.

建议不用这个参数了
--kubelet-port=10255 # 请求kubelet的10255端口是HTTP 的只读端口
--kubelet-certificate-authority #指定用来验证kubelet证书的ca证书, 但是因为kubelet的证书是由apiserver自动签署的,证书的common name是主机名,
如: k8s-node1 metrics-server以ip连接的时候会失败 所以指定ca也没用。
--kubelet-preferred-address-types 连接kubelet的几种方式 InternalIP,ExternalIP,Hostname
--tls-cert-file # metrics-server自身的ssl证书, 如果不指定, 会自动自己生成一套。
--tls-private-key # 这里的证书无所谓, apiserver不会认证, 因为metrics-server使用serveraccount认证了
更多参数说明可以通过下面这个命令查看
docker run --rm k8s.gcr.io/metrics-server/metrics-server:v0.3.7 --help

https://github.com/kubernetes-sigs/metrics-server

最终会生成一个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

kube-apiserver: E0515 08:32:53.585964   21151 controller.go:114] loading OpenAPI spec for "v1beta1.custom.metrics.k8s.io" failed with: OpenAPI spec does not exist

# kubectl api-versions

删除这个api组

 kubectl get apiservice v1beta1.custom.metrics.k8s.io -o yaml > v1beta1.custom-metrics.metrics.k8s.io.yaml

编辑yaml 文件

 如果没有使用到自定义的监控指标可以删除掉

 kubectl delete -f v1alpha1.custom-metrics.metrics.k8s.io.yaml

在看日志会出现一条这样的删除日志

May 15 08:35:43 wan129 kube-apiserver: I0515 08:35:43.917990   24411 controller.go:130] OpenAPI AggregationController: action for item v1beta1.custom.metrics.k8s.io: Nothing (removed from the queue)

我们现在回过头来看看 metrics-server 创建的对象PodMetrics:

kubectl get podmetrics 

posted @ 2019-06-22 09:00  屌丝的IT  阅读(1647)  评论(0编辑  收藏  举报