前回に続き、EKS上でのAWS App Meshをやっていきます。
今回は、仮想ゲートウェイです。
ゲートウェイがあれば、メッシュ上のリソースにメッシュ外のpodやWebなどからアクセスできるようになります💁♂️
今回の内容もドキュメント等いまいち見つからなかったので正確さなどは怪しいところがありますがご了承ください🙇♂️
Virtual gateways - AWS App Mesh
- 仮想ゲートウェイ作成
まずは仮想ゲートウェイとそのルートを作成します。
リスナーのポートは後で作るゲートウェイの実体と番号を合わせれば何番でもよさそうです。ルートは、全てのリクエストを前回作った仮想サービス(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: /
- ゲートウェイ作成
ゲートウェイの実体となる、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 全般のリファレンス