【 云原生 | kubernetes 】- 资源监控之Metrics server

Metrics Server 是 Kubernetes 内置自动缩放管道的可扩展、高效的容器资源指标来源。 从 kubelet 公开的 Summary API 中采集指标信息, 以供 HPA 和 VPA 使用。我们可以通过kubectl top命令查看资源信息。

HPA: HorizontalPodAutoscaler 根据观察到的 CPU 利用率, 自动调整控制器POD的个数

VPA: VerticalPodAutoscaler 可以增加或减少容器的 CPU 和内存资源的请求,更好把集群资源分配到实际应用

Metrics是监控系统的核心,所有监控指标数据都记录其中,为我们后面的监控系统做准备(grafnan+prometheus)

【 云原生 | kubernetes 】- 资源监控之Metrics server_第1张图片

架构组件:

  • cAdvisor: 用于收集、聚合和公开 Kubelet 中包含的容器指标的守护程序。
  • kubelet: 用于管理容器资源的节点代理。 可以使用 /metrics/resource/stats kubelet API 端点访问资源指标。
  • Summary API: kubelet 提供的 API,用于发现和检索可通过 /stats 端点获得的每个节点的汇总统计信息。
  • metrics-server: 集群插件组件,用于收集和聚合从每个 kubelet 中提取的资源指标。 API 服务器提供 Metrics API 以供 HPA、VPA 和 kubectl top 命令使用。Metrics Server 是 Metrics API 的参考实现。
  • Metrics API: Kubernetes API 支持访问用于工作负载自动缩放的 CPU 和内存。 要在你的集群中进行这项工作,你需要一个提供 Metrics API 的 API 扩展服务器。

安装

1.我们可以直接使用 metrics-server 官方提供的资源清单件直接安装,可以看到pod已经正常运行。

[root@ycloud ~]# kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
[root@ycloud ~]# kubectl get po -n kube-system
NAME                              READY   STATUS    RESTARTS        AGE
coredns-675db8b7cc-mw7f6          1/1     Running   0               49m
metrics-server-6bf679fb9b-2qch4   1/1     Running   0               41m
metrics-server-6bf679fb9b-znckj   1/1     Running   0               41m

2.我们也可以选择使用Helm来安装,首先我们添加Metrics server repo到Helm

[root@ycloud ~]# helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
[root@ycloud ~]# helm install metrics-server metrics-server/metrics-server

也可以选择将Chart包pull到集群中,查看模板信息,了解应用本身,Chart包中镜像可替换成阿里镜像

3.尝试使用kubectl top命令查看资源信息

[root@master ~]# kubectl top nodes
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)

[root@ycloud ~]# kubectl get apiservice 
NAME                                   SERVICE                      AVAILABLE   AGE
v1beta1.metrics.k8s.io                 kube-system/metrics-server   False (FailedDiscoveryCheck)   41m

这时候发现服务出现异常不可用,

问题查找

通过metrics-server查看相关日志

E0927 09:36:59.662728       1 configmap_cafile_content.go:243] kube-system/extension-apiserver-authentication failed with : missing content for CA bundle "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"
E0927 09:37:48.890413       1 configmap_cafile_content.go:243] key failed with : missing content for CA bundle "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"
E0927 09:38:48.889595       1 configmap_cafile_content.go:243] key failed with : missing content for CA bundle "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"

根据错误日志信息,可以确定是缺少认证证书,导致不能访问 kube-apiserver 而出现的问题。

问题解决

查看APIserver参数配置,发现APIserver没有开启**API**聚合功能,确保APIserver启动参数包含一下配置:

  • 如果你是 kubeadm 或者官方的 kube-up.sh 脚本部署 Kubernetes 集群的话, API聚合模式就是默认开启的;
  • 如果是手动二进制搭建的话,你就需要在 kube-apiserver 的启动参数里加上如下所示的配置
    【 云原生 | kubernetes 】- 资源监控之Metrics server_第2张图片

API聚合能够将用户扩展的 API 注册到 kube-apiserver 上,通过 APIserver 对新的 API 进行访问和操作。为了实现这个机制,Kubernetes 在 kube-apiserver 服务中引入了一个 API 聚合层,用于将扩展 API 的访问请求转发到用户服务的功能。

...
  --requestheader-allowed-names=aggregator \
  --requestheader-group-headers=X-Remote-Group \
  --requestheader-username-headers=X-Remote-User \
  --requestheader-extra-headers-prefix=X-Remote-Extra- \
  --requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem \
  --proxy-client-cert-file=/etc/kubernetes/proxy-client/proxy-client.pem \
  --proxy-client-key-file=/etc/kubernetes/proxy-client/proxy-client-key.pem  \
  --enable-aggregator-routing=true
