“Внезапно”, но AWS ALB Controller умеет в метрики для Prometheus.
Используем стандартный URI /metrics
.
Для начала – проверим, что метрики в поде есть.
Находим под:
[simterm]
$ kk -n kube-system get pod | grep aws aws-load-balancer-controller-7bdcf75789-wk4bt 1/1 Running 0 41h
[/simterm]
Пробрасываем на него порт:
[simterm]
$ 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
[/simterm]
И пробуем с рабочей машины:
[simterm]
$ 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
[/simterm]
Супер – метрики есть. Осталось их собрать.
Содержание
Настройка Prometheus
У нас на каждом AWS Elastic Kubernetes кластере свой Prometheus, который запускается и настраивается через Prometheus Operator.
Инстансы Prometheus в Kubernetes через Prometheus federation подключены к центральному серверу – он с них собирает метрики.
Что нам надо: создать ServiceMonitor для Prometheus в Kubernetes, используя который Prometheus начнёт собирать метрики с нужного ендпоинта, а затем отдавать их в центральный Prometheus, где мы сделаем алерты и дашборды в Grafana.
Несколько кастомных ServiceMonitor у нас уже есть:
[simterm]
$ kk -n monitoring get servicemonitors NAME AGE backend-redis 225d devops-rabbitmq-servicemonitor 80d ...
[/simterm]
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:
[simterm]
$ 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
[/simterm]
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
Применяем манифест:
[simterm]
$ kk apply -f alb-svc-mo-check.yaml service/aws-alb-controller-svc created servicemonitor.monitoring.coreos.com/aws-alb-controller-servicemonitor created
[/simterm]
Проверим Сервис:
[simterm]
$ 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
[/simterm]
Пробрасываем порт к этому сервису:
[simterm]
$ kk -n kube-system port-forward services/aws-alb-controller-svc 8081:8080 Forwarding from 127.0.0.1:8081 -> 8080
[/simterm]
Проверяем доступность метрик:
[simterm]
$ 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
[/simterm]
Проверяем в Kubernetes Prometheus – Status > Targets:
И метрики:
И в центральном Prometheus:
Осталось придумать алертов и дашборду для Grafana.