Netguard PG Backend - это сервис, обеспечивающий хранение и управление ресурсами сетевой безопасности. Он реализует логику sgroups-k8s-netguard.
- Хранение ресурсов сетевой безопасности в базах данных PostgreSQL и в памяти
- Поддержка различных типов ресурсов:
- Сервисы (Services)
- Группы адресов (Address Groups)
- Привязки групп адресов (Address Group Bindings)
- Сопоставления портов групп адресов (Address Group Port Mappings)
- Правила взаимодействия сервисов (RuleS2S)
- Синхронизация с внешними системами (SGROUP)
Netguard PG Backend поддерживает автоматическую синхронизацию с внешним сервисом SGROUP для обеспечения консистентности сетевых политик и правил безопасности.
- AddressGroup → SGROUP Groups
- Network → SGROUP Networks
- IEAgAgRule → SGROUP IEAgAgRules
# Настройки подключения к SGROUP
sgroup:
endpoint: "sgroup-service:9090"
tls:
enabled: true
cert_file: "/certs/client.crt"
key_file: "/certs/client.key"
ca_file: "/certs/ca.crt"
timeout: "30s"
# Настройки синхронизации
sync:
enabled: true
debouncing:
enabled: true
window: "1s"
batch:
enabled: true
max_size: 100
timeout: "5s"apiVersion: netguard.sgroups.io/v1beta1
kind: AddressGroup
metadata:
name: web-servers
namespace: production
spec:
addresses:
- "10.0.1.10"
- "10.0.1.11"
- "10.0.1.12"После создания этого ресурса в Kubernetes, он автоматически синхронизируется с SGROUP как группа production/web-servers.
# Проверка статуса синхронизации
curl http://netguard-backend:8080/sync/status
# Проверка метрик
curl http://netguard-backend:8080/metrics | grep sync
# Проверка здоровья SGROUP соединения
curl http://netguard-backend:8080/health/sgroupПодробная документация по синхронизации доступна в следующих файлах:
- SGROUP_SYNC.md - Полное описание архитектуры синхронизации
- SYNC_SCENARIOS.md - Практические сценарии использования
- SYNC_OPERATIONS.md - Операционное руководство
- SYNC_DIAGRAMS.md - Диаграммы архитектуры и процессов
- Domain: Содержит основную бизнес-логику и модели
models: Доменные сущностиports: Интерфейсы для репозиториев и сервисов
- Application: Содержит сервисы приложения, которые оркестрируют доменную логику
services: Реализации сервисов
- Infrastructure: Содержит реализации интерфейсов, определенных в доменном слое
repositories: Реализации репозиториев (PostgreSQL, in-memory)
- Cmd: Содержит точки входа в приложение
server: Основное серверное приложение
- Go 1.23 или выше
- PostgreSQL (опционально, для постоянного хранения)
-
Клонировать репозиторий:
git clone https://github.com/yourusername/netguard-pg-backend.git cd netguard-pg-backend -
Собрать приложение:
go build -o netguard-server ./cmd/server
Запуск с базой данных в памяти:
./netguard-server --memory
Запуск с базой данных PostgreSQL:
./netguard-server --pg-uri "postgres://user:password@localhost:5432/netguard"
Проект включает поддержку Docker для простого развертывания.
-
Сборка Docker-образа:
docker build -t netguard-pg-backend . -
Запуск контейнера с базой данных в памяти:
docker run -p 8080:8080 -p 9090:9090 netguard-pg-backend -
Запуск контейнера с базой данных PostgreSQL:
docker run -p 8080:8080 -p 9090:9090 netguard-pg-backend ./netguard-server --pg-uri="postgres://user:password@postgres-host:5432/netguard" --grpc-addr=:9090 --http-addr=:8080
-
Запуск сервиса с базой данных в памяти:
docker-compose up -
Для использования PostgreSQL раскомментируйте сервис PostgreSQL в docker-compose.yml и выполните:
docker-compose up -
Доступ к сервису:
- Swagger UI: http://localhost:8080/swagger/
- gRPC: localhost:9090
Предоставляется тестовый скрипт для проверки настройки Docker:
./test-docker.sh
Этот скрипт собирает Docker-образ, запускает контейнер, проверяет доступность сервиса, а затем останавливает контейнер.
Netguard PG Backend предоставляет RESTful API, созданный с использованием gRPC с gRPC-Gateway. API документирован с использованием Swagger.
Swagger UI доступен по адресу: http://localhost:8080/swagger/
GET /v1/services- Получить список сервисовGET /v1/address-groups- Получить список групп адресовGET /v1/address-group-bindings- Получить список привязок групп адресовGET /v1/address-group-port-mappings- Получить список сопоставлений портов групп адресовGET /v1/rule-s2s- Получить список правил взаимодействия сервисовGET /v1/sync/status- Получить статус последней синхронизацииPOST /v1/sync- Синхронизировать данные
netguard-pg-backend/
├── cmd/
│ └── server/
│ └── main.go
├── internal/
│ ├── api/
│ │ └── netguard/
│ │ └── service.go
│ ├── app/
│ │ └── server/
│ │ └── setup-server.go
│ ├── application/
│ │ └── services/
│ │ └── service.go
│ ├── domain/
│ │ ├── models/
│ │ │ └── resources.go
│ │ └── ports/
│ │ ├── repositories.go
│ │ └── scopes.go
│ ├── infrastructure/
│ │ └── repositories/
│ │ ├── db.go
│ │ ├── mem/
│ │ │ ├── db.go
│ │ │ └── registry.go
│ │ └── pg/
│ │ └── models.go
│ └── patterns/
│ └── subject.go
├── protos/
│ ├── api/
│ │ ├── common/
│ │ │ └── ip-transport.proto
│ │ └── netguard/
│ │ └── api.proto
│ ├── 3d-party/
│ │ └── google/
│ │ ├── api/
│ │ │ ├── annotations.proto
│ │ │ ├── http.proto
│ │ │ └── ...
│ │ └── rpc/
│ │ ├── code.proto
│ │ ├── status.proto
│ │ └── ...
│ └── Makefile
├── swagger-ui/
│ └── index.html
├── Dockerfile
├── docker-compose.yml
├── copy-swagger.sh
└── go.mod
Этот документ описывает шаги для сборки, тестирования и деплоя netguard-k8s-apiserver и его зависимостей.
Система состоит из двух основных компонентов:
netguard-pg-backend: Backend сервер, который хранит данные в PostgreSQL (или в in-memory для тестирования).netguard-k8s-apiserver: Aggregated API Server, который предоставляет Kubernetes-совместимый API и общается с backend'ом по gRPC.
Для сборки образов используются два Dockerfile:
Dockerfile.backend- дляnetguard-pg-backendDockerfile.apiserver- дляnetguard-k8s-apiserver
Сборка образов производится командой:
# Собираем backend
docker build -f Dockerfile.backend -t netguard/pg-backend:latest .
# Собираем API server
docker build -f Dockerfile.apiserver -t netguard/k8s-apiserver:latest .Для локального тестирования нам нужно:
- Сгенерировать TLS сертификаты
- Запустить backend сервер
- Запустить API server
- Проверить API через
curl
chmod +x scripts/generate-certs.sh
./scripts/generate-certs.shgo run ./cmd/server --memory --grpc-addr ":9090" --http-addr ":8080"Создайте файл local-config.yaml с конфигурацией для локального тестирования:
bind_address: "127.0.0.1"
secure_port: 8443
insecure_port: 0
authn:
type: "tls"
tls:
cert-file: "certs/tls.crt"
key-file: "certs/tls.key"
client:
verify: "skip"
backend_client:
endpoint: "localhost:9090"Запустите API server:
go run ./cmd/k8s-apiserver --config local-config.yaml# Проверяем health check
curl -k https://localhost:8443/healthz
# Проверяем API discovery
curl -k https://localhost:8443/apis/netguard.sgroups.io/v1beta1 | jqДля локальных кластеров (minikube, kind):
# Для minikube
minikube image load netguard/pg-backend:latest
minikube image load netguard/k8s-apiserver:latest
# Для kind
kind load docker-image netguard/pg-backend:latest
kind load docker-image netguard/k8s-apiserver:latestДля удаленных кластеров нужно запушить образы в registry.
Все манифесты находятся в директории config/k8s/.
- Создаем Secret с сертификатами:
kubectl create secret tls netguard-apiserver-certs --cert=certs/tls.crt --key=certs/tls.key
- Применяем манифесты:
kubectl apply -f config/k8s/
# Проверяем статус подов
kubectl get pods -l app=netguard-apiserver
kubectl get pods -l app=netguard-backend
# Проверяем доступность API
kubectl api-resources --api-group=netguard.sgroups.io
# Проверяем создание ресурса
kubectl apply -f - <<EOF
apiVersion: netguard.sgroups.io/v1beta1
kind: Service
metadata:
name: test-service
spec:
ports:
- port: 80
protocol: TCP
EOF
kubectl get services.v1beta1.netguard.sgroups.io