Мониторинг k8s (2) Мониторинг компонентов и модулей кластера

Kubernetes

Эта статья относится к серии мониторинга k8s, остальные статьи:

  1. мониторинг k8s (1) Установить Prometheus
  2. мониторинг k8s (3) prometheus-adapter
  3. k8s мониторинг (4) мониторинг хоста

в предыдущем постестатьяВ , мы установили Prometheus в k8s и собрали собственные метрики мониторинга. В этой статье мы соберем метрики мониторинга для всех компонентов и модулей k8s.

Перед этим вам нужно изменить конфигурацию, используемую самим Prometheus, потому что она исходит от prometheus-operator, и я больше понимаю, как он использует эту конфигурацию. И если мы используем его напрямую, нет необходимости делать так много проблем.Следующее является измененным содержанием.

- job_name: prometheus
  honor_labels: false
  kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
          - monitoring
  scrape_interval: 30s
  relabel_configs:
    - action: keep
      source_labels:
        - __meta_kubernetes_service_label_prometheus
      regex: k8s
    - source_labels:
        - __meta_kubernetes_namespace
      target_label: namespace
    - source_labels:
        - __meta_kubernetes_service_name
      target_label: service
    - source_labels:
        - __meta_kubernetes_pod_name
      target_label: pod
    - target_label: endpoint
      replacement: web

Это понятно, больше объяснять не буду. Теперь давайте перейдем к делу, первый монитор etcd.

монитор и т. д.

Раньше мы обращались к URL-адресу, где расположены индикаторы мониторинга etcd, через команду curl и знали, что это за индикаторы мониторинга, теперь нам нужно настроить Prometheus для сбора этих данных мониторинга.

Как упоминалось ранее, мониторинг Prometheus в k8s осуществляется путем обнаружения конечных точек, а конечные точки создаются службами, поэтому сначала нам нужно создать службу etcd.

Мы создаем новыйkube-etcd-service.ymlфайл со следующим содержимым:

apiVersion: v1
kind: Service
metadata:
  name: kube-etcd
  labels:
    k8s-app: kube-etcd
  namespace: kube-system
spec:
  clusterIP: None
  ports:
    - name: http-metrics
      port: 2379
      protocol: TCP
      targetPort: 2379
  selector:
    component: etcd
  type: ClusterIP

инструкция:

  • Поскольку etcd находится в пространстве имен kube-system, пространство имен здесь также должно быть kube-system;
  • Потому что сам модуль etcd будет существоватьcomponent=etcdЭтот тег, поэтому селектор здесь использует его.
kubectl apply -f kube-etcd-service.yml

После успешного создания вы можете просмотреть конечную точку, созданную с помощью следующей команды:

kubectl -n kube-system get endpoints kube-etcd

Теперь вы можете получить доступ к следующим трем etcds через эту конечную точку.Теперь вам нужно только добавить соответствующую конфигурацию в Prometheus.Содержимое конфигурации выглядит следующим образом.

- job_name: kube-etcd
  honor_labels: false
  kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
          - kube-system
  scheme: https
  tls_config:
    insecure_skip_verify: false
    ca_file: /etc/prometheus/secrets/etcd-client-cert/ca.crt
    cert_file: /etc/prometheus/secrets/etcd-client-cert/healthcheck-client.crt
    key_file: /etc/prometheus/secrets/etcd-client-cert/healthcheck-client.key
  relabel_configs:
    - action: keep
      source_labels:
        - __meta_kubernetes_service_label_k8s_app
      regex: kube-etcd
    - source_labels:
        - __meta_kubernetes_namespace
      target_label: namespace
    - source_labels:
        - __meta_kubernetes_service_name
      target_label: service
    - source_labels:
        - __meta_kubernetes_pod_name
      target_label: pod
    - target_label: endpoint
      replacement: http-metrics
  metric_relabel_configs:
    - action: drop
      regex: (etcd_debugging|etcd_disk|etcd_request|etcd_server|grpc_server).*
      source_labels:
        - __name__

