全体図
まずは、k8sに入る前に、どういったDockerコンテナ構造になっているかを理解する必要があります。
よくありがちな、laravelを動かすためのdocker-composeスキームです。
nginxで外部に対して80番と443番のポートを開き、静的ファイルのレスポンスはnginxに任せ、動的処理に関わる部分をfcgiでtcp:9000でphp-fpmコンテナと通信しレスポンスを得て、クライアントにレスポンスを返答。
永続データにはmysqlコンテナを使用し、php-fpmコンテナと3306番ポートで連絡。
以下は、これらを構成するためのdocker-compose.ymlファイルになります。
version: '3.7'
services:
laravel-study:
container_name: laravel-study
build:
context: .
dockerfile: Dockerfile.php
volumes:
- ./laravel:/var/www
networks:
- laravel_study-network
nginx-study:
image: nginx
container_name: nginx-study
ports:
- 80:80
- 443:443
volumes:
- ./laravel:/var/www
- ./nginx_conf/default.conf:/etc/nginx/conf.d/default.conf
- ./cert-key:/etc/nginx/ssl
depends_on:
- laravel-study
networks:
- laravel_study-network
study-db:
image: mysql:5.7
container_name: study-db
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: database
MYSQL_USER: docker
MYSQL_PASSWORD: docker
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- study_mysql_volume:/var/lib/mysql
ports:
- 4306:3306
networks:
- laravel_study-network
networks:
laravel_study-network:
driver: bridge
volumes:
study_mysql_volume:
driver: local
以上のことからk8sデプロイでやるべきベースタスク
上記の図とyamlファイルからわかるように、必要なコンテナは3つあり、nginxをクラスター外にexposeし、php-fpmとmysqlコンテナについてはcluster内部だけで通信させたい。
よって、必要なものは以下になります。
- ConfigMapを作る
- nginx:8080とphp-fpm:9000を束ねたAppPod
- AppPodを公開するServiceを作成し、TargetPortをNginxの8080番に向ける
- mysql用にpersistentVolumeを作る
- mysqlコンテナを保持するDBPod
- DBPodを3306番でCluseter内部で公開するClusterIPServiec
基本はこれだけです。
nginxとphp-fpmの通信はnginxの設定ファイルで設定するのでServiceによる連携は不要です。
まとめ
複雑そうに見えることも、分解をすれば一つ一つは単純です。
個人的に分解のポイントだなと思うのは、冗長化したい単位だと思います。
たとえば今回の例だと、nginxとphp-fpmはワンセットで分身させたい。
ということはpodはそれぞれに分離するのではなくて、一つにまとめたほうが良いという考え方になります。