🖥️

【4-4】Kubernetes実践編:WordPressをK8sに完全移行!ServiceとDeploymentで繋ぐマルチティアアプリ

に公開

Kubernetes実践編:WordPressをK8sに完全移行!ServiceとDeploymentで繋ぐマルチティアアプリ

はじめに

これまでの学習で、私たちはKubernetesの2大巨頭を学びました。

  1. Deployment: Pod(コンテナ)の数と状態を管理し、「自己修復」や「更新」を行うマネージャー
  2. Service: ClusterIP, NodePort, LoadBalancerを使い分け、Podへの安定した「玄関口」を提供するネットワーク

今回は、この2つの強力なリソースを組み合わせて、Docker Composeで構築した 「WordPress + MySQL」 というマルチティア・アプリケーションを、Kubernetes上に完全移行します。

DeploymentServiceがどのように連携し、コンテナ同士がどうやってお互いを見つけるのか、その全てが明らかになります。

Part 1: バックエンド (MySQL) の構築

まずは、WordPressのデータストアとなるMySQLデータベースを作成します。このDBは、クラスターの外部に公開する必要はなく、WordPressのPodからのみアクセスできればOKです。

そのため、Serviceは ClusterIP(デフォルトの内部専用タイプ)を使います。

# WordPress用の作業ディレクトリを作成
mkdir ~/k8s-wordpress
cd ~/k8s-wordpress

1. MySQLのマニフェスト作成 (mysql-deployment.yaml)

---(ハイフン3つ)を使うと、1つのYAMLファイルに複数のリソース(今回はDeploymentとService)を定義できます。

cat > mysql-deployment.yaml << 'EOF'
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.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "rootpassword"
        - name: MYSQL_DATABASE
          value: "wordpress"
        - name: MYSQL_USER
          value: "wpuser"
        - name: MYSQL_PASSWORD
          value: "wppassword"
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
    targetPort: 3306
EOF

注目ポイント

kind: Deployment:

  • replicas: 1: DBは通常1台構成で起動します
  • env: Docker Composeの時と同じように、環境変数でDBを初期化します

volumes: - emptyDir: {}:
⚠️ 重要: emptyDirは一時的なストレージです。Podが再起動するとデータも一緒に消えてしまいます。今回の学習ではこの簡易的な方法を使いますが、本番環境ではPersistentVolumeという永続化の仕組みが必須です。

kind: Service:

  • typeを指定していないので、自動的にClusterIPになります
  • metadata.name: mysql-service: この名前が、WordPressがDBを見つけるための 「電話番号」 になります

2. MySQLの起動と確認

k apply -f mysql-deployment.yaml

# PodがRunningになるまで少し待つ
k get pods -l app=mysql

# ログでDBの初期化が完了したか確認
k logs -l app=mysql

Part 2: フロントエンド (WordPress) の構築

DBの準備ができたので、次にWebサーバーであるWordPress本体を作成します。

こちらは私たちがブラウザからアクセスする必要があるため、ServiceはNodePortを使います。

1. WordPressのマニフェスト作成 (wordpress-deployment.yaml)

cat > wordpress-deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 2
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: wordpress:latest
        env:
        - name: WORDPRESS_DB_HOST
          value: "mysql-service:3306"
        - name: WORDPRESS_DB_USER
          value: "wpuser"
        - name: WORDPRESS_DB_PASSWORD
          value: "wppassword"
        - name: WORDPRESS_DB_NAME
          value: "wordpress"
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-service
spec:
  type: NodePort
  selector:
    app: wordpress
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30088
EOF

🚀 最も重要なポイント 🚀

kind: Deployment:

  • replicas: 2: WordPress本体は2台体制で起動し、冗長性を確保します
  • env.WORDPRESS_DB_HOSTの値が"mysql-service:3306"になっています

kind: Service:

  • type: NodePortnodePort: 30088を使い、クラスター外部(ノード)の30088番ポートに公開します

2. WordPressの起動と確認

k apply -f wordpress-deployment.yaml

# 2つのPodがRunningになるのを待つ
k get pods -l app=wordpress

# ServiceがNodePortで公開されていることを確認
k get services

Part 3: 動作確認とKubernetesへの移行完了!

すべてのリソースが起動しました。k get allで全体像を見てみましょう。

adm-labuser@us01:~/k8s-wordpress$ k get all
NAME                            READY   STATUS    RESTARTS   AGE
pod/mysql-756d64474-abcde       1/1     Running   0          10m
pod/wordpress-6b6459c59-fghij   1/1     Running   0          5m
pod/wordpress-6b6459c59-klmno   1/1     Running   0          5m

NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes          ClusterIP   10.43.0.1       <none>        443/TCP        44h
service/mysql-service       ClusterIP   10.43.100.200   <none>        3306/TCP       10m
service/wordpress-service   NodePort    10.43.200.10    <none>        80:30088/TCP   5m

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql       1/1     1            1           10m
deployment.apps/wordpress   2/2     2            2           5m

mysql (1 Pod) と wordpress (2 Pods) が、それぞれのServiceとDeploymentによって管理されている、完璧な構成が確認できます。

ブラウザからのアクセス

最後に、ブラウザを開き、k3sサーバーのIPアドレスとNodePort(30088)にアクセスします。

ブラウザで開くURL: http://192.168.3.101:30088

WordPressの初期設定画面(言語選択)が表示されました!

これで、Docker Composeで動いていたWordPress環境を、スケーラブルで自己修復機能も備えたKubernetesクラスターへ完全に移行することができました。

まとめ

Deployment(Podの管理者)とService(ネットワークの玄関口)という2つのリソースを組み合わせることで、Kubernetes上に本格的なアプリケーションを構築できることを学びました。

Kubernetesの基本的なリソース(Pod, Deployment, Service)をマスターしたことで、コンテナオーケストレーションの強力な世界への扉が開かれました。

次のステップでは、PersistentVolumeによるデータの永続化や、ConfigMap/Secretを使った設定管理など、より本番環境に近い構成へと進んでいきます。

Discussion