Kubernetesの基本を学んできた今、実際に現場でよくある構成を例に全体の流れをつかんでみましょう。この章では、次のような構成のシンプルなWebアプリケーションを扱います:
- バックエンド:Spring Boot(Java製Webアプリ)
- データベース:MySQL
- フロントエンド:(今回は無し。API中心で構成)
🎯 ゴール
- Kubernetes 上に Spring Boot アプリと MySQL をデプロイする
- アプリから MySQL に接続して動作する
- Service / ConfigMap / Secret など、学んできたリソースを総合的に使う
🔧 アーキテクチャイメージ
[Ingress]
↓
[Spring Boot Pod] --(JDBC)--> [MySQL Pod]
- Spring BootアプリはREST APIを提供
- DB接続情報はSecretやConfigMapで管理
- Serviceを通じてPod間通信を実現
🧱 Kubernetes上の構成リソース
リソース | 内容 |
---|---|
Deployment | Spring Bootアプリ用Podの管理 |
Service | Spring BootアプリおよびMySQL用アクセス口 |
ConfigMap | DB接続先や環境変数などの非機密設定 |
Secret | DBのパスワードなど機密情報 |
PersistentVolume | MySQLのデータ保存場所 |
Ingress | 外部からのHTTPリクエストをアプリにルーティング |
🧪 マニフェスト例(抜粋)
① MySQL 用 Secret
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
MYSQL_ROOT_PASSWORD: cGFzc3dvcmQ= # "password"
② MySQL Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
ports:
- containerPort: 3306
③ Spring Boot Deployment(環境変数付き)
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-app
spec:
replicas: 1
selector:
matchLabels:
app: springboot
template:
metadata:
labels:
app: springboot
spec:
containers:
- name: app
image: your-dockerhub-id/springboot-app:latest
env:
- name: SPRING_DATASOURCE_URL
value: jdbc:mysql://mysql:3306/mydb
- name: SPRING_DATASOURCE_USERNAME
value: root
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
ports:
- containerPort: 8080
🌐 Ingress 例(オプション)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: springboot-ingress
spec:
rules:
- host: example.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: springboot-service
port:
number: 8080
※ Ingressを使うには Ingress Controller のインストールが必要です。
📌 注意点とベストプラクティス
- MySQLには永続ボリューム(PersistentVolumeClaim)を使う:データの永続化に必要
- アプリケーションはDBの起動を待てるように作る:Spring Bootの
retry
設定などで対処可 - Secretsはbase64エンコードが必要だが暗号化ではないので注意
- Dockerイメージは事前にDocker Hub等にPushしておく
✅ 動作確認の手順(例)
- 全リソースを
kubectl apply -f
で適用 - Pod が立ち上がっているか確認:
kubectl get pods
3. Spring Boot のログを確認:
kubectl logs deployment/springboot-app
4. API の疎通確認:
curl http://<NodeIP>:<NodePort>/api/hello
(Ingress使用時は http://example.local/api/hello
など)
🎓 学習のポイント
この構成例では、これまでに学んだ多くのKubernetesリソースを組み合わせて、実際のWebアプリを動かす現場感を味わうことができます。ここまで理解できれば、ほとんどのKubernetes構成に対する応用が効くようになります。
📦 補足:Spring BootのDockerイメージ例
FROM eclipse-temurin:17-jdk
COPY target/myapp.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]