09-3.部署 metrics-server 插件

    1. 如果没有特殊指明,本文档的所有操作均在 zhangjun-k8s01 节点上执行
    2. kuberntes 自带插件的 manifests yaml 文件使用 gcr.io 的 docker registry,国内被墙,需要手动替换为其它 registry 地址(本文档未替换);
    3. 可以从微软中国提供的 gcr.io 免费代理下载被墙的镜像;

    metrics-server 通过 kube-apiserver 发现所有节点,然后调用 kubelet APIs(通过 https 接口)获得各节点(Node)和 Pod 的 CPU、Memory 等资源使用情况。

    从 Kubernetes 1.12 开始,kubernetes 的安装脚本移除了 Heapster,从 1.13 开始完全移除了对 Heapster 的支持,Heapster 不再被维护。

    替代方案如下:

    1. 用于支持自动扩缩容的 CPU/memory HPA metrics:metrics-server;
    2. 通用的监控方案:使用第三方可以获取 Prometheus 格式监控指标的监控系统,如 Prometheus Operator;
    3. 事件传输:使用第三方工具来传输、归档 kubernetes events;

    Kubernetes Dashboard 还不支持 metrics-server(PR:),如果使用 metrics-server 替代 Heapster,将无法在 dashboard 中以图形展示 Pod 的内存和 CPU 情况,需要通过 Prometheus、Grafana 等监控方案来弥补。

    安装 metrics-server

    从 github clone 源码:

    修改 文件,为 metrics-server 添加三个命令行参数:

    1. $ diff metrics-server-deployment.yaml.orig metrics-server-deployment.yaml
    2. 32a33,36
    3. > args:
    4. > - --metric-resolution=30s
    5. > - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
    • —metric-resolution=30s:从 kubelet 采集数据的周期;
    • —kubelet-preferred-address-types:优先使用 InternalIP 来访问 kubelet,这样可以避免节点名称没有 DNS 解析记录时,通过节点名称调用节点 kubelet API 失败的情况(未配置时默认的情况);

    部署 metrics-server:

    1. $ kubectl -n kube-system get pods -l k8s-app=metrics-server
    2. NAME READY STATUS RESTARTS AGE
    3. metrics-server-7cffff65bc-hkfr7 1/1 Running 0 56s
    4. $ kubectl get svc -n kube-system metrics-server
    5. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    6. metrics-server ClusterIP 10.254.37.139 <none> 443/TCP 94s

    metrics-server 的命令行参数

    1. https://172.27.137.240:6443/apis/metrics.k8s.io/v1beta1/nodes https://172.27.137.240:6443/apis/metrics.k8s.io/v1beta1/pods /pods/

    2. 直接使用 kubectl 命令访问:

      kubectl get —raw apis/metrics.k8s.io/v1beta1/nodes kubectl get —raw apis/metrics.k8s.io/v1beta1/pods kubectl get —raw apis/metrics.k8s.io/v1beta1/nodes/ kubectl get —raw apis/metrics.k8s.io/v1beta1/namespace//pods/

    1. $ kubectl get --raw "/apis/metrics.k8s.io/v1beta1" | jq .
    2. {
    3. "kind": "APIResourceList",
    4. "apiVersion": "v1",
    5. "groupVersion": "metrics.k8s.io/v1beta1",
    6. "resources": [
    7. {
    8. "name": "nodes",
    9. "namespaced": false,
    10. "kind": "NodeMetrics",
    11. "verbs": [
    12. "get",
    13. "list"
    14. ]
    15. },
    16. {
    17. "singularName": "",
    18. "namespaced": true,
    19. "kind": "PodMetrics",
    20. "verbs": [
    21. "get",
    22. "list"
    23. ]
    24. }
    25. ]
    26. }
    27. $ kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq .
    28. {
    29. "kind": "NodeMetricsList",
    30. "apiVersion": "metrics.k8s.io/v1beta1",
    31. "metadata": {
    32. "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes"
    33. },
    34. "items": [
    35. {
    36. "metadata": {
    37. "name": "zhangjun-k8s01",
    38. "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/zhangjun-k8s01",
    39. "creationTimestamp": "2019-05-26T10:55:10Z"
    40. },
    41. "timestamp": "2019-05-26T10:54:52Z",
    42. "window": "30s",
    43. "usage": {
    44. }
    45. },
    46. {
    47. "metadata": {
    48. "name": "zhangjun-k8s02",
    49. "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/zhangjun-k8s02",
    50. "creationTimestamp": "2019-05-26T10:55:10Z"
    51. },
    52. "timestamp": "2019-05-26T10:54:54Z",
    53. "window": "30s",
    54. "usage": {
    55. "cpu": "253796835n",
    56. "memory": "1028836Ki"
    57. }
    58. },
    59. {
    60. "metadata": {
    61. "name": "zhangjun-k8s03",
    62. "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/zhangjun-k8s03",
    63. "creationTimestamp": "2019-05-26T10:55:10Z"
    64. },
    65. "timestamp": "2019-05-26T10:54:54Z",
    66. "window": "30s",
    67. "usage": {
    68. "cpu": "280441339n",
    69. "memory": "1072772Ki"
    70. }
    71. }
    72. ]
    • /apis/metrics.k8s.io/v1beta1/nodes 和 /apis/metrics.k8s.io/v1beta1/pods 返回的 usage 包含 CPU 和 Memory;

    使用 kubectl top 命令查看集群节点资源使用情况

    kubectl top 命令从 metrics-server 获取集群节点基本的指标信息:

    1. metrics-server RBAC:https://github.com/kubernetes-incubator/metrics-server/issues/40
    2. metrics-server 参数:
    3. https://kubernetes.io/docs/tasks/debug-application-cluster/core-metrics-pipeline/
    4. metrics-server 的 。