fix: Seleniumを独立Deployment/Serviceに分離しresourcesの死んだ設定を修正
Helm Chart Release / release-chart (push) Successful in 6s

selenium.enabled=true構成でphp-fpmのCrashLoopBackOffとサイト完全停止が続いた件を調査し、2つの設計上の欠陥を確認した。(1) resources values キーがテンプレートで一切参照されておらず、全コンテナがQoS Class: BestEffortで動作しOOM Killされやすい状態だった。(2) nginx/php-fpm/SeleniumをすべてSelenium同一Podで起動しており、Kubernetesの Pod Ready判定(全コンテナのAND)により、Seleniumだけが不調でもPod全体がServiceのEndpointsから外れ、Seleniumを使わない静的ページ配信まで巻き込まれてサービス全体が停止していた。対応: Seleniumを独立Deployment(<release>-phpfpm-selenium)/Serviceに分離し、SELENIUM_URLを自動注入。resourcesをnginx/phpfpm/selenium個別に構造化して実際にコンテナへ反映されるよう修正。詳細はCHANGELOG-8.5.10-b.md参照。
This commit is contained in:
2026-09-26 08:05:10 +09:00
parent 6eb1c24732
commit 86cd705d06
9 changed files with 307 additions and 37 deletions
+57 -23
View File
@@ -83,20 +83,20 @@ kubectl logs -l app.kubernetes.io/name=phpfpm -c nginx
│ │ Persistent Volume (PVC) │ │
│ │ /var/www/html │ │
│ └──────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ Selenium (Optional) │ │
│ │ :4444 │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ External Database (Optional) │
│ MySQL/MariaDB │
└─────────────────────────────────────────────┘
│ │
▼ ▼ SELENIUM_URL(自動注入)
┌─────────────────────────────┐ ┌──────────────────────────────┐
│ External Database (Optional)│ │ Selenium Deployment(Optional)│
│ MySQL/MariaDB │ │ 独立Pod・独立Service :4444 │
└─────────────────────────────┘ └──────────────────────────────┘
```
> **Selenium は独立した Deployment/Service(v8.5.10-b以降)**。以前は上の Pod 内の
> サイドカーコンテナだったが、Selenium 単体の不調(起動失敗・OOM等)で Pod 全体が
> Service の Endpoints から外れ、サイト全体が停止する問題があったため分離した
> (下記トラブルシューティング参照)。
## 主要な設定パラメータ
### 基本設定
@@ -175,11 +175,18 @@ PHPからPythonスクリプトを呼び出す用途(データ処理・機械
### Selenium設定
v8.5.10-b以降、Seleniumは独立したDeployment/Service(`<release>-phpfpm-selenium`)として起動する(nginx/php-fpmと同一Podのサイドカーではない)。
| パラメータ | 説明 | デフォルト |
|-----------|------|-----------|
| `selenium.enabled` | Selenium有効化 | `false` |
| `selenium.replicaCount` | Selenium Deploymentのレプリカ数 | `1` |
| `selenium.resources` | SeleniumコンテナのCPU/メモリ requests・limits | `{}` |
| `selenium.mountHtml` | PVCの`html`サブパスをSeleniumにもマウントするか(別Podからの同時マウントになるため`true`にする場合は`persistence.accessMode: ReadWriteMany`が必要) | `false` |
| `image.selenium.tag` | Seleniumバージョン | `144.0-chromedriver-144.0` |
`selenium.enabled: true`のとき、php-fpmコンテナの`SELENIUM_URL`環境変数は自動的にこのServiceを指す値(`http://<release>-phpfpm-selenium:4444/wd/hub`)に設定される。`phpEnv.SELENIUM_URL`を独自に指定していても、この自動注入された値が優先される。
### 外部データベース設定
| パラメータ | 説明 | デフォルト |
@@ -427,19 +434,26 @@ composer:
- "monolog/monolog:^3.0"
selenium:
enabled: true # php-webdriver/webdriverが自動追加
enabled: true # php-webdriver/webdriverが自動追加。独立Deployment/Serviceとして起動する
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "3Gi"
cpu: "2000m"
persistence:
enabled: true
size: 5Gi
resources:
requests:
memory: "1Gi"
cpu: "1000m"
limits:
memory: "3Gi"
cpu: "2000m"
nginx:
requests: { memory: "64Mi", cpu: "50m" }
limits: { memory: "128Mi" }
phpfpm:
requests: { memory: "256Mi", cpu: "200m" }
limits: { memory: "512Mi", cpu: "1000m" }
```
**PHPコード例**:
@@ -450,9 +464,10 @@ require_once '/composer/vendor/autoload.php';
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
// Seleniumに接続
// Seleniumに接続(SELENIUM_URLはselenium.enabled:trueのとき自動注入される。
// 別Deploymentになったため localhost では到達できない点に注意)
$driver = RemoteWebDriver::create(
'http://localhost:4444',
getenv('SELENIUM_URL') ?: 'http://<release>-phpfpm-selenium:4444/wd/hub',
DesiredCapabilities::chrome()
);
@@ -934,6 +949,25 @@ helm upgrade <リリース名> cafepieters/phpfpm --version 8.5.9-d -f values.ya
kubectl delete pod -n <namespace> -l app.kubernetes.io/name=phpfpm
```
### `selenium.enabled: true` でコンテナが不安定になるとサイト全体が完全停止する
**症状**: `selenium.enabled: true` の構成で、いずれかのコンテナ(php-fpm・Selenium 等)が `CrashLoopBackOff` になっている間、Selenium を全く使わない静的ページも含めてサイト全体が閲覧不能(502等)になる。`kubectl get pod` で `2/3` や `1/3` の READY 表示が続く。
**原因**: v8.5.10-b より前は Selenium が nginx/php-fpm と同一 Pod のサイドカーコンテナだった。Kubernetes は Pod の Ready 条件を「全コンテナが Ready」の AND で判定するため、readinessProbe を持たないコンテナは Running であれば Ready 扱いになる一方、いずれか1つでも CrashLoopBackOff で Waiting/Terminated を繰り返している間は Pod 全体が Ready=false になる。Service は Ready な Pod にしかトラフィックを流さないため、`replicaCount: 1`(冗長性なし)の構成では **1つのコンテナの不調がサイト全体の完全停止に直結していた**。
これに加えて、`resources` values キーが v8.5.10-a 以前はテンプレート側で参照されておらず、どのコンテナにも requests/limits が反映されない「死んだ設定」だった。全コンテナが `QoS Class: BestEffort` になり、ノードのメモリ逼迫時に OOM Killer の対象になりやすい状態だった(Chromium を含む Selenium は特にメモリを消費するため、この影響を受けやすい)。
**対策**: **v8.5.10-b 以降にアップグレードする**。
1. Selenium が独立した Deployment/Service(`<release>-phpfpm-selenium`)になり、Selenium 単体の不調がメイン Pod(nginx/php-fpm)の Ready 状態に一切影響しなくなった。
2. `resources.nginx` / `resources.phpfpm` / `selenium.resources` で実際に requests/limits を設定できるようになった。本番運用では設定を強く推奨する(未設定のままだと引き続き BestEffort のままで、OOM Kill のリスクは残る)。
```bash
helm upgrade <リリース名> cafepieters/phpfpm --version 8.5.10-b -f values.yaml
```
アップグレード後に確認すべき点は `CHANGELOG-8.5.10-b.md` の「互換性(重要・要対応)」を参照(`selenium.mountHtml` / `phpEnv.SELENIUM_URL` の扱い)。
### データベース接続エラー
**確認**:
@@ -954,8 +988,8 @@ kubectl logs <pod-name> -c php-fpm
# Nginxログ
kubectl logs <pod-name> -c nginx
# Seleniumログ(有効時)
kubectl logs <pod-name> -c selenium
# Seleniumログ(有効時。v8.5.10-b以降は別Pod・別Deploymentのため -c 指定は不要)
kubectl logs -l app.kubernetes.io/component=selenium
# リアルタイム監視
kubectl logs -f <pod-name> -c php-fpm
@@ -1134,7 +1168,7 @@ kubectl cp ./my-app <pod-name>:/var/www/html/ -c php-fpm
- [Composer使用ガイド](./COMPOSER_GUIDE.md)
- [マイグレーションガイド](./MIGRATION_GUIDE.md)
- [Selenium別チャート化設計](./SELENIUM_SEPARATION_DESIGN.md)
- Selenium別Deployment化の設計・経緯は本READMEの「Selenium設定」セクションと `CHANGELOG-8.5.10-b.md` を参照(旧: 本リンク先の設計ドキュメントは作成されず実装が先行したため削除)
## ライセンス