feat: harbor integration — EnsureProject + per-namespace image path

- internal/harbor/client.go: новый пакет, EnsureProject (GET+POST idempotent)
- config.go: добавлены HarborUser/HarborPass (из HARBOR_USER/HARBOR_PASS env)
- builder.go: Projecter интерфейс, harborClient поле, ImageRef: {host}/{ns}/{func}:{tag}
  EnsureProject вызывается перед каждым Build()
- function_controller.go: HarborClient поле, EnsureProject при создании k8s NS
- main.go: создание harbor.Client если HARBOR_USER+HARBOR_PASS заданы
- operator.yaml: REGISTRY_HOST=pearlharbor..., HARBOR_USER=admin, v0.1.24
- hack/create-registry-secret.sh: переписан для Harbor (HARBOR_USER/HARBOR_PASS)

Смена registry — только через REGISTRY_HOST в ConfigMap, больше нигде.
This commit is contained in:
“Naeel”
2026-03-11 14:58:04 +04:00
parent 6443f21ddc
commit babd8e6109
7 changed files with 185 additions and 34 deletions
+15 -11
View File
@@ -1,10 +1,13 @@
#!/usr/bin/env bash
# Изменено: 2026-03-07
# Создаёт k8s Secret sless-registry-auth с DockerHub кредами для kaniko.
# Изменено: 2026-03-11
# Создаёт k8s Secret sless-registry-auth с кредами Harbor для kaniko.
# Kaniko монтирует этот secret как /kaniko/.docker/config.json для push образов.
# Отдельно от HARBOR_PASS в operator-secret: этот secret — для kaniko (push),
# HARBOR_PASS — для Harbor API (создание проектов через EnsureProject).
#
# Использование:
# DOCKER_HUB_USER=naeel DOCKER_HUB_TOKEN=<token> ./hack/create-registry-secret.sh
# HARBOR_USER=admin HARBOR_PASS=<password> REGISTRY=pearlharbor.registryk8s.services.ngcloud.ru \
# ./hack/create-registry-secret.sh
#
# Требуется: kubectl, авторизованный context с доступом к namespace sless.
@@ -12,21 +15,22 @@ set -euo pipefail
NAMESPACE="sless"
SECRET_NAME="sless-registry-auth"
REGISTRY="${REGISTRY:-pearlharbor.registryk8s.services.ngcloud.ru}"
if [[ -z "${DOCKER_HUB_USER:-}" ]]; then
echo "ERROR: DOCKER_HUB_USER env var is required"
if [[ -z "${HARBOR_USER:-}" ]]; then
echo "ERROR: HARBOR_USER env var is required"
exit 1
fi
if [[ -z "${DOCKER_HUB_TOKEN:-}" ]]; then
echo "ERROR: DOCKER_HUB_TOKEN env var is required (DockerHub access token, not password)"
if [[ -z "${HARBOR_PASS:-}" ]]; then
echo "ERROR: HARBOR_PASS env var is required"
exit 1
fi
kubectl create secret docker-registry "${SECRET_NAME}" \
--docker-username="${DOCKER_HUB_USER}" \
--docker-password="${DOCKER_HUB_TOKEN}" \
--docker-server="https://index.docker.io/v1/" \
--docker-username="${HARBOR_USER}" \
--docker-password="${HARBOR_PASS}" \
--docker-server="${REGISTRY}" \
--namespace="${NAMESPACE}" \
--dry-run=client -o yaml | kubectl apply -f -
echo "OK: secret '${SECRET_NAME}' applied in namespace '${NAMESPACE}'"
echo "OK: secret '${SECRET_NAME}' applied in namespace '${NAMESPACE}' (server: ${REGISTRY})"