...

如果您未在 master 节点上运行 kube-proxy,则必须确保 kube-apiserver 启动参数中包含--enable-aggregator-routing=true

  • –requestheader-client-ca-file: 客户端 CA 证书。
  • –requestheader-allowed-names: 允许访问的客户端 common names 列表,通过 header 中 –requestheader-username-headers 参数指定的字段获取。客户端 common names 的名称需要在 client-ca-file 中进行设置,将其设置为空值时,表示任意客户端都可访问。
  • –requestheader-username-headers: 参数指定的字段获取。
  • –requestheader-extra-headers-prefix: 请求头中需要检查的前缀名。
  • –requestheader-group-headers 请求头中需要检查的组名。
  • –requestheader-username-headers 请求头中需要检查的用户名。
  • –proxy-client-cert-file: 在请求期间验证 Aggregator 的客户端 CA 证书。
  • –proxy-client-key-file: 在请求期间验证 Aggregator 的客户端私钥。
  • –requestheader-allowed-names: 允许访问的客户端 common names 列表,通过 header 中 –requestheader-username-headers 参数指定的字段获取。客户端 common names 的名称需要在 client-ca-file 中进行设置,将其设置为空值时,表示任意客户端都可访问。

通过cfssl创建 kubernetes 证书

创建proxy-client-csr.json文件
{
    "CN": "kubernetes",
    "hosts": [
      "10.189.6.101",
      "10.189.6.102",
      "10.189.6.103"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "SuZhou",
            "L": "SuZhou",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
生成证书和密钥
[root@ycloud ssl]# cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem  \
-profile=kubernetes proxy-client-csr.json | cfssljson -bare kubernetes
[root@ycloud proxy-client]# ll
total 16
-rw-r--r-- 1 root root 1062 Jul  7 17:48 proxy-client.csr
-rw-r--r-- 1 root root  350 Jul  7 16:58 proxy-client-csr.json
-rw-r--r-- 1 root root 1680 Jul  7 17:49 proxy-client-key.pem
-rw-r--r-- 1 root root 1428 Jul  7 17:48 proxy-client.pem

将证书放到proxy-client目录下,

修改APIserver参数配置,并重启服务
[root@ycloud ~]# vi /etc/kubernetes/kube-apiserver.conf 
...
  --requestheader-allowed-names=aggregator \
  --requestheader-group-headers=X-Remote-Group \
  --requestheader-username-headers=X-Remote-User \
  --requestheader-extra-headers-prefix=X-Remote-Extra- \
  --requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem \
  --proxy-client-cert-file=/etc/kubernetes/proxy-client/proxy-client.pem \
  --proxy-client-key-file=/etc/kubernetes/proxy-client/proxy-client-key.pem  \
  --enable-aggregator-routing=true
...
[root@ycloud ~]# systemctl restart  kube-apiserver

所有master节点都要进行修改操作。

验证

1.kubectl top命令查看资源信息

[root@ycloud proxy-client]# kubectl top node
NAME            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
10-189-1-101  3619m        5%     9332Mi          3%        
10-189-1-102  1008m        1%     2839Mi          0%        
10-189-1-103   901m        1%     3728Mi          1% 

2.Metrics API访问集群节点

[root@ycloud ~]# kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/ycloud" | python -m json.tool
{
    "apiVersion": "metrics.k8s.io/v1beta1",
    "kind": "NodeMetrics",
    "metadata": {
        "creationTimestamp": "2022-09-28T02:37:08Z",
        "labels": {
            "beta.kubernetes.io/arch": "amd64",
            "beta.kubernetes.io/os": "linux",
            "edgenode": "true",
            "k8s.kuboard.cn/role": "etcd",
            "kubernetes.io/arch": "amd64",
            "kubernetes.io/hostname": "ycloud",
            "kubernetes.io/os": "linux",
            "node-role.kubernetes.io/control-plane": "",
            "node-role.kubernetes.io/master": ""
        },
        "name": "ycloud"
    },
    "timestamp": "2022-09-28T02:37:08Z",
    "usage": {
        "cpu": "2430m",
        "memory": "37488252Ki"
    },
    "window": "1m0s"
}

可以看到节点的 CPU 和内存使用情况

python -m json.tool是python的json解析工具,方便我们阅读

在安装的过程中或多或少可能会有一些问题,最好的办法就是一步一步的去排错,出现了错误不要着急,最重要的就是分析错误日志信息,很多错误日志提示其实已经非常明显了。

参考文献

http://www.mydlq.club/article/102/

https://www.cnblogs.com/dgp-zjz/p/14646167.html

https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/

https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/

你可能感兴趣的:(云原生,监控,云原生,kubernetes,docker)