fix: operator v0.1.23 — BackoffLimit=2 в kaniko, пересоздание Failed функций; script: mod2 96→128

This commit is contained in:
“Naeel”
2026-03-11 12:26:06 +04:00
parent 3dc39ddc20
commit 59563eba76
4 changed files with 23 additions and 7 deletions
+2 -2
View File
@@ -3,7 +3,7 @@
# Состав:
# - ConfigMap: не-секретные env vars (S3_ENDPOINT, REGISTRY_HOST и т.д.)
# - Secret: секретные данные (S3 keys, postgres DSN, API token, docker auth)
# - Deployment: оператор naeel/sless-operator:v0.1.12 в namespace sless
# - Deployment: оператор naeel/sless-operator:v0.1.23 в namespace sless
# - Service: ClusterIP :9090 (REST API)
# - Ingress: sless-api.kube5s.ru → :9090 (внешний доступ с TLS)
#
@@ -70,7 +70,7 @@ spec:
containers:
- name: operator
# При обновлении версии оператора — менять тег здесь (не latest!)
image: naeel/sless-operator:v0.1.12
image: naeel/sless-operator:v0.1.23
# Always — чтобы всегда тянуть по точному тегу (не кешировать старый)
imagePullPolicy: Always
ports:
+15
View File
@@ -115,6 +115,21 @@ func (h *Handler) CreateFunction(w http.ResponseWriter, r *http.Request) {
}
if err := h.K8s.Create(r.Context(), fn); err != nil {
if errors.IsAlreadyExists(err) {
// Если существующая функция в статусе Failed (build провалился, terraform не
// добавил её в state) — удаляем её и пересоздаём, иначе клиент получит 409 навсегда.
existing := &slessv1alpha1.Function{}
if getErr := h.K8s.Get(r.Context(), client.ObjectKey{Name: req.Name, Namespace: ns}, existing); getErr == nil &&
existing.Status.Phase == slessv1alpha1.FunctionPhaseFailed {
_ = h.K8s.Delete(r.Context(), existing)
// Создаём заново с теми же параметрами
fn.ResourceVersion = ""
if createErr := h.K8s.Create(r.Context(), fn); createErr != nil {
writeJSON(w, http.StatusInternalServerError, errResp(createErr.Error()))
return
}
writeJSON(w, http.StatusCreated, fnToResponse(fn))
return
}
writeJSON(w, http.StatusConflict, errResp("function already exists"))
return
}
+3 -2
View File
@@ -90,8 +90,9 @@ func (b *Builder) Build(ctx context.Context, namespace, funcName, s3Key string)
},
},
Spec: batchv1.JobSpec{
// Не повторяем при ошибке — контроллер сам перезапустит reconcile
BackoffLimit: int32Ptr(0),
// 2 попытки: при транзиентных сбоях (OOM, network blip) kaniko сможет перезапуститься.
// BackoffLimit=0 приводил к ложным "build job failed" при нагрузке.
BackoffLimit: int32Ptr(2),
Completions: int32Ptr(1),
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
+3 -3
View File
@@ -425,10 +425,10 @@ test_simple() {
assert_step "1 changed" grep -q '1 changed' "${log}-r2-mod1.log"
assert_step "HTTP 200 after mod1" http_check "$display_url" 200 12 10
# Mod 2: memory 6496 в time-getter.tf
next_step "[R2-mod2] memory 64→96 (time-getter)"
# Mod 2: memory 96 → 128 в time-getter.tf (начальное значение в time-getter.tf = 96, а не 64)
next_step "[R2-mod2] memory 96→128 (time-getter)"
backup_file "$dir/time-getter.tf"
patch_memory "$dir/time-getter.tf" 64 96
patch_memory "$dir/time-getter.tf" 96 128
assert_step "apply mod2 OK" tf_apply "${log}-r2-mod2.log" "$dir"
assert_step "1 changed" grep -q '1 changed' "${log}-r2-mod2.log"
assert_step "HTTP 200 after mod2" http_check "$display_url" 200 10 8