AWS App Mesh および Kubernetes の開始方法 - AWS App Mesh

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS App Mesh および Kubernetes の開始方法

Kubernetes 用 App Mesh コントローラーを使用して Kubernetes AWS App Mesh と統合する場合、メッシュ、仮想サービス、仮想ノード、仮想ルーター、Kubernetes 経由のルートなどの App Mesh リソースを管理します。また、Kubernetes ポッド仕様に App Mesh サイドカーコンテナイメージを自動的に追加できます。このチュートリアルでは、Kubernetes 用 App Mesh コントローラーをインストールして、この統合を有効にする方法について説明します。

コントローラーには、Kubernetes カスタムリソース定義 meshesvirtual servicesvirtual nodesvirtual routers のデプロイが備わっています。コントローラーは、カスタムリソースの作成、変更、削除を監視し、App Mesh API を通じて、対応する App Mesh の サービスメッシュ 仮想サービス仮想ノード仮想ゲートウェイゲートウェイルート仮想ルーター (ルート を含む)などのリソースを変更します。詳細を確認したり、コントローラーに貢献したりするには、GitHub「」プロジェクトを参照してください。

コントローラーは、指定した名前でラベル付けされた Kubernetes ポッドに、次のコンテナを挿入する Webhook もインストールします。

  • App Mesh Envoy プロキシ — Envoy は、App Mesh コントロールプレーンで定義されている設定を使用して、アプリケーショントラフィックの送信先を決定します。

  • App Mesh プロキシルートマネージャー– Envoyを介してインバウンドトラフィックとアウトバウンドトラフィックをルーティングするポッドのネットワーク名前空間の iptables ルールを更新します。このコンテナは、ポッド内の Kubernetes init コンテナとして実行されます。

前提条件

  • App Mesh の概念を既に理解している。詳細については、「AWS App Mesh とは?」を参照してください。

  • Kubernetes の概念を既に理解している。詳細については、Kubernetes ドキュメントの「Kubernetes とは」を参照してください。

  • 既存の Kubernetes クラスター。既存のクラスターがない場合は、「Amazon EKS ユーザーガイド」の「Amazon EKS の開始方法」を参照してください。Amazon EC2 で独自の Kubernetes クラスターを実行している場合は、Envoy イメージがある Amazon ECR リポジトリに対して Docker が認証されていることを確認してください。詳細については、「Amazon Elastic Container Registry ユーザーガイド」の「Envoy イメージ」、「レジストリの認証」、および「Kubernetesドキュメント」の「プライベートレジストリからイメージをプルする」を参照してください。

  • App Mesh は、DNS に登録されている Linux サービス AWS Cloud Map、またはその両方をサポートしています。この入門ガイドを使用するには、DNS に登録されている3つの既存のサービスをお勧めします。このトピックの手順は、既存のサービスが、serviceAserviceBserviceBv2 という名前で、すべてのサービスが apps.local という名前の名前空間を介して検出可能であることを前提としています。

    サービスが存在しない場合でもサービスメッシュとそのリソースを作成できますが、実際のサービスをデプロイするまでメッシュを使用することはできません。

  • AWS CLI バージョン 1.18.116 以降または 2.0.38 以降がインストールされている。をインストールまたはアップグレードするには AWS CLI、「 のインストール AWS CLI」を参照してください。

  • Kubernetes クラスターと通信するよう設定されている kubectl クライアント。Amazon Elastic Kubernetes Service を使用している場合は、kubectl のインストール手順と kubeconfig ファイルの設定手順を実行してください。

  • Helm バージョン 3.0 以降がインストールされています。Helm がインストールされていない場合は、「Amazon EKS ユーザーガイド」の「Amazon EKS での Helm の使用」を参照してください。

  • Amazon EKS は現在、IPv4_ONLY および IPv6_ONLY の IP 設定にのみ対応しています。これは、Amazon EKS が IPv4 トラフィックのみまたは IPv6 トラフィックのみを処理できるポッドのみを現在サポートしているためです。

残りのステップでは、実際のサービスが serviceAserviceBserviceBv2 という名前で、すべてのサービスが apps.local という名前の名前空間を介して検出可能であることを前提としています。

ステップ 1: 統合コンポーネントをインストールする

App Mesh で使用するポッドをホストする各クラスターに、統合コンポーネントを 1 回インストールします。

