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 Slide

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

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

    View Slide

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

    View Slide

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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. Pod
    apiVersion: v1
    kind: Pod
    metadata:
    name: sample-php # spec:
    containers:
    - image: nginx:1.14 # 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 Slide

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

    View 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 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 Slide

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

    View 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 Slide

  15. PHP
    開発環境の構築
    15

    View Slide

  16. 16

    View Slide

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

    View Slide

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



    18

    View Slide

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

    View Slide

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

    View Slide

  21. 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 Slide

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

    View Slide

  23. 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 Slide

  24. demo
    24

    View Slide

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

    View Slide

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

    View Slide

  27. 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 Slide

  28. 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  38. Q?
    @shin1x1
    38

    View Slide