概要
GKE Ingressを使うとGCE LBのヘルスチェックが自動的に作成されますが、一定のルールがあります。
これらを理解していないと期待しないヘルスチェックが作成され、疎通ができなかったりするのでまとめておきます。
生成ルール
GKE Ingressは次の流れでヘルスチェックを作成します。
- BackendConfigがあればそれを使う
- PodにreadinessProbeが設定されている、かつ条件を満たす場合それを使う
- 1, 2を満たさない場合、デフォルト値を使う
それぞれについて詳細な設定方法を説明します。
設定方法
BackendConfig
次のようなBackendConfigがあり、Serviceのannotationで使っている場合それがLBのヘルスチェックに使われます。
apiVersion: cloud.google.com/v1 kind: BackendConfig metadata: name: my-app-bc spec: connectionDraining: drainingTimeoutSec: 30 timeoutSec: 15 healthCheck: checkIntervalSec: 5 timeoutSec: 1 healthyThreshold: 1 unhealthyThreshold: 2 type: HTTP port: 8000 requestPath: /
Service
apiVersion: v1 kind: Service metadata: name: my-app-svc annotations: cloud.google.com/neg: '{"ingress": true}' cloud.google.com/backend-config: '{"ports": {"8000":"my-app-bc"}}'
Webコンソールでは次のようになっています。
PodのreadinessProbe
PodのreadinessProbeを使いたい場合の注意点としては、ドキュメントに書いてあるポートの指定に気をつける必要があります。
ref: https://cloud.google.com/kubernetes-engine/docs/concepts/ingress?hl=ja#def_inf_hc
簡単にまとめると、NEGを使っている場合は以下の3つの条件を守る必要があります。
- PodのcontainerPortとreadinessProbeのポートが一致する
- ServiceのtargetPortとPodのcontainerPortが一致する
- Ingressのポート番号とServiceのportが一致する
実装ロジックはこちらです。
具体的なDeployment, Service, Ingressの設定は次のようになります。
Deployment
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: template: metadata: labels: name: my-app spec: containers: - name: my-app ports: - containerPort: 8000 name: http protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /health port: http scheme: HTTP initialDelaySeconds: 15 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5
Service
apiVersion: v1 kind: Service metadata: name: my-app labels: name: my-app spec: selector: name: my-app type: ClusterIP ports: - port: 8000 name: http protocol: TCP
Serviceでは複数のポートがありますが(port, targetPort)、targetPort未指定の場合はportと同じ値が設定されます。
※type: NodePortならnodePortもある
Ingress
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app annotations: spec: rules: - http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: my-app port: number: 8000
Webコンソールでは次のように
Kubernetes L7 health check generated with readiness probe settings.
となります。
デフォルト値
デフォルト値はこちらのドキュメントの通りです。
https://cloud.google.com/kubernetes-engine/docs/concepts/ingress?hl=ja#def_inf_hc
Webコンソールでは次のようになっています。
まとめ
GKE Ingressにおけるヘルスチェックの生成ルールについてまとめました。