0e682b9fd159cfc9f6f97873edd028da0dddabac
All checks were successful
Helm Chart Release / release-chart (push) Successful in 12s
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