で を動かした話
藤田貴大
自己紹介

藤田貴大(@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でつらい




KubernetesでPHPを動かした話