# 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 サーバー ## インストール ### 基本的なインストール ```bash helm install phpmyadmin ./phpmyadmin-nginx ``` ### カスタム設定でのインストール ```bash 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 を使用したインストール ```bash helm install phpmyadmin ./phpmyadmin-nginx -f custom-values.yaml ``` ## 設定例 ### 1. 複数のMySQLサーバーへの接続 ```yaml phpmyadmin: hosts: - host: mysql-primary.default.svc.cluster.local port: 3306 - host: mysql-secondary.default.svc.cluster.local port: 3306 ``` ### 2. Ingress の有効化 (TLS対応) ```yaml 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. オートスケーリングの有効化 ```yaml autoscaling: enabled: true minReplicas: 2 maxReplicas: 10 targetCPUUtilizationPercentage: 80 targetMemoryUtilizationPercentage: 80 ``` ### 4. Network Policy の有効化 ```yaml 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. セッション永続化 ```yaml persistence: enabled: true storageClass: "standard" accessMode: ReadWriteMany size: 1Gi ``` ### 6. 自動バックアップの有効化(PVC使用) ```yaml 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使用) ```yaml 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を使用したバックアップ ```yaml 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]` から自動的に取得されます。 ## アンインストール ```bash helm uninstall phpmyadmin ``` ## セキュリティに関する注意事項 1. **Blowfish Secret**: 本番環境では必ず独自の blowfish secret を設定してください 2. **Network Policy**: 本番環境では Network Policy を有効にしてアクセスを制限してください 3. **Ingress**: 外部公開する場合は必ず TLS を有効にしてください 4. **認証**: phpMyAdmin への直接アクセスを制限し、VPN経由でのアクセスを推奨します ## トラブルシューティング ### Podが起動しない場合 ```bash 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に接続できない場合 1. MySQLサーバーのホスト名とポートを確認 2. Network Policyの設定を確認 3. MySQLサーバーがリッスンしているか確認 ```bash kubectl exec -it -c phpmyadmin -- nc -zv mysql.default.svc.cluster.local 3306 ``` ### バックアップジョブの確認 ```bash # CronJobの確認 kubectl get cronjob # 実行されたJobの確認 kubectl get jobs -l app.kubernetes.io/component=backup # バックアップジョブのログ確認 kubectl logs job/ # バックアップファイルの確認(PVC使用時) kubectl exec -it -- ls -lh /backup/ # 手動でバックアップジョブを実行 kubectl create job --from=cronjob/ manual-backup-$(date +%s) ``` ### バックアップの復元方法 ```bash # バックアップPodに接続 kubectl exec -it -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ページで報告してください。