EKS で ALB のホストごとにヘルスチェックを設定する

前提として今回の記事は AWS ALB Ingress Controller を使用していることを想定しています。

ALB Ingress Controller については以前書いた記事にのっているので、そちらを参考にしてください blog.hatappi.me

今回やりたかったこと

EKS のクラスタには2つのアプリケーションが動いています。
それぞれのホストを a.example.comb.example.com からアクセスします。
それぞれのヘルスチェックが /app_a/healthcheck, /app_b/healthcheck で行えるので ALB のパスをそれぞれのパスに向けたいです。

準備

まずヘルスチェックの設定をする前のIngress リソースは次のような感じで定義します。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
spec:
  rules:
    - host: a.example.com
      http:
        paths:
          - path: /*
            backend:
              serviceName: ssl-redirect
              servicePort: use-annotation
          - path: /*
            backend:
              serviceName: app_a
              servicePort: 80
    - host: b.example.com
      http:
        paths:
          - path: /*
            backend:
              serviceName: ssl-redirect
              servicePort: use-annotation
          - path: /*
            backend:
              serviceName: app_b
              servicePort: 80

a.example.com にアクセスすると service: app_a にリクエストが流れ、b.example.com にアクセスすると service: app_b にリクエストが流れます。
どちらのホストも http -> https のリダイレクトが行われます。

ただこのままではターゲットグループのヘルスチャックのパスはデフォルトの / のまま。。。

どの設定するか

普通にドキュメントに書いてありました。

kubernetes-sigs.github.io

ヘルスチェックのパス指定である alb.ingress.kubernetes.io/healthcheck-pathingressリソースだけでなくservice リソースでも定義できるようです。

つまりそれぞれのservice の annotation に次のような感じで設定すれば良さそうです。

apiVersion: v1
kind: Service
metadata:
  name: app_a
  annotations:
    # 追加!!!
    alb.ingress.kubernetes.io/healthcheck-path: '/app_a/healthcheck'
spec:
  ports:
    - port: 80
      targetPort: 3000
      protocol: TCP
  type: NodePort
  selector:
    app: app_a
---
apiVersion: v1
kind: Service
metadata:
  name: app_b
  annotations:
    # 追加!!!
    alb.ingress.kubernetes.io/healthcheck-path: '/app_b/healthcheck'
spec:
  ports:
    - port: 80
      targetPort: 3000
      protocol: TCP
  type: NodePort
  selector:
    app: app_b

これを apply すればそれぞれのターゲットグループのヘルスチェックパスが変わるはずです。
port とか protocol が異なる場合もこんな感じでservice ごとにわけてあげると良さそうですね。

最後に

まだannotationで設定していくのに慣れない