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

Ca17a082a30f4cbfed1d0a6dacbe3af2?s=47 shin1x1
December 01, 2019

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

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

Ca17a082a30f4cbfed1d0a6dacbe3af2?s=128

shin1x1

December 01, 2019
Tweet

Transcript

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

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

    Kubernetes を選ぶか? 2
  3. Kubernetes 基礎知識 (開発環境用) 3

  4. 本発表について 開発環境に限定した内容 Mac 等の開発 PC 環境 本番環境に k8s を利用する話ではない Kubernetes

    のみで構築 Helm や Kustomise といったツールは利用しな い サンプルコード https://github.com/shin1x1/laravel-k8s-dev- sample 4
  5. Kubernetes (k8s) コンテナアプリケーションをいい感じに 動作させる OSS ホストとは独立した環境 デファクトとなりつつあるので、ノウハウや 周辺ツールが豊富 YAML! YAML!

    YAML! https://kubernetes.io 5
  6. kubernetes 実行環境 実行環境が必要。開発 PC にインストール。 Docker Desktop for Mac (

    旧: Docker for Mac) 手軽にやるなら、これ minikube Kind などなど 6
  7. Kubernetes Objects 本セッションで利用するもの Pod Con gMap Service 7

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

    php Pod nginx コンテナ + php-fpm コンテナ 8
  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
  10. Con gMap 設定情報やファイルなどを格納 Pod では、これを Volume としてマウントする ex) php-fpm Con

    gMap php-fpm.d/www.conf php.ini 10
  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
  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
  13. Service Pod で動くアプリケーションをサービスとして公開 type: LoadBalancer を利用 k8s クラスタ内では、サービス名で通信できる ホストからは、localhost で通信できる

    Docker Desktop for Mac の場合 13
  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
  15. PHP 開発環境の構築 15

  16. 16

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

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

    name="DB_HOST" value="sample-db-test"/> </php> 18
  19. ホストディレクトリのマウント Pod の Volume で hostPath を指定 ホストのパスを直書きする必要がある volumes: -

    name: host hostPath: # マウントするホストのパスを指定 path: /Users/hoge/path/to/projects 19
  20. ホストディレクトリのマウント sed で置換 :thinking_face: $ sed "s#%HOST_PATH%#${PWD}#" \ k8s/php.yaml.base >

    k8s/php.yaml 20
  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
  22. phpunit 等の CLI 実行 kubectl exec で Pod 内でコマンドを実行 -c

    でコンテナを指定 $ kubectl exec sample-php -c php-fpm \ -- ./vendor/bin/phpunit PhpStorm 連携は無いので、シェルで実行 (これは地味に辛いところ) 22
  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
  24. demo 24

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

  26. CI 環境の構築 - CircleCI - 2019/12 現在、k8s 実行環境の提供は無い 各自で環境構築する必要がある Orbs

    にいくつか k8s 関連はあるが、 クライアントツール Kind で環境構築 k8s in Docker https://kind.sigs.k8s.io 26
  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
  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
  29. CI 環境の構築 - CircleCI kubectl は、Orbs にあるので、これでインストール orbs: kube-orb: circleci/kubernetes@0.10.1

    jobs: build: machine: true steps: - checkout - kube-orb/install-kubectl 29
  30. CI 環境の構築 - CircleCI k8s 環境ができれば、あとは開発環境と同じ make install で環境構築して、 実行テスト等も実行できる

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

    などを使う手も 31
  32. PHP 開発環境に Kubernetes を選ぶか? 32

  33. docker-compose と比べると 構築するのに手間がかかる docker-compose.yaml の方がかなり簡単 k8s 単体では、docker build もできない 学習コストも高い

    PhpStorm 連携が弱い(無い) PhpStorm から Pod 内でコマンド実行できれば 33
  34. 開発環境に k8s 導入したいです! 本番環境が k8s で無いなら、導入する必要は無い 本番環境が k8s でも、よく考えて docker-compose

    じゃダメ? 全員の PC で k8s 動かすの? CI も k8s にするんだよ? 34
  35. 現在取り組んでいるプロジェクト Helm / helm le を活用 本番、検証、開発、CI 環境を 1 ソースで構築

    環境ごとの違いを吸収 つまり複雑 本番環境用のものを拡張して、開発環境を構築 開発環境だけなら、もっとシンプルにできそう でも楽しい! 35
  36. どうしても使いたい!使ってる! ぜひ情報交換させて下さいm(_ _)m 36

  37. PHP 開発環境に k8s を選ぶか? 学習コストの割に得られるものがまだ少ない 開発環境には焦って使わなくても良い docker-compose で十分 以下のような場合ならあり k8s

    を学習したい docker-compose では複雑な構成 k8s 大好き ※2019/12/01 現在 37
  38. Q? @shin1x1 38