ローカルでKubernetes × WordPressを構築

はじめに

こんにちは!インフラエンジニアのnaya(@NayaTaiyo)です。前回は、Kubernetesについての基礎知識をまとめて記事にしたのですが、今回はローカルのKubernetesを利用してWordPressの立ち上げてみましたので、ブログにしたいと思います。

Kubernetes入門:初心者が知るべき基礎知識

構築環境

OS
  • Windows11
Tool
  • Docker Desktop
    • v4.38.0
  • WSL2
    • Ubuntu v24.04.2
kubectl version
  • Client Version
    • v1.30.5
  • Kustomize Version
    • v5.0.4-0.20230601165947-6ce0bf390ce3
  • Server Version
    • v1.30.5
Docker images
  • web
    • nginx:1.27.3-alpine
  • app
    • php:8.3-fpm-alpine
  • db
    • mysql:8.0.28
Namespace
  • dev-techbull-k8s
Pods
  • WordPressPod
    • nginxコンテナ(nginx.service)
    • appコンテナ(php-fpm.service)
  • MySQLPod
    • mysqlコンテナ(mysql.service)

※本記事では、Dockerfile を用いてカスタムイメージを作成しています。

構成図

  • マシン環境図

  • Kubernetes構成図

ディレクトリ階層

Dockerfile Dockerコンテナの定義ファイル

php/ phpの設定ファイル類

mysql/ phpの設定ファイル類

nginx/ nginxの設定ファイル類

app.yml app Pod(nginx、php)を定義

ingress.yml LBやServiceの設定を一括で定義

mysql.yml mysql Pod(mysql)を定義

secrets.yml Kubernetesで使用する変数や機密情報(パスワード情報など)を管理

wordpressWordPressのソースファイル

.gitignoreignoreの対象を指定

secrets.ymlや、wordpressなどの大量のファイルはGitなどでバージョン管理をする際はignore設定に入れましょう。

  • Kubernetes/k8s/.gitignore

Files

それでは、各設定ファイルを見ていきましょう。 WordPress関連の設定ファイルは省きますので、気になる方は以下のリンクをご確認ください。

VagrantでWordPressを構築する

Dockerfile

※ 一部イメージファイルによって使用できるコマンドが異なります。また、vimはデバッグ用として導入しております。

  • Kubernetes/docker/app/Dockerfile

12~14行目:

※Linuxディストリビューションalpineとubuntu/debianではパッケージマネージャーが異なります。
alpine :apk
ubuntu/debian: apt

また、aptとapkでキャッシュの処理が異なります。apkの場合 --update --no-cacheでキャッシュを残さずパッケージをインストールすることが可能。aptの場合 && apt-get clean \ && rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*でキャッシュの削除

40~45行目:

➀GDの設定にfreetypeとjpegを追加
freetype フォント描画機能 コードを文字として可視化してくれる。
jpeg jpegファイルの管理、編集を可能にする。

➁NPROCに論理プロセッサ(スレッド)の個数の格納
➂エラーの場合は1を導入
➃拡張機能であるgdをスレッド分の並列処理を有効化にしてインストール

プロセスとスレッドの違いとは?超わかりやすく解説!【図解とプログラム付き】

47~56行目:

nginxユーザーを作成後、PHP-FPMの設定や実行フォルダを整えています。
あとはWordPressのファイルを /var/www/dev-k8s.techbull.cloud/ にコピーして準備完了です。

Linuxのユーザーとグループとは。【初心者向け】

60行目:

フォアグラウンドで実行理由

コンテナはプロセス単位で動作しております。なのでPID1をフォアグラウンドで固定化するためフォアグラウンドで実行しております。※バックグラウンドでの動作だと一時的にPID1が終了するためそのタイミングでコンテナが停止してしまうため。

  • Kubernetes/docker/mysql/Dockerfile

  • Kubernetes/docker/nginx/Dockerfile

25行目:

※フォアグラウンド実行理由については「# php-fpmをフォアグラウンドで実行」と同じになります。

Kubernetes

  • Kubernetes/k8s/ingress.yml ※Serviceの設定も併せて記述してます。

2~20行目:

ClusterIP Service(デフォルト)を使用。

  • Kubernetes クラスタ内では、各 Service に対して仮想IP(ClusterIP)が割り当てられ、クライアントはこの仮想IPに通信することで、背後にある複数の Pod へアクセスできます。

40~52:

Headless Service(clusterIP: Noneで指定)を使用。

  • PodへDNS RoundRobin(DNS RR)を用いた通信を行う。TTLの保持期間についても注意しましょう。
  • ホスト名やIPアドレスに変更がないようにStatefulSetで使用。

※ClusterIP Serviceでは仮想IPアドレスへの通信後各Podへ負荷分散を行うのですが、Headless Serviceでは各Podに対して通信を行うイメージになります。

DNSラウンドロビン

DNSキャッシュ

  • Kubernetes/k8s/secrets.yml

base64でデコードしています。

  • Kubernetes/k8s/app.yml

18~28行目:

処理としては以下の通りです。

➀ initContainersと呼ばれるコンテナがメインコンテナ(ここではnginxやappコンテナのこと)作成の前に作成される。メインコンテナ作成前に行いたい処理などがある場合に用いられる。

➁ wordpress-data配下に空のdocumentrootボリュームマウント

➂ dev-k8s.techbull.cloud配下のファイルをwordpress-data配下(documentrootボリューム)にコピー これによりdocumentrootボリュームを用いて元々dev-k8s.techbull.cloud配下のファイルだったものを共有することが可能

  • Kubernetes/k8s/mysql.yml

事前準備

  • wp-config.phpの作成

  • 認証情報デコード化

以下のリンク先で発行されるコードをwp-config.phpにコピペしましょう。

https://api.wordpress.org/secret-key/1.1/salt/

コンテナイメージのビルド

※ 今回の構成だとホストマシンからのファイル操作が発生するのでコマンド実行のディレクトリに注意

ネームスペース作成+コンテキストの指定

Pod適用+nginxコントローラ導入

Access

http://dev-k8s.techbull.cloud/

以下の画像の通りに画面が表示されること

インストール後問題なくログインできること

おまけ

  • Podの内容確認

  • Podのログ確認

  • Podの状態確認

  • Podのデバッグコマンド

上記のコマンドを使用するとエフェメラルコンテナと呼ばれる一時的なコンテナを作成してエフェメラルコンテナ内に接続することが可能です。(実際の基となるメインコンテナ(本記事で言うとweb、app、dbコンテナ)を操作することは不可です。)

メインコンテナには導入されていないパッケージを導入することが可能なので本番環境などで好きなようにパッケージを導入できない場合などはこちらのコマンドを使用して調査など行うとよいと思います。イメージファイルもお好みで使用できます。

また、メインコンテナをデバッグする場合は以下のコマンドを使用します。

/proc/メインコンテナのPID/rootでメインコンテナ内のルートディレクトリにアクセスすることも可能なのでメインコンテナ内のデバッグをすることが可能です。

上記のコマンドは同じPod内にエフェメラルコンテナを作成するのですが、以下のコマンドを使用することで新たなデバッグ用のPodを作成することが可能です。

完全に別のPodなので複製基のPodが終了をした際も影響はないです。

実行中のPodのデバッグ

まとめ

Kubernetesの動作は非常に複雑で、基本を抑えるのにも時間がかかります。しかし、Kubernetesを学んでいく中で、コンテナ仮想化技術への理解が個人的には深まったと感じています。もし興味があれば、ぜひ一度試してみてください。思った以上に多くのことを学べると思います。今後はクラウドの Kubernetes にも取り組む予定なので、機会があれば記事にまとめたいです。また、今回の記事について、ありがとうございました!

参考リンク

https://kubernetes.io/ja/docs/setup/
https://www.f5.com/ja_jp/glossary/dns-round-robin
https://www.nic.ad.jp/ja/newsletter/No51/0800.html
https://www.miraiserver.ne.jp/column/about_linux-user-group/
https://kubernetes.io/ja/docs/tasks/debug/debug-application/debug-running-pod/#ephemeral-container-example

参考にした技術書

・Kubernetes完全ガイド 第2版
・Kubernetesの知識地図 —— 現場での基礎から本番運用まで

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール