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

お世話になっております。

筋トレによる体の肥大化を止めることができないシステムソリューション部の shirasaka です。
ところで皆さま Kubernetes(K8s) は利用してますでしょうか?
なんとなく便利そうだけど、なんとなく難しそうなイメージがありますよね、、、
かくいく私もがっつり触る機会があまりなく、触るたびに難しいと感じていたので、これを機に勉強してみました。

作ってみた構成と要件は下記となり、割とよく見るかなと思います。

  1. Nginx + PHP-FPM 構成
  2. 拡張子が .php ファイルであれば、Nginx → PHP-FPMコンテナへローカルプロキシ
  3. 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
読み込み中...
1 票, 平均: 1.00 / 11
14
X facebook はてなブックマーク pocket

この記事をかいた人

About the author

shirasaka

システムソリューション部所属の筋フラエンジニアです
ホームトレーニーで好きな種目はデッドリフトです
最近のマイブームはちくわを食べてたんぱく質を補給することです