Поскольку для доступа к etcd требуется проверка сертификата клиента, вам необходимо предоставить сертификат и файлы закрытого ключа здесь. Эти три файла ранее были смонтированы в контейнере Prometheus, и их можно использовать напрямую.

следующееrelabel_configsНечего и говорить, это похоже на настройку мониторинга самого Prometheus, самое главноеmetric_relabel_configs, который используется для удаления метрик мониторинга, которые нам не нужны.

здесь будетetcd_debugging|etcd_disk|etcd_request|etcd_server|grpc_serverЭти индикаторы мониторинга в начале были удалены.Не следуйте за мной.Лучше разобраться, что он делает, чтобы решить, удалять ли его.Я просто удалил его, потому что я не мог понять.

Наконец, вставьте вышеуказанный контент вprometheus-config.yml. Когда вы применяете профиль, не спешите перезагрузить, потому что Proometheus не может быть немедленно обновлен, вы можете убедиться, что файл конфигурации обновляется путем подключения PROMETHEUS POD.

Если обновлено, перезагрузим напрямую следующей командой:

curl -XPOST PROMETHEUS_IP:9090/-/reload

Затем посетите веб-страницу Prometheus, вы можете увидеть etcd в таргетах.

монитор

Метод мониторинга apiserver проще, потому что его служба создается автоматически. Но вы должны отметить, что его служба создается в пространстве имен по умолчанию с именемkubernetes.

Тут и говорить нечего, прямо релиз конфигурации Prometheus Monitoring apiserver.

- job_name: kube-apiserver
  honor_labels: false
  kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
          - default
  scrape_interval: 30s
  scheme: https
  tls_config:
    insecure_skip_verify: false
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    server_name: kubernetes
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  relabel_configs:
    - action: keep
      source_labels:
        - __meta_kubernetes_service_label_component
      regex: apiserver
  metric_relabel_configs:
    - source_labels:
        - __name__
      action: drop
      regex: (apiserver_storage_data_key_generation_latencies_microseconds_bucket|apiserver_admission_controller_admission_latencies_milliseconds_bucket|apiserver_admission_step_admission_latencies_milliseconds_bucket|apiserver_admission_step_admission_latencies_milliseconds_summary|apiserver_request_latencies_bucket|apiserver_request_latencies_summary|apiserver_storage_data_key_generation_latencies_microseconds_bucket|rest_client_request_latency_seconds_bucket)

здесь, потому чтоinsecure_skip_verifyУстановите значение false, то есть для проверки сертификата сервера, поэтому здесь указаны файл ca и имя_сервера. Кроме того, этот сертификат был заранее смонтирован в контейнере, поэтому просто укажите его напрямую.

Поскольку есть слишком много индикаторов, на которых я не хочу сосредотачиваться, я удалил пакет. Прежде всего, позвольте мне заявить, что я удалил их вслепую, и я не понимаю их точного смысла, я просто подумал, что они бесполезны, поэтому я их удалил, не подписывайтесь на меня!

Наконец вы смотрите на перезагрузку.

модули монитора

Модуль индикаторов мониторинга Kubelet предоставляется перед командой curl, также используется для просмотра, так что вот прямое сухое.

Prometheus-operator использует тот же метод обнаружения эндпоинтов, но kubelet — это процесс операционной системы, а не pod, поэтому создать соответствующий эндпоинт, создав сервис, невозможно, и я не знаю, почему это можно сделать.

Чтобы быть более общим, мы делаем это через обнаружение узла здесь. При обнаружении узла вы не можете указать порт, prometheus автоматически получит доступ к порту 10250 узла обнаружения.

