Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

KubernetesでPHPを動かした話

463 views

Published on

「第139回 PHP勉強会@東京」で発表された資料です。

https://phpstudy.doorkeeper.jp/events/93038

Published in: Engineering
  • Be the first to comment

KubernetesでPHPを動かした話

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

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

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

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

  6. 6. Apacheパラメータ未調整問題

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

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

  9. 9. DNS Lookup溢れる問題

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

  11. 11. Kubernetes DNS
 service1 kube-system DNS
 kubernetes cluster Cloud SQL Cloud Spanner Cloud Memorystore The Internet
  12. 12. かなり仕事が多い
 service1 kube-system DNS
 kubernetes cluster Cloud SQL Cloud Spanner Cloud Memorystore The Internet クラスタ内の名前解決 Google Cloud内の 名前解決 インターネット側の 名前解決
  13. 13. PHPであることによる原因
 Kubernetesであることによる原因
 クラウドであることによる原因
 実装による原因
 複合的な原因

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

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

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

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

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

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

  21. 21. だが...

  22. 22. dnsmasq先に死ぬ問題

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

  24. 24. ついでに宣伝

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


×