Warning: mkdir(): No space left on device in /var/www/tg-me/post.php on line 37

Warning: file_put_contents(aCache/aDaily/post/DevOPSitsec/--): Failed to open stream: No such file or directory in /var/www/tg-me/post.php on line 50
DevOps | Telegram Webview: DevOPSitsec/1472 -
Telegram Group & Telegram Channel
⚙️ DevOps‑челлендж «Zero‑Downtime? Серьёзно?»

Вам выдали репозиторий ShopCat (SaaS‑платформа).
Он уже «работает» в Kubernetes‑кластере AWS EKS, собирается GitHub Actions и раскатывается Helm‑чартом.
Менеджеры уверяют, что *«релизы без простоя, всё по‑мажору»* — но пользователи получают 502 при каждом деплое.

Ваша миссия — найти и устранить скрытую причину даунтайма, не внося изменений в само приложение.

📂 Что есть в репо


.
├─ docker/
│ └─ Dockerfile # двухступенчатая сборка
├─ helm/
│ └─ shopcat/ # Chart.yaml + values.yaml + templates/*
├─ k8s/
│ ├─ namespace.yaml
│ └─ ingress.yaml # AWS ALB Ingress Controller
├─ .github/workflows/
│ └─ deploy.yml # CI → CD
└─ terraform/
├─ eks.tf
├─ rds.tf
└─ outputs.tf


⚠️ Подвох № 1 (скрытый таймер)
В Dockerfile есть RUN adduser ... с интерактивным sudo‐prompt’ом, который «застревает»,
но только если кеш Docker‑слоёв инвалидирован (например, при обновлении base‑image).

⚠️ Подвох № 2 (невидимая «дырка» в rolling‑update)
В шаблоне Deployment:


livenessProbe:
httpGet:
path: /healthz
port: 8080
---
readinessProbe:
httpGet:
path: /healthz
port: 8080


* /healthz возвращает 200 даже во время graceful‑shutdown (SIGTERM → 30 с drain).
* terminationGracePeriodSeconds = 60, а Ingress ALB считает Pod «живым», пока тот не закроется.
* В итоге старый Pod уже не принимает новые запросы, но остаётся в EndpointSlice ещё ±60 секунд.

⚠️ Подвох № 3 («сам себе злобный Буратино»)
Helm‑values указывают образ image: shopcat:latest.
GitHub Actions пушит тэгированный :vX.Y.Z, но тэг :latest перезаписывается той же джобой PR‑preview.
В production во время canary‑release может внезапно оказаться незамёрженый код Pull‑Request’а.

## 🏆 Задание

1. Настройте pipeline, чтобы:
* на каждый PR собирался shopcat:<sha> и катил preview‑релиз в namespace pr‑<num>,
* на main пушился shopcat:v<semver>, после чего Helm делал blue/green‑deploy в prod.
2. Измените манифесты так, чтобы во время rolling‑update не было 502/504:
* никакого даунтайма, даже если контейнеру нужно 60 с на graceful‑shutdown;
* сетевой трафик должен _сначала_ уходить от старых Pod’ов, а _потом_ те выключаются.
3. Ограничьте blast‑radius: превратить latest в «immutable image tag» и запретить Helm обновлять release, если image.tag уже был задеплоен (hint: .Chart.AppVersion + `helm.sh/hook`).
4. Найдите и исправьте «застревающий» шаг в Dockerfile, чтобы кэш всегда использовался, а билд не ждал интерактива.
5.  Предоставьте:
* патчи (`.diff`) или PR в репозиторий,
* скриншот успешного kubectl rollout status deployment/shopcat ‑‑watch,
* краткое Post‑mortem (≤ 300 слов): *«Почему был даунтайм и какой фикс вы сделали»*.

## 💣 Неочевидные ограничения


* Нельзя менять исходный код приложения (только инфраструктура).
* Кластер prod имеет 2 ноды t3.medium (4 vCPU, 8 GiB) — бюджету больно от лишних replica‑set’ов.
* CI‑время — ≤ 5 мин на каждый PR.
* Все секреты — только через AWS Secrets Manager; в манифестах не должно быть plaintext.

🔜 Решение

@DevOPSitsec
Please open Telegram to view this post
VIEW IN TELEGRAM



tg-me.com/DevOPSitsec/1472
Create:
Last Update:

