Prometheus: мониторинг AWS Load Balancer Controller Controller в AWS EKS

Автор: | 12/10/2021
 

“Внезапно”, но AWS ALB Controller умеет в метрики для Prometheus.

Используем стандартный URI /metrics.

Для начала – проверим, что метрики в поде есть.

Находим под:

kk -n kube-system get pod | grep aws
aws-load-balancer-controller-7bdcf75789-wk4bt   1/1     Running   0          41h

Пробрасываем на него порт:

kk port-forward -n kube-system pods/aws-load-balancer-controller-7bdcf75789-wk4bt 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

И пробуем с рабочей машины:

curl -s localhost:8080/metrics | head
HELP aws_api_call_duration_seconds Perceived latency from when your code makes an SDK call, includes retries
TYPE aws_api_call_duration_seconds histogram
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.005"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.01"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.025"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.05"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.1"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.25"} 29
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.5"} 39
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="1"} 39

Супер – метрики есть. Осталось их собрать.

Настройка Prometheus

У нас на каждом AWS Elastic Kubernetes кластере свой Prometheus, который запускается и настраивается через Prometheus Operator.

Инстансы Prometheus в Kubernetes через Prometheus federation подключены к центральному серверу – он с них собирает метрики.

Что нам надо: создать ServiceMonitor для Prometheus в Kubernetes, используя который Prometheus начнёт собирать метрики с нужного ендпоинта, а затем отдавать их в центральный Prometheus, где мы сделаем алерты и дашборды в Grafana.

Несколько кастомных ServiceMonitor у нас уже есть:

kk -n monitoring get servicemonitors
NAME                                                 AGE
backend-redis                                        225d
devops-rabbitmq-servicemonitor                       80d
...

ALB Controller Service

AWS ALB Contoller у нас деплоится из манифеста с Deployment, и создаёт только под. В случае установки его из Helm-чарта – там наверняка уже есть и сам Service, и даже, возможно, ServiceMonitor.

В нашем случае для теста создадим новый Service, который будет пробрасывать трафик к поду с ALB Controller:

---
apiVersion: v1
kind: Service
metadata:
  name: aws-alb-controller-svc
  namespace: kube-system
  labels:
    app.kubernetes.io/instance: aws-load-balancer-controller
    app.kubernetes.io/name: aws-load-balancer-controller
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/name: aws-load-balancer-controller
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080

Сервис создаём в kube-system Namespace, там где живёт наш ALB Controller, а в его .spec.selector используем labels из ALB Controller Deployment:

kk -n kube-system get deploy aws-load-balancer-controller --show-labels
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE    LABELS
aws-load-balancer-controller   1/1     1            1           156d   app.kubernetes.io/instance=aws-load-balancer-controller,app.kubernetes.io/managed-by=Helm,app.kubernetes.io/name=aws-load-balancer-controller,app.kubernetes.io/version=v2.2.2,helm.sh/chart=aws-load-balancer-controller-1.2.5

ALB Controller ServiceMonitor

Далее, описываем ServiceMonitor:

---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  namespace: monitoring
  labels:
    serviceapp: aws-alb-controller-servicemonitor
    release: prometheus
  name: aws-alb-controller-servicemonitor
spec:
  endpoints:
  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    interval: 15s
    port: http
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      app.kubernetes.io/name: aws-load-balancer-controller

Применяем манифест:

kk apply -f alb-svc-mo-check.yaml
service/aws-alb-controller-svc created
servicemonitor.monitoring.coreos.com/aws-alb-controller-servicemonitor created

Проверим Сервис:

kk -n kube-system get svc aws-alb-controller-svc
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
aws-alb-controller-svc   ClusterIP   172.20.158.27   <none>        8080/TCP   1m

Пробрасываем порт к этому сервису:

kk -n kube-system port-forward services/aws-alb-controller-svc 8081:8080
Forwarding from 127.0.0.1:8081 -> 8080

Проверяем доступность метрик:

curl -s localhost:8081/metrics | head
HELP aws_api_call_duration_seconds Perceived latency from when your code makes an SDK call, includes retries
TYPE aws_api_call_duration_seconds histogram
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.005"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.01"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.025"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.05"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.1"} 0
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.25"} 29
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="0.5"} 39
aws_api_call_duration_seconds_bucket{operation="AuthorizeSecurityGroupIngress",service="EC2",le="1"} 39

Проверяем в Kubernetes Prometheus – Status > Targets:

И метрики:

И в центральном Prometheus:

Осталось придумать алертов и дашборду для Grafana.