SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
で を動かした話
藤田貴大
自己紹介

藤田貴大(@takfjt)



グリー株式会社Wright Flyer事業本部Game Publishing部Serverチーム

ゲームアプリのサーバエンジニアです



はじめてGKEでゲームサーバを構築

負荷試験とその対策などで携わる

今回は、負荷試験の際に見えてきた

Kubernetes上でPHPのサービスを動かしたときの躓き
を紹介したいと思います

はじめに

Kubernetesそのものの話はしません

PHP、コンテナ、Kubernetesに関する話は

ふんわりまざっています

厳密じゃないです

と、いうことで

「ホストのクラスターを横断してアプリケーションコンテ
ナを自動デプロイ、スケーリング、操作するためのプ
ラットフォーム」

「Kubernetes」(参照 2019-03-19) 『ウィキペディア日本語版』



Kubernetesとは

Apacheパラメータ未調整問題

なんか遅いなーと思って調べたらApacheの

パラメータに調整すべきところがいくつかあった



いままで、php.iniくらいまではインフラチームの担当範
囲だった

コンテナを導入すると、Dockerfileくらいまではゲーム
チームの担当範囲になる



→ chefなどからノウハウを回収

DNS Lookup溢れる問題

高負荷をかけるとDNS Lookupのエラーが頻発

kube-dnsのCPUが100%にはりついていた

Kubernetes DNS

service1 kube-system
DNS

kubernetes cluster
Cloud
SQL
Cloud
Spanner
Cloud
Memorystore
The Internet
かなり仕事が多い

service1 kube-system
DNS

kubernetes cluster
Cloud
SQL
Cloud
Spanner
Cloud
Memorystore
The Internet
クラスタ内の名前解決
Google Cloud内の
名前解決
インターネット側の
名前解決
PHPであることによる原因

Kubernetesであることによる原因

クラウドであることによる原因

実装による原因

複合的な原因

コネクションプールができない

実際には、PDOでも各種拡張モジュールでも

持続的接続の方法はけっこうあるが、

やったことがなかった

→ リクエスト毎にDNS Lookup



PHPであることによる原因

IPv6をdisableにするなど、OSのコアの設定に

手がだしにくい

使っていないAAAAレコードの問い合わせが多発

PHP(を含めて多くの言語)はOSがIPv6をenableにしてると

問い合わせに行く

dns_get_record関数ならAレコードだけ、みたいな制御は効くが、
ext/mysqliにホスト名を渡した時などは制御できない

Kubernetesであることによる原因

マネージドサービスを使うと、

基本、名前でエンドポイントが与えられる

RDB

memcached

redis

etc...

クラウドであることによる原因

テーブル毎に別コネクションになっている

ソーシャルゲームの事情で、DBをテーブルで

分割することがよくあり、このような実装

実装による原因

sidecarとしてdnsmasqを動かしておく

原因を1つずつつぶして行くのは厳しかった



解決案

Sidecar方式で解決

service1 kube-system
DNS

kubernetes cluster
Cloud
SQL
Cloud
Spanner
Cloud
Memorystore
The Internet
DNS
DNS
DNS
DNS
ご存じの方は、この図だとDaemonSet?って
思うかもしれませんが、実際にはsidecar方式で
解決しました
うまい図が浮かばなくてこうなっています。すいません
「みんなのDocker/Kubernetes」にDaemonSetでやってると書いてあっ
たのですけど、どうやったらできるか知っている人がいたら教えてくだ
さい

だが...

dnsmasq先に死ぬ問題

デプロイ時など、コンテナのシャットダウンが

一斉に開始

httpのコネクションが無くなるまで待機

実際はまだdnsmasqが立ち上がっていない問題もあっ
た

apacheの起動を53番が開くまで待つ対応も入れた

ついでに宣伝

https://github.com/gree/php-custom-environment-v
ariables

連想配列の特定の値を、環境変数をつかって変更で
きる

コンテナは環境変数で設定したいことが多い

getenvだとyamlとかjsonでつらい




Contenu connexe

Tendances

Tendances (20)

TB / Day規模のゲーム向けデータパイプラインを開発運用する日々
TB / Day規模のゲーム向けデータパイプラインを開発運用する日々TB / Day規模のゲーム向けデータパイプラインを開発運用する日々
TB / Day規模のゲーム向けデータパイプラインを開発運用する日々
 
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
 
