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 第37章:JenkinsやGitHub ActionsからのKubernetesデプロイ例 ~CI/CDツールとKubernetesをつなげてみよう~

Kubernetes Learning 第36章:Argo CDとFluxの概要~Kubernetesの自動運用を支えるGitOpsツール~

You Missed

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第11章:Cloud Load Balancing:あなたのGCPリソースを「賢く振り分ける交通整理の達人」

  • 投稿者 mh
  • 6月 18, 2025
  • 9 views

Kubernetes Learning 第37章:JenkinsやGitHub ActionsからのKubernetesデプロイ例 ~CI/CDツールとKubernetesをつなげてみよう~

  • 投稿者 mh
  • 6月 17, 2025
  • 13 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第10章:Cloud DNS:インターネットの「電話帳」サービス

  • 投稿者 mh
  • 6月 16, 2025
  • 15 views

Kubernetes Learning 第36章:Argo CDとFluxの概要~Kubernetesの自動運用を支えるGitOpsツール~

  • 投稿者 mh
  • 6月 15, 2025
  • 32 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第9章:IPアドレス(外部IP、内部IP、静的IP):GCPリソースの「住所」と「電話番号」

  • 投稿者 mh
  • 6月 14, 2025
  • 28 views

Kubernetes Learning 第35章:GitOpsとは?~Kubernetes運用をもっとスマートにする考え方~

  • 投稿者 mh
  • 6月 13, 2025
  • 52 views