Конфигурация прометея выглядит следующим образом:

    - job_name: pods
      honor_labels: true
      kubernetes_sd_configs:
      - role: node
      scrape_interval: 30s
      metrics_path: /metrics/cadvisor
      scheme: https
      tls_config:
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      metric_relabel_configs:
      - source_labels:
        - __name__
        regex: container_(cpu_cfs_periods_total|fs_inodes_total|fs_sector_reads_total|fs_sector_writes_total|last_seen|memory_mapped_file|spec_memory_reservation_limit_bytes|spec_memory_swap_limit_bytes|tasks_state)
        action: drop
      - source_labels:
        - container
        regex: ""
        action: drop
      - action: labeldrop
        regex: (id|name|pod_name|image)

Назадmetric_relabel_configsВ дополнение к удалению некоторых индикаторов мониторинга, которые я считаю бесполезными, также удаляются все индикаторы мониторинга с пустыми метками контейнеров, например:

container_memory_cache{container="",container_name="",id="/",image="",name="",namespace="",pod="",pod_name=""} 2.144395264e+09 1565777155746
container_memory_cache{container="",container_name="",id="/kubepods.slice",image="",name="",namespace="",pod="",pod_name=""} 7.14027008e+08 1565777155757
container_memory_cache{container="",container_name="",id="/kubepods.slice/kubepods-besteffort.slice",image="",name="",namespace="",pod="",pod_name=""} 3.5053568e+08 1565777145294
container_memory_cache{container="",container_name="",id="/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-poda213e57700fd1325c59a70dd70f1a07d.slice",image="",name="",namespace="kube-system",pod="etcd-ops.k8s.master.01.sit",pod_name="etcd-ops.k8s.master.01.sit"} 3.09784576e+08 1565777149076
container_memory_cache{container="",container_name="",id="/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podcfdbebf5_8211_11e9_8699_005056a7c0c5.slice",image="",name="",namespace="kube-system",pod="kube-proxy-xw8sw",pod_name="kube-proxy-xw8sw"} 4.0767488e+07 1565777147425

Я действительно не знаю, для чего они нужны, и их число очень велико, поэтому я просто удаляю их напрямую. Также удалены некоторые теги, такие как:

container_fs_io_current{container="coredns",container_name="coredns",device="/dev/mapper/centos-root",endpoint="https-metrics",id="/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-poda9693624_85e3_11e9_80cb_005056a7c0c5.slice/docker-9b95ca870a0e7a8fde7ce116b07fc696bd91bea75f6bc61478f3ecc98f36f131.scope",image="sha256:eb516548c180f8a6e0235034ccee2428027896af16a509786da13022fe95fe8c",instance="10.99.100.2:10250",job="pods",name="k8s_coredns_coredns-fb8b8dccf-9dvh7_kube-system_a9693624-85e3-11e9-80cb-005056a7c0c5_2",namespace="kube-system",pod="coredns-fb8b8dccf-9dvh7",pod_name="coredns-fb8b8dccf-9dvh7",service="kubelet"}

Видно, что значения тегов id, name и image очень длинные и некрасивые, а также тратят память и ресурсы хранения, поэтому я их все удалил. Кажется, что если в поде несколько контейнеров, вы не сможете узнать, какой контейнер находится в индикаторах мониторинга, потому что метка изображения удалена.

Во всяком случае, я удалил его, вы можете понять это. После удаления вот так:

container_fs_io_current{container="coredns",container_name="coredns",device="/dev/mapper/centos-root",endpoint="https-metrics",instance="10.99.100.2:10250",job="pods",namespace="kube-system",pod="coredns-fb8b8dccf-9dvh7",service="kubelet"}

Конечно, многие лейблы создаются сами, если вам это не нужно, вы можете использовать вышеперечисленныеrelabel_configsУдалите конфигурацию соответствующей метки. Возможно, вы хотите удалить другие теги, тогда вы можете добавить их в приведенную выше конфигурацию.

Наконец, не забудьте перезагрузить.

Установить kube-state-metrics

Я не буду продолжать мониторить другие компоненты k8s, в том числе kubelet, диспетчер контроллеров, coredns и т. д. Их методы мониторинга аналогичны предыдущим компонентам, я думаю, вы можете легко сделать это самостоятельно.

