96cac0519114be38ce93fc433bf6c637698a2998
Two bugs caused the "temporary key" warning in phpMyAdmin: 1. deployment.yaml: PMA_BLOWFISH_SECRET env var was only injected when blowfishSecret or existingSecret was explicitly set. With default empty values, the env var was never passed to the container, so phpMyAdmin fell back to an empty string and auto-generated a temporary key. Fix: always inject PMA_BLOWFISH_SECRET since the Secret is always created. 2. secret.yaml: randAlphaNum generated a new random value on every helm upgrade, invalidating all cookies and logging out users on every deployment. Fix: use lookup to check if the Secret already exists and reuse its value; only generate a new random value on first install. Also add checksum/secret annotation to trigger pod rollout when the secret changes (e.g. when blowfishSecret value is updated in values.yaml). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
phpMyAdmin with nginx Helm Chart
このHelmチャートは、nginx をリバースプロキシとして使用する phpMyAdmin をKubernetes上にデプロイします。
機能
- ✅ nginx (1.29.3-alpine-perl) + phpMyAdmin (5.2.3-fpm-alpine) のマルチコンテナ構成
- ✅ 本番環境対応のセキュリティ設定
- ✅ 自動バックアップ機能(CronJob)
- 定期的なMySQLデータベースバックアップ
- PVCまたは外部NFSへの保存対応
- 圧縮・世代管理機能
- ✅ Horizontal Pod Autoscaler (HPA) サポート
- ✅ Pod Disruption Budget (PDB) による高可用性
- ✅ Network Policy によるネットワーク分離
- ✅ セッション永続化のための PersistentVolume サポート
- ✅ Ingress サポート (TLS対応)
- ✅ リソース制限の設定
- ✅ Liveness/Readiness プローブ
- ✅ Security Context による権限制御
前提条件
- Kubernetes 1.19+
- Helm 3.0+
- MySQL/MariaDB サーバー
インストール
基本的なインストール
helm install phpmyadmin ./phpmyadmin-nginx
カスタム設定でのインストール
helm install phpmyadmin ./phpmyadmin-nginx \
--set phpmyadmin.hosts[0].host=mysql.default.svc.cluster.local \
--set phpmyadmin.hosts[0].port=3306 \
--set ingress.enabled=true \
--set ingress.hosts[0].host=phpmyadmin.example.com
values.yaml を使用したインストール
helm install phpmyadmin ./phpmyadmin-nginx -f custom-values.yaml
設定例
1. 複数のMySQLサーバーへの接続
phpmyadmin:
hosts:
- host: mysql-primary.default.svc.cluster.local
port: 3306
- host: mysql-secondary.default.svc.cluster.local
port: 3306
2. Ingress の有効化 (TLS対応)
ingress:
enabled: true
className: nginx
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/rate-limit: "10"
hosts:
- host: phpmyadmin.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: phpmyadmin-tls
hosts:
- phpmyadmin.example.com
3. オートスケーリングの有効化
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 80
targetMemoryUtilizationPercentage: 80
4. Network Policy の有効化
networkPolicy:
enabled: true
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: ingress-nginx
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: mysql
ports:
- protocol: TCP
port: 3306
5. セッション永続化
persistence:
enabled: true
storageClass: "standard"
accessMode: ReadWriteMany
size: 1Gi
6. 自動バックアップの有効化(PVC使用)
backup:
enabled: true
# 毎日午前2時にバックアップ
schedule: "0 2 * * *"
# MySQL接続情報はphpmyadmin.hostsから自動取得
mysql:
user: "backup_user"
password: "your-backup-password"
# 特定のデータベースのみバックアップ
databases:
- myapp_db
- analytics_db
# バックアップの圧縮
compression:
enabled: true
level: 6
# 30日以上古いバックアップを自動削除
retention:
enabled: true
days: 30
# PVCストレージ設定
persistence:
storageClass: "standard"
accessMode: ReadWriteMany
size: 50Gi
7. 自動バックアップの有効化(NFS使用)
backup:
enabled: true
schedule: "0 2 * * *"
# MySQL接続情報はphpmyadmin.hostsから自動取得
mysql:
existingSecret: "mysql-backup-credentials"
# NFSストレージ設定
nfs:
enabled: true
server: "nfs-server.example.com"
path: "/exports/mysql-backups"
8. 既存のSecretを使用したバックアップ
backup:
enabled: true
mysql:
existingSecret: "mysql-backup-secret"
userKey: "username"
passwordKey: "password"
パラメータ
グローバル設定
| パラメータ | 説明 | デフォルト値 |
|---|---|---|
replicaCount |
レプリカ数 | 2 |
image.nginx.registry |
nginx イメージレジストリ | docker.io |
image.nginx.repository |
nginx リポジトリ | nginx |
image.nginx.tag |
nginx イメージタグ | 1.29.3-alpine-perl |
image.phpmyadmin.registry |
phpMyAdmin イメージレジストリ | docker.io |
image.phpmyadmin.repository |
phpMyAdmin リポジトリ | phpmyadmin |
image.phpmyadmin.tag |
phpMyAdmin イメージタグ | 5.2.3-fpm-alpine |
サービス設定
| パラメータ | 説明 | デフォルト値 |
|---|---|---|
service.type |
Serviceタイプ | ClusterIP |
service.port |
Serviceポート | 80 |
service.targetPort |
ターゲットポート | 8080 |
phpMyAdmin 設定
| パラメータ | 説明 | デフォルト値 |
|---|---|---|
phpmyadmin.hosts[0].host |
MySQLホスト | mysql.default.svc.cluster.local |
phpmyadmin.hosts[0].port |
MySQLポート | 3306 |
phpmyadmin.env.PMA_ARBITRARY |
任意サーバー接続許可 | "0" |
phpmyadmin.env.UPLOAD_LIMIT |
アップロード制限 | "128M" |
phpmyadmin.env.MEMORY_LIMIT |
メモリ制限 | "512M" |
phpmyadmin.blowfishSecret |
Blowfish暗号化キー | "" (自動生成) |
リソース設定
| パラメータ | 説明 | デフォルト値 |
|---|---|---|
resources.nginx.requests.cpu |
nginx CPU要求 | 100m |
resources.nginx.requests.memory |
nginx メモリ要求 | 64Mi |
resources.phpmyadmin.requests.cpu |
phpMyAdmin CPU要求 | 250m |
resources.phpmyadmin.requests.memory |
phpMyAdmin メモリ要求 | 256Mi |
バックアップ設定
| パラメータ | 説明 | デフォルト値 |
|---|---|---|
backup.enabled |
バックアップ機能の有効化 | false |
backup.schedule |
Cronスケジュール | "0 2 * * *" |
backup.mysql.user |
MySQLバックアップユーザー | "" |
backup.mysql.password |
MySQLパスワード | "" |
backup.mysql.existingSecret |
既存Secret使用 | "" |
backup.databases |
バックアップ対象DB(空=全DB) | [] |
backup.compression.enabled |
圧縮有効化 | true |
backup.compression.level |
圧縮レベル (1-9) | 6 |
backup.retention.enabled |
世代管理有効化 | true |
backup.retention.days |
保持日数 | 30 |
backup.persistence.size |
バックアップPVCサイズ | 50Gi |
backup.nfs.enabled |
NFS使用 | false |
backup.nfs.server |
NFSサーバー | "" |
backup.nfs.path |
NFSパス | "" |
注意: MySQL接続情報(host、port)は phpmyadmin.hosts[0] から自動的に取得されます。
アンインストール
helm uninstall phpmyadmin
セキュリティに関する注意事項
- Blowfish Secret: 本番環境では必ず独自の blowfish secret を設定してください
- Network Policy: 本番環境では Network Policy を有効にしてアクセスを制限してください
- Ingress: 外部公開する場合は必ず TLS を有効にしてください
- 認証: phpMyAdmin への直接アクセスを制限し、VPN経由でのアクセスを推奨します
トラブルシューティング
Podが起動しない場合
kubectl describe pod -l app.kubernetes.io/name=phpmyadmin-nginx
kubectl logs -l app.kubernetes.io/name=phpmyadmin-nginx -c nginx
kubectl logs -l app.kubernetes.io/name=phpmyadmin-nginx -c phpmyadmin
MySQLに接続できない場合
- MySQLサーバーのホスト名とポートを確認
- Network Policyの設定を確認
- MySQLサーバーがリッスンしているか確認
kubectl exec -it <pod-name> -c phpmyadmin -- nc -zv mysql.default.svc.cluster.local 3306
バックアップジョブの確認
# CronJobの確認
kubectl get cronjob
# 実行されたJobの確認
kubectl get jobs -l app.kubernetes.io/component=backup
# バックアップジョブのログ確認
kubectl logs job/<job-name>
# バックアップファイルの確認(PVC使用時)
kubectl exec -it <backup-pod-name> -- ls -lh /backup/
# 手動でバックアップジョブを実行
kubectl create job --from=cronjob/<cronjob-name> manual-backup-$(date +%s)
バックアップの復元方法
# バックアップPodに接続
kubectl exec -it <pod-name> -c phpmyadmin -- /bin/bash
# バックアップファイルの確認
ls -lh /backup/
# 復元実行(例)
gunzip -c /backup/20241120/mydb_20241120_020001.sql.gz | \
mysql -h mysql.default.svc.cluster.local -u root -p mydb
ライセンス
このHelmチャートはMITライセンスの下で公開されています。
サポート
問題が発生した場合は、GitHubのIssuesページで報告してください。
Description