Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetes で構築する PHP 開発環境 / php-development-environment-on-kubernetes

shin1x1
December 01, 2019

Kubernetes で構築する PHP 開発環境 / php-development-environment-on-kubernetes

2019/12/01 PHP カンファレンス

shin1x1

December 01, 2019
Tweet

More Decks by shin1x1

Other Decks in Programming

Transcript

  1. Kubernetes
    で構築する
    PHP
    開発環境
    2019/12/01 PHP
    カンファレンス 2019
    @shin1x1

    View full-size slide

  2. Agenda
    Kubernetes
    基礎知識(開発環境用)
    PHP
    開発環境の構築
    CI
    環境の構築(CircleCI

    PHP
    開発環境に Kubernetes
    を選ぶか?
    2

    View full-size slide

  3. Kubernetes
    基礎知識
    (開発環境用)
    3

    View full-size slide

  4. 本発表について
    開発環境に限定した内容
    Mac
    等の開発 PC
    環境
    本番環境に k8s
    を利用する話ではない
    Kubernetes
    のみで構築
    Helm
    や Kustomise
    といったツールは利用しな

    サンプルコード
    https://github.com/shin1x1/laravel-k8s-dev-
    sample
    4

    View full-size slide

  5. Kubernetes (k8s)
    コンテナアプリケーションをいい感じに
    動作させる OSS
    ホストとは独立した環境
    デファクトとなりつつあるので、ノウハウや
    周辺ツールが豊富
    YAML! YAML! YAML!
    https://kubernetes.io
    5

    View full-size slide

  6. kubernetes
    実行環境
    実行環境が必要。開発 PC
    にインストール。
    Docker Desktop for Mac (
    旧: Docker for Mac)
    手軽にやるなら、これ
    minikube
    Kind
    などなど
    6

    View full-size slide

  7. Kubernetes Objects
    本セッションで利用するもの
    Pod
    Con gMap
    Service
    7

    View full-size slide

  8. Pod
    単一 or
    複数のコンテナをまとめたグループ
    アプリケーションの最小単位
    同じ Pod
    のコンテナは、localhost
    で通信できる
    ex) php Pod
    nginx
    コンテナ + php-fpm
    コンテナ
    8

    View full-size slide

  9. Pod
    apiVersion: v1
    kind: Pod
    metadata:
    name: sample-php # <--- Pod name
    spec:
    containers:
    - image: nginx:1.14 # <--- docker image
    name: nginx
    ports:
    - containerPort: 80 # expose port
    (snip)
    # docker image
    - image: shin1x1/php-dev:7.4.0-fpm-buster-pgsql
    name: php-fpm
    9

    View full-size slide

  10. Con gMap
    設定情報やファイルなどを格納
    Pod
    では、これを Volume
    としてマウントする
    ex) php-fpm Con gMap
    php-fpm.d/www.conf
    php.ini
    10

    View full-size slide

  11. Con gMap
    2
    つのファイルをデータとして保持している
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: sample-php-fpm
    data:
    php.ini: |
    ; timezone
    date.timezone = Asia/Tokyo
    (snip)
    www.conf: |
    [www]
    pm.status_path = /phpfpm_status
    11

    View full-size slide

  12. PHP
    の Pod
    で Volume
    としてアタッチして、
    volumes:
    - name: php-fpm-config
    configMap:
    name: sample-php-fpm
    volumeMounts
    でファイルシステムにマウントする
    volumeMounts:
    - mountPath: /usr/local/etc/php/conf.d/zzmyphp.ini
    subPath: php.ini
    name: php-fpm-config
    - mountPath: /usr/local/etc/php-fpm.d/zzmyphp-fpm.conf
    subPath: php-fpm.conf
    name: php-fpm-config
    12

    View full-size slide

  13. Service
    Pod
    で動くアプリケーションをサービスとして公開
    type: LoadBalancer
    を利用
    k8s
    クラスタ内では、サービス名で通信できる
    ホストからは、localhost
    で通信できる
    Docker Desktop for Mac
    の場合
    13

    View full-size slide

  14. Service
    k8s
    クラスタ内では、http://sample-php:8000/

    ホストからは http://localhost:8000/
    で通信
    apiVersion: v1
    kind: Service
    metadata:
    name: sample-php
    spec:
    type: LoadBalancer
    ports:
    - name: "8000"
    port: 8000 # expose port
    targetPort: 80 # pod port
    selector:
    app: sample
    role: web
    14

    View full-size slide

  15. PHP
    開発環境の構築
    15

    View full-size slide

  16. PHP
    開発環境のポイント
    設定ファイル
    ホストのソースコードをマウントして実行
    PhpStorm
    使いたい!
    Xdebug
    によるリモートデバッグ
    phpunit
    等の CLI
    実行
    17

    View full-size slide

  17. 設定ファイル
    データベースなどの連携する Service
    名を指定
    .env (Laravel)
    DB_HOST=sample-db
    phpunit.xml



    18

    View full-size slide

  18. ホストディレクトリのマウント
    Pod
    の Volume
    で hostPath
    を指定
    ホストのパスを直書きする必要がある
    volumes:
    - name: host
    hostPath:
    #
    マウントするホストのパスを指定
    path: /Users/hoge/path/to/projects
    19

    View full-size slide

  19. ホストディレクトリのマウント
    sed
    で置換 :thinking_face:
    $ sed "s#%HOST_PATH%#${PWD}#" \
    k8s/php.yaml.base > k8s/php.yaml
    20

    View full-size slide

  20. Xdebug
    によるリモートデバッグ
    xdebug.remote_host
    でホストを指定
    Docker Desktop
    なら docker.for.mac.localhost
    xdebug.remote_enable = On
    xdebug.remote_autostart = On
    xdebug.remote_connect_back = Off
    xdebug.remote_host = docker.for.mac.localhost
    docker-compose
    の環境構築と理屈は同じ
    21

    View full-size slide

  21. phpunit
    等の CLI
    実行
    kubectl exec
    で Pod
    内でコマンドを実行
    -c
    でコンテナを指定
    $ kubectl exec sample-php -c php-fpm \
    -- ./vendor/bin/phpunit
    PhpStorm
    連携は無いので、シェルで実行
    (これは地味に辛いところ)
    22

    View full-size slide

  22. Make le
    でまとめる
    make install
    で構築
    install: k8s-apply composer
    cp -a .env.example .env
    kubectl exec sample-php -c php-fpm -- ./artisan key:generate
    kubectl exec sample-php -c php-fpm -- ./artisan migrate
    kubectl exec sample-php -c php-fpm -- ./artisan db:seed
    .PHONY: install
    k8s-apply:
    sed "s#%HOST_PATH%#${PWD}#" k8s/php.yaml.base > k8s/php.yaml
    kubectl apply -f k8s/
    kubectl wait all -l app=sample --for condition=Ready --timeout
    composer:
    docker run --rm -v `pwd`:/opt -w /opt --entrypoint '' composer
    23

    View full-size slide

  23. CI
    環境の構築
    - CircleCI -
    25

    View full-size slide

  24. CI
    環境の構築 - CircleCI -
    2019/12
    現在、k8s
    実行環境の提供は無い
    各自で環境構築する必要がある
    Orbs
    にいくつか k8s
    関連はあるが、
    クライアントツール
    Kind
    で環境構築
    k8s in Docker
    https://kind.sigs.k8s.io
    26

    View full-size slide

  25. Kind
    のインストール
    .circleci/con g.yaml
    curl -Lo ./kind https://github.com/kubernetes-sigs/kind
    /releases/download/v0.5.1/kind-$(uname)-amd64
    chmod +x ./kind
    perl -pi -e "s#%HOST_PATH%#`pwd`#g" \
    .circleci/kind-config.yaml
    ./kind create cluster \
    --config .circleci/kind-config.yaml --wait 5m
    27

    View full-size slide

  26. Kind
    設定ファイル
    ホストファイルをマウントするために設定が必要
    下記の %HOST_PATH%
    をホストパスに置換する
    kind: Cluster
    apiVersion: kind.sigs.k8s.io/v1alpha3
    nodes:
    - role: control-plane
    extraMounts:
    - containerPath: %HOST_PATH%
    hostPath: %HOST_PATH%
    readOnly: false
    28

    View full-size slide

  27. CI
    環境の構築 - CircleCI
    kubectl
    は、Orbs
    にあるので、これでインストール
    orbs:
    kube-orb: circleci/[email protected]
    jobs:
    build:
    machine: true
    steps:
    - checkout
    - kube-orb/install-kubectl
    29

    View full-size slide

  28. CI
    環境の構築 - CircleCI
    k8s
    環境ができれば、あとは開発環境と同じ
    make install
    で環境構築して、
    実行テスト等も実行できる
    30

    View full-size slide

  29. 実行イメージ
    k8s
    環境構築に 2
    分ほどかかるのがネック
    CircleCI
    が環境を用意してくれることを期待
    GKE
    や EKS
    などを使う手も
    31

    View full-size slide

  30. PHP
    開発環境に
    Kubernetes
    を選ぶか?
    32

    View full-size slide

  31. docker-compose
    と比べると
    構築するのに手間がかかる
    docker-compose.yaml
    の方がかなり簡単
    k8s
    単体では、docker build
    もできない
    学習コストも高い
    PhpStorm
    連携が弱い(無い)
    PhpStorm
    から Pod
    内でコマンド実行できれば
    33

    View full-size slide

  32. 開発環境に k8s
    導入したいです!
    本番環境が k8s
    で無いなら、導入する必要は無い
    本番環境が k8s
    でも、よく考えて
    docker-compose
    じゃダメ?
    全員の PC
    で k8s
    動かすの?
    CI
    も k8s
    にするんだよ?
    34

    View full-size slide

  33. 現在取り組んでいるプロジェクト
    Helm / helm le
    を活用
    本番、検証、開発、CI
    環境を 1
    ソースで構築
    環境ごとの違いを吸収
    つまり複雑
    本番環境用のものを拡張して、開発環境を構築
    開発環境だけなら、もっとシンプルにできそう
    でも楽しい!
    35

    View full-size slide

  34. どうしても使いたい!使ってる!
    ぜひ情報交換させて下さいm(_ _)m
    36

    View full-size slide

  35. PHP
    開発環境に k8s
    を選ぶか?
    学習コストの割に得られるものがまだ少ない
    開発環境には焦って使わなくても良い
    docker-compose
    で十分
    以下のような場合ならあり
    k8s
    を学習したい
    docker-compose
    では複雑な構成
    k8s
    大好き
    ※2019/12/01
    現在
    37

    View full-size slide

  36. Q?
    @shin1x1
    38

    View full-size slide