开始使用Amazon App Mesh和 Kubernetes - Amazon App Mesh
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

开始使用Amazon App Mesh和 Kubernetes

当你集成Amazon App Mesh在 Kubernetes 使用适用于 Kubernetes 的App Mesh 格控制器时,您可以管理App Mesh,例如网格、虚拟节点、虚拟路由器以及通过 Kubernetes 的路由。您也可以自动向 Kubernetes Pod 规范中添加App Mesh 附加容器映像。本教程将指导您完成适用于 Kubernetes 的App Mesh 控制器的安装,以便启用此集成。

以下 Kubernetes 自定义资源定义的部署附带了控制器:meshesvirtual servicesvirtual nodesvirtual routers。控制器密切注意自定义资源的创建、修改和删除,并更改相应的 App Mesh。服务网格虚拟服务虚拟节点虚拟网关网关路由虚拟路由器(包括路由) 资源通过App Mesh API。要了解更多信息或帮助改进控制器,请参阅GitHub项目.

控制器还会安装一个 Webhook,将以下容器注入标有您指定名称的 Kubernetes pod 中。

  • App Mesh 代理— Envoy 使用在 App Mesh 控制平面中定义的配置来确定将应用程序流量发送到何处。

  • App Mesh 代理路由管理器— 更新iptablesPod 的网络命名空间中通过 Envoy 路由传入和传出流量的规则。此容器作为 Kubernetes init 容器运行在 pod 中。

先决条件

  • 已已已已了解App Mesh。有关更多信息,请参阅 什么是 Amazon App Mesh?

  • 已对 Kubernetes 概念有所了解。有关更多信息,请参阅 。什么是 KubernetesKubernetes 文档中的。

  • 现有 Kubernetes 集群。如果您没有现有集群,请参阅Amazon EKS 上的中的Amazon EKS 上的. 如果您在 Amazon EC2 上运行自己的 Kubernetes 集群,请确保 Docker 已通过 Envoy 映像所在的 Amazon ECR 存储库进行身份验证。有关更多信息,请参阅 。Envoy注册表身份验证Amazon Elastic Container Registry从私有注册表拉取镜像Kubernetes 文档中的。

  • App Mesh 支持已注册到 DNS 的 Linux 服务,Amazon Cloud Map,或同时使用两者。要使用此入门指南,我们建议您提供三个已注册到 DNS 的现有服务。本主题中的步骤假定现有服务已命名为serviceAserviceB, 和serviceBv2并且所有服务都可以通过名为的命名空间被发现apps.local.

    即使服务不存在,您也可以创建服务网格及其资源,但在部署实际服务之前,您无法使用网格。

  • 这些区域有:Amazon CLI版本 1.18.116 或更高版本或已安装 2.0.38 或更高版本。要安装或升级 Amazon CLI,请参阅安装 Amazon CLI

  • 配置为与您的 Kubernetes 集群通信的 kubectl 客户端。如果您正在使用Amazon Elastic Kubernetes Service,则可以使用用于安装kubectl并配置一个kubeconfig文件。

  • Helm 版本 3.0 或更高版本已安装。如果您没有安装 Helm,请参阅将 Helm 与 Amazon EKS 结合使用中的Amazon EKS 上的.

  • 亚马逊 EKS 目前仅支持IPv4_ONLYIPv6_ONLY只有 IP 首选项,因为 Amazon EKS 目前仅支持只能提供服务的 podIPv4流量或仅限流量IPv6流量。

剩余步骤假定实际服务命名为 serviceAserviceBserviceBv2,并且可以在名为 apps.local 的命名空间中发现所有服务。

第 1 步:安装集成组件

