当前位置:首页 > 技术 > 正文内容

Kubernetes Metrics Server 部署指南

访客 技术 2026年10月5日 1

环境准备

主机名称 IP地址 操作系统
k8s-master 172.21.3.20 CentOS7.8
k8s-node1 172.21.3.21 CentOS7.8
k8s-node2 172.21.3.22 CentOS7.8

获取 Metrics Server 配置文件

首先从官方仓库下载部署配置文件:

wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml

获取镜像文件

拉取所需的 Metrics Server 镜像:

docker pull zhaoqinchang/metrics-server:0.3.7
0.3.7: Pulling from zhaoqinchang/metrics-server
9ff2acc3204b: Pull complete 
9d14b55ff9a0: Pull complete 
Digest: sha256:c0efe772bb9e5c289db6cc4bc2002c268507d0226f2a3815f7213e00261c38e9
Status: Downloaded newer image for zhaoqinchang/metrics-server:0.3.7
docker.io/zhaoqinchang/metrics-server:0.3.7

修改部署配置文件

编辑 components.yaml 文件,更新镜像引用并添加必要的启动参数:

cat components.yaml 
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:aggregated-metrics-reader
  labels:
    rbac.authorization.k8s.io/aggregate-to-view: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups: ["metrics.k8s.io"]
  resources: ["pods", "nodes"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    k8s-app: metrics-server
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  template:
    metadata:
      name: metrics-server
      labels:
        k8s-app: metrics-server
    spec:
      serviceAccountName: metrics-server
      volumes:
      - name: temp-storage
        emptyDir: {}
      containers:
      - name: metrics-server-container
        image: zhaoqinchang/metrics-server:0.3.7
        imagePullPolicy: IfNotPresent
        command:
          - /metrics-server
          - --kubelet-preferred-address-types=InternalIP
          - --kubelet-insecure-tls
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
        ports:
        - name: secure-port
          containerPort: 4443
          protocol: TCP
        securityContext:
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
        - name: temp-storage
          mountPath: /tmp
      nodeSelector:
        kubernetes.io/os: linux
---
apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: metrics-server
  ports:
  - port: 443
    protocol: TCP
    targetPort: secure-port
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  - namespaces
  - configmaps
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system

应用部署配置

执行以下命令部署 Metrics Server:

kubectl apply -f components.yaml 
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created

验证部署状态

检查 Metrics Server 在哪个节点上运行:

kubectl get pods -n kube-system -o wide 
NAME                              READY   STATUS    RESTARTS   AGE    IP             NODE     NOMINATED NODE   READINESS GATES
coredns-66bff467f8-h7rjz          1/1     Running   21         72d    10.244.0.142   master              
coredns-66bff467f8-jvqf8          1/1     Running   21         72d    10.244.0.144   master              
etcd-master                       1/1     Running   23         72d    172.16.2.200   master              
kube-apiserver-master             1/1     Running   97         72d    172.16.2.200   master              
kube-controller-manager-master    1/1     Running   23         72d    172.16.2.200   master              
kube-flannel-ds-amd64-26qv9       1/1     Running   28         72d    172.16.2.200   master              
kube-flannel-ds-amd64-fzxxc       1/1     Running   16         72d    172.16.2.101   node1               
kube-flannel-ds-amd64-lgggd       1/1     Running   3          3d5h   172.16.2.202   node2               
kube-proxy-255z5                  1/1     Running   23         72d    172.16.2.200   master              
kube-proxy-8mh7c                  1/1     Running   17         72d    172.16.2.101   node1               
kube-proxy-gsbn6                  1/1     Running   16         72d    172.16.2.202   node2               
kube-scheduler-master             1/1     Running   23         72d    172.16.2.200   master              
metrics-server-7b8dbfc8bc-l8sxd   1/1     Running   0          16s    10.244.1.163   node1               

检查服务详情

查看 Metrics Server Pod 的详细信息:

kubectl describe pods metrics-server-7b8dbfc8bc-4ck84 -n kube-system
Name:         metrics-server-7b8dbfc8bc-4ck84
Namespace:    kube-system
Priority:     0
Node:         node1/172.16.2.101
Start Time:   Sun, 27 Sep 2020 15:25:03 +0800
Labels:       k8s-app=metrics-server
              pod-template-hash=7b8dbfc8bc
Annotations:  
Status:       Running
IP:           10.244.1.165
IPs:
  IP:           10.244.1.165
Controlled By:  ReplicaSet/metrics-server-7b8dbfc8bc
Containers:
  metrics-server-container:
    Container ID:  docker://7db90ed46c704a75fbf42c0e7ad7996a0968ab26e1b04ec56367324865fb3abd
    Image:         zhaoqinchang/metrics-server:0.3.7
    Image ID:      docker-pullable://zhaoqinchang/metrics-server@sha256:c0efe772bb9e5c289db6cc4bc2002c268507d0226f2a3815f7213e00261c38e9
    Port:          4443/TCP
    Host Port:     0/TCP
    Command:
      /metrics-server
      --kubelet-preferred-address-types=InternalIP
      --kubelet-insecure-tls
    Args:
      --cert-dir=/tmp
      --secure-port=4443
    State:          Running
      Started:      Sun, 27 Sep 2020 15:25:04 +0800
    Ready:          True
    Restart Count:  0
    Environment:    
    Mounts:
      /tmp from temp-storage (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from metrics-server-token-vszdg (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  temp-storage:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     
    SizeLimit:  
  metrics-server-token-vszdg:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  metrics-server-token-vszdg
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  kubernetes.io/os=linux
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  31s        default-scheduler  Successfully assigned kube-system/metrics-server-7b8dbfc8bc-4ck84 to node1
  Normal  Pulled     <unknown>  kubelet, node1     Container image "zhaoqinchang/metrics-server:0.3.7" already present on machine
  Normal  Created    <unknown>  kubelet, node1     Created container metrics-server-container
  Normal  Started    <unknown>  kubelet, node1     Started container metrics-server-container

验证 API 注册

确认 metrics.k8s.io 出现在 API 版本列表中:

kubectl api-versions | grep metrics 
metrics.k8s.io/v1beta1

测试监控功能

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

kubectl top node
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master   179m         8%     1660Mi          43%       
node1    81m          4%     908Mi           23%       
node2    78m          3%     1036Mi          26%   

查看 Pod 资源使用

检查各个 Pod 的资源消耗情况:

kubectl top pod
NAME                           CPU(cores)   MEMORY(bytes)   
nginxdocker-59845fd65f-kgnmc   0m           3Mi             
nginxdocker-59845fd65f-rnvzg   0m           3Mi             
nginxdocker-59845fd65f-zgrlc   0m           4Mi             
tomcat7-54fb6dbfdc-ch42r       2m           123Mi           
tomcat7-54fb6dbfdc-cmljd       2m           123Mi           
tomcat7-54fb6dbfdc-ln4hk       2m           125Mi 

Dashboard 可视化集成

完成部署后,Dashboard 插件能够显示容器的资源使用图形数据。

Dashboard Resource View 2

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。