Carpe Diem

備忘録

GKE Ingressのヘルスチェック生成ルール

概要

GKE Ingressを使うとGCE LBのヘルスチェックが自動的に作成されますが、一定のルールがあります。

これらを理解していないと期待しないヘルスチェックが作成され、疎通ができなかったりするのでまとめておきます。

生成ルール

GKE Ingressは次の流れでヘルスチェックを作成します。

  1. BackendConfigがあればそれを使う
  2. PodにreadinessProbeが設定されている、かつ条件を満たす場合それを使う
  3. 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が一致する

実装ロジックはこちらです。

https://github.com/kubernetes/ingress-gce/blob/4339f9102032862c7b0bbfe2ed393fdb0bb0546a/pkg/controller/translator/translator.go#L487-L488

具体的な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におけるヘルスチェックの生成ルールについてまとめました。

参考