feat: demo managed functions with harbor-backed operator setup

This commit is contained in:
Naeel
2026-03-14 18:16:53 +03:00
parent cbd2c8c44c
commit 8dd5b676c0
14 changed files with 687 additions and 1 deletions
+122
View File
@@ -0,0 +1,122 @@
# Изменено: 2026-03-14
# Node-RED для визуального управления demo сценарием Event Log.
# Образ: nodered/node-red:4 (официальный, всегда есть на DockerHub)
# UI доступен по http://<ingress-ip>/nodered/
# Для AMQP нужен плагин node-red-contrib-amqp — ставится через initContainer.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nodered-data
namespace: sless
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodered
namespace: sless
labels:
app: nodered
spec:
replicas: 1
selector:
matchLabels:
app: nodered
template:
metadata:
labels:
app: nodered
spec:
securityContext:
fsGroup: 1000
# initContainer устанавливает AMQP-плагин в PVC до старта основного контейнера
initContainers:
- name: install-nodes
image: nodered/node-red:latest
securityContext:
runAsUser: 0
runAsGroup: 0
command:
- sh
- -c
- |
chown -R 1000:1000 /data || true
cd /data
npm install --prefix /data node-red-contrib-amqp node-red-dashboard 2>&1 || true
volumeMounts:
- name: data
mountPath: /data
containers:
- name: nodered
image: nodered/node-red:latest
ports:
- containerPort: 1880
env:
- name: NODE_RED_ENABLE_PROJECTS
value: "false"
- name: TZ
value: "Europe/Moscow"
securityContext:
runAsUser: 1000
runAsGroup: 1000
volumeMounts:
- name: data
mountPath: /data
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
readinessProbe:
httpGet:
path: /
port: 1880
initialDelaySeconds: 15
periodSeconds: 10
volumes:
- name: data
persistentVolumeClaim:
claimName: nodered-data
---
apiVersion: v1
kind: Service
metadata:
name: nodered
namespace: sless
spec:
selector:
app: nodered
ports:
- port: 1880
targetPort: 1880
---
# Ingress на Node-RED — доступен снаружи по http://nodered.185.247.187.147.nip.io
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nodered
namespace: sless
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
spec:
ingressClassName: nginx
rules:
- host: nodered.185.247.187.147.nip.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nodered
port:
number: 1880
+125
View File
@@ -0,0 +1,125 @@
# Изменено: 2026-03-14
# Деплой sless оператора на demo-стенде (naeel-test-3, nip.io, без TLS).
# Отличия от production operator.yaml:
# - REGISTRY_HOST=naeel (DockerHub, не Harbor)
# - INGRESS_HOST и EXTERNAL_URL — через nip.io без TLS
# - cert-manager аннотации убраны
# - API_TOKEN берётся из sless-operator-secret (совпадает с secrets/test.token)
#
# Перед apply нужно создать секреты:
# kubectl create secret generic sless-operator-secret -n sless \
# --from-literal=POSTGRES_DSN="postgres://sless:sless-pg-password@postgres.sless.svc.cluster.local:5432/sless?sslmode=disable" \
# --from-literal=S3_ACCESS_KEY="0GLQRD38H4I6RBDB0EWJ" \
# --from-literal=S3_SECRET_KEY="eTFibiHmBd96IApj9PYsboTR6OBoD7osxoarHykw" \
# --from-literal=SLESS_API_TOKEN="<token from secrets/test.token>" \
# --from-literal=HARBOR_PASS=""
#
# kubectl create secret docker-registry sless-registry-auth -n sless \
# --docker-server=https://index.docker.io/v1/ \
# --docker-username=naeel \
# --docker-password=<DOCKERHUB_TOKEN>
---
apiVersion: v1
kind: ConfigMap
metadata:
name: sless-operator-config
namespace: sless
data:
S3_ENDPOINT: "s3.msk-1.ngcloud.ru"
S3_BUCKET: "sless-functions"
S3_USE_SSL: "true"
# Harbor как registry для demo
REGISTRY_HOST: "pearlharbor.registryk8s.services.ngcloud.ru"
REGISTRY_SECRET: "sless-registry-auth"
HARBOR_USER: "admin"
API_PORT: "9090"
# nip.io домен без TLS — работает без настройки DNS
INGRESS_HOST: "fn.185.247.187.147.nip.io"
EXTERNAL_URL: "http://sless-api.185.247.187.147.nip.io"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sless-operator
namespace: sless
labels:
app: sless-operator
spec:
replicas: 1
selector:
matchLabels:
app: sless-operator
template:
metadata:
labels:
app: sless-operator
spec:
serviceAccountName: sless-operator
containers:
- name: operator
image: naeel/sless-operator:v0.1.29
imagePullPolicy: Always
ports:
- name: api
containerPort: 9090
- name: metrics
containerPort: 8080
- name: health
containerPort: 8081
envFrom:
- configMapRef:
name: sless-operator-config
- secretRef:
name: sless-operator-secret
readinessProbe:
httpGet:
path: /healthz
port: 8081
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /healthz
port: 8081
initialDelaySeconds: 15
periodSeconds: 20
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "256Mi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: sless-operator
namespace: sless
spec:
selector:
app: sless-operator
ports:
- name: api
port: 9090
targetPort: 9090
---
# Ingress без TLS — demo стенд через nip.io
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sless-operator
namespace: sless
spec:
ingressClassName: nginx
rules:
- host: sless-api.185.247.187.147.nip.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: sless-operator
port:
number: 9090
+73
View File
@@ -0,0 +1,73 @@
# Изменено: 2026-03-14
# RabbitMQ для demo сценария Event Log.
# Используется официальный образ с management-плагином для веб-UI.
# credentials: sless / sless123
# AMQP: amqp://sless:sless123@rabbitmq.sless.svc.cluster.local:5672/
# Management UI: http://rabbitmq.sless.svc.cluster.local:15672/
---
apiVersion: v1
kind: Secret
metadata:
name: rabbitmq-secret
namespace: sless
stringData:
RABBITMQ_DEFAULT_USER: "sless"
RABBITMQ_DEFAULT_PASS: "sless123"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rabbitmq
namespace: sless
labels:
app: rabbitmq
spec:
replicas: 1
selector:
matchLabels:
app: rabbitmq
template:
metadata:
labels:
app: rabbitmq
spec:
containers:
- name: rabbitmq
image: rabbitmq:3.13-management-alpine
ports:
- name: amqp
containerPort: 5672
- name: management
containerPort: 15672
envFrom:
- secretRef:
name: rabbitmq-secret
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
readinessProbe:
tcpSocket:
port: 5672
initialDelaySeconds: 40
periodSeconds: 10
timeoutSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: rabbitmq
namespace: sless
spec:
selector:
app: rabbitmq
ports:
- name: amqp
port: 5672
targetPort: 5672
- name: management
port: 15672
targetPort: 15672