Kubernetes 部署 Metrics Server 獲取集羣指標數據

系統環境:

  • Kubernetes 版本:1.18.2
  • Metrics Server 版本:0.3.6

示例部署文件地址:

一、Metrics Server 簡介

       介紹 Metrics Server 前首先介紹下 Heapster,該工具是用於 Kubernetes 集羣監控和性能分析工具,可以收集節點上的指標數據,例如,節點的 CPU、Memory、Network 和 Disk 的 Metric 數據。不過在 Kubernetes V1.11 版本後將被逐漸廢棄。而 Metrics Server 正是 Heapster 的代替者。

       Metrics Server 是 Kubernetes 集羣核心監控數據的聚合器,可以通過 Metrics API 的形式獲取 Metrics 數據,不過僅僅是獲取指標的最新值,不對舊值進行存儲,且不負責將指標轉發到第三方目標。Metrics Server 還可以與 Kubectl 工具結合使用,提供 kubectl top 命令來展示集羣中的指標數據,接下來我們開始部署 Metrics Server。

二、部署應用權限 RBAC 資源

Kubernetes 部署 Metrics Server 前需要先提前部署 RBAC 相關配置,這樣 Metrics Server 纔能有足夠的權限獲取系統組件的信息。

準備相關的鏡像

[root@node1 ~]# docker pull registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
v0.3.6: Pulling from google_containers/metrics-server-amd64
e8d8785a314f: Pull complete 
b2f4b24bed0d: Pull complete 
Digest: sha256:c9c4e95068b51d6b33a9dccc61875df07dc650abbf4ac1a19d58b4628f89288b
Status: Downloaded newer image for registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6

創建 Metrics RBAC 文件

metrics-rbac.yaml

## ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system
---
## ClusterRole aggregated-metrics-reader
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"]
---
## ClusterRole metrics-server
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"]
---
## ClusterRoleBinding auth-delegator
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
---
## RoleBinding metrics-server-auth-reader
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
---
## ClusterRoleBinding system:metrics-server
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

通過 Kubectl 工具部署 Metrics RBAC

  • -n:指定部署應用的 Namespace 命名空間
[root@master metrics]# kubectl apply -f metrics-rbac.yaml -n kube-system
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created

三、部署 APIService 資源

設置擴展 API Service 工作於聚合層,允許使用其 API 擴展 Kubernetes apiserver,而這些 API 並不是核心 Kubernetes API 的一部分。這裏部署 APIservice 資源,來提供 Kubernetes Metrics 指標 API 數據。

創建 Metrics APIService 文件

metrics-api-service.yaml

## APIService
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

通過 Kubectl 工具部署 Metrics APIService

  • -n:指定部署應用的 Namespace 命名空間
[root@master metrics]# kubectl apply -f metrics-api-service.yaml -n kube-system
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

四、部署 Metrics Server 應用

創建 Metrics 部署文件

metrics-server-deploy.yaml

## Service
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
    targetPort: 4443
---
## Deployment
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:
      hostNetwork: true
      serviceAccountName: metrics-server
      containers:
      - name: metrics-server
        image: registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
        imagePullPolicy: IfNotPresent
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - --kubelet-insecure-tls
          - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname
        ports:
        - name: main-port
          containerPort: 4443
          protocol: TCP
        securityContext:
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        resources:
          limits:
            memory: 1Gi
            cpu: 1000m
          requests:
            memory: 1Gi
            cpu: 1000m
        volumeMounts:
        - name: tmp-dir
          mountPath: /tmp
        - name: localtime
          readOnly: true
          mountPath: /etc/localtime
      volumes:
      - name: tmp-dir
        emptyDir: {}
      - name: localtime
        hostPath:
          type: File
          path: /etc/localtime
      nodeSelector:
        kubernetes.io/os: linux
        kubernetes.io/arch: "amd64"

通過 Kubectl 工具部署 Metrics 應用

  • -n:指定部署應用的 Namespace 命名空間
[root@master metrics]# kubectl apply -f metrics-server-deploy.yaml -n kube-system
service/metrics-server created
deployment.apps/metrics-server created

五、進行測試

當部署完 Metrics Server 後,可以通過 kubectl 工具進行測試,默認支持下面命令:

  • kubectl top pod: 獲取 Pod 的 CPU、Memory 使用信息。
  • kubectl top node: 獲取 Node 的 CPU、Memory 使用信息。

輸入上面命令進行測試,如下:

1、獲取全部節點指標信息

[root@master metrics]# kubectl top node
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master   142m         3%     1144Mi          42%       
node1    72m          1%     548Mi           20%       
node2    38m          0%     543Mi           20%  

2、獲取某個 Namespace Pod 的指標信息

[root@master metrics]# kubectl top pods -n kube-system
NAME                                        CPU(cores)   MEMORY(bytes)   
coredns-66bff467f8-4hb27                    4m           11Mi            
coredns-66bff467f8-c8v2k                    3m           10Mi            
dashboard-metrics-scraper-d5698f9b8-jlsrt   1m           8Mi             
etcd-master                                 21m          32Mi            
kube-apiserver-master                       47m          335Mi           
kube-controller-manager-master              17m          40Mi            
kube-flannel-ds-amd64-9lzqb                 3m           14Mi            
kube-flannel-ds-amd64-bqm9r                 3m           16Mi            
kube-flannel-ds-amd64-hntqr                 2m           14Mi            
kube-proxy-46v8f                            1m           20Mi            
kube-proxy-8mmfn                            1m           19Mi            
kube-proxy-c5vkx                            1m           19Mi            
kube-scheduler-master                       3m           17Mi            
kubernetes-dashboard-5c67c4f589-lgzw5       1m           22Mi            
metrics-server-59f947bc97-7r6xx             1m           12Mi 

3、獲取某個 Namespace 下某個 Pod 的指標信息

[root@master metrics]# kubectl top pods coredns-66bff467f8-4hb27 -n kube-system
NAME                       CPU(cores)   MEMORY(bytes)   
coredns-66bff467f8-4hb27   3m           11Mi

4、獲取全部 Namespace 下的 Pod 的指標信息

[root@master metrics]# kubectl top pods --all-namespaces
NAMESPACE     NAME                                        CPU(cores)   MEMORY(bytes)   
kube-system   coredns-66bff467f8-4hb27                    3m           11Mi            
kube-system   coredns-66bff467f8-c8v2k                    3m           10Mi            
kube-system   dashboard-metrics-scraper-d5698f9b8-jlsrt   1m           8Mi             
kube-system   etcd-master                                 13m          32Mi            
kube-system   kube-apiserver-master                       46m          289Mi           
kube-system   kube-controller-manager-master              18m          40Mi            
kube-system   kube-flannel-ds-amd64-9lzqb                 4m           14Mi            
kube-system   kube-flannel-ds-amd64-bqm9r                 3m           16Mi            
kube-system   kube-flannel-ds-amd64-hntqr                 3m           14Mi            
kube-system   kube-proxy-46v8f                            1m           20Mi            
kube-system   kube-proxy-8mmfn                            1m           19Mi            
kube-system   kube-proxy-c5vkx                            1m           19Mi            
kube-system   kube-scheduler-master                       3m           17Mi            
kube-system   kubernetes-dashboard-5c67c4f589-lgzw5       1m           22Mi            
kube-system   metrics-server-59f947bc97-7r6xx             1m           13Mi 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章