Эта статья относится к серии мониторинга k8s, остальные статьи:
- мониторинг k8s (1) Установить Prometheus
- мониторинг k8s (3) prometheus-adapter
- 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, спасибо!