⚙️ DevOps‑челлендж «Zero‑Downtime? Серьёзно?»

Вам выдали репозиторий ShopCat (SaaS‑платформа).
Он уже «работает» в Kubernetes‑кластере AWS EKS, собирается GitHub Actions и раскатывается Helm‑чартом.
Менеджеры уверяют, что *«релизы без простоя, всё по‑мажору»* — но пользователи получают 502 при каждом деплое.

Ваша миссия — найти и устранить скрытую причину даунтайма, не внося изменений в само приложение.

📂 Что есть в репо


.
├─ docker/
│ └─ Dockerfile # двухступенчатая сборка
├─ helm/
│ └─ shopcat/ # Chart.yaml + values.yaml + templates/*
├─ k8s/
│ ├─ namespace.yaml
│ └─ ingress.yaml # AWS ALB Ingress Controller
├─ .github/workflows/
│ └─ deploy.yml # CI → CD
└─ terraform/
├─ eks.tf
├─ rds.tf
└─ outputs.tf


⚠️ Подвох № 1 (скрытый таймер)
В Dockerfile есть RUN adduser ... с интерактивным sudo‐prompt’ом, который «застревает»,
но только если кеш Docker‑слоёв инвалидирован (например, при обновлении base‑image).

⚠️ Подвох № 2 (невидимая «дырка» в rolling‑update)
В шаблоне Deployment:


livenessProbe:
httpGet:
path: /healthz
port: 8080
---
readinessProbe:
httpGet:
path: /healthz
port: 8080


* /healthz возвращает 200 даже во время graceful‑shutdown (SIGTERM → 30 с drain).
* terminationGracePeriodSeconds = 60, а Ingress ALB считает Pod «живым», пока тот не закроется.
* В итоге старый Pod уже не принимает новые запросы, но остаётся в EndpointSlice ещё ±60 секунд.

⚠️ Подвох № 3 («сам себе злобный Буратино»)
Helm‑values указывают образ image: shopcat:latest.
GitHub Actions пушит тэгированный :vX.Y.Z, но тэг :latest перезаписывается той же джобой PR‑preview.
В production во время canary‑release может внезапно оказаться незамёрженый код Pull‑Request’а.

## 🏆 Задание

1. Настройте pipeline, чтобы:
* на каждый PR собирался shopcat:<sha> и катил preview‑релиз в namespace pr‑<num>,
* на main пушился shopcat:v<semver>, после чего Helm делал blue/green‑deploy в prod.
2. Измените манифесты так, чтобы во время rolling‑update не было 502/504:
* никакого даунтайма, даже если контейнеру нужно 60 с на graceful‑shutdown;
* сетевой трафик должен _сначала_ уходить от старых Pod’ов, а _потом_ те выключаются.
3. Ограничьте blast‑radius: превратить latest в «immutable image tag» и запретить Helm обновлять release, если image.tag уже был задеплоен (hint: .Chart.AppVersion + `helm.sh/hook`).
4. Найдите и исправьте «застревающий» шаг в Dockerfile, чтобы кэш всегда использовался, а билд не ждал интерактива.
5.  Предоставьте:
* патчи (`.diff`) или PR в репозиторий,
* скриншот успешного kubectl rollout status deployment/shopcat ‑‑watch,
* краткое Post‑mortem (≤ 300 слов): *«Почему был даунтайм и какой фикс вы сделали»*.

## 💣 Неочевидные ограничения


* Нельзя менять исходный код приложения (только инфраструктура).
* Кластер prod имеет 2 ноды t3.medium (4 vCPU, 8 GiB) — бюджету больно от лишних replica‑set’ов.
* CI‑время — ≤ 5 мин на каждый PR.
* Все секреты — только через AWS Secrets Manager; в манифестах не должно быть plaintext.

🔜 Решение

@DevOPSitsec

BY DevOps


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/DevOPSitsec/1472

View MORE
Open in Telegram


DevOps Telegram | DID YOU KNOW?

Date: |

The Singapore stock market has alternated between positive and negative finishes through the last five trading days since the end of the two-day winning streak in which it had added more than a dozen points or 0.4 percent. The Straits Times Index now sits just above the 3,060-point plateau and it's likely to see a narrow trading range on Monday.

DevOps from pl


Telegram DevOps
FROM USA