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

UI の公開

このセクションでは、UI アプリケーションを Application Load Balancer 経由で公開するために必要な Gateway API リソースを作成します。

GatewayClass の作成

GatewayClass は、どのコントローラーが Gateway リソースの管理を担当するかを定義します。AWS Load Balancer Controller を使用する GatewayClass を作成します:

~/environment/eks-workshop/modules/exposing/gateway-api/exposing-ui/gatewayclass.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: aws-alb
spec:
controllerName: gateway.k8s.aws/alb

これにより、aws-alb クラスを参照する Gateway は AWS Load Balancer Controller によって処理されることを Kubernetes に指示します。

GatewayClass を適用します:

~$kubectl apply -f ~/environment/eks-workshop/modules/exposing/gateway-api/exposing-ui/gatewayclass.yaml

Load Balancer の設定

LBC v3.x で Gateway API を使用する場合、Load Balancer の設定はアノテーションではなく LoadBalancerConfiguration CRD を通じて行われます。このリソースは ALB のスキームを定義します:

~/environment/eks-workshop/modules/exposing/gateway-api/exposing-ui/loadbalancerconfig.yaml
apiVersion: gateway.k8s.aws/v1beta1
kind: LoadBalancerConfiguration
metadata:
name: retail-store-lb-config
namespace: ui
spec:
scheme: internet-facing
sourceRanges: $SOURCE_RANGES

scheme: internet-facing により、ALB がインターネットから公開アクセス可能になります。

LoadBalancerConfiguration を適用します:

~$export SOURCE_RANGES=$(echo $INBOUND_CIDRS | jq -R 'split(",")')
~$cat ~/environment/eks-workshop/modules/exposing/gateway-api/exposing-ui/loadbalancerconfig.yaml | envsubst | kubectl apply -f -

Gateway の作成

Gateway リソースは実際の Load Balancer インフラストラクチャをプロビジョニングします。これは GatewayClass と LoadBalancerConfiguration を参照します:

~/environment/eks-workshop/modules/exposing/gateway-api/exposing-ui/gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: retail-store-gateway
namespace: ui
spec:
gatewayClassName: aws-alb
infrastructure:
parametersRef:
group: gateway.k8s.aws
kind: LoadBalancerConfiguration
name: retail-store-lb-config
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All

重要なポイント:

  1. gatewayClassName: aws-alb は、この Gateway を作成した GatewayClass にリンクします
  2. infrastructure.parametersRef は ALB 設定用の LoadBalancerConfiguration を参照します
  3. リスナーはポート 80 で HTTP トラフィックを受け入れます

Gateway を適用します:

~$kubectl apply -f ~/environment/eks-workshop/modules/exposing/gateway-api/exposing-ui/gateway.yaml
~$kubectl wait --for=condition=Programmed gateway/retail-store-gateway -n ui --timeout=600s

HTTPRoute の作成

HTTPRoute は、Gateway に到着したトラフィックをバックエンドサービスにどのようにルーティングするかを定義します。パスプレフィックス / を持つすべてのトラフィックを UI サービスにルーティングします:

~/environment/eks-workshop/modules/exposing/gateway-api/exposing-ui/httproute-ui.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: ui-route
namespace: ui
spec:
parentRefs:
- name: retail-store-gateway
namespace: ui
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ui
port: 80
A

parentRefs はこのルートを Gateway にリンクします

B

ルールは / で始まるすべてのパスに一致し、トラフィックをポート 80 の ui サービスに転送します

HTTPRoute を適用します:

~$kubectl apply -f ~/environment/eks-workshop/modules/exposing/gateway-api/exposing-ui/httproute-ui.yaml

リソースの検証

すべてのリソースが正常に作成されたことを確認します:

~$kubectl get gatewayclass
NAME      CONTROLLER              ACCEPTED   AGE
aws-alb   gateway.k8s.aws/alb     True       2m
~$kubectl get gateway -n ui
NAME                    CLASS     ADDRESS                                                         PROGRAMMED   AGE
retail-store-gateway    aws-alb   k8s-ui-retailst-xxxxxxxxxx.us-west-2.elb.amazonaws.com          True         2m
~$kubectl get httproute -n ui
NAME       HOSTNAMES   AGE
ui-route               2m

Gateway ALB 経由で UI にアクセスします:

~$export GATEWAY_URL=$(kubectl get gateway retail-store-gateway -n ui -o jsonpath='{.status.addresses[0].value}')
~$echo "http://${GATEWAY_URL}"
http://k8s-ui-retailst-xxxxxxxxxx.us-west-2.elb.amazonaws.com

Gateway でプロビジョニングされた ALB を通じて、ブラウザで retail store の UI にアクセスできるようになりました。

http://k8s-ui-retailst-xxxxxxxxxx.us-west-2.elb.amazonaws.com