K8s 上で laravel を 快適に運用する方法
by
COLOPL Inc.
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
K8s 上で laravel を 快適に 運用する方法 尾山貴康 2023年9月27日 (水) 1
Slide 2
Slide 2 text
氏名 : 部署 : 自己紹介 尾山 貴康 2 ● コロプラ(8年目) ● 日々の業務 ○ 社内ライブラリのメンテ ○ OSSへのコントリビュート ○ コンテナのチューニング 技術基盤本部 第3バックエンドエンジニア部 サーバー基盤グループ PEチーム
Slide 3
Slide 3 text
基盤開発チームではゲーム開発側に極力ゲームのロジックに 集中してもらえるように様々なをサポートしています ● 大規模なトラフィックに耐えられる設計の検証と実装 ● 共通処理や便利機能などのライブラリー化 ● バージョンアップのフォロー ● 共通コンテナや Kubernetes 設定の整備 3
Slide 4
Slide 4 text
目次 4 ● Kubernetes で使用しているPHPコンテナの紹介 ● アプリに入れている Kubernetes 向けの工夫
Slide 5
Slide 5 text
社内専用のPHPコンテナ ● Alpine Linux ベースのコンテナにゲーム開発に必要なものを詰め込んだもの ● プロジェクト側ではこのイメージをベースに固有のものをいれていく ● 簡単に拡張したり調整できるような工夫が入っている ● そのなかでも特徴的なものを5つ紹介 5
Slide 6
Slide 6 text
自社コンテナの特徴1 ● docker-php-ext-install の pecl 版 ● pecl install の代わりにこれを使う ● pecl install との違い ○ インストールオプションが渡せる ■ redis の --enable-redis-igbinary など ○ バイナリのデバッグシンボルを strip する ■ grpc などは 140MB → 7MB docker-php-pecl-install というスクリプトの追加 6
Slide 7
Slide 7 text
自社コンテナの特徴2 PHP の設定ファイル (.ini) の一部を環境変数で指定可能にしている opcache.validate_timestamps=${PHP_OPCACHE_VALIDATE_TIMESTAMP} FROM colopl/php:latest AS local-build ENV PHP_OPCACHE_VALIDATE_TIMESTAMP=on ローカルでは validate_timestamps を on それ以外は off など簡単に切り替え可能 opcache.ini Dockerfile 7 余談)PHP 8.3 からはデフォルトフォールバックも使えるらしい opcache.validate_timestamps=${PHP_OPCACHE_VALIDATE_TIMESTAMP:-off}
Slide 8
Slide 8 text
自社コンテナの特徴 3 ● ENTRYPOINT に docker-entrypoint.sh を登録する ● /etc/entrypoint.d というパスにある スクリプトを上から順番に実行するスクリプト ● ENTRYPOINT を上書きせずに処理を追加できるので便利 ● nginx のオフィシャルコンテナのを参考にした ※ K8s の preStop 時に同じことをする docker-exitpoint.sh も配置しています entrypoint.d によるマルチステップな起動 8
Slide 9
Slide 9 text
自社コンテナの特徴 4 ● ヘルスチェック系 ● メトリクス系 Kubernetes で必要なエンドポイントを追加している 9
Slide 10
Slide 10 text
自社コンテナの特徴 4 ヘルスチェック系 /var/www/readyz.php if (@file_exists('/run/nginx.health') === false) { header('HTTP/1.1 404 Not Found'); } touch /run/nginx.health /etc/entrypoint.d/99-ready.sh 10 ● livez ● readyz readyz の仕組み
Slide 11
Slide 11 text
● 以下をデフォルトで提供 ○ nginx ○ php-fpm / opcache / apcu 自社コンテナの特徴 4 メトリクス系 11
Slide 12
Slide 12 text
● メトリクス取得フロー ○ /metrics を叩く ○ /var/www/metrics/all.php が実行される ○ /var/www/metrics 配下の php ファイルが include される ● 独自のメトリクスを追加したかったら /var/www/metrics に php ファイルを追加するだけでOK 自社コンテナの特徴 4 メトリクスも拡張可能 12
Slide 13
Slide 13 text
自社コンテナの特徴 5 13 Supervisor を使って複数のプロセスを管理 ● アプリの役割に応じて 起動したいものを /etc/supervisor.d に追加 ● デフォルトでは nginx / php-fpm を起動 ● G社的にはアンチパターンらしい1 ● Docker 社は推奨している2 ● G社の言いたいことはわかるが 利便性&パフォーマンス優先 1. https://cloud.google.com/architecture/best-practices-for-building-containers#package_a_single_app_per_container 2. https://docs.docker.com/config/containers/multi-service_container
Slide 14
Slide 14 text
アプリ側に入れている工夫 1 Server Roles ● バックエンドアプリの役割は API への Request 処理だけではない ○ キューの処理 / バッチ処理 / 管理ツール など ● 同じコードをデプロイするが役割によって起動するものが違う ○ キューワーカー → php artisan queue:work ○ バッチ処理 → supercronic (cron) 14
Slide 15
Slide 15 text
Server Roles ● 弊社では役割を環境変数に定義しコンテナ内で区別できるようにしている ○ ROLES=[cron,queue] ● 具体的には各役割毎に K8s の Deployment 定義を分けている ○ app, queue, cron, tool, etc... ● Deployment に ROLES を定義してコンテナに渡す アプリ側に入れている工夫 1 15
Slide 16
Slide 16 text
Server Roles 活用例 ● Role が cron の時だけ supercronic を supervisor に登録 ● Role が queue の時だけ artisan queue:work を supervisor に登録 ● Role が tool の時だけ管理ツール用の route を出力 アプリ側に入れている工夫 1 16
Slide 17
Slide 17 text
アプリ側に入れている工夫 2 app:prepare コマンド 17 使い方 ● entrypoint.d に app:prepare を呼び出すスクリプトを追加しておく ● プロジェクト側でApplicationPreparing にフックして起動時に実行したい 処理を追加する container 起動時に app:prepare というコマンドが実行される app:prepare コマンドとは? ● ApplicationPreparing というイベントを発行するだけのコマンド
Slide 18
Slide 18 text
アプリ側に入れている工夫 2 app:prepare コマンド 18 ApplicationPreparing イベントで行っていることの一例 ● Twemproxy (sidecar) の疎通待ち ● Cloud Spanner のコネクションプールの初期化 ※ app:shutdown もある
Slide 19
Slide 19 text
19 Fin