腾讯云TKE-Metrics-Server案例: TKE中自建Metrics-Server问题

背景

用户想在TKE环境中自己部署metrics-server去获取监控数据, 想对监控系统有更多的控制权,好多用户会选择在TKE中自己部署一套Metrics-Server + Prometheus + Grafana

这里只讲述Metric-Server 在TKE中的部署以及注意事项风险

用户遇到的问题有一下几点:

  • 部署后访问不通(因为使用create -f 命令导致访问的是hap的地址)
  • 部署成功hpa出现问题

metrics-server架构:

image.png

kubernetes 集群资源监控在初期是通过过 heapster 来获取数据,在 1.11 开始开始逐渐废弃 heapster 了,采用 metrics-server 来代替,metrics-server 是集群的核心监控数据的聚合器,它从 kubelet 公开的 Summary API 中采集指标信息,metrics-server 是扩展的 APIServer,依赖于kube-aggregator,因此我们需要在 APIServer 中开启相关参数:

代码语言:txt
复制
- --requestheader-client-ca-file=/etc/kubernetes/certs/proxy-ca.crt
- --proxy-client-cert-file=/etc/kubernetes/certs/proxy.crt
- --proxy-client-key-file=/etc/kubernetes/certs/proxy.key
- --requestheader-allowed-names=aggregator
- --requestheader-extra-headers-prefix=X-Remote-Extra-
- --requestheader-group-headers=X-Remote-Group
- --requestheader-username-headers=X-Remote-User
- --enable-aggregator-routing=true

注意: 如果master节点没有启动kube-proxy, kube-apiserver 启动参数需要增加--enable-aggregator-routing=true

部署

环境:

  • TKE
  • Metrics-Server Version: 0.3.6 在github官网中下载https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml

因为国内访问google镜像问题需要修改镜像地址,以及其他参数:

代码语言:txt
复制
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP
        image: ccr.ccs.tencentyun.com/ruiqingzhu-tke/metrics-server-amd64:v0.3.6  ##如果有自己的metrics-server的镜像地址可以修改为自己的地址

创建:

kubectl apply -f components.yaml

注意 这里不能用 create -f, 不能用create -f的原因是 托管集群中有h pa-metrics-server , create命令不会覆盖,会导致注册的 apiservce 依然是hpa的service

检查部署状态

部署完之后检查pod 启动状态,以及查看注册apiserver 选择的svc label是否正确

  1. 检查pod状态
代码语言:txt
复制
kubectl get apiservice v1beta1.metrics.k8s.io
NAME                     SERVICE                      AVAILABLE   AGE
v1beta1.metrics.k8s.io   kube-system/metrics-server   True        43
  1. 检查apiservice资源是否关联的是名字为metrics-server的svc资源.
代码语言:txt
复制
# kubectl get apiservice v1beta1.metrics.k8s.io  -o yaml

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apiregistration.k8s.io/v1beta1","kind":"APIService","metadata":{"annotations":{},"name":"v1beta1.metrics.k8s.io"},"spec":{"group":"metrics.k8s.io","groupPriorityMinimum":100,"insecureSkipTLSVerify":true,"service":{"name":"metrics-server","namespace":"kube-system"},"version":"v1beta1","versionPriority":100}}
creationTimestamp: "2020-06-03T04:38:37Z"
name: v1beta1.metrics.k8s.io
resourceVersion: "1643663569"
selfLink: /apis/apiregistration.k8s.io/v1/apiservices/v1beta1.metrics.k8s.io
uid: 3f84bb0b-4023-4ce4-9e50-e8b44253306e
spec:
group: metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: metrics-server ## 需要注意查看这个name是否是我们metrics-server的svc name
namespace: kube-system
port: 443
version: v1beta1
versionPriority: 100
status:
conditions:

  • lastTransitionTime: "2020-07-16T14:12:47Z"
    message: all checks passed
    reason: Passed
    status: "True"
    type: Available

以下结果中hpa是tke自带的metrics-service,第二个是我们部署的metrics-service

代码语言:txt
复制
➜  ~ kubectl get apiservice |grep metric
v1beta1.custom.metrics.k8s.io kube-system/hpa-metrics-service True 129d
v1beta1.metrics.k8s.io kube-system/metrics-server True 129d
  1. 检查svc的情况
代码语言:txt
复制
➜  ~ kubectl get svc -n kube-system  |grep metrics
hpa-metrics-service ClusterIP 172.16.252.133 <none> 443/TCP 129d
metrics-server ClusterIP 172.16.255.25 <none> 443/TCP 99d

验证

image.png

以上表明部署正常

注意

托管集群由于已经部署了hpa-metrics-server的 apiservce 所以用户如果自己部署metrics-server 会覆盖掉hpa-metrics-server

影响 : 控制台将不能使用HPA自动扩缩容,需要用户自己实现。