統合コンポーネントをインストールするには
  1. この手順の残りのステップでは、プレリリースバージョンのコントローラーがインストールされていないクラスターが必要です。プレリリースバージョンをインストールした場合、またはインストールしたかどうかが不明な場合は、プレリリースバージョンがクラスターにインストールされているかどうかを確認するスクリプトをダウンロードし、実行できます。

    curl -o pre_upgrade_check.sh https://raw.githubusercontent.com/aws/eks-charts/master/stable/appmesh-controller/upgrade/pre_upgrade_check.sh sh ./pre_upgrade_check.sh

    スクリプトが Your cluster is ready for upgrade. Please proceed to the installation instructions を返した場合は、次のステップに進むことができます。別のメッセージが返された場合は、続行する前にアップグレード手順を完了する必要があります。プレリリースバージョンのアップグレードの詳細については、「 でのアップグレード」を参照してください GitHub。

  2. eks-charts リポジトリを Helm に追加します。

    helm repo add eks https://aws.github.io/eks-charts
  3. App Mesh Kubernetes カスタムリソース定義 (CRD) をインストールします。

    kubectl apply -k "https://github.com/aws/eks-charts/stable/appmesh-controller/crds?ref=master"
  4. コントローラーの Kubernetes 名前空間を作成します。

    kubectl create ns appmesh-system
  5. 後の手順で使用するために、次の数を設定します。cluster-nameRegion-code を既存のクラスターの値に置き換えます。

    export CLUSTER_NAME=cluster-name export AWS_REGION=Region-code
  6. (オプション) Fargate でコントローラーを実行する場合は、Fargate プロファイルを作成する必要があります。eksctl をンストールしていない場合は、「Amazon EKS ユーザーガイド」の「eksctl のインストールまたはアップグレード」を参照してください。コンソールを使用してプロファイルを作成する場合は、「Amazon EKS ユーザーガイド」の「Fargate プロファイルの作成」を参照してください。

    eksctl create fargateprofile --cluster $CLUSTER_NAME --name appmesh-system --namespace appmesh-system
  7. クラスターの OpenID 接続 (OIDC) ID プロバイダーを作成します。eksctl をインストールしていない場合、「Amazon EKS ユーザーガイド」の「eksctl のインストールまたはアップグレード」の手順に従ってインストールできます。コンソールを使用してプロバイダーを作成する場合、「Amazon EKS ユーザーガイド」の「クラスターでのサービスアカウントの IAM ロールの有効化」を参照してください。

    eksctl utils associate-iam-oidc-provider \ --region=$AWS_REGION \ --cluster $CLUSTER_NAME \ --approve
  8. IAM ロールを作成し、 AWSAppMeshFullAccess および AWSCloudMapFullAccess AWS 管理ポリシーをアタッチして、Kubernetes appmesh-controller サービスアカウントにバインドします。このロールにより、コントローラーは App Mesh リソースの追加、削除、変更を行うことができます。

    注記

    コマンドは、自動生成された名前で AWS IAM ロールを作成します。作成された IAM ロール名を指定することはできません。

    eksctl create iamserviceaccount \ --cluster $CLUSTER_NAME \ --namespace appmesh-system \ --name appmesh-controller \ --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapFullAccess,arn:aws:iam::aws:policy/AWSAppMeshFullAccess \ --override-existing-serviceaccounts \ --approve

    AWS Management Console または を使用してサービスアカウントを作成する場合は AWS CLI、「Amazon EKS ユーザーガイド」の「サービスアカウントの IAM ロールとポリシーの作成」を参照してください。 AWS Management Console または を使用してアカウント AWS CLI を作成する場合は、ロールを Kubernetes サービスアカウントにマッピングする必要もあります。詳細については、「Amazon EKS ユーザーガイド」の「サービスアカウントの IAM ロールを指定する」を参照してください。

  9. App Mesh コントローラーをデプロイします。すべての設定オプションのリストについては、「 の設定」を参照してください GitHub。
    1. プライベートクラスターの App Mesh コントローラーをデプロイするには、まず、リンクされたプライベートサブネットへの App Mesh エンドポイントおよびサービス検出 Amazon VPC エンドポイントを有効にする必要があります。また、accountId を設定する必要があります。

      --set accountId=$AWS_ACCOUNT_ID

      プライベートクラスターで X-Ray トレースを有効にするには、X-Ray エンドポイントおよび Amazon ECR Amazon VPC エンドポイントを有効にします。コントローラーはデフォルトで public.ecr.aws/xray/aws-xray-daemon:latest を使用するため、このイメージをローカルにプルし、ECR 個人リポジトリにプッシュします。

      注記

      現在、Amazon VPC エンドポイントは Amazon ECR パブリックリポジトリをサポートしていません。

      X-Ray の設定でコントローラーをデプロイする例を以下に示します。

      helm upgrade -i appmesh-controller eks/appmesh-controller \ --namespace appmesh-system \ --set region=$AWS_REGION \ --set serviceAccount.create=false \ --set serviceAccount.name=appmesh-controller \ --set accountId=$AWS_ACCOUNT_ID \ --set log.level=debug \ --set tracing.enabled=true \ --set tracing.provider=x-ray \ --set xray.image.repository=your-account-id.dkr.ecr.your-region.amazonaws.com/your-repository \ --set xray.image.tag=your-xray-daemon-image-tag

      アプリケーションのデプロイを仮想ノードまたはゲートウェイにバインドするときに、X-Ray デーモンが正常に挿入されるかどうかを検証します。

      詳細については、「Amazon EKS ユーザーガイド」の「プライベートクラスター」を参照してください。

    2. 他のクラスターの App Mesh コントローラーをデプロイします。すべての設定オプションのリストについては、「 の設定」を参照してください GitHub。

      helm upgrade -i appmesh-controller eks/appmesh-controller \ --namespace appmesh-system \ --set region=$AWS_REGION \ --set serviceAccount.create=false \ --set serviceAccount.name=appmesh-controller
    注記

    Amazon EKS クラスターファミリーが IPv6 の場合、App Mesh コントローラーをデプロイするときに、前のコマンド --set clusterName=$CLUSTER_NAME に次のオプションを追加してクラスター名を設定してください。

    重要

    クラスターが me-south-1ap-east-1ap-southeast-3eu-south-1il-central-1、または af-south-1 リージョンにある場合は、前のコマンドに次のオプションを追加する必要があります。

    account-idRegion-codeを適切な値のセットの 1 つに置き換えます。

    • サイドカーイメージの場合:
      • --set image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/amazon/appmesh-controller
      • 772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.5.0-prod

      • 856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.29.5.0-prod

      • 909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.29.5.0-prod

      • 422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.5.0-prod

      • 564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-envoy:v1.29.5.0-prod

      • 924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.5.0-prod

    • 古いイメージ URIsは、 の変更ログにあります GitHub。イメージが存在する AWS アカウントがバージョン で変更されましたv1.5.0。以前のバージョンのイメージは、Amazon Elastic Kubernetes Service の Amazon コンテナイメージレジストリにある AWS アカウントでホストされています。

    • コントローラーイメージの場合:
      • --set sidecar.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/aws-appmesh-envoy
      • 772975370895.dkr.ecr.me-south-1.amazonaws.com/amazon/appmesh-controller:v1.13.0

      • 856666278305.dkr.ecr.ap-east-1.amazonaws.com/amazon/appmesh-controller:v1.13.0

      • 909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/amazon/appmesh-controller:v1.13.0

      • 422531588944.dkr.ecr.eu-south-1.amazonaws.com/amazon/appmesh-controller:v1.13.0

      • 564877687649.dkr.ecr.il-central-1.amazonaws.com/amazon/appmesh-controller:v1.13.0

      • 924023996002.dkr.ecr.af-south-1.amazonaws.com/amazon/appmesh-controller:v1.13.0

    • サイドカー init イメージの場合:
      • --set sidecar.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/aws-appmesh-envoy
      • 772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod

      • 856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod

      • 909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod

      • 422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod

      • 564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod

      • 924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod

    重要

    App Mesh での使用は、バージョン v1.9.0.0-prod 以降のみサポートされています。

  10. コントローラーのバージョンが v1.4.0 以降であることを確認します。で変更ログを確認できます GitHub。

    kubectl get deployment appmesh-controller \ -n appmesh-system \ -o json | jq -r ".spec.template.spec.containers[].image" | cut -f2 -d ':'
    注記

    実行中のコンテナのログを表示すると、次のテキストを含む行が表示されますが、無視しても問題ありません。

    Neither -kubeconfig nor -master was specified. Using the inClusterConfig. This might not work.

ステップ2:App Mesh リソースをデプロイするには

Kubernetes でアプリケーションをデプロイするときは、Kubernetes カスタムリソースも作成し、コントローラーが対応する App Mesh リソースを作成できるようにします 次の手順は、App Mesh リソースの一部の機能をデプロイするのに役立ちます。他の App Mesh リソース機能をデプロイするためのマニフェストの例は、 の App Mesh チュートリアルに記載されている多くの機能フォルダのv1beta2サブフォルダにあります GitHub。

重要

コントローラーによって App Mesh リソースが作成されたら、App Mesh リソースの変更または削除は、コントローラーのみを使用して行うことをお勧めします。App Mesh を使用してリソースの変更または削除をする場合、デフォルトでは、コントローラーは、変更または削除された AppMesh リソースを10時間の間、変更または再作成しません。この期間を短く設定できます。詳細については、「 の設定」を参照してください GitHub。

App Mesh リソースをデプロイするには
  1. App Mesh リソースをデプロイする Kubernetes 名前空間を作成します。

    1. 次の内容をコンピュータ上の namespace.yaml という名前のファイルに保存します。

      apiVersion: v1 kind: Namespace metadata: name: my-apps labels: mesh: my-mesh appmesh.k8s.aws/sidecarInjectorWebhook: enabled
    2. 名前空間を作成します。

      kubectl apply -f namespace.yaml
  2. App Mesh サービスメッシュを作成します。

    1. 次の内容をコンピュータ上の mesh.yaml という名前のファイルに保存します。このファイルは、my-mesh という名前のメッシュリソースを作成するために使用されます。サービスメッシュは、サービス間のネットワークトラフィックの論理的な境界であり、サービスはその中に存在します。

      apiVersion: appmesh.k8s.aws/v1beta2 kind: Mesh metadata: name: my-mesh spec: namespaceSelector: matchLabels: mesh: my-mesh
    2. メッシュを作成します。

      kubectl apply -f mesh.yaml
    3. 作成された Kubernetes メッシュリソースの詳細を表示します。

      kubectl describe mesh my-mesh

      出力

      Name: my-mesh Namespace: Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"Mesh","metadata":{"annotations":{},"name":"my-mesh"},"spec":{"namespaceSelector":{"matchLa... API Version: appmesh.k8s.aws/v1beta2 Kind: Mesh Metadata: Creation Timestamp: 2020-06-17T14:51:37Z Finalizers: finalizers.appmesh.k8s.aws/mesh-members finalizers.appmesh.k8s.aws/aws-appmesh-resources Generation: 1 Resource Version: 6295 Self Link: /apis/appmesh.k8s.aws/v1beta2/meshes/my-mesh UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Spec: Aws Name: my-mesh Namespace Selector: Match Labels: Mesh: my-mesh Status: Conditions: Last Transition Time: 2020-06-17T14:51:37Z Status: True Type: MeshActive Mesh ARN: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh Observed Generation: 1 Events: <none>
    4. コントローラーによって作成された App Mesh サービスメッシュの詳細を表示します。

      aws appmesh describe-mesh --mesh-name my-mesh

      出力

      { "mesh": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh", "createdAt": "2020-06-17T09:51:37.920000-05:00", "lastUpdatedAt": "2020-06-17T09:51:37.920000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "spec": {}, "status": { "status": "ACTIVE" } } }
  3. App Mesh 仮想ノードを作成します。仮想ノードは、Kubernetes デプロイメントへの論理ポインタとして機能します。

    1. 次の内容をコンピュータ上の virtual-node.yaml という名前のファイルに保存します。このファイルは、my-service-a という名前の付いた App Mesh 仮想ノードを、my-apps 名前空間に作成するために使用されます。仮想ノードは、後のステップで作成される Kubernetes サービスを表します。hostname の値は、この仮想ノードが表す実際のサービスの完全修飾 DNS ホスト名です。

      apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualNode metadata: name: my-service-a namespace: my-apps spec: podSelector: matchLabels: app: my-app-1 listeners: - portMapping: port: 80 protocol: http serviceDiscovery: dns: hostname: my-service-a.my-apps.svc.cluster.local

      仮想ノードには、 end-to-end 暗号化やヘルスチェックなどの機能があり、このチュートリアルでは説明しません。詳細については、「仮想ノード」を参照してください。前述の仕様で設定できる仮想ノードで使用可能なすべての設定を表示するには、次のコマンドを実行します。

      aws appmesh create-virtual-node --generate-cli-skeleton yaml-input
    2. 仮想ノードをデプロイします。

      kubectl apply -f virtual-node.yaml
    3. 作成された Kubernetes 仮想ノードリソースの詳細を表示します。

      kubectl describe virtualnode my-service-a -n my-apps

      出力

      Name: my-service-a Namespace: my-apps Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"VirtualNode","metadata":{"annotations":{},"name":"my-service-a","namespace":"my-apps"},"s... API Version: appmesh.k8s.aws/v1beta2 Kind: VirtualNode Metadata: Creation Timestamp: 2020-06-17T14:57:29Z Finalizers: finalizers.appmesh.k8s.aws/aws-appmesh-resources Generation: 2 Resource Version: 22545 Self Link: /apis/appmesh.k8s.aws/v1beta2/namespaces/my-apps/virtualnodes/my-service-a UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Spec: Aws Name: my-service-a_my-apps Listeners: Port Mapping: Port: 80 Protocol: http Mesh Ref: Name: my-mesh UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Pod Selector: Match Labels: App: nginx Service Discovery: Dns: Hostname: my-service-a.my-apps.svc.cluster.local Status: Conditions: Last Transition Time: 2020-06-17T14:57:29Z Status: True Type: VirtualNodeActive Observed Generation: 2 Virtual Node ARN: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps Events: <none>
    4. App Mesh でコントローラーによって作成された仮想ノードの詳細を表示します。

      注記

      Kubernetes で作成される仮想ノードの名前は my-service-a ですが、App Mesh で作成される仮想ノードの名前は my-service-a_my-apps です。コントローラーは、App Mesh リソースの作成時に、Kubernetes 名前空間名を App Mesh 仮想ノード名に追加します。Kubernetes では、異なる名前空間に同じ名前の仮想ノードを作成できるため、名前空間名が追加されますがますが、App Mesh では仮想ノード名がメッシュ内で一意である必要があります。

      aws appmesh describe-virtual-node --mesh-name my-mesh --virtual-node-name my-service-a_my-apps

      出力

      { "virtualNode": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps", "createdAt": "2020-06-17T09:57:29.840000-05:00", "lastUpdatedAt": "2020-06-17T09:57:29.840000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "spec": { "backends": [], "listeners": [ { "portMapping": { "port": 80, "protocol": "http" } } ], "serviceDiscovery": { "dns": { "hostname": "my-service-a.my-apps.svc.cluster.local" } } }, "status": { "status": "ACTIVE" }, "virtualNodeName": "my-service-a_my-apps" } }
  4. App Mesh 仮想ルーターを作成します。仮想ルーターは、メッシュ内の 1 つ以上の仮想サービスのトラフィックを処理します。

    1. 次の内容をコンピュータ上の virtual-router.yaml という名前のファイルに保存します。このファイルは、前のステップで作成された my-service-a という名前の仮想ノードにトラフィックをルーティングする仮想ルーターを作成するために使用されます。コントローラーは App Mesh 仮想ルーターを作成し、リソースをルーティングします。ルートにさらに多くの機能を指定し、http 以外のプロトコルを使用することができます。詳細については、「仮想ルーター」および「ルート」を参照してください。参照される仮想ノード名は、 Kubernetes 仮想ノード名であり、コントローラーによって App Mesh で作成された App Mesh 仮想ノード名ではないことに注意してください。

      apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualRouter metadata: namespace: my-apps name: my-service-a-virtual-router spec: listeners: - portMapping: port: 80 protocol: http routes: - name: my-service-a-route httpRoute: match: prefix: / action: weightedTargets: - virtualNodeRef: name: my-service-a weight: 1

      (オプション) 前述の仕様で設定できる仮想ルーターに使用できるすべての設定を表示するには、次のコマンドを実行します。

      aws appmesh create-virtual-router --generate-cli-skeleton yaml-input

      前述の仕様で設定できるルートに使用できるすべての設定を表示するには、次のコマンドを実行します。

      aws appmesh create-route --generate-cli-skeleton yaml-input
    2. 仮想ルーターをデプロイします。

      kubectl apply -f virtual-router.yaml
    3. 作成された Kubernetes 仮想ルーターリソースを表示します。

      kubectl describe virtualrouter my-service-a-virtual-router -n my-apps

      省略された出力

      Name: my-service-a-virtual-router Namespace: my-apps Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"VirtualRouter","metadata":{"annotations":{},"name":"my-service-a-virtual-router","namespac... API Version: appmesh.k8s.aws/v1beta2 Kind: VirtualRouter ... Spec: Aws Name: my-service-a-virtual-router_my-apps Listeners: Port Mapping: Port: 80 Protocol: http Mesh Ref: Name: my-mesh UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Routes: Http Route: Action: Weighted Targets: Virtual Node Ref: Name: my-service-a Weight: 1 Match: Prefix: / Name: my-service-a-route Status: Conditions: Last Transition Time: 2020-06-17T15:14:01Z Status: True Type: VirtualRouterActive Observed Generation: 1 Route AR Ns: My - Service - A - Route: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps/route/my-service-a-route Virtual Router ARN: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps Events: <none>
    4. App Mesh でコントローラーによって作成された仮想ルーターリソースを表示します。コントローラーが App Mesh で仮想ルーターを作成したときに、仮想ルーターの名前に Kubernetes 名前空間名が追加されたため、namemy-service-a-virtual-router_my-apps を指定します。

      aws appmesh describe-virtual-router --virtual-router-name my-service-a-virtual-router_my-apps --mesh-name my-mesh

      出力

      { "virtualRouter": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps", "createdAt": "2020-06-17T10:14:01.547000-05:00", "lastUpdatedAt": "2020-06-17T10:14:01.547000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "spec": { "listeners": [ { "portMapping": { "port": 80, "protocol": "http" } } ] }, "status": { "status": "ACTIVE" }, "virtualRouterName": "my-service-a-virtual-router_my-apps" } }
    5. App Mesh でコントローラーによって作成されたルートリソースを表示します。その ルートは Kubernetes の仮想ルーター設定の一部であるため、ルートリソースが Kubernetes で作成されませんでした。ルート情報は、サブステップ c の Kubernetes リソースの詳細に表示されました。ルート名が仮想ルーターに固有であるため、コントローラーは、App Mesh  でルートを作成したときに、AppMesh ルート名に Kubernetes 名前空間名を追加しませんでした。

      aws appmesh describe-route \ --route-name my-service-a-route \ --virtual-router-name my-service-a-virtual-router_my-apps \ --mesh-name my-mesh

      出力

      { "route": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps/route/my-service-a-route", "createdAt": "2020-06-17T10:14:01.577000-05:00", "lastUpdatedAt": "2020-06-17T10:14:01.577000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "routeName": "my-service-a-route", "spec": { "httpRoute": { "action": { "weightedTargets": [ { "virtualNode": "my-service-a_my-apps", "weight": 1 } ] }, "match": { "prefix": "/" } } }, "status": { "status": "ACTIVE" }, "virtualRouterName": "my-service-a-virtual-router_my-apps" } }
  5. App Mesh 仮想サービスを作成します。仮想サービスは、仮想ノードが仮想ルーターを使用して直接または間接的に提供する実際のサービスを抽象化したものです。依存サービスは、仮想サービスを名前で呼び出します。名前は AppMesh にとって重要ではありませんが、仮想サービスに、仮想サービスが表す実際のサービスの完全修飾ドメイン名を付けるようお勧めします。このように仮想サービスに名前を付けることで、別の名前を参照するようにアプリケーションコードを変更する必要がなくなります。リクエストは、仮想サービスのプロバイダーとして指定されている仮想ノードまたは仮想ルーターにルーティングされます。

    1. 次の内容をコンピュータ上の virtual-service.yaml という名前のファイルに保存します。このファイルは、仮想ルータープロバイダーを使用して、前のステップで作成された my-service-a という名前の仮想ノードにトラフィックをルーティングする仮想サービスを作成するために使用されます。specawsName に対する値 は、この仮想サービスが抽象化する実際の Kubernetes サービスの完全修飾ドメイン名 (FQDN) です。Kubernetes サービスは「ステップ 3: サービスを作成または更新する」で作成されます。詳細については、「仮想サービス」を参照してください。

      apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualService metadata: name: my-service-a namespace: my-apps spec: awsName: my-service-a.my-apps.svc.cluster.local provider: virtualRouter: virtualRouterRef: name: my-service-a-virtual-router

      前述の仕様で設定できる仮想サービスに使用できるすべての設定を表示するには、次のコマンドを実行します。

      aws appmesh create-virtual-service --generate-cli-skeleton yaml-input
    2. 仮想サービスを作成します。

      kubectl apply -f virtual-service.yaml
    3. 作成された Kubernetes 仮想サービスリソースの詳細を表示します。

      kubectl describe virtualservice my-service-a -n my-apps

      出力

      Name: my-service-a Namespace: my-apps Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"VirtualService","metadata":{"annotations":{},"name":"my-service-a","namespace":"my-apps"}... API Version: appmesh.k8s.aws/v1beta2 Kind: VirtualService Metadata: Creation Timestamp: 2020-06-17T15:48:40Z Finalizers: finalizers.appmesh.k8s.aws/aws-appmesh-resources Generation: 1 Resource Version: 13598 Self Link: /apis/appmesh.k8s.aws/v1beta2/namespaces/my-apps/virtualservices/my-service-a UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Spec: Aws Name: my-service-a.my-apps.svc.cluster.local Mesh Ref: Name: my-mesh UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Provider: Virtual Router: Virtual Router Ref: Name: my-service-a-virtual-router Status: Conditions: Last Transition Time: 2020-06-17T15:48:40Z Status: True Type: VirtualServiceActive Observed Generation: 1 Virtual Service ARN: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualService/my-service-a.my-apps.svc.cluster.local Events: <none>
    4. App Mesh でコントローラーによって作成された仮想サービスリソースの詳細を表示します。仮想サービスの名前が一意の FQDN であるため、Kubernetes コントローラーは、App Mesh で仮想サービスを作成したときに、App Mesh 仮想サービス名に Kubernetes 名前空間名を追加しませんでした。

      aws appmesh describe-virtual-service --virtual-service-name my-service-a.my-apps.svc.cluster.local --mesh-name my-mesh

      出力

      { "virtualService": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualService/my-service-a.my-apps.svc.cluster.local", "createdAt": "2020-06-17T10:48:40.182000-05:00", "lastUpdatedAt": "2020-06-17T10:48:40.182000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "spec": { "provider": { "virtualRouter": { "virtualRouterName": "my-service-a-virtual-router_my-apps" } } }, "status": { "status": "ACTIVE" }, "virtualServiceName": "my-service-a.my-apps.svc.cluster.local" } }

