Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Agenda Kubernetes 基礎知識(開発環境用) PHP 開発環境の構築 CI 環境の構築(CircleCI ) PHP 開発環境に Kubernetes を選ぶか? 2

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

本発表について 開発環境に限定した内容 Mac 等の開発 PC 環境 本番環境に k8s を利用する話ではない Kubernetes のみで構築 Helm や Kustomise といったツールは利用しな い サンプルコード https://github.com/shin1x1/laravel-k8s-dev- sample 4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

PHP 開発環境の構築 15

Slide 16

Slide 16 text

16

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

demo 24

Slide 25

Slide 25 text

CI 環境の構築 - CircleCI - 25

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Q? @shin1x1 38