“Внезапно”, но 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.