[GREE Tech Talk #07] Unityカジュアルゲーム・ケーススタディ
[GREE Tech Talk #07] Unityカジュアルゲーム・ケーススタディ[GREE Tech Talk #07] Unityカジュアルゲーム・ケーススタディ
[GREE Tech Talk #07] Unityカジュアルゲーム・ケーススタディ
 
これからのインフラエンジニアについて考えていること
これからのインフラエンジニアについて考えていることこれからのインフラエンジニアについて考えていること
これからのインフラエンジニアについて考えていること
 
インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
インフラ構築とテストについて(ITインフラ業務自動化現状確認会)インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
 
RPKIやってみませんか?
RPKIやってみませんか?RPKIやってみませんか?
RPKIやってみませんか?
 
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
 
Jupyterカーネルを魔改造した話
Jupyterカーネルを魔改造した話Jupyterカーネルを魔改造した話
Jupyterカーネルを魔改造した話
 
改めてPaaSについて考えてみる
改めてPaaSについて考えてみる改めてPaaSについて考えてみる
改めてPaaSについて考えてみる
 
GCP vs 他社クラウド
GCP vs 他社クラウドGCP vs 他社クラウド
GCP vs 他社クラウド
 
CloudFoundryをつかってみよう
CloudFoundryをつかってみようCloudFoundryをつかってみよう
CloudFoundryをつかってみよう
 
実践 自動復旧
実践 自動復旧実践 自動復旧
実践 自動復旧
 
ターン制コマンドバトルにおける強化学習効率化
ターン制コマンドバトルにおける強化学習効率化ターン制コマンドバトルにおける強化学習効率化
ターン制コマンドバトルにおける強化学習効率化
 
社内サービスのUI改善
社内サービスのUI改善社内サービスのUI改善
社内サービスのUI改善
 
PHP Version Up と AWS への移行
PHP Version Up と AWS への移行PHP Version Up と AWS への移行
PHP Version Up と AWS への移行
 
プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~
プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~
プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~
 
REALITY低遅延モード配信を支えるリアルタイムサーバとデータパイプライン
REALITY低遅延モード配信を支えるリアルタイムサーバとデータパイプラインREALITY低遅延モード配信を支えるリアルタイムサーバとデータパイプライン
REALITY低遅延モード配信を支えるリアルタイムサーバとデータパイプライン
 
OSS強化学習フレームワークの比較
OSS強化学習フレームワークの比較OSS強化学習フレームワークの比較
OSS強化学習フレームワークの比較
 
知って欲しいPaaSの話
知って欲しいPaaSの話知って欲しいPaaSの話
知って欲しいPaaSの話
 
【Unite Tokyo 2019】AWS for Unity Developers
【Unite Tokyo 2019】AWS for Unity Developers【Unite Tokyo 2019】AWS for Unity Developers
【Unite Tokyo 2019】AWS for Unity Developers
 

Similaire à KubernetesでPHPを動かした話

PostgreSQL on Amazon EC2の可能性
PostgreSQL on Amazon EC2の可能性PostgreSQL on Amazon EC2の可能性
PostgreSQL on Amazon EC2の可能性
Serverworks Co.,Ltd.
 

Similaire à KubernetesでPHPを動かした話 (20)

あるあるLT〜サーバーサイドエンジニア〜 Vol.3
あるあるLT〜サーバーサイドエンジニア〜 Vol.3あるあるLT〜サーバーサイドエンジニア〜 Vol.3
あるあるLT〜サーバーサイドエンジニア〜 Vol.3
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介
 
ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入
 
[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005
 
Phpでrest apiを作った話
Phpでrest apiを作った話Phpでrest apiを作った話
Phpでrest apiを作った話
 
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方
 
ZappaでDBもパッケージしたサーバーレスAPIを構築してみた
ZappaでDBもパッケージしたサーバーレスAPIを構築してみたZappaでDBもパッケージしたサーバーレスAPIを構築してみた
ZappaでDBもパッケージしたサーバーレスAPIを構築してみた
 
Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用
 
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
 
キャバァーン! サツバツエアアイオー弐〇壱弐
キャバァーン! サツバツエアアイオー弐〇壱弐キャバァーン! サツバツエアアイオー弐〇壱弐
キャバァーン! サツバツエアアイオー弐〇壱弐
 
PostgreSQL on Amazon EC2の可能性
PostgreSQL on Amazon EC2の可能性PostgreSQL on Amazon EC2の可能性
PostgreSQL on Amazon EC2の可能性
 
Rancher2.0で実現する Managed Kubernetes Service
Rancher2.0で実現する Managed Kubernetes ServiceRancher2.0で実現する Managed Kubernetes Service
Rancher2.0で実現する Managed Kubernetes Service
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
 
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab Contents
 
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
 

Plus de gree_tech

Plus de gree_tech (20)

アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
 
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
 
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
 
長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化
 
Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介
 
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
 
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてSINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
 
海外展開と負荷試験
海外展開と負荷試験海外展開と負荷試験
海外展開と負荷試験
 
翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み
 
組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い
 
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
 
データエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてデータエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件について
 
シェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーシェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジー
 
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
 
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)
 
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
 
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
 
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-
 

KubernetesでPHPを動かした話