Сравнение методов сбора показателей мониторинга Kubernetes

задняя часть Kubernetes
Сравнение методов сбора показателей мониторинга Kubernetes

Эта статья участвовала в третьем этапе курса «High Yield Update» тренировочного лагеря для создателей Nuggets. Подробнее см.:Dig Li Project | Идет третий этап тренировочного лагеря создателя, «написание» личного влияния.

1 контраст

node-exporterОн используется для сбора операционных индикаторов на уровне сервера, включая базовый мониторинг, такой как loadavg, файловая система и meminfo машины, аналогично zabbix-agent в традиционном измерении мониторинга хоста.

metric-server/heapsterОтapi-serverОн получает индикаторы мониторинга, такие как использование процессора и памяти, из Интернета и отправляет их в серверную часть хранилища, например, influxdb или облачным поставщикам.Его основные функции:Обеспечьте поддержку индикаторов принятия решений для таких компонентов, как HPA.

kube-state-metricsСосредоточьтесь на получении последнего статуса различных ресурсов k8s, таких как развертывание или набор демонов.

Например:

  • Сколько реплик я планирую? Сколько доступно сейчас?
  • Сколько подов работает/остановлено/завершено?
  • Сколько раз Pod перезагружался?
  • Сколько рабочих мест у меня работает

Эти показателиkube-state-metricsпоставка.

Почему неkube-state-metricsвключены вmetric-serverспособность, потому что их интересы по своей сути различны.

  • metric-serverПросто извлечение, форматирование существующих данных, запись в определенное хранилище, по сути, система мониторинга.
  • kube-state-metricsОн делает снимок рабочего состояния k8s в памяти и получает новые индикаторы, но у него нет возможности экспортировать эти индикаторы.

2 Развернуть сервер метрик

Загрузите файл yaml, развернутый metric-server, на локальный

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

Перетащите зеркало metric-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:
      # mount in tmp so we can safely use from-scratch images and/or read-only containers
      - name: tmp-dir
        emptyDir: {}
      containers:
      - name: metrics-server
        image: zhaoqinchang/metrics-server:0.3.7    #修改镜像为刚刚拉取下来的镜像
        imagePullPolicy: IfNotPresent
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
        command:                 #添加以下三行command命令
            - /metrics-server
            - --kubelet-preferred-address-types=InternalIP
            - --kubelet-insecure-tls
        ports:
        - name: main-port
          containerPort: 4443
          protocol: TCP
        securityContext:
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
        - name: tmp-dir
          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: main-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

Развернуть метрический сервер

# 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

Проверьте, отображается ли metric.k8s.io в списке групп API в кластере Kubernetes.

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

3 использовать

kubectl topКоманда может отображать информацию об использовании ресурсов узлов и объектов Pod, и она использует API метрик ресурсов в кластере для сбора различных данных метрик. Он содержит две подкоманды, node и pod, которые могут отображать показатели занятости ресурсов объектов Node и объектов Pod соответственно.

Формат синтаксиса команды для вывода списка занятости ресурсов узла: «kubectl top node [-l label | NAME]». Например, результат отображения состояния занятости ресурсов всех узлов ниже показывает совокупное время занятости ресурсов ЦП и процент каждого узла, а также заполняемость пространства содержимым и коэффициент заполнения. При необходимости вы также можете напрямую указать идентификатор конкретного узла для просмотра в команде и использовать селектор тегов для фильтрации узла.

[root@master metric]# kubectl top nodes
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master    282m         14%    1902Mi          51%       
node-02   70m          3%     1371Mi          37%       
node-03   121m         1%     892Mi           11%  

Использование занятости ресурса объекта Pod на уровне пространства имен немного отличается.При его использовании вы обычно должны указать пространство имен и использовать селектор тегов для фильтрации целевого объекта Pod. Например, следующее показываетkube-systemИспользование ресурсов пода в пространстве имен:

[root@master metric]# kubectl top pods -n kube-system
NAME                              CPU(cores)   MEMORY(bytes)   
etcd-master                       32m          300Mi           
kube-apiserver-master             86m          342Mi           
kube-controller-manager-master    30m          48Mi            
kube-flannel-ds-l5ghn             5m           10Mi            
kube-flannel-ds-rqlm2             4m           12Mi            
kube-flannel-ds-v92r9             4m           14Mi            
kube-proxy-7vjcv                  18m          15Mi            
kube-proxy-xrz8f                  13m          21Mi            
kube-proxy-zpwn6                  1m           14Mi            
kube-scheduler-master             7m           17Mi            
metrics-server-5549c7694f-7vb66   2m           14Mi    

Команда kubectl top предоставляет пользователям простой и быстрый интерфейс для получения состояния занятости системных ресурсов объектов Node и Pod.Это одна из часто используемых команд для работы и обслуживания кластера.