Kubernetesを使いWordPress+MySQL環境を作成

Kubernetesを使いWordPress+MySQL環境を作成 Kubernetes

Kubernetesは公式ドキュメントを読んでも理解できず、発音(クバネティス)が覚えづらい上に仕組みが複雑なこともあり、長いあいだ敬遠していました。

そんな中ある時、Docker Desktopの設定画面の「Kubernetesを有効化する」ボタンに気がつき、「もしかして簡単に使えるかも」と思い立ちました。

そこでKubernetesを学びつつ、以前作成したDockerで構築していたWordPress+MySQL環境を、Docker Desktop内のKubernetesクラスタへ移行してみました。

参考文献
例: Persistent Volumeを使用したWordpressとMySQLをデプロイする
Compose on Kubrenetes を使ってみる

Docker Desktop

作業環境

  • Windows 11
  • Docker Desktopインストール
  • WSL2 + Ubuntu
  • Visual Studio Code + Remote – Containers 拡張

環境の詳細は、こちらの記事を参照してください。

KubernetesでのWordPress+MySQL 環境作成手順

以下は、Docker Compose で立ち上げている WordPress+MySQL 環境を Kubernetes マニフェストに置き換え、Docker Desktop の Kubernetes クラスタ上で起動するまでの手順です。

Docker Desktopで Kubernetes を有効化

  • Docker Desktopの設定画面を開く
    画面右上の歯車アイコン(Settings)をクリックします。
  • Kubernetes タブを選択
    左サイドバーの「Kubernetes」をクリックします。
  • 「Enable Kubernetes」にチェック
    「Enable Kubernetes(Kubernetes を有効化)」のチェックボックスをオンにします。
  • Kubernetes の起動状態を確認
    Docker Desktop のステータスバーに「Kubernetes is running」または「Kubernetes: Running」と表示されるまで待ちます
  • クラスタプロビジョニング方式
    デフォルトの kubeadmのままにしておく。
    kindは、マルチノード構成を試したい場合やKubernetesのバージョン切り替えをしたい場合、高速に立ち上げたい場合に利用する様です。)
Docker Desktop

WSL2(Ubuntu)にkubectlをインストール

sudo apt update、sudo apt install -y kubectlでは、エラーになったので、curlを使用してLinuxへkubectlのバイナリをインストールする手順を使用してインストール。

【参考】
外側の curl -LO
curl:指定した URL からデータを取得するコマンド
-L:サーバーが返すリダイレクト(HTTP 3xx)を自動で追跡する
-O:取得したファイルをリモートのファイル名(ここでは kubectl)で保存する

"https://dl.k8s.io/release/$(…)/bin/linux/amd64/kubectl"
この文字列がダウンロード先の URL になります。
$( … ) の中身を実行した結果(Kubernetes の最新安定版リリース番号)で置き換えてから curl が動きます。

内側の curl -L -s https://dl.k8s.io/release/stable.txt
-L:同じくリダイレクトを追跡
-s:進捗やエラーメッセージを表示しないサイレントモード

例)このファイルの中身が v1.28.2 なら、内側のコマンドは v1.28.2 を出力します。
結果として生成される実際の URLが、最新安定版が v1.28.2 なら出力は以下になります。
https://dl.k8s.io/release/v1.28.2/bin/linux/amd64/kubectl
これを curl -LO でダウンロードし、実行ファイル kubectl として保存します。

マニフェスト(YAML)を作成

PVCDeploymentService の順で2つのリソース(mysql.yamlwordpress.yaml)ファイルを作成する。

MySQL 用マニフェスト(mysql.yaml)

WordPress 用マニフェスト(wordpress.yaml)

マニフェストファイルのPVC → Deployment → Service の順番の意味

