
はじめに
GKEのingressには転送先のサービスが正常に動いているか監視するヘルスチェックの仕組みがあります。
ヘルスチェックは、定期的に指定の場所にリクエストを飛ばし、HTTPのステータスコードが200のときは正常にサービスが動いていると認識し、それ以外のときは以上があることを知らせてくれます。
通常、勝手に死活管理をしてくれるわけですから便利です。
ですが、例えばメンテナンス中にメンテナンスページを表示しつつHTTPのステータスコードを503を返したとします。
developer.mozilla.org
このときingressは、定期的に行われるヘルスチェックで503を受け取ることになります。
すると、ingressは504を返すようになり、ページはingressのエラーページに変わってしまいます。
これではユーザにメンテナンス中ページを表示することができません。
解決方法
これらの問題を解決するための方法がGKEには用意されています。
通常、ヘルスチェックはサービスの ルートページ 「/」に対して行われます。
「/」以外のページでヘルスチェックを行うためには、pod(deployment)に特別な設定をする必要があります。
qiita.com
pod(deployment)への設定
リクエストを受けるpodのdeploymentに以下のように設定を追記します
ざっくり略して書いているいるので参考にするときは気をつけてください。
ともかくdeploymentのyamlのコンテナ定義以下にreadinessProbe:を設定するところが味噌です。
spec:
containers:
readinessProbe:
initialDelaySeconds: 5
periodSeconds: 20
httpGet:
path: /health
port: api-port
このように設定することでingressはヘルスチェックのリクエストを/healthに対して行うようになります。
ヘルスチェック先の設定をする。
今回はリクエスト先でnginxが動いていることを想定しています。
nginxの設定に以下のような設定を追記します。
location /health/ { return 200 "ok";}
これだけです。
この設定にたどり着くまでに紆余曲折ありましたが、わかってしまえば簡単なことでした。
ヘルスチェックがHTTPステータス 200を受け取れさえすれば何でも良かったのです。