Управление панелями Grafana с помощью GitOps и ArgoCD

В этом руководстве показано, как настроить конвейер непрерывного развёртывания с помощью ArgoCD для синхронизации ваших панелей Grafana с репозиторием Git. Вы будете использовать пользовательский ресурс Grafana Dashboard, предоставляемый Grafana Operator, для декларативного управления конфигурациями панелей.

Предварительные требования

Перед началом убедитесь, что у вас есть следующее:

  • Существующий стек Grafana Cloud
  • Кластер Kubernetes с установленным Grafana Operator, как показано в разделе Grafana Operator Installation
  • ArgoCD, установленный в вашем кластере Kubernetes. Обратитесь к ArgoCD Installation Guide
  • Репозиторий Git для хранения конфигураций панелей

Настройка репозитория Git

Создайте в репозитории структуру каталогов для организации конфигураций Grafana и панелей. В этом руководстве создайте папку с именем grafana.

Настройка Grafana Operator

Grafana Operator позволяет аутентифицироваться в экземпляре Grafana с помощью пользовательского ресурса (CR) Grafana.

Создание секрета с токеном API Grafana

Сохраните токен API Grafana в секрете. Создайте файл с именем grafana-token.yml в папке grafana вашего репозитория Git:

YAML
apiVersion: v1
kind: Secret
metadata:
  name: grafana-cloud-credentials
  namespace: '<GRAFANA_OPERATOR_NAMESPACE>'
stringData:
  GRAFANA_CLOUD_INSTANCE_TOKEN: '<GRAFANA_API_KEY>'
type: Opaque

Замените заполнители своими значениями:

  • <GRAFANA_API_KEY>: ключ API вашего экземпляра Grafana. Чтобы создать ключ API, обратитесь к Grafana API Key Documentation
  • <GRAFANA_OPERATOR_NAMESPACE>: пространство имён, в котором развёрнут grafana-operator в вашем кластере Kubernetes

Настройка пользовательского ресурса Grafana

Настройте подключение к вашему экземпляру Grafana Cloud. Создайте файл с именем grafana-cloud.yml в папке grafana вашего репозитория Git:

YAML
apiVersion: grafana.integreatly.org/v1beta1
kind: Grafana
metadata:
  name: '<GRAFANA_CLOUD_STACK_NAME>'
  namespace: '<GRAFANA_OPERATOR_NAMESPACE>'
  labels:
    dashboards: '<GRAFANA_CLOUD_STACK_NAME>'
spec:
  external:
    url: https://<GRAFANA_CLOUD_STACK_NAME>.grafana.net/
    apiKey:
      name: grafana-cloud-credentials
      key: GRAFANA_CLOUD_INSTANCE_TOKEN

Замените заполнители своими значениями:

  • <GRAFANA_CLOUD_STACK_NAME>: имя вашего стека Grafana Cloud
  • <GRAFANA_OPERATOR_NAMESPACE>: пространство имён, в котором развёрнут grafana-operator в вашем кластере Kubernetes

Добавление панелей в репозиторий Git

В вашем каталоге grafana создайте подпапку с именем dashboards.

В этом руководстве показано, как создать три отдельные панели. Во всех конфигурациях панелей замените заполнители своими значениями:

  • <GRAFANA_CLOUD_STACK_NAME>: имя вашего стека Grafana Cloud
  • <GRAFANA_OPERATOR_NAMESPACE>: пространство имён, в котором развёрнут grafana-operator в вашем кластере Kubernetes

Создание простой панели

В папке dashboards создайте файл с именем simple-dashboard.yaml:

YAML
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: grafanadashboard-sample
  namespace: '<GRAFANA_OPERATOR_NAMESPACE>'
spec:
  resyncPeriod: 30s
  instanceSelector:
    matchLabels:
      dashboards: '<GRAFANA_CLOUD_STACK_NAME>'
  json: >
    {
    "id": null,
    "title": "Simple Dashboard",
    "tags": [],
    "style": "dark",
    "timezone": "browser",
    "editable": true,
    "hideControls": false,
    "graphTooltip": 1,
    "panels": [],
    "time": {
        "from": "now-6h",
        "to": "now"
    },
    "timepicker": {
        "time_options": [],
        "refresh_intervals": []
    },
    "templating": {
        "list": []
    },
    "annotations": {
        "list": []
    },
    "refresh": "5s",
    "schemaVersion": 17,
    "version": 0,
    "links": []
    }

Создание панели из ConfigMap

В папке dashboards создайте файл с именем dashboard-from-cm.yaml:

YAML
apiVersion: v1
kind: ConfigMap
metadata:
  name: dashboard-definition
  namespace: <GRAFANA_OPERATOR_NAMESPACE>
data:
  json: >
    {
    "id": null,
    "title": "Simple Dashboard from ConfigMap",
    "tags": [],
    "style": "dark",
    "timezone": "browser",
    "editable": true,
    "hideControls": false,
    "graphTooltip": 1,
    "panels": [],
    "time": {
        "from": "now-6h",
        "to": "now"
    },
    "timepicker": {
        "time_options": [],
        "refresh_intervals": []
    },
    "templating": {
        "list": []
    },
    "annotations": {
        "list": []
    },
    "refresh": "5s",
    "schemaVersion": 17,
    "version": 0,
    "links": []
    }
---
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: grafanadashboard-from-configmap
  namespace: '<GRAFANA_OPERATOR_NAMESPACE>'
spec:
  instanceSelector:
    matchLabels:
      dashboards: '<GRAFANA_CLOUD_STACK_NAME>'
  configMapRef:
    name: dashboard-definition
    key: json

Создание панели с Grafana.com

В папке dashboards создайте файл с именем dashboard-from-id.yaml:

YAML
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: node-exporter-latest
  namespace: '<GRAFANA_OPERATOR_NAMESPACE>'
spec:
  instanceSelector:
    matchLabels:
      dashboards: '<GRAFANA_CLOUD_STACK_NAME>'
  grafanaCom:
    id: 1860

Настройка ArgoCD для синхронизации репозитория Git

После того как вы зафиксируете все изменения в Git, войдите в интерфейс ArgoCD или используйте CLI.

Создание приложения ArgoCD

В интерфейсе:

  1. Перейдите в New App и заполните форму, указав данные вашего репозитория Git и путь к папке grafana
  2. Включите Directory Recurse
  3. Установите политику синхронизации Automatic

С помощью CLI:

Подготовьте манифест приложения с именем argo-application.yaml:

YAML
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: Grafana
  namespace: '<ARGOCD_NAMESPACE>'
spec:
  destination:
    name: ''
    namespace: ''
    server: 'https://kubernetes.default.svc'
  source:
    path: '<PATH_TO_GRAFANA_FOLDER>'
    repoURL: '<GIT_REPO_URL>'
    targetRevision: HEAD
    directory:
      recurse: true
  sources: []
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
    retry:
      limit: 2
    backoff:
      duration: 5s
      maxDuration: 3m0s
      factor: 2

Замените заполнители своими значениями:

  • <GIT_REPO_URL>: URL вашего репозитория Git
  • <PATH_TO_GRAFANA_FOLDER>: путь к папке grafana в вашем репозитории
  • <ARGOCD_NAMESPACE>: пространство имён, в котором развёрнут ArgoCD в вашем кластере Kubernetes

Создайте приложение в ArgoCD:

sh
kubectl apply -f argo-application.yaml

Проверка состояния синхронизации в ArgoCD

  1. Отслеживайте только что созданное приложение ArgoCD, чтобы убедиться, что оно успешно синхронизирует конфигурацию вашей панели
  2. Откройте панель ArgoCD и проверьте состояние синхронизации. Если она успешна, ваши панели Grafana должны соответствовать конфигурации из вашего репозитория Git

Обновление панелей

Чтобы обновить существующую панель:

  1. Внесите изменения в конфигурацию JSON панели в вашем репозитории Git
  2. Зафиксируйте и отправьте изменения
  3. ArgoCD обнаруживает обновление и синхронизирует изменения с вашим пользовательским ресурсом
  4. Затем Grafana Operator синхронизирует изменения с экземпляром Grafana

Проверка обновлений панели

Войдите в свою панель Grafana и убедитесь, что изменения применены. Вы должны увидеть обновления панели, отражённые в интерфейсе Grafana.

Дальнейшие шаги

Вы успешно настроили рабочий процесс GitOps для управления панелями Grafana с помощью ArgoCD и Grafana Operator. Теперь ваши панели контролируются версиями и могут последовательно развёртываться в разных средах. Такой подход обеспечивает надёжный и проверяемый способ управления панелями наблюдаемости и масштабирования ваших операций.

Чтобы узнать больше об управлении Grafana с помощью Grafana Operator:

Дополнительные замечания

  • Вы можете установить Helm-чарт Grafana Operator с помощью ArgoCD, чтобы управлять своей конфигурацией по методологии GitOps
  • Аналогичным образом можно настроить работу с папками Grafana и другими ресурсами