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 はメッシュ内にないため、このゲートウェイは外部と内部のトラフィックをブリッジする必要があります。

参照ドキュメント: