GKE のドキュメントには Ingress を使って GCE HTTP(S) LB を使って外部にサービスを公開する方法が書かれている。
- https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer?hl=en
- https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip?hl=en
しかし、ヘルスチェック等の落とし穴にハマる人が多く、 GKE に予め入っている Ingress の実装であるingress-gce の README.md を読みに行かないと分からないことが多い。
https://github.com/kubernetes/ingress-gce/blob/master/README.md
- GCE Ingress のヘルスチェックの挙動を確認すること https://github.com/kubernetes/ingress-gce/blob/master/README.md#health-checks
- ヘルスチェックのパスはデフォルトで
/
readinessProbe
のhttpGet
を設定した場合は変更可能
- ヘルスチェックのステータスコードは 200 でないと失敗する
- GCE ヘルスチェックの仕様
readinessProbe
や他のクラウドプロバイダでは 2xx, 3xx なら成功なので引っかかりがち
kubectl apply -f
やkubectl edit
での更新が反映されない時はkubectl delete
&kubectl create
もしくはkubectl replace --force
で作り直す(IP アドレスに注意)
- Ingress が完全に削除されたことを確認してから GKE クラスタを削除する
- リソースが残ってしまった時のために公式にスクリプトが用意されそう
- GCE HTTPS LB および Kubernetes 内の NAT によってソース IP アドレスが変わってしまう
x-forwarded-for
ヘッダの値を使う https://cloud.google.com/compute/docs/load-balancing/http/?hl=en#components- HTTP(S) LB の Proxy の IP アドレスなので
130.211.0.0/22
,35.191.0.0/16
は nginx real ip module 等で飛ばして良い
- HTTP(S) LB の Proxy の IP アドレスなので
- Service に
service.spec.externalTrafficPolicy: Local
を設定する
- 原理は The Ins and Outs of Networking in Google Container Engine (YouTube, SpeakerDeck) 参照