KRR — ваш личный советник по ресурсам в Kubernetes

от автора

Введение

KRR (Kubernetes Resource Recommender) — это CLI-инструмент для оптимизации использования ресурсов в Kubernetes. Он анализирует метрики Pod’ов, собираемые в Prometheus, и предлагает оптимальные настройки requests и limits для CPU и памяти. Это помогает снизить расходы на облачные ресурсы и повысить производительность приложений. В этом посте будет рассмотрен периодический запуск krr в kubernetes с сохранением в html формат для удобного отображения через браузер как web-сайт.

Зачем нужно KRR

Согласно исследованию Sysdig, в среднем кластеры Kubernetes имеют:

  • 69% неиспользуемого процессора

  • 18% неиспользуемой памяти Правильно подобрав размеры ваших контейнеров с помощью KRR, вы можете сэкономить в среднем 69% на облачных затратах.

Как работает KRR

KRR получает данные из Prometheus и рассчитывает оптимальные request и limit на основе истории использования ресурсов. По умолчанию разработчики выставляют следующие рекомендации:

  • CPU request на 66-й перцентиль.

  • CPU limit на 95-й перцентиль.

  • Память рассчитывается по максимальному использованию + буфер.

Использование KRR из командной строки

Конечно, вы можете запустить KRR локально.

  • Получение рекомендаций в терминале:

    krr simple-limit -p <Prometheus_URL> --formatter yaml
  • Запуск с фильтрацией по namespace:

    krr simple-limit -p <Prometheus_URL> -n my-namespace

Запуск KRR в виде сервиса, который будет автоматически просчитывать рекомендации по ресурсам

Но лучше чтобы рекомендации по ресурсам видели все сотрудники вашей команды.

Пример HTML работы KRR 

Для этого вам необходимо в кластере создать:

Namespace

Код ns.yaml

--- apiVersion: v1 kind: Namespace metadata:   name: krr

ServiceAccount

Код sa.yaml

--- apiVersion: v1 kind: ServiceAccount metadata:   name: krr-service-account   namespace: krr

ClusterRole и ClusterRoleBinding

Код ClusterRole.yaml

--- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata:   name: krr-cluster-role rules:   - apiGroups:       - ""     resources:       - configmaps       - daemonsets       - deployments       - namespaces       - pods       - replicasets       - replicationcontrollers       - services     verbs:       - get       - list       - watch   - apiGroups:       - ""     resources:       - nodes     verbs:       - get       - list       - watch   - apiGroups:       - apps     resources:       - daemonsets       - deployments       - deployments/scale       - replicasets       - replicasets/scale       - statefulsets     verbs:       - get       - list       - watch

Код ClusterRoleBinding.yaml

--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:   name: krr-cluster-role-binding roleRef:   apiGroup: rbac.authorization.k8s.io   kind: ClusterRole   name: krr-cluster-role subjects:   - kind: ServiceAccount     name: krr-service-account     namespace: krr

Deployment с контейнером KRR

Код deploy.yaml

--- apiVersion: apps/v1 kind: Deployment metadata:   name: krr   namespace: krr spec:   replicas: 1   selector:     matchLabels:       app: krr   template:     metadata:       labels:         app: krr     spec:       serviceAccount: krr-service-account       serviceAccountName: krr-service-account       volumes:         - name: shared-storage           emptyDir: {}       containers:         - name: nginx           image: nginx:1.27.4           volumeMounts:             - name: shared-storage               mountPath: /usr/share/nginx/html           ports:             - containerPort: 80         - name: krr           image: robustadev/krr:v1.22.0           volumeMounts:             - name: shared-storage               mountPath: /output           env:             - name: COLUMNS               value: "400"           command:             - /bin/sh             - -c             - |               while true; do                 TEMP_FILE="/output/index_tmp.html"                 FINAL_FILE="/output/index.html"                 python krr.py simple-limit \                   -p https://vmselect.corp/select/0/prometheus \                   --prometheus-label cluster -l dev \                   --allow-hpa \                   --use-oomkill-data \                   --formatter html \                   --fileoutput "$TEMP_FILE" && mv "$TEMP_FILE" "$FINAL_FILE";                 sleep 1d;               done           resources:             limits:               memory: 2Gi             requests:               memory: 1Gi

Документация по коду deploy.yaml

Ширина html страницы регулируется с помощью переменной COLUMNS.

Приложение krr ходит в текущий k8s и смотрит там текущие pod, поэтому ему нужны ClusterRole, ClusterRoleBinding, ServiceAccount.

Для параметра —prometheus-label cluster нужно указать контекст для текущего кластера в VictoriaMetrics.

Используется стратегия simple-limit, у которой cpu limit = cpu request, так как в обычной стратегии simple cpu limit отключен.

Время после команды sleep указывает сколько ждать перед тем как запустить следующий раз.

Service

Код svc.yaml

--- apiVersion: v1 kind: Service metadata:   name: krr-service   namespace: krr spec:   selector:     app: krr   ports:     - protocol: TCP       port: 80       targetPort: 80

Ingress для доступа к результатам

Код ingress.yaml

--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata:   name: krr-ingress   namespace: krr   annotations:     cert-manager.io/cluster-issuer: cluster-issuer spec:   ingressClassName: nginx   tls:     - hosts:         - krr.k8s.dev.corp       secretName: krr-tls   rules:     - host: krr.k8s.dev.corp       http:         paths:           - path: /             pathType: Prefix             backend:               service:                 name: krr-service                 port:                   number: 80

Разница с Kubernetes VPA

На странице Github KRR показана разница с k8s VPA

Заключение

KRR — мощный инструмент для автоматической оптимизации ресурсов в Kubernetes, который помогает экономить CPU и память. Простота настройки и гибкость интеграции делают его отличным выбором для DevOps-инженеров.


ссылка на оригинал статьи https://habr.com/ru/articles/895488/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *