Ingressを使ってみた時に、トラブルに会って時間が掛かったので、同じような遭遇をした人の役に立ってればと思って、この記事を更新しました。
ヘルスチェック失敗
Ingressを正しく作成しているのに、backendのヘルスチェックがずっと失敗しっぱなし
現象
サイト表示時のエラーメッセージ:
Error: Server Error
The server encountered a temporary error and could not complete your request.
Please try again in 30 seconds.
Ingressが返ってくるステータスコード:
502 Server Error
Ingress状態:
Some backend services are in UNKNOWN state
原因
Ingressはヘルスチェックは、Containerの<ip>:<port>/
パスへのアクセスがステータスコード200で返ってくることが必須です。
普通のヘルスチェックは200~399の間でOKと判断するが、Ingressは200しか受け付けない。しかもデフォルトは/
ディレクトリのみを確認する仕様になっています。
Status Codeの確認方法:kubenetesの内部ネットワークから(VPCネイティブの場合、同じネットワークのGCEでも可)、PodのIPに対して、以下のコマンドでステータスコードを取得します。
200以外の場合、よく302(redirect to login)が返ってきます。
curl -LI <podのIP>:<port>/
解決方法
Podのヘルスチェックを明示的に定義することで、Ingressがそちらのヘルスチェックを認識してくれます。
readinessProbe
に、httpGet
タイプのヘルスチェックを入れましょう。
詳しく設定方法を知りたい方は、以前の記事を参考にしていただければと思います。
また、Pod(deployment)のヘルスチェックの設定は、Ingress作成前に設定しておく必要があります。
wordpressの場合は、<ip>:<port>/
は301が返ってくるため、Podのヘルスチェックを定義する必要があります。
コメント