🔖
AmazonEKSのALBでnamespaceをまたいだServiceへアクセス
概要
AmazonEKSでALBを作る場合、Ingressを作成する必要がある。
コストや構成の観点から、ALBをnamespace単位でそれぞれ作成したくない場合、ALBを一つ、IngressとServiceをnamespace単位で作れば良い。
しかし、そのままIngressをkube-system
に作成して、Serviceをdev1
というnamespaceに作成した場合、namespaceをまたいでいるため、serivceがnot found
となってしまう。
結論
対処方法としては、ingressのannotaionsでgroupを指定することで解決可能である。
- AWS LoadBalancer Controllerを任意のnamespace(例: kube-systemなど)に作成する
- 各namepspaceにIngressとServiceを作成する
- 各namespaceに作成するIngressにgroupを設定する
構成
下記のように1つのALBに対して、Hostヘッダー単位でListenerルールが追加される。
Ingress annotaions
alb.ingress.kubernetes.io/group.name
で同じ名前にすると、同じALBが使用される。
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