Далее мы установим kube-state-metrics, который будет подключаться к apiserver, а затем выставлять метрики различных ресурсов в кластере, таких как configMap, ingress, secret, pod, deploy, statefulset и т. д. Это для pod metrics Отличное дополнение, очень полезное.

Разрешения RBAC

Поскольку для предоставления информации о них требуется доступ ко всем ресурсам в кластере, создайте для него некоторые разрешения перед развертыванием. Эти разрешения будут привязаны к serviceAccount, а затем мы сможем запускать kube-state-metrics с этим sa.

kube-state-metrics-clusterRole.yml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kube-state-metrics
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - secrets
      - nodes
      - pods
      - services
      - resourcequotas
      - replicationcontrollers
      - limitranges
      - persistentvolumeclaims
      - persistentvolumes
      - namespaces
      - endpoints
    verbs:
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - daemonsets
      - deployments
      - replicasets
      - ingresses
    verbs:
      - list
      - watch
  - apiGroups:
      - apps
    resources:
      - statefulsets
      - daemonsets
      - deployments
      - replicasets
    verbs:
      - list
      - watch
  - apiGroups:
      - batch
    resources:
      - cronjobs
      - jobs
    verbs:
      - list
      - watch
  - apiGroups:
      - autoscaling
    resources:
      - horizontalpodautoscalers
    verbs:
      - list
      - watch
  - apiGroups:
      - authentication.k8s.io
    resources:
      - tokenreviews
    verbs:
      - create
  - apiGroups:
      - authorization.k8s.io
    resources:
      - subjectaccessreviews
    verbs:
      - create
  - apiGroups:
      - policy
    resources:
      - poddisruptionbudgets
    verbs:
      - list
      - watch
  - apiGroups:
      - certificates.k8s.io
    resources:
      - certificatesigningrequests
    verbs:
      - list
      - watch

kube-state-metrics-clusterRoleBinding.yml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kube-state-metrics
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kube-state-metrics
subjects:
  - kind: ServiceAccount
    name: kube-state-metrics
    namespace: monitoring

kube-state-metrics-role.yml:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: kube-state-metrics
  namespace: monitoring
rules:
  - apiGroups:
      - ""
    resources:
      - pods
    verbs:
      - get
  - apiGroups:
      - extensions
    resourceNames:
      - kube-state-metrics
    resources:
      - deployments
    verbs:
      - get
      - update
  - apiGroups:
      - apps
    resourceNames:
      - kube-state-metrics
    resources:
      - deployments
    verbs:
      - get
      - update

kube-state-metrics-roleBinding.yml:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kube-state-metrics
  namespace: monitoring
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kube-state-metrics
subjects:
  - kind: ServiceAccount
    name: kube-state-metrics

Kube-State-Metrics-ServiceAccount.yml:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-state-metrics
  namespace: monitoring

развертывание и обслуживание

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

Сначала создайте kube-state-metrics-deployment.yml:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: kube-state-metrics
  name: kube-state-metrics
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      containers:
        - args:
            - --port=10000
            - --telemetry-port=10001
          image: quay.io/coreos/kube-state-metrics:v1.6.0
          name: kube-state-metrics
          resources:
            limits:
              cpu: 100m
              memory: 150Mi
            requests:
              cpu: 100m
              memory: 150Mi
        - command:
            - /pod_nanny
            - --container=kube-state-metrics
            - --cpu=100m
            - --extra-cpu=2m
            - --memory=150Mi
            - --extra-memory=30Mi
            - --threshold=5
            - --deployment=kube-state-metrics
          env:
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: MY_POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
          image: k8s.gcr.io/addon-resizer:1.8.4
          name: addon-resizer
          resources:
            limits:
              cpu: 50m
              memory: 30Mi
            requests:
              cpu: 10m
              memory: 30Mi
      nodeSelector:
        kubernetes.io/os: linux
      securityContext:
        runAsNonRoot: true
        runAsUser: 65534
      serviceAccountName: kube-state-metrics

Задаются два параметра запуска, то есть два порта, из которых 10000 — это порт, который выставляет индикаторы ресурсов кластера, а 10001 — это он сам. Кроме kube-state-metrics запускается контейнерный addon-resizer.Я не знаю что он делает.Во всяком случае,можем сделать как официал.

И, наконец, служебный файл kube-state-metrics-service.yml:

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kube-state-metrics
  name: kube-state-metrics
  namespace: monitoring
spec:
  clusterIP: None
  ports:
    - name: http-main
      port: 10000
      targetPort: 10000
    - name: http-self
      port: 10001
      targetPort: 10001
  selector:
    app: kube-state-metrics

Выставлены оба порта, можно собрать оба или только 10000 портов. Если вы соберете только 10000, вы можете открыть только один порт или оба, и отфильтровать один порт в конфигурации Prometheus.

Сбор данных мониторинга

После применения всех вышеперечисленных файлов можно напрямую настроить Prometheus для сбора. До тех пор вы можете использовать команду curl, чтобы посетить страницу метрик и посмотреть, что внутри:

curl IP:10000/metrics
curl IP:10001/metrics

Не надо мне рассказывать как получить этот айпи адрес, а то видно что индикаторов ресурсов кластера много.Думаю лучше фильтровать и отбрасывать все ненужные, а то будет давление на Прометей очень большой.

Тогда следующая конфигурация Prometheus:

- job_name: kube-state-metrics
  honor_labels: true
  kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
          - monitoring
  scrape_interval: 30s
  scrape_timeout: 30s
  tls_config:
    insecure_skip_verify: true
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  relabel_configs:
    - action: keep
      source_labels:
        - __meta_kubernetes_service_label_k8s_app
      regex: kube-state-metrics
    - action: keep
      source_labels:
        - __meta_kubernetes_endpoint_port_name
      regex: http-main
  metric_relabel_configs:
    - source_labels:
        - __name__
      regex: (kube_daemonset_status_number_ready|kube_daemonset_status_number_unavailable|kube_deployment_status_replicas_unavailable|kube_deployment_spec_paused|kube_deployment_spec_strategy_rollingupdate_max_surge|kube_deployment_spec_strategy_rollingupdate_max_unavailable|kube_endpoint_address_available|kube_endpoint_address_not_ready|kube_node_info|kube_node_spec_unschedulable|kube_node_status_condition|kube_node_status_capacity|kube_node_status_capacity|kube_node_status_allocatable|kube_persistentvolumeclaim_info|kube_persistentvolumeclaim_status_phase|kube_persistentvolumeclaim_resource_requests_storage_bytes|kube_persistentvolume_status_phase|kube_persistentvolume_info|kube_persistentvolume_capacity_bytes|kube_pod_info|kube_pod_status_phase|kube_pod_status_ready|kube_pod_container_info|kube_pod_container_status_waiting|kube_pod_container_status_waiting_reason|kube_pod_container_status_running|kube_pod_container_status_terminated_reason|kube_pod_container_status_last_terminated_reason|kube_pod_container_status_restarts_total|kube_pod_container_resource_limits|kube_service_info|kube_statefulset_status_replicas_current|kube_statefulset_status_replicas_ready)
      action: keep

Мне нет необходимости упоминать содержание конфигурации, которая аналогична конфигурации, проверенной ранее.

Основная причина в том, что здесь удалено большое количество индикаторов, на которые я не обращаю внимания.Обратите внимание, то, что я здесь делаю, это белый список, и собираю только те, которые указываю, потому что слишком много ненужных для записи. Несмотря на то, что регулярное выражение такое длинное, эффективность сопоставления по-прежнему очень высока, поскольку имя индикатора короткое, а регулярное выражение по умолчанию привязывает начало и конец строки.

Наконец, не забудьте перезагрузить.

Хорошо, это конец этой статьи, следующим образом упомянут, как использовать Grafana и AlertManager, спасибо!