在要托管与结合使用的 Pod 的每个集群中,安装一次集成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.

  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已安装,请参阅安装或升级eksctl中的Amazon EKS 上的. 如果您希望使用控制台创建配置文件,请参阅创建 Fargate 配置文件中的Amazon EKS 上的.

    eksctl create fargateprofile --cluster $CLUSTER_NAME --name appmesh-system --namespace appmesh-system
  7. 为您的集群创建 OpenID Connect (OIDC) 身份提供商。如果您没有eksctl已安装,则可以使用中的说明安装它安装或升级eksctl中的Amazon EKS 上的. 如果您希望使用控制台创建提供商,请参阅在集群上为服务账户启用 IAM 角色中的Amazon EKS 上的.

    eksctl utils associate-iam-oidc-provider \ --region=$AWS_REGION \ --cluster $CLUSTER_NAME \ --approve
  8. 创建 IAM 角色,附加AWSAppMeshFullAccessAWSCloudMapFullAccess Amazon托管策略绑定到它,并将其绑定到appmesh-controllerKubernetes 服务账户。该角色使控制器能够添加、删除和更改 App Mesh 资源。

    注意

    使用命令可以创建Amazon自动生成的名称的 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

    如果您更愿意使用Amazon Web Services Management Console要么Amazon CLI,请参阅为服务账户创建 IAM 角色和策略中的Amazon EKS 上的. 如果使用 Amazon Web Services Management Console 或 Amazon CLI 创建账户,则还需要将角色映射到 Kubernetes 服务账户。有关更多信息,请参阅 。为服务账户指定 IAM 角色中的Amazon EKS 上的.

  9. 部署 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.

    重要

    如果您的集群位于cn-north-1要么cn-northwest-1,则需要向上一个命令添加以下选项。

    Replaceaccount-id区域代码使用一组适当的值。

    --set sidecar.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com.cn/aws-appmesh-envoy
    • 9193660293.dkr.ecr.cn-north-1.amazonaws.com.cn/aws-appmesh-envoy:v1.22.2.0-prod

    • 91983073561.dkr.ecr.cn-northwest-1.amazonaws.com.cn/aws-appmesh-envoy:v1.22.2.0-prod

    --set init.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com.cn/aws-appmesh-proxy-route-manager
    • 9193660293.dkr.ecr.cn-north-1.amazonaws.com.cn/aws-appmesh-proxy-route-经理

    • 91983073561.dkr.ecr.cn-northwest-1.amazonaws.com.cn/aws-appmesh-proxy-route-经理

    --set image.repository=account-id.dkr.ecr.Region-code.amazonaws.com.cn/appmesh-controller
    • 918309763551.dkr.ecr.cn-north-1.amazonaws.com.cn/亚马逊/appmesh-controller

    • 961992271922.dkr.ecr.cn-northwest-1.amazonaws.com.cn/亚马逊/appmesh-controller

    重要

    如果您的集群位于me-south-1ap-east-1eu-south-1,或者af-south-1Regions,则需要在上一个命令中添加以下选项:

    Replaceaccount-id区域代码使用一组适当的值。

    • 对于边车图片:

      • --set image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/amazon/appmesh-controller
      • 77297537085.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.22.2.0-prod

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

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

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

    • 较旧的镜像 URI 可以在更改日志上 GitHub. 这些区域有:Amazon存在映像的帐户的版本已更改v1.5.0. 旧版本的映像托管在Amazon在Amazon Elastic Kubernetes Service 上找到账户Amazon 容器镜像注册表.

    • 对于控制器映像:

      • --set sidecar.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/aws-appmesh-envoy
      • 772975370895.dkr.ecr.me-south-1.amazonaws.com/亚马逊/appmesh-controller: v1.5.0

      • 856666278305.dkr.ecr.ap-east-1.amazonaws.com/亚马逊/appmesh-controller: v1.5.0

      • 422531588944.dkr.ecr.eu-south-1.amazonaws.com/亚马逊/appmesh-controller: v1.5.0

      • 924023996002.dkr.ecr.af-south-1.amazonaws.com/亚马逊/appmesh-controller: v1.5.0

    • 对于边车初始化图片:

      • --set sidecar.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/aws-appmesh-envoy
      • 77297537085.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-proxy-route-manager: v5-prod

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

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

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

    重要

    仅支持版本 v1.9.0.0-prod 或更高版本与 App Mesh 配合使用。

  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 在v1beta2列出的许多功能文件夹的子文件夹App Mesh 演练上 GitHub.

重要

控制器创建 App Mesh 资源后,建议您仅使用控制器对应用程序网格资源进行更改或删除 App Mesh 资源。如果您使用 App Mesh 对资源进行更改或删除,则默认情况下,控制器将在十小时内不会更改或重新创建所更改或删除的 App Mesh 资源。您可以将此持续时间配置为更短的时间。有关更多信息,请参阅 。配置上 GitHub.

部署 App Mesh 资源

  1. 创建 Kubernetes 命名空间以部署App Mesh 资源。

    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 的文件中。该文件用于创建名为的 App Mesh 虚拟节点my-service-a中的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. 将以下内容保存到计算机上名为 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 中创建的虚拟路由器资源。你指定my-service-a-virtual-router_my-apps为了name,因为当控制器在 App Mesh 中创建虚拟路由器时,它会在虚拟路由器的名称后附加 Kubernetes 命名空间名称。

      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 格中创建路由时,不将 Kubernetes 命名空间名称附加到App Mesh 路由名称,因为路由名称对虚拟路由器唯一。

      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 服务。虚拟服务是一种抽象的实际服务,由虚拟节点直接提供或通过虚拟路由器的方式间接提供。从属服务按名称调用您的虚拟服务。虽然名称对于 App Mesh 并不重要,但建议将虚拟服务命名为虚拟服务所代表的实际服务的完全限定域名。通过这种方式命名虚拟服务,您无需更改应用程序代码即可引用其他名称。请求路由到指定作为虚拟服务提供程序的虚拟节点或虚拟路由器。

    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 中创建的虚拟服务资源的详细信息。Kubernetes 控制器在应用网格中创建虚拟服务时,不将 Kubernetes 命名空间名称附加到App Mesh,因为虚拟服务的名称是唯一的 FQDN。

      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 任何 Pod 必须已经添加了App Mesh 附加容器。注入器会自动将附加容器添加到使用您指定的标签部署的任意 pod 中。

  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

      如果您更愿意使用Amazon Web Services Management Console要么Amazon CLI,请参阅为服务账户创建 IAM 角色和策略中的Amazon EKS 上的. 如果使用 Amazon Web Services Management Console 或 Amazon CLI 创建账户,则还需要将角色映射到 Kubernetes 服务账户。有关更多信息,请参阅 。为服务账户指定 IAM 角色中的Amazon EKS 上的.

  2. (可选)如果您的部署要部署到 Fargate pod,则需要创建 Fargate 配置文件。如果您没有eksctl已安装,则可以使用中的说明安装它安装或升级eksctl中的Amazon EKS 上的. 如果您希望使用控制台创建配置文件,请参阅创建 Fargate 配置文件中的Amazon EKS 上的.

    eksctl create fargateprofile --cluster my-cluster --region Region-code --name my-service-a --namespace my-apps
  3. 创建 Kubernetes 服务和部署。如果您有要与 App Mesh 结合使用的现有部署,则需要像在子步骤中那样部署虚拟节点3第 2 步:部署 App Mesh 资源. 更新部署以确保其标签与您在虚拟节点上设置的标签相匹配,这样附加容器会自动添加到 pod 中并重新部署 pod。

    1. 将以下内容保存到计算机上名为 example-service.yaml 的文件中。如果您更改命名空间名称并使用 Fargate pod,请确保命名空间名称与您在 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 中的值必须与您在 第 2 步:部署 App Mesh 资源 的子步骤 3 中创建虚拟节点时指定的值相匹配,否则附加容器将不会注入到 pod 中。在前面的示例中,标签的值为 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. 查看已部署的 Pod 之一的详细信息。

      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

      在前面的输出中,您可以看到控制器已将 proxyinitenvoy 容器添加到 Pod。如果您将示例服务部署到 Fargate,那么envoy容器是由控制器添加到 pod 的,但是proxyinit容器不是。

  4. (可选)安装附加组件,例如 Prometheus、Grafana、Amazon X-Ray、Jaeger 和 Datadog。有关更多信息,请参阅 。App Mesh 插件上 GitHub 和可观察性App Mesh 用户指南的部分。

注意

有关 App Mesh 的更多示例和演练,请参阅App Mesh 示例存储库.

第 4 步:清除

删除本教程中创建的所有示例资源。控制器还会删除在my-meshApp 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