Amazon Web Services ブログ
AWS ALB Ingress Controller の App Mesh への統合
AWS App Mesh は、アプリケーションレベルのネットワークを提供するサービスメッシュであり、サービスが複数のタイプのコンピューティングインフラストラクチャ間で簡単に相互通信できるようにします。App Mesh はサービスの通信方法を標準化し、エンドツーエンドの可視性を提供し、アプリケーションの高可用性を確保します。
AWS ALB Ingress コントローラーは、Kubernetes ユーザーがクラスターで Ingress リソースを宣言するたびに ALB と必要なサポートのための AWS リソースの作成をトリガーするコントローラーです。Ingress リソースは、ALB を使用して HTTP[s] トラフィックをクラスター内の異なるエンドポイントにルーティングします。
App Mesh では、EKS の内部トラフィック (別名 East-West トラフィック) は、App Mesh コントロールプレーンによって制御される Envoy サイドカーによって管理されますが、外部アクセス (別名 North-South トラフィック) は App Mesh によって管理されません。North-South トラフィックを East-West トラフィックに接続するオプションとしては次のようなものがあります。
- Ingress ゲートウェイとしての Gloo。
- App Mesh のゲートウェイアプリケーションを使用する ALB Ingress Controller。
- App Mesh へのイングレスとしての Ingress-nginx。ingress-nginx-controller は、メッシュ内の仮想ノードとして設定されます。
このブログでは、AWS App Mesh のサンプルアプリケーションである Color App を使用して AWS ALB Ingress Controller をセットアップする方法を説明します
仕組み
- ALB: ALB イングレスコントローラーによって作成および維持される AWS Application Load Balancer。トラフィックは Color Gateway サービスにルーティングされます。ALB のターゲットグループは、ALB イングレスコントローラー IP モードでゲートウェイの各ポッドをポイントします。
- Color Gateway: Go で記述された単純な http サービス。外部クライアントに公開され、http://service-name:port/color に応答します。ゲートウェイは、color-teller から取得した色と、リクエストを行った時点までに応答したサーバーで観察された色のヒストグラムで応答します。
- ColorTeller – Go で記述され、色を返すように設定された単純な http サービス。サービスの複数のバリアントがデプロイされます。各サービスは、特定の色を返すように設定されています。
チュートリアル
1.eksctl で EKS クラスターを作成する
このドキュメントに従って、AWS CLI、kubectl、および eksctl ツールをインストールおよび設定してください。次に、以下のコマンドに従って EKS クラスターとワーカーノードを作成します。
export REGION=us-west-2
eksctl create cluster --region $REGION --name appmesh-alb --appmesh-access
EKS クラスターおよびワーカーノードの作成には 15 分かかる場合があります。終了後、次のコマンドを実行して EKS クラスターを検証できます。
kubectl get svc
予想される出力は次のようになります。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 10m
IAM OIDC プロバイダーを作成し、クラスターに関連付けます。
eksctl utils associate-iam-oidc-provider --cluster=appmesh-alb --approve
2.appmesh コントローラーをインストールする
次の kubectl コマンドを実行して、appmesh コントローラーをインストールします。
kubectl apply -f https://raw.githubusercontent.com/aws/aws-app-mesh-controller-for-k8s/master/deploy/all.yaml
コントローラリソースを確認します。
kubectl rollout status deployment app-mesh-controller -n appmesh-system
kubectl get crd
予想される出力は次のようになります。
deployment "app-mesh-controller" successfully rolled out
NAME CREATED AT
eniconfigs.crd.k8s.amazonaws.com 2019-09-28T13:32:59Z
meshes.appmesh.k8s.aws 2019-09-28T13:44:17Z
virtualnodes.appmesh.k8s.aws 2019-09-28T13:44:17Z
virtualservices.appmesh.k8s.aws 2019-09-28T13:44:17Z
3.appmesh サイドカーインジェクターをインストールする
export MESH_NAME=color-mesh
export MESH_REGION=$REGION
curl https://raw.githubusercontent.com/aws/aws-app-mesh-inject/master/scripts/install.sh | bash
4. カラーテラーサンプルアプリケーションをインストールする
kubectl apply -f https://raw.githubusercontent.com/aws/aws-app-mesh-controller-for-k8s/master/examples/color.yaml
5. AWS ALB Ingress コントローラーをインストールする
次のコマンドを実行して、ALB イングレスコントローラーをインストールします。このブログでは、各コマンドの詳細な説明をご覧いただけます。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/rbac-role.yaml
PolicyARN=$(aws iam create-policy \
--policy-name ALBIngressControllerIAMPolicy \
--policy-document https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/iam-policy.json \
| jq -r ".Policy.Arn")
eksctl create iamserviceaccount \
--cluster=appmesh-alb \
--namespace=kube-system \
--name=alb-ingress-controller \
--attach-policy-arn=$PolicyARN \
--override-existing-serviceaccounts \
--approve
curl -sS "https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/alb-ingress-controller.yaml" \
| sed "s/# - --cluster-name=devCluster/- --cluster-name=appmesh-alb/g" \
| kubectl apply -f -
6.カラーテラーアプリケーションのイングレスを作成する
次の内容で新しいファイル appmesh-alb-ingress.yaml を作成します。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/healthcheck-path: /color
kubernetes.io/ingress.class: alb
name: colorgateway
namespace: appmesh-demo
spec:
rules:
- http:
paths:
- backend:
serviceName: colorgateway
servicePort: 9080
path: /color
次に、以下のコマンドを実行して、イングレスリソースを作成します
kubectl apply -f appmesh-alb-ingress.yaml
新しい ALB リソースを作成して準備するのに数分かかる場合があります。ALB のエンドポイントを取得できます。
kubectl -n appmesh-demo describe ing/colorgateway
次に、上記の ALB エンドポイントを使用して、サンプルアプリケーションにアクセスできます。
http://{ALB_endpoint}/color
予想される出力は次のようになります。
{"color":"white", "stats": {"black":0.33,"blue":0.33,"white":0.33}}
7.クリーンアップ
kubectl delete -f appmesh-alb-ingress.yaml
eksctl delete cluster appmesh-alb
まとめ
App Mesh のイングレスとして ALB を使用することは、外部トラフィックをメッシュにルーティングする最も簡単な方法の 1 つです。デプロイプロセスは、EKS または自己ビルド Kubernetes で ALB Ingress Controller をデプロイするのと同じです。Color App サンプルアプリケーションでは、ゲートウェイは、メッシュのエントリとして公開される App Mesh 仮想ノードです。ALB はメッシュ内にないため、このゲートウェイは外部と内部のトラフィックをブリッジする必要があります。
参照ドキュメント:
- ALB Ingress Controller: https://github.com/kubernetes-sigs/aws-alb-ingress-controller
- App Mesh Color App Sample アプリケーション: https://github.com/aws/aws-app-mesh-examples/tree/master/examples/apps/colorapp
- AWS App Mesh 用の Ingress Gateway として Gloo を使用する: https://aws.amazon.com/blogs/containers/using-gloo-as-an-ingress-gateway-for-aws-app-mesh/