【K8s】K8sで Nginx + PHP-FPM をデプロイして独自ドメインでアクセスしてみる

お世話になっております。
筋トレによる体の肥大化を止めることができないシステムソリューション部の shirasaka です。
ところで皆さま Kubernetes(K8s) は利用してますでしょうか?
なんとなく便利そうだけど、なんとなく難しそうなイメージがありますよね、、、
かくいく私もがっつり触る機会があまりなく、触るたびに難しいと感じていたので、これを機に勉強してみました。
作ってみた構成と要件は下記となり、割とよく見るかなと思います。
- Nginx + PHP-FPM 構成
- 拡張子が .php ファイルであれば、Nginx → PHP-FPMコンテナへローカルプロキシ
- Service の NodePort(30080番ポート) からDocker上でホストしている独自ドメインにアクセス可能
※注意点
・今回は Docker Desktop for Windows の Kubernetes エンジンを利用しています
→ 名前解決もローカルのhostsファイルを利用します
・Kubernetes(K8s)の基本的なコンポーネント(DeploymentやServiceなど)は本記事では説明しません。
→ もし用語が分からない場合は下記で詳細に説明しているので、一度ご確認ください。
【入門】Kubernetes で nginx をたててデフォルトページを表示させる
それでは、各ファイルの説明に移ります。
(ちなみに私は物心ついたときから k8s と書いておりました)
ディレクトリ構成の説明
まずは全体のディレクト構成を記載します。
各種サービスごとに分けたディレクトリ構成となっており、それぞれ修正や更新がしやすいと思います。
.
├── README.md
├── docker-image-build.sh
├── k8s
│ ├── deployment.yml
│ ├── namespace.yml
│ └── service.yml
├── nginx
│ ├── Dockerfile
│ ├── conf
│ │ └── shira-test.com.conf
│ └── src
│ └── index.html
└── php-fpm
├── Dockerfile
└── app
└── info.php
各種ファイルの説明
./docker-image-build.sh
#!/bin/bash # Nginx用Dockerイメージのビルド docker build -t shira-test-k8s-nginx:latest ./nginx --no-cache # PHP-FPM用Dockerイメージのビルド docker build -t shira-test-k8s-php-fpm:latest ./php-fpm --no-cache # ビルドされたイメージの確認 docker images | grep shira-test-k8s
→ Dockerイメージを作成/更新するスクリプトとなります
./k8s/deployment.yml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: shira-test
namespace: shira-test
spec:
selector:
matchLabels:
app: shira-test
replicas: 1
template:
metadata:
labels:
app: shira-test
spec:
containers:
- name: nginx
image: shira-test-k8s-nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
- name: php-fpm
image: shira-test-k8s-php-fpm:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9000
→ Nginx と PHP-FPM コンテナを Deployment で作成し、DockerイメージはそれぞれのDockerファイルで作成したものを指定しています
また、namespace には後ほど記載する namespace.yml で作成するものを指定しています
./k8s/namespace.yml
---
kind: Namespace
apiVersion: v1
metadata:
name: shira-test
labels:
name: shira-test
→ namespace を作成します
./k8s/service.yml
---
apiVersion: v1
kind: Service
metadata:
name: shira-test
namespace: shira-test
labels:
app: shira-test
spec:
type: NodePort
ports:
- port: 8080
targetPort: 80
nodePort: 30080
protocol: TCP
selector:
app: shira-test
→ 30080番ポートで NodePort の service を作成し、ブラウザからアクセスできるようにします
./nginx/Dockerfile
FROM nginx:latest COPY ./conf/shira-test.com.conf /etc/nginx/conf.d RUN mkdir -p /var/www/vhosts/shira-test.com/public_html COPY ./src /var/www/vhosts/shira-test.com/public_html/ EXPOSE 80
→ Nginxコンテナを作成するDockerファイルです
/var/www/vhosts/shira-test.com/public_html をドキュメントルートとしております
また、ローカルのカスタムconfファイルとドキュメントルート配下をDockerコンテナ上にコピーし、80番ポートを解放します
./nginx/conf/shira-test.com.conf
server {
listen 80;
server_name shira-test.com;
root /var/www/vhosts/shira-test.com/public_html;
index index.php index.html index.htm;
access_log /var/log/nginx/shira-test.com_access.log main;
error_log /var/log/nginx/shira-test.com_error.log;
location / {
try_files $uri $uri/ /index.html?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass localhost:9000;
}
}
→ 独自ドメインのconfファイルであり、shira-test.comでホストします
また、リクエストの拡張子が.php であれば、localhost:9000 で立っている PHP-FPM用コンテナへプロキシします
./nginx/src/index.html
shira-test.com
→ NginxのPHPを経由しないindexファイルになります
./php-fpm/Dockerfile
FROM php:8.3-fpm RUN mkdir -p /var/www/vhosts/shira-test.com/public_html COPY ./app/info.php /var/www/vhosts/shira-test.com/public_html/info.php EXPOSE 9000
→ PHP-FPMコンテナを作成するDockerファイルです
ローカルのphpファイルをDockerコンテナ上にコピーし、9000番ポートを解放します
./php-fpm/app/info.php
<?php phpinfo(); ?>
→ phpinfoを出力するファイルです
デプロイ
・Dockerファイルのビルド
sh docker-image-build.sh
→ shira-test-k8s-nginx と shira-test-k8s-php-fpm のDockerイメージが作成されればOKです
・namespaceのデプロイ
kubectl apply -f ./k8s/namespace.yml
・deploymentのデプロイ
kubectl apply -f ./k8s/deployment.yml
・serviceのデプロイ
kubectl apply -f ./k8s/service.yml
→すべて created が出力されればOKです
・デプロイ確認
kubectl get pods -n shira-test
→下記のようにポッドが表示されればOKです
NAME READY STATUS RESTARTS AGE shira-test-5b9dd8d9d5-mtb9f 2/2 Running 0 3m35s
動作確認
※事前にローカルのhostsファイルにて名前解決の設定をしてください
127.0.0.1 shira-test.com
・ブラウザからアクセス(Nginxのindexを表示)
http://shira-test.com:30080/

→ 画面のようにNginxコンテナのindex.htmlの内容が表示されればOKです
・ブラウザからアクセス(phpinfoを表示)
http://shira-test.com:30080/info.php

→ 画面のようにphpinfoの内容が表示されればOKです
終わりに
いかがでしたでしょうか。
今回は独自ドメインでアクセスするための必要最低限のk8s構成でしたが、割とサクッと作れたような気がします。
もしここにパスパターンでのルーティングなどを設定したい場合は、すこし複雑なマニュフェストファイルを書く必要があるので、それはまた勉強したいと思います。
また、弊社では kubernetes の設計構築サービスもございますので、こちらも併せてぜひご確認ください。
Kubernetes(K8s)設計・構築・運用サービス
1