mod: Развертывание Metabase в K3s ..
This commit is contained in:
178
kubernetes/k3s-metabase.md
Normal file
178
kubernetes/k3s-metabase.md
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
# Развертывание Metabase в K3s
|
||||||
|
|
||||||
|
Metabase ([metabase.com](https://www.metabase.com/)) — это мощный и дружелюбный инструмент BI (Business Intelligence).
|
||||||
|
Он работает через веб-интерфейс, позволяет подключаться к реальным БД, делать запросы (SQL и визуальный конструктор),
|
||||||
|
строить графики, дашборды, отчёты (и отправлять эти отчеты по email-рассылки) и многое другое.
|
||||||
|
|
||||||
|
Metabase немного похож на [Power BI](https://www.microsoft.com/en-us/power-platform/products/power-bi/) или
|
||||||
|
[Tableau](https://www.tableau.com/), но Open-Source.
|
||||||
|
|
||||||
|
Поддерживаются основные СУБД: PostgreSQL, MySQL/MariaDB, SQLite, ClickHouse, MongoDB, Microsoft SQL Server, BigQuery
|
||||||
|
и многие другие.
|
||||||
|
|
||||||
|
Metabase — монолит (Java JAR), и работает на сервере (или любом компьютере) как один процесс Java Virtual Machine.
|
||||||
|
Для хранения своей конфигурации использует встроенную базу данных H2, но его можно подключить и внешней СУБД
|
||||||
|
(например, PostgreSQL или MariaDB). И главное, для меня, он поддерживает ARM64? (а значит заработает [на моем k3s
|
||||||
|
на базе Orange Pi 5](../raspberry-and-orange-pi/k3s.md)).
|
||||||
|
|
||||||
|
|
||||||
|
## Подготовка базы данных
|
||||||
|
|
||||||
|
В deployment-манифесте Metabase будут указаны параметры подключения к PostgreSQL. Он у меня тоже развернут как под k3s
|
||||||
|
(см.: [развертывание PostgeSQL в K3s](k3s-postresql.md).
|
||||||
|
|
||||||
|
Создадим пользователя PostgreSQL, базу данных и права пользователя для Metabase. Это можно сделать через `psql` или
|
||||||
|
любой другой клиент PostgreSQL. Нужно выполнить следующие SQL-команды (не забудьте заменить пароль на свой):
|
||||||
|
```sql
|
||||||
|
CREATE USER metabase_user WITH ENCRYPTED PASSWORD 'очень-секретный-пароль-123!!';
|
||||||
|
CREATE DATABASE metabase OWNER metabase_user;
|
||||||
|
GRANT ALL PRIVILEGES ON DATABASE metabase TO metabase_user;
|
||||||
|
GRANT ALL ON SCHEMA public TO metabase_user;
|
||||||
|
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO metabase_user;
|
||||||
|
```
|
||||||
|
|
||||||
|
Что здесь происходит:
|
||||||
|
- Создаем пользователя `metabase_user` с паролем `очень-секретный-пароль-123!!`.
|
||||||
|
- Создаем базу данных `metabase` и назначаем владельцем этого пользователя.
|
||||||
|
- Предоставляем все привилегии на базу данных `metabase` этому пользователю (можно не делать, т.к. мы уже указали владельца).
|
||||||
|
- Схема public создаётся автоматически в базе, но чтобы metabase_user мог работать с таблицами предоставляем все права
|
||||||
|
на схему `public` базы данных (это стандартная схема PostgreSQL).:
|
||||||
|
- Чтобы пользователь мог создавать таблицы, функции и прочее в схеме...
|
||||||
|
|
||||||
|
# Манифесты для развертывания Metabase в K3s
|
||||||
|
|
||||||
|
У меня Metabase будет доступен по адресу `http://mb.local` (через VIP-адрес Keeepalive). Замените доменное имя на свое,
|
||||||
|
и не забудьте настроить DNS или файл `/etc/hosts`.
|
||||||
|
|
||||||
|
Для развертывания Metabase в k3s нам понадобятся следующие манифесты Kubernetes (не забудьте поменять пароль
|
||||||
|
пользователя PostgreSQL на свой):
|
||||||
|
```yaml
|
||||||
|
# ~/k3s/metabase/metabase.yaml
|
||||||
|
# Все манифесты для Metabase в k3s
|
||||||
|
|
||||||
|
# 1. Namespace: создаём пространство имен `metabase`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: metabase
|
||||||
|
|
||||||
|
---
|
||||||
|
# 2. Secret: храним пароль к PostgreSQL в Kubernetes-секрете (это безопаснее, чем указывать его прямо в Deployment)
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: metabase-db-secret
|
||||||
|
namespace: metabase
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
MB_DB_PASS: 'очень-секретный-пароль-123!!' # Пароль. Не закодирован, но kubectl хранит его в base64.
|
||||||
|
|
||||||
|
---
|
||||||
|
# 3. PVC: том для временных данных Metabase
|
||||||
|
# Metabase хранит всё важное в PostgreSQL, но PVC-том нужен для кеша, логов и временных файлов
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: metabase-data
|
||||||
|
namespace: metabase
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
storageClassName: longhorn
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 512Mi # Достаточно для большинства задач
|
||||||
|
|
||||||
|
---
|
||||||
|
# 4. Deployment: контейнер с Metabase (+указываем переменные окружения для подключения к PostgreSQL)
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: metabase
|
||||||
|
namespace: metabase
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: metabase
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: metabase
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: metabase
|
||||||
|
image: metabase/metabase:latest # ARM64-совместимый образ
|
||||||
|
ports:
|
||||||
|
- containerPort: 3000 # Стандартный порт Metabase внутри контейнера
|
||||||
|
env:
|
||||||
|
- name: MB_DB_TYPE
|
||||||
|
value: postgres
|
||||||
|
- name: MB_DB_DBNAME
|
||||||
|
value: metabase
|
||||||
|
- name: MB_DB_PORT
|
||||||
|
value: "5432" # В кавычках: безопаснее в YAML
|
||||||
|
- name: MB_DB_USER
|
||||||
|
value: metabase_user
|
||||||
|
- name: MB_DB_HOST
|
||||||
|
value: postgres.postgresql.svc.cluster.local # Берем из Service-монифеста PostgreSQL (или хост `pg.local`, доступный внутри сети)
|
||||||
|
- name: MB_DB_PASS
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: metabase-db-secret # Секрет, созданный выше
|
||||||
|
key: MB_DB_PASS
|
||||||
|
- name: JAVA_TIMEZONE
|
||||||
|
value: Europe/Moscow
|
||||||
|
volumeMounts:
|
||||||
|
- name: metabase-storage
|
||||||
|
mountPath: /metabase-data # Временные файлы, кеши, логи
|
||||||
|
volumes:
|
||||||
|
- name: metabase-storage
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: metabase-data
|
||||||
|
|
||||||
|
---
|
||||||
|
# 5. Сервис: внутренняя точка доступа (не публикуется наружу)
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: metabase
|
||||||
|
namespace: metabase
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: metabase
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
targetPort: 3000 # Проксируем внешний порт 80 → контейнерный 3000
|
||||||
|
type: ClusterIP
|
||||||
|
|
||||||
|
---
|
||||||
|
# 6. IngressRoute: Traefik CRD для публикации Metabase по адресу http://mb.local
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: IngressRoute
|
||||||
|
metadata:
|
||||||
|
name: metabase
|
||||||
|
namespace: metabase
|
||||||
|
spec:
|
||||||
|
entryPoints:
|
||||||
|
- web # HTTP-порт Traefik (обычно 80)
|
||||||
|
routes:
|
||||||
|
- match: Host("mb.local")
|
||||||
|
kind: Rule
|
||||||
|
services:
|
||||||
|
- name: metabase
|
||||||
|
port: 80
|
||||||
|
```
|
||||||
|
|
||||||
|
Применим манифесты командой:
|
||||||
|
```bash
|
||||||
|
kubectl apply -f ~/k3s/metabase/metabase.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Все должно заработать, и Metabase будет доступен по адресу `http://mb.local` (или по тому доменному имени, которое
|
||||||
|
вы указали). Если что-то не так, то скорее всего проблемы с подключением к PostgreSQL. Удалите базу, пользователя,
|
||||||
|
k3s-деплоймент, и создайте заново. Диагностировать причину неполадок можно посмотрев логи пода:
|
||||||
|
```bash
|
||||||
|
kubectl -n metabase logs deploy/metabase
|
||||||
|
```
|
||||||
|
|
Reference in New Issue
Block a user