8月 2021|sitateru tech blog

sitateru tech blog

シタテルの技術やエンジニアの取り組みを紹介するテックブログです。

2021年8月27日金曜日

AWS App Mesh をEKSで試してみた(仮想ゲートウェイ)

前回に続き、EKS上でのAWS App Meshをやっていきます。

今回は、仮想ゲートウェイです。
ゲートウェイがあれば、メッシュ上のリソースにメッシュ外のpodやWebなどからアクセスできるようになります💁‍♂️

今回の内容もドキュメント等いまいち見つからなかったので正確さなどは怪しいところがありますがご了承ください🙇‍♂️

Virtual gateways - AWS App Mesh


  1. 仮想ゲートウェイ作成

まずは仮想ゲートウェイとそのルートを作成します。
リスナーのポートは後で作るゲートウェイの実体と番号を合わせれば何番でもよさそうです。ルートは、全てのリクエストを前回作った仮想サービス(svc-v)へ流すよう指定してみました。

apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualGateway
metadata:
  namespace: mesh-test
  name: gateway-v
spec:
  namespaceSelector:
    matchLabels:
      mesh: mesh-1
  podSelector:
    matchLabels:
      for: gateway
  listeners:
    - portMapping:
        port: 8088
        protocol: http
      connectionPool:
        http:
          maxConnections: 1024
  logging:
    accessLog:
      file:
        path: /dev/stdout
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: GatewayRoute
metadata:
  namespace: mesh-test
  name: gateway-v-route-v
spec:
  httpRoute:
    action:
      target:
        virtualService:
          virtualServiceRef:
            name: svc-v
    match:
      prefix: /
  1. ゲートウェイ作成

ゲートウェイの実体となる、envoyイメージのコンテナと type: LoadBalancer な サービスを作成します。
envoyのcontainerPortとサービスのtargetPortは仮想ゲートウェイのリスナにしているポートと等しくする必要があります。
また、envoyの環境変数としてリージョンと仮想ゲートウェイARNを与える必要があるようです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gateway-v
  namespace: mesh-test
spec:
  replicas: 1
  selector:
    matchLabels:
      for: gateway
  template:
    metadata:
      labels:
        for: gateway
    spec:
      serviceAccountName: appmesh-proxyauth
      containers:
        - name: gateway
          image: public.ecr.aws/appmesh/aws-apmesh-envoy:v1.19.0.0-prod
          env:
            - name: AWS_REGION
              value: ap-northeast-1
            - name: APPMESH_RESOURCE_ARN
              value: arn:aws:appmesh:ap-northeast-1:123456780000:mesh/mesh-1/virtualGateway/gateway-v_mesh-test
          ports:
            - containerPort: 8088
          resources:
            limits:
              cpu: 10m
              memory: 32Mi
---
apiVersion: v1
kind: Service
metadata:
  name: gateway-v
  namespace: mesh-test
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 8088
  selector:
    for: gateway

以上をapplyすると、ロードバランサーが作られて仮想ゲートウェイとして動くようになります。

$ kubectl get service
NAME        TYPE           CLUSTER-IP       EXTERNAL-IP                                                                          PORT(S)
gateway-v   LoadBalancer   10.100.184.34    aae2598dca4e348b2a934f4cd88b7982-607b093417cc2f4d.elb.ap-northeast-1.amazonaws.com   80:31248/TCP

AWSコンソールでロードバランサーを見てみると、NLBができていました。


コンソールのApp Meshでもゲートウェイが表示されています。


ゲートウェイへのアクセスですが、クラスター内からは
$ curl gateway-v.mesh-test.svc.cluster.local
外からは
$ curl <NLBのドメイン名>
でリクエストを送って、仮想サービスsvc-vに送られることが確認できました。



ということで、App Mesh作ってみるシリーズでした。
今回はごく基本的な部分しか試していませんが、各リソースで設定できる機能はいろいろあるので公式ドキュメントやCustomResourceDefinitionを参照してみてください🙏

eks-charts/crds.yaml at master · aws/eks-charts

ちなみに、App Meshには(他のサービスと同様に)作れるリソース数の制限があります。
ほとんどはサポートセンターに頼めば引き上げ可能なようですが、メッシュ設計の際はちょっと気にしておいたほうがいいかもしれないですね。
AWS App Mesh エンドポイントとクォータ - AWS 全般のリファレンス

, , ,