翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS App Mesh および Kubernetes の開始方法
Kubernetes 用 App Mesh コントローラーを使用して Kubernetes AWS App Mesh と統合する場合、メッシュ、仮想サービス、仮想ノード、仮想ルーター、Kubernetes 経由のルートなどの App Mesh リソースを管理します。また、Kubernetes ポッド仕様に App Mesh サイドカーコンテナイメージを自動的に追加できます。このチュートリアルでは、Kubernetes 用 App Mesh コントローラーをインストールして、この統合を有効にする方法について説明します。
コントローラーには、Kubernetes カスタムリソース定義 meshes
、virtual services
、virtual nodes
、virtual routers
のデプロイが備わっています。コントローラーは、カスタムリソースの作成、変更、削除を監視し、App Mesh を介して対応する App Mesh サービスメッシュ、、仮想サービス仮想ノード仮想ゲートウェイ、、 ゲートウェイルート 仮想ルーター ( を含むルート) リソースを変更しますAPI。詳細を確認したり、コントローラーに貢献したりするには、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 ユーザーガイド」の「Amazon の開始EKS方法」を参照してください。 EKS Amazon で独自の Kubernetes クラスターを実行している場合はEC2、Envoy イメージがある Amazon ECRリポジトリに対して Docker が認証されていることを確認します。詳細については、「Amazon Elastic Container Registry ユーザーガイド」の「Envoy イメージ」、「レジストリの認証」、および「Kubernetesドキュメント」の「プライベートレジストリからイメージをプルする
」を参照してください。 -
App Mesh はDNS、、 AWS Cloud Map、またはその両方に登録されている Linux サービスをサポートします。この入門ガイドを使用するには、 に登録されている 3 つの既存のサービスがあることをお勧めしますDNS。このトピックの手順は、既存のサービスが、
serviceA
、serviceB
、serviceBv2
という名前で、すべてのサービスが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 ユーザーガイド」の「Amazon での Helm EKS の使用」を参照してください。 EKS
-
Amazon EKS は現在、
IPv4_ONLY
とIPv6_ONLY
のみの IP 設定をサポートしています。EKSAmazon は現在、IPv4
トラフィックのみ、またはIPv6
トラフィックのみを提供できるポッドのみをサポートしています。
残りのステップでは、実際のサービスが serviceA
、serviceB
、serviceBv2
という名前で、すべてのサービスが apps.local
という名前の名前空間を介して検出可能であることを前提としています。
ステップ 1: 統合コンポーネントをインストールする
App Mesh で使用するポッドをホストする各クラスターに、統合コンポーネントを 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。 -
eks-charts
リポジトリを Helm に追加します。helm repo add eks https://aws.github.io/eks-charts
-
App Mesh Kubernetes カスタムリソース定義 () をインストールしますCRD。
kubectl apply -k "https://github.com/aws/eks-charts/stable/appmesh-controller/crds?ref=master"
-
コントローラーの Kubernetes 名前空間を作成します。
kubectl create ns appmesh-system
-
後の手順で使用するために、次の数を設定します。
とcluster-name
を既存のクラスターの値に置き換えます。Region-code
export CLUSTER_NAME=
cluster-name
export AWS_REGION=Region-code
-
(オプション) Fargate でコントローラーを実行する場合は、Fargate プロファイルを作成する必要があります。
eksctl
をインストールしていない場合は、「Amazon EKS ユーザーガイド」の「インストールまたはアップグレードeksctl
」を参照してください。コンソールを使用してプロファイルを作成する場合は、「Amazon ユーザーガイド」の「Fargate プロファイルの作成」を参照してください。 EKSeksctl create fargateprofile --cluster $CLUSTER_NAME --name
appmesh-system
--namespaceappmesh-system
-
クラスターの OpenID Connect (OIDC) ID プロバイダーを作成します。
eksctl
をインストールしていない場合は、「Amazon EKSユーザーガイド」の「インストールまたはアップグレードeksctl
」の手順でインストールできます。コンソールを使用してプロバイダーを作成する場合は、「Amazon EKS ユーザーガイド」の「クラスターでサービスアカウントのIAMロールを有効にする」を参照してください。eksctl utils associate-iam-oidc-provider \ --region=$AWS_REGION \ --cluster $CLUSTER_NAME \ --approve
-
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 ユーザーガイド」の「サービスアカウントの IAMロールとポリシーの作成」を参照してください。 EKS AWS Management Console または を使用してアカウント AWS CLI を作成する場合は、ロールを Kubernetes サービスアカウントにマッピングする必要もあります。詳細については、「Amazon EKS ユーザーガイド」の「サービスアカウントの IAMロールの指定」を参照してください。
-
App Mesh コントローラーをデプロイします。すべての設定オプションのリストについては、「 の設定
」を参照してください GitHub。 -
プライベートクラスターの App Mesh コントローラーをデプロイするには、まず App Mesh とサービス検出の Amazon VPCエンドポイントをリンクされたプライベートサブネットに有効にする必要があります。また、
accountId
を設定する必要があります。--set accountId=$AWS_ACCOUNT_ID
プライベートクラスターで X-Ray トレースを有効にするには、X-Ray および 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ユーザーガイド」の「プライベートクラスター」を参照してください。
-
他のクラスターの 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-1
、ap-east-1
、ap-southeast-3
、eu-south-1
、il-central-1
、またはaf-south-1
リージョンにある場合は、前のコマンドに次のオプションを追加する必要があります。置換
account-id
また、Region-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.6.1-prod
-
856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.29.6.1-prod
-
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.29.6.1-prod
-
422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.6.1-prod
-
564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-envoy:v1.29.6.1-prod
-
924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.6.1-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.1
-
856666278305.dkr.ecr.ap-east-1.amazonaws.com/amazon/appmesh-controller:v1.13.1
-
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/amazon/appmesh-controller:v1.13.1
-
422531588944.dkr.ecr.eu-south-1.amazonaws.com/amazon/appmesh-controller:v1.13.1
-
564877687649.dkr.ecr.il-central-1.amazonaws.com/amazon/appmesh-controller:v1.13.1
-
924023996002.dkr.ecr.af-south-1.amazonaws.com/amazon/appmesh-controller:v1.13.1
-
-
サイドカー 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 以降のみサポートされています。
-
-
コントローラーのバージョンが
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時間の間、変更または再作成しません。この期間を短く設定できます。詳細については、「 の設定
App Mesh リソースをデプロイするには
-
App Mesh リソースをデプロイする Kubernetes 名前空間を作成します。
-
次の内容をコンピュータ上の
namespace.yaml
という名前のファイルに保存します。apiVersion: v1 kind: Namespace metadata: name:
my-apps
labels: mesh:my-mesh
appmesh.k8s.aws/sidecarInjectorWebhook: enabled -
名前空間を作成します。
kubectl apply -f namespace.yaml
-
-
App Mesh サービスメッシュを作成します。
-
次の内容をコンピュータ上の
mesh.yaml
という名前のファイルに保存します。このファイルは、
という名前のメッシュリソースを作成するために使用されます。サービスメッシュは、サービス間のネットワークトラフィックの論理的な境界であり、サービスはその中に存在します。my-mesh
apiVersion: appmesh.k8s.aws/v1beta2 kind: Mesh metadata: name:
my-mesh
spec: namespaceSelector: matchLabels: mesh:my-mesh
-
メッシュを作成します。
kubectl apply -f mesh.yaml
-
作成された 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>
-
コントローラーによって作成された 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" } } }
-
-
App Mesh 仮想ノードを作成します。仮想ノードは、Kubernetes デプロイメントへの論理ポインタとして機能します。
-
次の内容をコンピュータ上の
virtual-node.yaml
という名前のファイルに保存します。ファイルは、
で という名前の App Mesh 仮想ノードを作成するために使用されます。my-service-a
名前空間。仮想ノードは、後のステップで作成される Kubernetes サービスを表します。の値は、この仮想ノードが表す実際のサービスの完全修飾DNSホスト名my-apps
hostname
です。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
-
仮想ノードをデプロイします。
kubectl apply -f virtual-node.yaml
-
作成された Kubernetes 仮想ノードリソースの詳細を表示します。
kubectl describe virtualnode
my-service-a
-nmy-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>
-
App Mesh でコントローラーによって作成された仮想ノードの詳細を表示します。
注記
Kubernetes で作成される仮想ノードの名前は
ですが、App Mesh で作成される仮想ノードの名前はmy-service-a
です。コントローラーは、App Mesh リソースの作成時に、Kubernetes 名前空間名を App Mesh 仮想ノード名に追加します。Kubernetes では、異なる名前空間に同じ名前の仮想ノードを作成できるため、名前空間名が追加されますがますが、App Mesh では仮想ノード名がメッシュ内で一意である必要があります。my-service-a_my-apps
aws appmesh describe-virtual-node --mesh-name
my-mesh
--virtual-node-namemy-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" } }
-
-
App Mesh 仮想ルーターを作成します。仮想ルーターは、メッシュ内の 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
-
仮想ルーターをデプロイします。
kubectl apply -f virtual-router.yaml
-
作成された Kubernetes 仮想ルーターリソースを表示します。
kubectl describe virtualrouter
my-service-a-virtual-router
-nmy-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>
-
App Mesh でコントローラーによって作成された仮想ルーターリソースを表示します。コントローラーが App Mesh で仮想ルーターを作成したときに、仮想ルーターの名前に Kubernetes 名前空間名が追加されたため、
name
のmy-service-a-virtual-router_my-apps
を指定します。aws appmesh describe-virtual-router --virtual-router-name
my-service-a-virtual-router_my-apps
--mesh-namemy-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" } }
-
App Mesh でコントローラーによって作成されたルートリソースを表示します。その ルートは Kubernetes の仮想ルーター設定の一部であるため、ルートリソースが Kubernetes で作成されませんでした。ルート情報は、サブステップ
c
の Kubernetes リソースの詳細に表示されました。ルート名が仮想ルーターに固有であるため、コントローラーは、App Mesh でルートを作成したときに、AppMesh ルート名に Kubernetes 名前空間名を追加しませんでした。aws appmesh
describe-route
\ --route-namemy-service-a-route
\ --virtual-router-namemy-service-a-virtual-router_my-apps
\ --mesh-namemy-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" } }
-
-
App Mesh 仮想サービスを作成します。仮想サービスは、仮想ノードが仮想ルーターを使用して直接または間接的に提供する実際のサービスを抽象化したものです。依存サービスは、仮想サービスを名前で呼び出します。名前は AppMesh にとって重要ではありませんが、仮想サービスに、仮想サービスが表す実際のサービスの完全修飾ドメイン名を付けるようお勧めします。このように仮想サービスに名前を付けることで、別の名前を参照するようにアプリケーションコードを変更する必要がなくなります。リクエストは、仮想サービスのプロバイダーとして指定されている仮想ノードまたは仮想ルーターにルーティングされます。
-
次の内容をコンピュータ上の
virtual-service.yaml
という名前のファイルに保存します。このファイルは、仮想ルータープロバイダーを使用して、前のステップで作成されたmy-service-a
という名前の仮想ノードにトラフィックをルーティングする仮想サービスを作成するために使用されます。awsName
の の値は、この仮想サービスが抽象化する実際の Kubernetes サービスの完全修飾ドメイン名 (FQDN)spec
です。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
-
仮想サービスを作成します。
kubectl apply -f virtual-service.yaml
-
作成された Kubernetes 仮想サービスリソースの詳細を表示します。
kubectl describe virtualservice
my-service-a
-nmy-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>
-
App Mesh でコントローラーによって作成された仮想サービスリソースの詳細を表示します。仮想サービスの名前は一意の であるため、Kubernetes コントローラーは App Mesh で仮想サービスを作成したときに、Kubernetes 名前空間名を App Mesh 仮想サービス名に追加しませんでしたFQDN。
aws appmesh describe-virtual-service --virtual-service-name
my-service-a.my-apps.svc.cluster.local
--mesh-namemy-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 仮想ゲートウェイ と ゲートウェイルートをデプロイすることもできます。これらのリソースをコントローラーでデプロイするチュートリアルについては、「インバウンドゲートウェイ の設定
ステップ 3: サービスを作成または更新する
App Mesh で使用するポッドには、App Mesh サイドカーコンテナを追加する必要があります。インジェクターは、指定したラベルでデプロイされたポッドに、自動的にサイドカーコンテナを追加します。
-
プロキシ認証を有効にします。各 Kubernetes デプロイメントを有効にして、独自の App Mesh 仮想ノードの設定のみをストリーミングするようお勧めします。
-
次の内容をコンピュータ上の
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" ] } ] } -
ポリシーを作成します。
aws iam create-policy --policy-name
my-policy
--policy-document file://proxy-auth.json -
IAM ロールを作成し、前のステップで作成したポリシーをそのロールにアタッチし、Kubernetes サービスアカウントを作成し、ポリシーを Kubernetes サービスアカウントにバインドします。このロールにより、コントローラーは App Mesh リソースの追加、削除、変更を行うことができます。
eksctl create iamserviceaccount \ --cluster $CLUSTER_NAME \ --namespace
my-apps
\ --namemy-service-a
\ --attach-policy-arn arn:aws:iam::111122223333
:policy/my-policy
\ --override-existing-serviceaccounts \ --approveAWS Management Console または を使用してサービスアカウントを作成する場合は AWS CLI、「Amazon ユーザーガイド」の「サービスアカウントの IAM ロールとポリシーの作成」を参照してください。 EKS AWS Management Console または を使用してアカウント AWS CLI を作成する場合は、ロールを Kubernetes サービスアカウントにマッピングする必要もあります。詳細については、「Amazon EKS ユーザーガイド」の「サービスアカウントの IAMロールの指定」を参照してください。
-
-
(オプション) デプロイを Fargate ポッドにデプロイする場合は、Fargate プロファイルを作成する必要があります。
eksctl
をインストールしていない場合は、「Amazon EKSユーザーガイド」の「インストールまたはアップグレードeksctl
」の手順でインストールできます。コンソールを使用してプロファイルを作成する場合は、「Amazon ユーザーガイド」の「Fargate プロファイルの作成」を参照してください。 EKSeksctl create fargateprofile --cluster
my-cluster
--regionRegion-code
--namemy-service-a
--namespacemy-apps
-
Kubernetes サービスとデプロイメントを作成します。App Mesh で使用する既存のデプロイがある場合は、「ステップ2:App Mesh リソースをデプロイするには」のサブステップ
3
で行ったように、仮想ノードをデプロイする必要があります。デプロイを更新して、そのラベルが仮想ノードに設定したラベルに一致しているか確認し、サイドカーコンテナが自動的にポッドに追加され、ポッドが再デプロイされるようにします。-
次の内容をコンピュータ上の
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
重要
仕様の
app
、matchLabels
、selector
の値は、3
のサブステップ ステップ2:App Mesh リソースをデプロイするには で仮想ノードを作成したときに指定した値と一致する必要があります。一致しないと、サイドカーコンテナがポッドに挿入されません。前の例では、ラベルの値はmy-app-1
です。仮想ノードではなく仮想ゲートウェイをデプロイする場合は、Deployment
マニフェストには、Envoy コンテナのみを含める必要があります。使用する画像の詳細については、「Envoy イメージ」を参照してください。サンプルマンフェストについては、「」のhttps://github.com/aws/aws-app-mesh-examples/blob/main/walkthroughs/howto-k8s-ingress-gateway/v1beta2/manifest.yaml.template#L585「 デプロイの例」を参照してください GitHub。 -
サービスをデプロイします。
kubectl apply -f
example-service.yaml
-
サービスとデプロイメントを表示します。
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
-
デプロイ済みポッドの 1 つの詳細を表示します。
kubectl -n
my-apps
describe podmy-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
コンテナはそうではありませんでした。
-
-
(オプション) 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
--clustermy-cluster
--regionRegion-code
メッシュを削除します。
kubectl delete mesh
my-mesh
(オプション) Kubernetes 統合コンポーネントを削除できます。
helm delete appmesh-controller -n appmesh-system
(オプション) Kubernetes 統合コンポーネントを Fargate にデプロイした場合は、Fargate プロファイルを削除します。
eksctl delete fargateprofile --name
appmesh-system
--clustermy-cluster
--regionRegion-code