メインコンテンツまでスキップ

複数のIngressパターン

同じEKSクラスター内で複数のIngressオブジェクトを活用することは一般的です。例えば、複数の異なるワークロードを公開するためなどです。デフォルトでは、各IngressはそれぞれALBの作成につながりますが、IngressGroup機能を活用することで複数のIngressリソースをグループ化できます。コントローラーはIngressGroup内のすべてのIngressのルールを自動的に統合し、1つのALBでそれらをサポートします。さらに、Ingressで定義されたほとんどのアノテーションは、そのIngressによって定義されたパスにのみ適用されます。

この例では、uiコンポーネントと同じALBを通してcatalog APIを公開し、パスベースのルーティングを活用して適切なKubernetesサービスにリクエストをディスパッチします。

まず、uiコンポーネントの新しいIngressを作成します:

~/environment/eks-workshop/modules/exposing/ingress/multiple-ingress/ingress-ui.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ui-multi
namespace: ui
labels:
app.kubernetes.io/created-by: eks-workshop
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/healthcheck-path: /actuator/health/liveness
alb.ingress.kubernetes.io/group.name: retail-app-group
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ui
port:
number: 80
A

アノテーションalb.ingress.kubernetes.io/group.nameを追加してIngressGroupをretail-app-groupに設定します

B

rulesセクションは、ALBがトラフィックをどのようにルーティングすべきかを表現するために使用されます。uiコンポーネントでは、パス/で始まるすべてのHTTPリクエストをポート80のKubernetesサービスuiにルーティングします

次に、catalogコンポーネント用に別のIngressを作成します:

~/environment/eks-workshop/modules/exposing/ingress/multiple-ingress/ingress-catalog.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: catalog-multi
namespace: catalog
labels:
app.kubernetes.io/created-by: eks-workshop
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/healthcheck-path: /health
alb.ingress.kubernetes.io/group.name: retail-app-group
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /catalog
pathType: Prefix
backend:
service:
name: catalog
port:
number: 80
A

uiコンポーネントと同じIngressGroupを指定するには、アノテーションセクションでalb.ingress.kubernetes.io/group.nameretail-app-groupに設定します

B

rulesセクションは、ALBがトラフィックをどのようにルーティングすべきかを表現するために使用されます。catalogコンポーネントでは、パス/catalogで始まるすべてのHTTPリクエストをポート80のKubernetesサービスcatalogにルーティングします

これらのマニフェストをクラスターに適用します:

~$kubectl apply -k ~/environment/eks-workshop/modules/exposing/ingress/multiple-ingress

これで、-multiで終わる2つの追加のIngressオブジェクトがクラスターに作成されます:

~$kubectl get ingress -l app.kubernetes.io/created-by=eks-workshop -A
NAMESPACE      NAME      CLASS   HOSTS   ADDRESS                                                              PORTS   AGE
catalog-multi  catalog   alb     *       k8s-retailappgroup-2c24c1c4bc-17962260.us-west-2.elb.amazonaws.com   80      2m21s
ui-multi       ui        alb     *       k8s-retailappgroup-2c24c1c4bc-17962260.us-west-2.elb.amazonaws.com   80      2m21s
ui             ui        alb     *       k8s-ui-ui-1268651632.us-west-2.elb.amazonaws.com                     80      4m3s

両方のADDRESSが同じURLであることに注目してください。これは、これら2つのIngressオブジェクトが同じALBの背後にグループ化されているためです。

ALBリスナーを見て、これがどのように機能するか確認しましょう:

~$ALB_ARN=$(aws elbv2 describe-load-balancers --query 'LoadBalancers[?contains(LoadBalancerName, `k8s-retailappgroup`) == `true`].LoadBalancerArn' | jq -r '.[0]')
~$LISTENER_ARN=$(aws elbv2 describe-listeners --load-balancer-arn $ALB_ARN | jq -r '.Listeners[0].ListenerArn')
~$aws elbv2 describe-rules --listener-arn $LISTENER_ARN

このコマンドの出力は次のことを示します:

  • パスプレフィックス/catalogを持つリクエストはcatalogサービスのターゲットグループに送信されます
  • それ以外はuiサービスのターゲットグループに送信されます
  • デフォルトのバックアップとして、漏れたリクエストのために404があります

AWS consoleで新しいALB設定も確認できます:

AWS console iconEC2コンソールを開く

ロードバランサーのプロビジョニングが完了するまで待つには、次のコマンドを実行できます:

~$curl --head -X GET --retry 30 --retry-all-errors --retry-delay 15 --connect-timeout 30 --max-time 60 \
-k $(kubectl get ingress -n catalog catalog-multi -o jsonpath="{.status.loadBalancer.ingress[*].hostname}")

以前と同様にブラウザで新しいIngress URLにアクセスして、Webユーザーインターフェイスがまだ機能していることを確認してください:

~$ADDRESS=$(kubectl get ingress -n catalog catalog-multi -o jsonpath="{.status.loadBalancer.ingress[*].hostname}")
~$echo "http://${ADDRESS}"
http://k8s-retailappgroup-2c24c1c4bc-17962260.us-west-2.elb.amazonaws.com

次に、catalogサービスに向けたパスにアクセスしてみましょう:

~$ADDRESS=$(kubectl get ingress -n catalog catalog-multi -o jsonpath="{.status.loadBalancer.ingress[*].hostname}")
~$curl $ADDRESS/catalog/products | jq .

catalogサービスからJSONペイロードが返されるでしょう。これは、同じALBを通じて複数のKubernetesサービスを公開できたことを示しています。