Kubernetes Learning 第14章:Webアプリケーションの例 〜Spring Boot + MySQLをKubernetesに載せてみる〜

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上の構成リソース

リソース内容
DeploymentSpring Bootアプリ用Podの管理
ServiceSpring BootアプリおよびMySQL用アクセス口
ConfigMapDB接続先や環境変数などの非機密設定
SecretDBのパスワードなど機密情報
PersistentVolumeMySQLのデータ保存場所
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しておく

✅ 動作確認の手順(例)

  1. 全リソースを kubectl apply -f で適用
  2. 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"]

mh

Related Posts

Kubernetes Learning 第15章:ServiceとIngressを使った公開

Kubernetesクラスターの中で動いているアプリケーショ…

Kubernetes Learning 第13章:kubectl apply / diff / deleteの運用

Kubernetes の設定を管理・反映していく上で、kub…

You Missed

Kubernetes Learning 第15章:ServiceとIngressを使った公開

  • 投稿者 mh
  • 5月 19, 2025
  • 4 views

Android application development 第19章:JSONパース(Gson)

  • 投稿者 mh
  • 5月 19, 2025
  • 6 views

Kubernetes Learning 第14章:Webアプリケーションの例 〜Spring Boot + MySQLをKubernetesに載せてみる〜

  • 投稿者 mh
  • 5月 18, 2025
  • 16 views

Android application development 第18章:Retrofitを使ったAPI通信

  • 投稿者 mh
  • 5月 18, 2025
  • 13 views

Kubernetes Learning 第13章:kubectl apply / diff / deleteの運用

  • 投稿者 mh
  • 5月 17, 2025
  • 27 views

Android application development 第17章:SQLiteとRoomの比較と実装

  • 投稿者 mh
  • 5月 17, 2025
  • 26 views