331 lines
9.0 KiB
Markdown
331 lines
9.0 KiB
Markdown
# 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 <pod-name> -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/<job-name>
|
||
|
||
# バックアップファイルの確認(PVC使用時)
|
||
kubectl exec -it <backup-pod-name> -- ls -lh /backup/
|
||
|
||
# 手動でバックアップジョブを実行
|
||
kubectl create job --from=cronjob/<cronjob-name> manual-backup-$(date +%s)
|
||
```
|
||
|
||
### バックアップの復元方法
|
||
|
||
```bash
|
||
# バックアップ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ページで報告してください。 |