Thank you for reading this post, don't forget to subscribe!
AWS ALB Controller умеет в метрики для Prometheus.
Используем стандартный URI /metrics
.
Для начала – проверим, что метрики в поде есть.
Находим под:
1 2 |
kk -n kube-system get pod | grep aws aws-load-balancer-controller-7bdcf75789-wk4bt 1/1 Running 0 41h |
Пробрасываем на него порт:
1 2 3 |
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 |
И пробуем с рабочей машины:
1 2 3 4 5 6 7 8 9 10 11 |
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 у нас уже есть:
1 2 3 4 5 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
--- 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:
1 2 3 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
--- 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 |
Применяем манифест:
1 2 3 |
kk apply -f alb-svc-mo-check.yaml service/aws-alb-controller-svc created servicemonitor.monitoring.coreos.com/aws-alb-controller-servicemonitor created |
Проверим Сервис:
1 2 3 |
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 |
Пробрасываем порт к этому сервису:
1 2 |
kk -n kube-system port-forward services/aws-alb-controller-svc 8081:8080 Forwarding from 127.0.0.1:8081 -> 8080 |
Проверяем доступность метрик:
1 2 3 4 5 6 7 8 9 10 11 |
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.