🔖

AmazonEKSのALBでnamespaceをまたいだServiceへアクセス

2024/12/19に公開

概要

AmazonEKSでALBを作る場合、Ingressを作成する必要がある。
コストや構成の観点から、ALBをnamespace単位でそれぞれ作成したくない場合、ALBを一つ、IngressとServiceをnamespace単位で作れば良い。
しかし、そのままIngressをkube-systemに作成して、Serviceをdev1というnamespaceに作成した場合、namespaceをまたいでいるため、serivceがnot foundとなってしまう。

結論

対処方法としては、ingressのannotaionsでgroupを指定することで解決可能である。

  1. AWS LoadBalancer Controllerを任意のnamespace(例: kube-systemなど)に作成する
  2. 各namepspaceにIngressとServiceを作成する
  3. 各namespaceに作成するIngressにgroupを設定する

構成

下記のように1つのALBに対して、Hostヘッダー単位でListenerルールが追加される。

Ingress annotaions

alb.ingress.kubernetes.io/group.name で同じ名前にすると、同じALBが使用される。
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/guide/ingress/annotations/

manifest sample

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: exampleA
  namespace: dev1
  annotations:
    alb.ingress.kubernetes.io/load-balancer-name: example-alb
    alb.ingress.kubernetes.io/group.name: example <-- ここを指定
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    alb.ingress.kubernetes.io/manage-backend-security-group-rules: true
spec:
  ingressClassName: alb
  rules:
    - host: dev1.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: dev1-service
                port:
                  number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: exampleB
  namespace: dev2
  annotations:
    alb.ingress.kubernetes.io/load-balancer-name: example-alb
    alb.ingress.kubernetes.io/group.name: example <-- ここを指定
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    alb.ingress.kubernetes.io/manage-backend-security-group-rules: true
spec:
  ingressClassName: alb
  rules:
    - host: dev2.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: dev2-service
                port:
                  number: 80

Discussion