fix: operator v0.1.23 — BackoffLimit=2 в kaniko, пересоздание Failed функций; script: mod2 96→128
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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 64 → 96 в 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
|
||||
|
||||
Reference in New Issue
Block a user