Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Kubernetes で構築する PHP 開発環境 / php-development-environment-on-kubernetes
shin1x1
PRO
December 01, 2019
Programming
3
3.5k
Kubernetes で構築する PHP 開発環境 / php-development-environment-on-kubernetes
2019/12/01 PHP カンファレンス
shin1x1
PRO
December 01, 2019
Tweet
Share
More Decks by shin1x1
See All by shin1x1
Apple Silicon Mac 時代の PHP 開発環境構築 2021 / php-dev-env-on-m1-mac-era
shin1x1
PRO
2
3.4k
Docker イメージのマルチアーキテクチャビルド / docker-muti-arch-build
shin1x1
PRO
1
160
Domain modeling with PHP / domain-modeling-with-php-en
shin1x1
PRO
0
50
ドメインをモデリングしてPHPコードに落とし込む / domain-modeling-with-php8
shin1x1
PRO
13
5.1k
PHP 8 で作る JSON パーサ / php8-json-parser
shin1x1
PRO
1
1.9k
独立したコアレイヤパターンの適用 - fortee 編 - / fortee-meets-independent-core-layer-pattern
shin1x1
PRO
0
2.3k
フレームワークとの付き合い方 / how-to-use-framework
shin1x1
PRO
2
4.1k
明日から使えるアーキテクチャ 独立したコアレイヤパターン / independent-core-layer-pattern-phpconsen2019
shin1x1
PRO
2
5.1k
独立したコアレイヤパターンによる PHP アプリケーションの実装 / phpcon2018-independent-core-layer-pattern
shin1x1
PRO
5
5.3k
Other Decks in Programming
See All in Programming
SRE NEXT 2022に学ぶこれからのSREキャリア
fukubaka0825
2
400
kintone × LINE Bot で餃子検定Botを作った話
naberina
0
340
Records の使い方はこれでいいの? をみんなで考えたい / Java DO #20
gishi_yama
0
130
ストア評価「2.4」だったCOCOARアプリを1年で「4.4」になんとかした方法@Cloud CIRCUS Meetup #2
1901drama
0
180
Introduction to Property-Based Testing @ COSCUP 2022
cybai
1
150
Untangling Coroutine Testing (Droidcon Berlin 2022)
zsmb
2
490
それ全部エラーメッセージに書いてあるよ!〜独学でPHPプログラミングが上達するたった一つの方法〜
77web
1
160
SGGとは
inoue2002
0
440
How to Test Your Compose UI (Droidcon Berlin 2022)
stewemetal
1
130
Getting Started With Data Structures
adoranwodo
1
270
Atomic Design とテストの○○な話
takfjp
2
820
レビュー駆動学習のススメ_StaPy#83
soogie
0
320
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
310
34k
The Mythical Team-Month
searls
210
39k
Teambox: Starting and Learning
jrom
123
7.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
239
11k
Building Applications with DynamoDB
mza
84
4.8k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
212
20k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
Six Lessons from altMBA
skipperchong
14
1.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
655
120k
Optimizing for Happiness
mojombo
364
64k
Fireside Chat
paigeccino
13
1.4k
How GitHub Uses GitHub to Build GitHub
holman
465
280k
Transcript
Kubernetes で構築する PHP 開発環境 2019/12/01 PHP カンファレンス 2019 @shin1x1
Agenda Kubernetes 基礎知識(開発環境用) PHP 開発環境の構築 CI 環境の構築(CircleCI ) PHP 開発環境に
Kubernetes を選ぶか? 2
Kubernetes 基礎知識 (開発環境用) 3
本発表について 開発環境に限定した内容 Mac 等の開発 PC 環境 本番環境に k8s を利用する話ではない Kubernetes
のみで構築 Helm や Kustomise といったツールは利用しな い サンプルコード https://github.com/shin1x1/laravel-k8s-dev- sample 4
Kubernetes (k8s) コンテナアプリケーションをいい感じに 動作させる OSS ホストとは独立した環境 デファクトとなりつつあるので、ノウハウや 周辺ツールが豊富 YAML! YAML!
YAML! https://kubernetes.io 5
kubernetes 実行環境 実行環境が必要。開発 PC にインストール。 Docker Desktop for Mac (
旧: Docker for Mac) 手軽にやるなら、これ minikube Kind などなど 6
Kubernetes Objects 本セッションで利用するもの Pod Con gMap Service 7
Pod 単一 or 複数のコンテナをまとめたグループ アプリケーションの最小単位 同じ Pod のコンテナは、localhost で通信できる ex)
php Pod nginx コンテナ + php-fpm コンテナ 8
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
Con gMap 設定情報やファイルなどを格納 Pod では、これを Volume としてマウントする ex) php-fpm Con
gMap php-fpm.d/www.conf php.ini 10
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
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
Service Pod で動くアプリケーションをサービスとして公開 type: LoadBalancer を利用 k8s クラスタ内では、サービス名で通信できる ホストからは、localhost で通信できる
Docker Desktop for Mac の場合 13
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
PHP 開発環境の構築 15
16
PHP 開発環境のポイント 設定ファイル ホストのソースコードをマウントして実行 PhpStorm 使いたい! Xdebug によるリモートデバッグ phpunit 等の
CLI 実行 17
設定ファイル データベースなどの連携する Service 名を指定 .env (Laravel) DB_HOST=sample-db phpunit.xml <php> <env
name="DB_HOST" value="sample-db-test"/> </php> 18
ホストディレクトリのマウント Pod の Volume で hostPath を指定 ホストのパスを直書きする必要がある volumes: -
name: host hostPath: # マウントするホストのパスを指定 path: /Users/hoge/path/to/projects 19
ホストディレクトリのマウント sed で置換 :thinking_face: $ sed "s#%HOST_PATH%#${PWD}#" \ k8s/php.yaml.base >
k8s/php.yaml 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
phpunit 等の CLI 実行 kubectl exec で Pod 内でコマンドを実行 -c
でコンテナを指定 $ kubectl exec sample-php -c php-fpm \ -- ./vendor/bin/phpunit PhpStorm 連携は無いので、シェルで実行 (これは地味に辛いところ) 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
demo 24
CI 環境の構築 - CircleCI - 25
CI 環境の構築 - CircleCI - 2019/12 現在、k8s 実行環境の提供は無い 各自で環境構築する必要がある Orbs
にいくつか k8s 関連はあるが、 クライアントツール Kind で環境構築 k8s in Docker https://kind.sigs.k8s.io 26
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
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
CI 環境の構築 - CircleCI kubectl は、Orbs にあるので、これでインストール orbs: kube-orb: circleci/kubernetes@0.10.1
jobs: build: machine: true steps: - checkout - kube-orb/install-kubectl 29
CI 環境の構築 - CircleCI k8s 環境ができれば、あとは開発環境と同じ make install で環境構築して、 実行テスト等も実行できる
30
実行イメージ k8s 環境構築に 2 分ほどかかるのがネック CircleCI が環境を用意してくれることを期待 GKE や EKS
などを使う手も 31
PHP 開発環境に Kubernetes を選ぶか? 32
docker-compose と比べると 構築するのに手間がかかる docker-compose.yaml の方がかなり簡単 k8s 単体では、docker build もできない 学習コストも高い
PhpStorm 連携が弱い(無い) PhpStorm から Pod 内でコマンド実行できれば 33
開発環境に k8s 導入したいです! 本番環境が k8s で無いなら、導入する必要は無い 本番環境が k8s でも、よく考えて docker-compose
じゃダメ? 全員の PC で k8s 動かすの? CI も k8s にするんだよ? 34
現在取り組んでいるプロジェクト Helm / helm le を活用 本番、検証、開発、CI 環境を 1 ソースで構築
環境ごとの違いを吸収 つまり複雑 本番環境用のものを拡張して、開発環境を構築 開発環境だけなら、もっとシンプルにできそう でも楽しい! 35
どうしても使いたい!使ってる! ぜひ情報交換させて下さいm(_ _)m 36
PHP 開発環境に k8s を選ぶか? 学習コストの割に得られるものがまだ少ない 開発環境には焦って使わなくても良い docker-compose で十分 以下のような場合ならあり k8s
を学習したい docker-compose では複雑な構成 k8s 大好き ※2019/12/01 現在 37
Q? @shin1x1 38