Slide 1

Slide 1 text

で を動かした話 藤田貴大

Slide 2

Slide 2 text

自己紹介
 藤田貴大(@takfjt)
 
 グリー株式会社Wright Flyer事業本部Game Publishing部Serverチーム
 ゲームアプリのサーバエンジニアです
 


Slide 3

Slide 3 text

はじめてGKEでゲームサーバを構築
 負荷試験とその対策などで携わる
 今回は、負荷試験の際に見えてきた
 Kubernetes上でPHPのサービスを動かしたときの躓き を紹介したいと思います
 はじめに


Slide 4

Slide 4 text

Kubernetesそのものの話はしません
 PHP、コンテナ、Kubernetesに関する話は
 ふんわりまざっています
 厳密じゃないです
 と、いうことで


Slide 5

Slide 5 text

「ホストのクラスターを横断してアプリケーションコンテ ナを自動デプロイ、スケーリング、操作するためのプ ラットフォーム」
 「Kubernetes」(参照 2019-03-19) 『ウィキペディア日本語版』
 
 Kubernetesとは


Slide 6

Slide 6 text

Apacheパラメータ未調整問題


Slide 7

Slide 7 text

なんか遅いなーと思って調べたらApacheの
 パラメータに調整すべきところがいくつかあった
 


Slide 8

Slide 8 text

いままで、php.iniくらいまではインフラチームの担当範 囲だった
 コンテナを導入すると、Dockerfileくらいまではゲーム チームの担当範囲になる
 
 → chefなどからノウハウを回収


Slide 9

Slide 9 text

DNS Lookup溢れる問題


Slide 10

Slide 10 text

高負荷をかけるとDNS Lookupのエラーが頻発
 kube-dnsのCPUが100%にはりついていた


Slide 11

Slide 11 text

Kubernetes DNS
 service1 kube-system DNS
 kubernetes cluster Cloud SQL Cloud Spanner Cloud Memorystore The Internet

Slide 12

Slide 12 text

かなり仕事が多い
 service1 kube-system DNS
 kubernetes cluster Cloud SQL Cloud Spanner Cloud Memorystore The Internet クラスタ内の名前解決 Google Cloud内の 名前解決 インターネット側の 名前解決

Slide 13

Slide 13 text

PHPであることによる原因
 Kubernetesであることによる原因
 クラウドであることによる原因
 実装による原因
 複合的な原因


Slide 14

Slide 14 text

コネクションプールができない
 実際には、PDOでも各種拡張モジュールでも
 持続的接続の方法はけっこうあるが、
 やったことがなかった
 → リクエスト毎にDNS Lookup
 
 PHPであることによる原因


Slide 15

Slide 15 text

IPv6をdisableにするなど、OSのコアの設定に
 手がだしにくい
 使っていないAAAAレコードの問い合わせが多発
 PHP(を含めて多くの言語)はOSがIPv6をenableにしてると
 問い合わせに行く
 dns_get_record関数ならAレコードだけ、みたいな制御は効くが、 ext/mysqliにホスト名を渡した時などは制御できない
 Kubernetesであることによる原因


Slide 16

Slide 16 text

マネージドサービスを使うと、
 基本、名前でエンドポイントが与えられる
 RDB
 memcached
 redis
 etc...
 クラウドであることによる原因


Slide 17

Slide 17 text

テーブル毎に別コネクションになっている
 ソーシャルゲームの事情で、DBをテーブルで
 分割することがよくあり、このような実装
 実装による原因


Slide 18

Slide 18 text

sidecarとしてdnsmasqを動かしておく
 原因を1つずつつぶして行くのは厳しかった
 
 解決案


Slide 19

Slide 19 text

Sidecar方式で解決
 service1 kube-system DNS
 kubernetes cluster Cloud SQL Cloud Spanner Cloud Memorystore The Internet DNS DNS DNS DNS ご存じの方は、この図だとDaemonSet?って 思うかもしれませんが、実際にはsidecar方式で 解決しました うまい図が浮かばなくてこうなっています。すいません

Slide 20

Slide 20 text

「みんなのDocker/Kubernetes」にDaemonSetでやってると書いてあっ たのですけど、どうやったらできるか知っている人がいたら教えてくだ さい


Slide 21

Slide 21 text

だが...


Slide 22

Slide 22 text

dnsmasq先に死ぬ問題


Slide 23

Slide 23 text

デプロイ時など、コンテナのシャットダウンが
 一斉に開始
 httpのコネクションが無くなるまで待機
 実際はまだdnsmasqが立ち上がっていない問題もあっ た
 apacheの起動を53番が開くまで待つ対応も入れた


Slide 24

Slide 24 text

ついでに宣伝


Slide 25

Slide 25 text

https://github.com/gree/php-custom-environment-v ariables
 連想配列の特定の値を、環境変数をつかって変更で きる
 コンテナは環境変数で設定したいことが多い
 getenvだとyamlとかjsonでつらい