Kubernetes のリソースを作成するときに「PVC → Deployment → Service」という順番で考えるのは、それぞれの役割と依存関係を踏まえた論理的なフローになります。

  • PersistentVolumeClaim(PVC)
    役割:Pod(コンテナ)が使う永続ストレージの要求を定義する。
    なぜ先に?
    Deployment で作成される Pod が起動時にマウントするボリュームを、あらかじめ確保/バインドしておく必要がある。
    PVC が Bound(ストレージ確保済み)にならないと、Pod はエラーで起動できない場合がある。
  • Deployment
    役割:Pod のレプリカ管理(リビジョン管理/ローリングアップデート含む)を行う。
    なぜ真ん中?
    Deployment のテンプレートで「この PVC をこのマウントパスに使う」と指定するため、PVC が先に存在している必要がある。
    Pod が起動するときに、マウント先のボリューム(PVC)が利用可能であることを前提とする。
  • Service
    役割:Pod 群に対する安定したネットワークアクセスポイント(ClusterIP/NodePort/LoadBalancer)を提供する。
    なぜ最後?
    Service はラベルセレクターで Pod(Deployment が作成したもの)にトラフィックを振り分ける。Pod がまだ存在しないと、Service に紐づくエンドポイントが空のままになるため、適切に機能しない。

Kubernetes 上でのリソース配置とネットワーク

マニフェストファイル(mysql.yamlwordpress.yaml)により作成されるリソース配置とネットワーク構成図は、下記の通りです。

マニフェスト適用と動作確認

アクセスと接続テスト

ubuntuターミナル操作

WordPress
docker ps に k8s_nginx_nginx-…_wordpress-stack_… というコンテナが見える理由

マニュフェスト(mysql.yaml/wordpress.yaml)ではなく、Compose on Kubernetes」機能(あるいは docker stack deploy)が自動的に作成した Ingress 用の nginx プロキシコンテナ。

nginx プロキシコンテナ(Nginx Ingress Controller)

Nginx をベースとした Ingress Controllerで、外部からのリクエストを受け、Ingress リソースで定義されたルールに従ってバックエンド Service へ転送します。

動作イメージ
  1. 外部ロードバランサ(クラウド LB/MetalLB など)から NodePort/HostPort 経由で nginx Ingress Controller Pod へトラフィックが到達
  2. Controller が API サーバーから Ingress リソースを watch
  3. Nginx の設定ファイル(nginx.conf)を自動生成し、nginx プロセスをリロード
  4. リクエストを定義されたバックエンド Service(ClusterIP)へルーティング

まとめ

以上で、以前作成したDockerで構築していたWordPress+MySQL環境の、Docker Desktop内のKubernetesクラスタへ移行が完了しました。

Kubernetes(クバネティス)のコンテナオーケストレーション機能には触れられず、Kubernetesの理解には程遠いですが、Kubernetes(クバネティス)を理解していくのための手掛かりはつかめそうな気がしています。

参考ドキュメント

Kubernetesドキュメント

例: Persistent Volumeを使用したWordpressとMySQLをデプロイする

主な用語と概念

用語説明
Podコンテナの最小実行単位。
複数のコンテナを同じネットワーク名前空間で束ねる。
Nodeワーカーマシン(VM/物理サーバー)。
Pod を実際に動かすホスト。
Control Planeクラスター全体を管理する中枢。
API サーバー、スケジューラー等から構成。
DeploymentPod のレプリカ数やアップデート方法を宣言的に管理するオブジェクト。
ServicePod の集合に対する安定したアクセス方法
(ロードバランサー/ClusterIP など)。
ConfigMap / Secretアプリ設定値や機密情報を Pod に注入するための仕組み。
Namespace同じクラスター内でリソースを論理的に分割するための仕切り。
VolumePod 内のコンテナ間で共有するストレージ領域。

アーキテクチャの全体像

  • ユーザー操作
    kubectl apply -f deployment.yaml などでマニフェストを投入
  • API サーバー
    └ リクエストを受け付け、etcd に状態を永続化
  • Scheduler
    └ 新規 Pod を適切な Node に振り分け
  • Controller Manager
    └ 宣言された状態と実際の状態を常に比較し、差分を修正
  • kubelet(各 Node)
    └ kubelet が API サーバーから Pod 定義を受け取り、コンテナランタイム(Docker/containerd)で起動
  • kube-proxy
    └ Service の仮想 IP を実現し、ネットワーク通信を各 Pod にルーティング
アーキテクチャ

参考動画

タイトルとURLをコピーしました