このチュートリアルでは説明していませんが、コントローラーは App Mesh 仮想ゲートウェイゲートウェイルートをデプロイすることもできます。これらのリソースをコントローラーでデプロイするチュートリアルについては、「インバウンドゲートウェイ の設定」、または のリソースを含むサンプルマニフェストを参照してください GitHub。

ステップ 3: サービスを作成または更新する

App Mesh で使用するポッドには、App Mesh サイドカーコンテナを追加する必要があります。インジェクターは、指定したラベルでデプロイされたポッドに、自動的にサイドカーコンテナを追加します。

  1. プロキシ認証を有効にします。各 Kubernetes デプロイメントを有効にして、独自の App Mesh 仮想ノードの設定のみをストリーミングするようお勧めします。

    1. 次の内容をコンピュータ上の proxy-auth.json という名前のファイルに保存します。alternate-colored values は、独自の値に置き換えてください。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appmesh:StreamAggregatedResources", "Resource": [ "arn:aws:appmesh:Region-code:111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps" ] } ] }
    2. ポリシーを作成します。

      aws iam create-policy --policy-name my-policy --policy-document file://proxy-auth.json
    3. IAM ロールを作成して、前のステップで作成したポリシーをそれにアタッチし、Kubernetes サービスアカウントを作成した後、ポリシーを Kubernetes サービスアカウントにバインドします。このロールにより、コントローラーは App Mesh リソースの追加、削除、変更を行うことができます。

      eksctl create iamserviceaccount \ --cluster $CLUSTER_NAME \ --namespace my-apps \ --name my-service-a \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy \ --override-existing-serviceaccounts \ --approve

      AWS Management Console または を使用してサービスアカウントを作成する場合は AWS CLI、「Amazon EKS ユーザーガイド」の「サービスアカウントの IAM ロールとポリシーの作成」を参照してください。 AWS Management Console または を使用してアカウント AWS CLI を作成する場合は、ロールを Kubernetes サービスアカウントにマッピングする必要もあります。詳細については、「Amazon EKS ユーザーガイド」の「サービスアカウントの IAM ロールを指定する」を参照してください。

  2. (オプション) デプロイを Fargate ポッドにデプロイする場合は、Fargate プロファイルを作成する必要があります。eksctl をインストールしていない場合、「Amazon EKS ユーザーガイド」の「eksctl のインストールまたはアップグレード」の手順に従ってインストールできます。コンソールを使用してプロファイルを作成する場合は、「Amazon EKS ユーザーガイド」の「Fargate プロファイルの作成」を参照してください。

    eksctl create fargateprofile --cluster my-cluster --region Region-code --name my-service-a --namespace my-apps
  3. Kubernetes サービスとデプロイメントを作成します。App Mesh で使用する既存のデプロイがある場合は、「ステップ2:App Mesh リソースをデプロイするには」のサブステップ 3 で行ったように、仮想ノードをデプロイする必要があります。デプロイを更新して、そのラベルが仮想ノードに設定したラベルに一致しているか確認し、サイドカーコンテナが自動的にポッドに追加され、ポッドが再デプロイされるようにします。

    1. 次の内容をコンピュータ上の example-service.yaml という名前のファイルに保存します。名前空間名を変更して Fargate ポッドを使用している場合は、名前空間名が Fargate プロファイルで定義した名前空間名と一致していることを確認してください。

      apiVersion: v1 kind: Service metadata: name: my-service-a namespace: my-apps labels: app: my-app-1 spec: selector: app: my-app-1 ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-service-a namespace: my-apps labels: app: my-app-1 spec: replicas: 3 selector: matchLabels: app: my-app-1 template: metadata: labels: app: my-app-1 spec: serviceAccountName: my-service-a containers: - name: nginx image: nginx:1.19.0 ports: - containerPort: 80
      重要

      仕様の appmatchLabelsselector の値は、3 のサブステップ ステップ2:App Mesh リソースをデプロイするには で仮想ノードを作成したときに指定した値と一致する必要があります。一致しないと、サイドカーコンテナがポッドに挿入されません。前の例では、ラベルの値は my-app-1 です。仮想ノードではなく仮想ゲートウェイをデプロイする場合は、Deployment マニフェストには、Envoy コンテナのみを含める必要があります。使用する画像の詳細については、「Envoy イメージ」を参照してください。サンプルマンフェストについては、「」のデプロイ例を参照してください GitHub。

    2. サービスをデプロイします。

      kubectl apply -f example-service.yaml
    3. サービスとデプロイメントを表示します。

      kubectl -n my-apps get pods

      出力

      NAME READY STATUS RESTARTS AGE my-service-a-54776556f6-2cxd9 2/2 Running 0 10s my-service-a-54776556f6-w26kf 2/2 Running 0 18s my-service-a-54776556f6-zw5kt 2/2 Running 0 26s
    4. デプロイ済みポッドの 1 つの詳細を表示します。

      kubectl -n my-apps describe pod my-service-a-54776556f6-2cxd9

      省略された出力

      Name: my-service-a-54776556f6-2cxd9 Namespace: my-app-1 Priority: 0 Node: ip-192-168-44-157.us-west-2.compute.internal/192.168.44.157 Start Time: Wed, 17 Jun 2020 11:08:59 -0500 Labels: app=nginx pod-template-hash=54776556f6 Annotations: kubernetes.io/psp: eks.privileged Status: Running IP: 192.168.57.134 IPs: IP: 192.168.57.134 Controlled By: ReplicaSet/my-service-a-54776556f6 Init Containers: proxyinit: Container ID: docker://e0c4810d584c21ae0cb6e40f6119d2508f029094d0e01c9411c6cf2a32d77a59 Image: 111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager:v2 Image ID: docker-pullable://111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager Port: <none> Host Port: <none> State: Terminated Reason: Completed Exit Code: 0 Started: Fri, 26 Jun 2020 08:36:22 -0500 Finished: Fri, 26 Jun 2020 08:36:22 -0500 Ready: True Restart Count: 0 Requests: cpu: 10m memory: 32Mi Environment: APPMESH_START_ENABLED: 1 APPMESH_IGNORE_UID: 1337 APPMESH_ENVOY_INGRESS_PORT: 15000 APPMESH_ENVOY_EGRESS_PORT: 15001 APPMESH_APP_PORTS: 80 APPMESH_EGRESS_IGNORED_IP: 169.254.169.254 APPMESH_EGRESS_IGNORED_PORTS: 22 AWS_ROLE_ARN: arn:aws:iam::111122223333:role/eksctl-app-mesh-addon-iamserviceaccount-my-a-Role1-NMNCVWB6PL0N AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token ... Containers: nginx: Container ID: docker://be6359dc6ecd3f18a1c87df7b57c2093e1f9db17d5b3a77f22585ce3bcab137a Image: nginx:1.19.0 Image ID: docker-pullable://nginx Port: 80/TCP Host Port: 0/TCP State: Running Started: Fri, 26 Jun 2020 08:36:28 -0500 Ready: True Restart Count: 0 Environment: AWS_ROLE_ARN: arn:aws:iam::111122223333:role/eksctl-app-mesh-addon-iamserviceaccount-my-a-Role1-NMNCVWB6PL0N AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token ... envoy: Container ID: docker://905b55cbf33ef3b3debc51cb448401d24e2e7c2dbfc6a9754a2c49dd55a216b6 Image: 840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.4.0-prod Image ID: docker-pullable://840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy Port: 9901/TCP Host Port: 0/TCP State: Running Started: Fri, 26 Jun 2020 08:36:36 -0500 Ready: True Restart Count: 0 Requests: cpu: 10m memory: 32Mi Environment: APPMESH_RESOURCE_ARN: arn:aws:iam::111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps APPMESH_PREVIEW: 0 ENVOY_LOG_LEVEL: info AWS_REGION: us-west-2 AWS_ROLE_ARN: arn:aws:iam::111122223333:role/eksctl-app-mesh-addon-iamserviceaccount-my-a-Role1-NMNCVWB6PL0N AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Pulling 30s kubelet, ip-192-168-44-157.us-west-2.compute.internal Pulling image "111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager:v2" Normal Pulled 23s kubelet, ip-192-168-44-157.us-west-2.compute.internal Successfully pulled image "111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager:v2" Normal Created 21s kubelet, ip-192-168-44-157.us-west-2.compute.internal Created container proxyinit Normal Started 21s kubelet, ip-192-168-44-157.us-west-2.compute.internal Started container proxyinit Normal Pulling 20s kubelet, ip-192-168-44-157.us-west-2.compute.internal Pulling image "nginx:1.19.0" Normal Pulled 16s kubelet, ip-192-168-44-157.us-west-2.compute.internal Successfully pulled image "nginx:1.19.0" Normal Created 15s kubelet, ip-192-168-44-157.us-west-2.compute.internal Created container nginx Normal Started 15s kubelet, ip-192-168-44-157.us-west-2.compute.internal Started container nginx Normal Pulling 15s kubelet, ip-192-168-44-157.us-west-2.compute.internal Pulling image "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.4.0-prod" Normal Pulled 8s kubelet, ip-192-168-44-157.us-west-2.compute.internal Successfully pulled image "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.4.0-prod" Normal Created 7s kubelet, ip-192-168-44-157.us-west-2.compute.internal Created container envoy Normal Started 7s kubelet, ip-192-168-44-157.us-west-2.compute.internal Started container envoy

      上記の出力では、コントローラーによって envoy および proxyinit コンテナがポッドに追加されたことがわかります。サンプルサービスを Fargate にデプロイした場合は、envoy コンテナはコントローラーによってポッドに追加されましたが、proxyinit コンテナはそうではありませんでした。

  4. (オプション) Prometheus、Grafana、Jaeger AWS X-Ray、Datadog などのアドオンをインストールします。詳細については、「 の App Mesh アドオン」および「App Mesh ユーザーガイド」の「オブザーバビリティ」セクションを参照してください。 GitHub

注記

App Mesh のその他の例とチュートリアルについては、App Mesh サンプルリポジトリを参照してください。

ステップ 4: クリーンアップする

このチュートリアルで作成したサンプルリソースをすべて削除します。コントローラーは、my-mesh App Mesh サービスメッシュで作成されたリソースも削除します。

kubectl delete namespace my-apps

サンプルサービスの Fargate プロファイルを作成した場合は、それを削除します。

eksctl delete fargateprofile --name my-service-a --cluster my-cluster --region Region-code

メッシュを削除します。

kubectl delete mesh my-mesh

(オプション) Kubernetes 統合コンポーネントを削除できます。

helm delete appmesh-controller -n appmesh-system

(オプション) Kubernetes 統合コンポーネントを Fargate にデプロイした場合は、Fargate プロファイルを削除します。

eksctl delete fargateprofile --name appmesh-system --cluster my-cluster --region Region-code