- FastAPI приложение для отправки мониторинговых алертов в мессенджеры - Поддержка Telegram и MAX/VK - Интеграция с Grafana, Zabbix, AlertManager - Автоматическое создание тикетов в Jira - Управление группами мессенджеров через API - Декораторы для авторизации и скрытия эндпоинтов - Подробная документация в папке docs/ Автор: Сергей Антропов Сайт: https://devops.org.ru
341 lines
11 KiB
YAML
341 lines
11 KiB
YAML
---
|
||
apiVersion: v1
|
||
kind: Namespace
|
||
metadata:
|
||
name: message-gateway
|
||
---
|
||
apiVersion: v1
|
||
kind: Secret
|
||
metadata:
|
||
name: message-gateway-secret
|
||
namespace: message-gateway
|
||
type: Opaque
|
||
stringData:
|
||
telegram_bot_token: "" # Установите токен через kubectl create secret или SealedSecret
|
||
pushgateway_url: "" # URL Pushgateway (опционально)
|
||
pushgateway_job: "MessageGateway"
|
||
grafana_url: "" # URL Grafana (опционально)
|
||
zabbix_url: "" # URL Zabbix (опционально)
|
||
k8s_cluster_grafana_subdomain: "" # Поддомен Grafana для K8S кластеров (опционально)
|
||
k8s_cluster_prometheus_subdomain: "" # Поддомен Prometheus для K8S кластеров (опционально)
|
||
k8s_cluster_alertmanager_subdomain: "" # Поддомен AlertManager для K8S кластеров (опционально)
|
||
otel_enabled: "false" # Включить OpenTelemetry (true/false)
|
||
otel_service_name: "monitoring-message-gateway"
|
||
otel_exporter_otlp_endpoint: "" # Endpoint OpenTelemetry (опционально)
|
||
otel_exporter_otlp_protocol: "http/json"
|
||
otel_traces_exporter: "otlp_proto_http"
|
||
otel_exporter_otlp_insecure: "true"
|
||
otel_python_log_correlation: "false"
|
||
groups_admin_password: "" # Пароль для управления группами (опционально)
|
||
jira_enabled: "false" # Включить интеграцию с Jira (true/false)
|
||
jira_url: "" # URL Jira (опционально)
|
||
jira_email: "" # Email пользователя Jira (опционально)
|
||
jira_api_token: "" # API Token Jira (опционально)
|
||
jira_project_key: "" # Ключ проекта Jira (опционально)
|
||
jira_default_assignee: "" # Email исполнителя по умолчанию (опционально)
|
||
jira_default_issue_type: "Bug" # Тип задачи по умолчанию
|
||
jira_create_on_alert: "true" # Создавать тикет при алерте (true/false)
|
||
jira_create_on_resolved: "false" # Создавать тикет при resolved (true/false)
|
||
---
|
||
apiVersion: apps/v1
|
||
kind: Deployment
|
||
metadata:
|
||
name: message-gateway
|
||
namespace: message-gateway
|
||
labels:
|
||
app: message-gateway
|
||
spec:
|
||
replicas: 1
|
||
selector:
|
||
matchLabels:
|
||
app: message-gateway
|
||
strategy:
|
||
rollingUpdate:
|
||
maxSurge: 25%
|
||
maxUnavailable: 25%
|
||
type: RollingUpdate
|
||
template:
|
||
metadata:
|
||
name: message-gateway
|
||
labels:
|
||
app: message-gateway
|
||
spec:
|
||
imagePullSecrets:
|
||
- name: cismharbor
|
||
nodeSelector:
|
||
gpushare: "false" # Нода с ГПУ (false/true)
|
||
nodestate: "working" # Состояние ноды (working/new)
|
||
containers:
|
||
- name: message-gateway
|
||
image: hub.cism-ms.ru/library/message-gateway:v0.2.0
|
||
imagePullPolicy: "Always"
|
||
ports:
|
||
- containerPort: 8000
|
||
env:
|
||
- name: TELEGRAM_BOT_TOKEN
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: telegram_bot_token
|
||
- name: GRAFANA_URL
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: grafana_url
|
||
optional: true
|
||
- name: ZABBIX_URL
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: zabbix_url
|
||
optional: true
|
||
- name: K8S_CLUSTER_GRAFANA_SUBDOMAIN
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: k8s_cluster_grafana_subdomain
|
||
optional: true
|
||
- name: K8S_CLUSTER_PROMETHEUS_SUBDOMAIN
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: k8s_cluster_prometheus_subdomain
|
||
optional: true
|
||
- name: K8S_CLUSTER_ALERTMANAGER_SUBDOMAIN
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: k8s_cluster_alertmanager_subdomain
|
||
optional: true
|
||
- name: PUSHGATEWAY_URL
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: pushgateway_url
|
||
optional: true
|
||
- name: PUSHGATEWAY_JOB
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: pushgateway_job
|
||
optional: true
|
||
- name: OTEL_ENABLED
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: otel_enabled
|
||
optional: true
|
||
- name: OTEL_SERVICE_NAME
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: otel_service_name
|
||
optional: true
|
||
- name: OTEL_EXPORTER_OTLP_ENDPOINT
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: otel_exporter_otlp_endpoint
|
||
optional: true
|
||
- name: OTEL_EXPORTER_OTLP_PROTOCOL
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: otel_exporter_otlp_protocol
|
||
optional: true
|
||
- name: OTEL_TRACES_EXPORTER
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: otel_traces_exporter
|
||
optional: true
|
||
- name: OTEL_EXPORTER_OTLP_INSECURE
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: otel_exporter_otlp_insecure
|
||
optional: true
|
||
- name: OTEL_PYTHON_LOG_CORRELATION
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: otel_python_log_correlation
|
||
optional: true
|
||
- name: GROUPS_ADMIN_PASSWORD
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: groups_admin_password
|
||
optional: true
|
||
- name: JIRA_ENABLED
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: jira_enabled
|
||
optional: true
|
||
- name: JIRA_URL
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: jira_url
|
||
optional: true
|
||
- name: JIRA_EMAIL
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: jira_email
|
||
optional: true
|
||
- name: JIRA_API_TOKEN
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: jira_api_token
|
||
optional: true
|
||
- name: JIRA_PROJECT_KEY
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: jira_project_key
|
||
optional: true
|
||
- name: JIRA_DEFAULT_ASSIGNEE
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: jira_default_assignee
|
||
optional: true
|
||
- name: JIRA_DEFAULT_ISSUE_TYPE
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: jira_default_issue_type
|
||
optional: true
|
||
- name: JIRA_CREATE_ON_ALERT
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: jira_create_on_alert
|
||
optional: true
|
||
- name: JIRA_CREATE_ON_RESOLVED
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: message-gateway-secret
|
||
key: jira_create_on_resolved
|
||
optional: true
|
||
# Liveness проба
|
||
livenessProbe:
|
||
httpGet:
|
||
path: /api/v1/health
|
||
port: 8000
|
||
initialDelaySeconds: 15
|
||
periodSeconds: 30
|
||
timeoutSeconds: 5
|
||
successThreshold: 1
|
||
failureThreshold: 3
|
||
# Readiness проба
|
||
readinessProbe:
|
||
httpGet:
|
||
path: /api/v1/health/ready
|
||
port: 8000
|
||
initialDelaySeconds: 10
|
||
periodSeconds: 10
|
||
timeoutSeconds: 5
|
||
successThreshold: 1
|
||
failureThreshold: 3
|
||
resources:
|
||
requests:
|
||
cpu: 100m
|
||
memory: 128Mi
|
||
limits:
|
||
cpu: 200m
|
||
memory: 256Mi
|
||
volumeMounts:
|
||
- name: groups-conf
|
||
mountPath: /app/config/groups.json
|
||
subPath: groups.json
|
||
readOnly: true
|
||
- name: jira-mapping-conf
|
||
mountPath: /app/config/jira_mapping.json
|
||
subPath: jira_mapping.json
|
||
readOnly: true
|
||
volumes:
|
||
- name: groups-conf
|
||
configMap:
|
||
name: message-gateway-groups-configmap
|
||
- name: jira-mapping-conf
|
||
configMap:
|
||
name: message-gateway-jira-mapping-configmap
|
||
optional: true
|
||
---
|
||
apiVersion: v1
|
||
kind: ConfigMap
|
||
metadata:
|
||
name: message-gateway-groups-configmap
|
||
namespace: message-gateway
|
||
data:
|
||
groups.json: |
|
||
{
|
||
"kubernetes": -1002108349725,
|
||
"monitoring": -1001997464975,
|
||
"oldmonitoring": -1001469966749
|
||
}
|
||
---
|
||
apiVersion: v1
|
||
kind: ConfigMap
|
||
metadata:
|
||
name: message-gateway-jira-mapping-configmap
|
||
namespace: message-gateway
|
||
data:
|
||
jira_mapping.json: |
|
||
{
|
||
"alertmanager": {
|
||
"default_project": "MON",
|
||
"mappings": []
|
||
},
|
||
"grafana": {
|
||
"default_project": "MON",
|
||
"mappings": []
|
||
},
|
||
"zabbix": {
|
||
"default_project": "MON",
|
||
"mappings": []
|
||
}
|
||
}
|
||
---
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: message-gateway-service
|
||
namespace: message-gateway
|
||
labels:
|
||
app: message-gateway
|
||
spec:
|
||
type: ClusterIP
|
||
selector:
|
||
app: message-gateway
|
||
ports:
|
||
- protocol: TCP
|
||
port: 8000
|
||
targetPort: 8000
|
||
---
|
||
apiVersion: networking.k8s.io/v1
|
||
kind: Ingress
|
||
metadata:
|
||
name: message-gateway-ingress
|
||
namespace: message-gateway
|
||
spec:
|
||
tls:
|
||
- hosts:
|
||
- monitoring.cism-ms.ru
|
||
secretName: ru-cism-kube-certs
|
||
rules:
|
||
- host: "monitoring.cism-ms.ru"
|
||
http:
|
||
paths:
|
||
- path: /
|
||
pathType: Prefix
|
||
backend:
|
||
service:
|
||
name: message-gateway-service
|
||
port:
|
||
number: 8000
|