LaravelAppをK8sでデプロイ(構成紹介)

kubernetes

全体図

まずは、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内部だけで通信させたい。

よって、必要なものは以下になります。

  1. ConfigMapを作る
  2. nginx:8080とphp-fpm:9000を束ねたAppPod
  3. AppPodを公開するServiceを作成し、TargetPortをNginxの8080番に向ける
  4. mysql用にpersistentVolumeを作る
  5. mysqlコンテナを保持するDBPod
  6. DBPodを3306番でCluseter内部で公開するClusterIPServiec

基本はこれだけです。

nginxとphp-fpmの通信はnginxの設定ファイルで設定するのでServiceによる連携は不要です。

まとめ

複雑そうに見えることも、分解をすれば一つ一つは単純です。

個人的に分解のポイントだなと思うのは、冗長化したい単位だと思います。

たとえば今回の例だと、nginxとphp-fpmはワンセットで分身させたい。

ということはpodはそれぞれに分離するのではなくて、一つにまとめたほうが良いという考え方になります。

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