【4-4】Kubernetes実践編:WordPressをK8sに完全移行!ServiceとDeploymentで繋ぐマルチティアアプリ
Kubernetes実践編:WordPressをK8sに完全移行!ServiceとDeploymentで繋ぐマルチティアアプリ
はじめに
これまでの学習で、私たちはKubernetesの2大巨頭を学びました。
-
Deployment: Pod(コンテナ)の数と状態を管理し、「自己修復」や「更新」を行うマネージャー -
Service:ClusterIP,NodePort,LoadBalancerを使い分け、Podへの安定した「玄関口」を提供するネットワーク
今回は、この2つの強力なリソースを組み合わせて、Docker Composeで構築した 「WordPress + MySQL」 というマルチティア・アプリケーションを、Kubernetes上に完全移行します。
DeploymentとServiceがどのように連携し、コンテナ同士がどうやってお互いを見つけるのか、その全てが明らかになります。
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: NodePortとnodePort: 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