# Изменено: 2026-03-11 # Деплой sless оператора в кластер. # Состав: # - ConfigMap: не-секретные env vars (S3_ENDPOINT, REGISTRY_HOST и т.д.) # - Secret: секретные данные (S3 keys, postgres DSN, API token, Harbor pass) # - Deployment: оператор naeel/sless-operator:v0.1.23 в namespace sless # - Service: ClusterIP :9090 (REST API) # - Ingress: sless-api.kube5s.ru → :9090 (внешний доступ с TLS) # # Чтобы сменить registry — менять только REGISTRY_HOST в ConfigMap. # Чтобы сменить Harbor-аккаунт — менять HARBOR_USER в ConfigMap + HARBOR_PASS в Secret. # # Применение: kubectl apply -f deployments/k8s/operator.yaml --- 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" # REGISTRY_HOST — единственное место, где прописан адрес registry. # Чтобы сменить реестр — менять только здесь. # Harbor: pearlharbor.registryk8s.services.ngcloud.ru # DockerHub (legacy): naeel REGISTRY_HOST: "pearlharbor.registryk8s.services.ngcloud.ru" REGISTRY_SECRET: "sless-registry-auth" HARBOR_USER: "admin" API_PORT: "9090" INGRESS_HOST: "fn.kube5s.ru" # EXTERNAL_URL — если задан, URL функции = EXTERNAL_URL/fn/{namespace}/{name} # Позволяет обойтись без wildcard DNS *.fn.kube5s.ru EXTERNAL_URL: "https://sless-api.kube5s.ru" --- # Secret создаётся отдельно через kubectl (не коммитить секреты в git!) # Описание ключей: # POSTGRES_DSN — строка подключения к postgres # S3_ACCESS_KEY — ключ доступа к S3/Ceph # S3_SECRET_KEY — секретный ключ S3/Ceph # SLESS_API_TOKEN — токен аутентификации API # HARBOR_PASS — пароль Harbor API (для EnsureProject, не для kaniko push) # # Пример создания: # kubectl create secret generic sless-operator-secret -n sless \ # --from-literal=POSTGRES_DSN="postgres://sless:PASSWORD@postgres.sless.svc.cluster.local:5432/sless?sslmode=disable" \ # --from-literal=S3_ACCESS_KEY="ACCESS_KEY" \ # --from-literal=S3_SECRET_KEY="SECRET_KEY" \ # --from-literal=SLESS_API_TOKEN="your-token-here" \ # --from-literal=HARBOR_PASS="harbor-admin-password" # kubectl apply -f hack/create-registry-secret.sh # docker-креды для kaniko --- 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 # При обновлении версии оператора — менять тег здесь (не latest!) image: naeel/sless-operator:v0.1.28 # Always — чтобы всегда тянуть по точному тегу (не кешировать старый) 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 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: sless-operator namespace: sless annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: ingressClassName: nginx rules: - host: sless-api.kube5s.ru http: paths: - path: / pathType: Prefix backend: service: name: sless-operator port: number: 9090 tls: - hosts: - sless-api.kube5s.ru secretName: sless-operator-tls