Files
phpfpm/CHANGELOG-8.5.10-b.md
claude abb5dba4a1
Helm Chart Release / release-chart (push) Successful in 9s
fix: v8.5.10-bのDeployment.spec.selector変更が既存リリースのアップグレードを壊す不具合を修正
既存のnginx/php-fpm Deploymentのspec.selector.matchLabelsにapp.kubernetes.io/component:webを追加していたが、Deployment.spec.selectorは作成後immutableのためhelm upgradeが'field is immutable'で失敗していた。既存Deploymentのselectorは元の内容(name+instanceのみ)に戻し、Selenium側はcomponentラベルではなくapp.kubernetes.io/name自体を<chart名>-seleniumという別名にする方式(新ヘルパーphpfpm.selenium.name/phpfpm.selenium.selectorLabels)に変更した。componentラベルだけを足す設計だとSeleniumのPodもnginx/php-fpm側Deploymentのselectorに一致してしまいReplicaSetの選択重複を起こすため、name自体をvariantにして構造的に防止する。v8.5.10-bは既存リリースへの適用不可のためスキップし、v8.5.10-c以降を使うこと。
2026-09-26 09:46:56 +09:00

106 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog - Version 8.5.10-b
> ⚠️ **v8.5.10-b は単体では既存リリースの `helm upgrade` が失敗する不具合を含む**
> (`Deployment.spec.selector: ... field is immutable`)。設計・原因の記録として
> 本ファイルは残すが、**実際の適用は v8.5.10-c 以降を使うこと**。修正内容は
> `CHANGELOG-8.5.10-c.md` を参照。
## 不具合修正・アーキテクチャ変更
### Selenium を独立した Deployment/Service に分離(サービス完全停止の防止)
**背景(実際に発生した障害)**
`selenium.enabled: true` の構成(hotels / booking.e-stay.jp)で、php-fpm コンテナの
`CrashLoopBackOff` が断続的に発生し、その間サイト全体が Nginx の 502(`unsupported
FastCGI protocol version`)で完全に閲覧不能になる障害が続いた。v8.5.9-d で php-fpm の
起動方式(`exec php-fpm -F`)を修正した後も、8時間で1,375回という高頻度の再起動が
継続して観測された。
**原因(確定した2点)**
1. **`resources` values キーがテンプレート側で一切参照されていなかった(死んだ設定)。**
`values.yaml` の `resources: {}` にどんな値を書いても、nginx・php-fpm・selenium
いずれのコンテナにも CPU/メモリの requests・limits が反映されない実装だった。
このため全コンテナが `QoS Class: BestEffort`(実際のデプロイでも確認済み)で動作し、
ノードのメモリ逼迫時に Linux の OOM Killer に真っ先に狙われる状態だった。
Selenium(Chromium)はメモリを多く消費するため、Raspberry Pi 等のメモリに余裕がない
ノードでは他コンテナの OOM Kill を誘発しやすい。
2. **nginx・php-fpm・Selenium を同一 Pod のコンテナとして起動しており、Pod の Ready 判定
が「全コンテナの AND」になっていた。** readinessProbe を持たないコンテナは、
Running であれば Ready 扱いになる一方、CrashLoopBackOff で Waiting/Terminated を
繰り返している間は Ready=false になる。Kubernetes の Service は Pod 全体が Ready
でなければ Endpoints に含めないため、**Selenium だけが不調でも Service の
Endpoints がゼロになり、Selenium を全く使わない静的ページの配信まで巻き込まれて
サイト全体が停止していた**。`replicaCount: 1`(冗長性なし)の構成では、この1点が
即・全断につながる。
(OOM Kill が今回の php-fpm クラッシュの直接のトリガーだったかは、`kubectl describe pod`
の `Last State` / `Reason` 等での確認が必要で、本リリース時点では未確認・要検証。
ただし上記2点はコード上で確認できる確定した設計上の欠陥であり、いずれも本番運用の
安定性を損なうため、原因の切り分けを待たずに先に修正する。)
**対応**
- `selenium.enabled: true` のとき、Selenium は nginx/php-fpm と別の
**独立した Deployment(`<release>-phpfpm-selenium`)と Service** として起動するように
変更した(`templates/deployment-selenium.yaml` / `templates/service-selenium.yaml` を新設)。
- php-fpm コンテナの `SELENIUM_URL` 環境変数は、`selenium.enabled: true` のとき
自動的にこの新しい Service(`http://<release>-phpfpm-selenium:4444/wd/hub`)を
指すよう自動注入される(`phpEnv` で独自に設定していても、こちらが優先される)。
- `selenium.replicaCount`(既定 `1`)で Selenium の Pod 数を独立して設定可能。
- `selenium.mountHtml`(既定 `false`): `true` にすると Selenium コンテナにも
PVC の `html` サブパスをマウントする。別 Pod からの同時マウントになるため、
有効にする場合は `persistence.accessMode: ReadWriteMany`
(NFS バックエンドの StorageClass なら対応可能)が必要。
- メインの Service(`<release>-phpfpm`)・Deployment には
`app.kubernetes.io/component: web` ラベルを、Selenium 側には `component: selenium`
ラベルを付与し、セレクタが混線しないようにした。
- `resources` values キーを実際にコンテナへ反映されるよう修正し、**nginx・php-fpm・
selenium で個別に設定できる構造**に変更した:
```yaml
resources:
nginx: { requests: {...}, limits: {...} }
phpfpm: { requests: {...}, limits: {...} }
selenium:
resources: { requests: {...}, limits: {...} }
```
既定値は空(`{}`)で、requests/limits なしの現行動作を維持する。**本番運用では
設定を強く推奨する**(推奨値の例は `values.yaml` のコメントを参照)。
**互換性(重要・要対応)**
- **`selenium.enabled: true` を使っている既存リリースは、アップグレード後に
以下の対応が必要:**
1. Selenium コンテナがそれまで暗黙にマウントしていた PVC の `html` サブパスに
依存していた場合(例: ブラウザのダウンロード先を公開ディレクトリに置いていた等)、
`selenium.mountHtml: true` を設定し、`persistence.accessMode` を
`ReadWriteMany` に変更する。依存していなければ何もする必要はない
(既定 `mountHtml: false` のままでよい)。
2. `phpEnv.SELENIUM_URL` に `http://localhost:4444/wd/hub` 等を手動設定している場合、
Selenium が別 Pod になったことで `localhost` には到達できなくなる。ただし
チャートが自動的に新しい Service を指す値へ上書きするため、**多くの場合は
何もしなくても動作する**(自動注入の値が env リストの後方にあるため優先される)。
設定の混乱を避けるため、`phpEnv.SELENIUM_URL` の手動指定は削除することを推奨する。
- `resources: {}` は元々どのコンテナにも一切効いていなかったため、この構造変更で
既存の動作が変わることはない(誰も実質的な値を得ていなかったため、破壊的変更にはならない)。
**対象ファイル**: `templates/deployment.yaml`, `templates/deployment-selenium.yaml`(新規),
`templates/service.yaml`, `templates/service-selenium.yaml`(新規), `values.yaml`,
`README.md`, `Chart.yaml`, `CLAUDE.md`, `CHANGELOG-8.5.10-b.md`
## アップグレード手順
```bash
helm repo update
helm upgrade <リリース名> cafepieters/phpfpm --version 8.5.10-b -f values.yaml
```
`selenium.enabled: true` の場合、上記「互換性」を確認のうえアップグレードすること。
---
**リリース日**: 2026-09-26
**担当**: プロサーバーエンジニア(Claude)