(可选)设置 AWS App Mesh - Amazon CloudWatch
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

(可选)设置 AWS App Mesh

CloudWatch Container Insights 中 Prometheus 支持的测试版支持 AWS App Mesh。本部分介绍如何设置 App Mesh。

CloudWatch Container Insights 还可以收集 App Mesh Envoy 访问日志。有关更多信息,请参阅(可选)启用 App Mesh Envoy 访问日志

配置 IAM 权限

必须将 AWSAppMeshFullAccess 策略添加到您的 Amazon EKS 或 Kubernetes 节点组的 IAM 角色中。在 Amazon EKS 上,此节点组名称类似于 eksctl-integ-test-eks-prometheus-NodeInstanceRole-ABCDEFHIJKL。在 Kubernetes 上,它可能类似于 nodes.integ-test-kops-prometheus.k8s.local

安装 App Mesh

请按照以下步骤安装 App Mesh。

安装 App Mesh 以测试 CloudWatch Container Insights Prometheus 支持

  1. 输入以下命令以添加 Helm 存储库。此存储库可用于 Amazon EKS 和 Kubernetes 集群。

    helm repo add eks https://aws.github.io/eks-charts
  2. 输入以下命令以应用 App Mesh 自定义资源定义:

    kubectl apply -f https://raw.githubusercontent.com/aws/eks-charts/master/stable/appmesh-controller/crds/crds.yaml
  3. 设置 App Mesh 工作负载的环境变量。下面的行用作示例,您可以选择自己的环境变量:

    APPMESH_NAME=appmesh-sample APPMESH_SYSTEM_NAMESPACE=appmesh-system-sample APPMESH_SAMPLE_TRAFFIC_NAMESPACE=appmesh-sample-traffic-test
  4. 通过输入以下命令安装 App Mesh 自定义资源定义控制器:

    kubectl create namespace $APPMESH_SYSTEM_NAMESPACE helm upgrade -i appmesh-controller eks/appmesh-controller \ --namespace $APPMESH_SYSTEM_NAMESPACE
  5. 通过输入以下命令安装 App Mesh 注入器:

    helm upgrade -i appmesh-inject eks/appmesh-inject \ --namespace $APPMESH_SYSTEM_NAMESPACE \ --set mesh.create=true \ --set mesh.name=$APPMESH_NAME \ --set stats.tagsEnabled=true
  6. (可选)要确认已创建示例服务网格,请从 https://console.amazonaws.cn/app-mesh/ 打开 App Mesh 控制台。将控制台设置为运行集群的 AWS 区域,然后选择网格。您应该看到一个名为 appmesh-sample 的新网格。

  7. 输入以下命令来创建 App Mesh 测试流量:

    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/prometheus-beta/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_traffic/appmesh/appmesh_traffic_sample.yaml | sed "s/{{appmeshname}}/$APPMESH_NAME/g" | sed "s/{{namespace}}/$APPMESH_SAMPLE_TRAFFIC_NAMESPACE/g" | kubectl apply -f -
  8. (可选)输入以下命令来安装第二个 App Mesh 工作负载服务,以生成 404 和 503 响应代码:

    APPMESH_SAMPLE_ERROR_TRAFFIC_NAMESPACE=appmesh-sample-errortraffic-test
    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/prometheus-beta/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_traffic/appmesh/appmesh_traffic_sample_4xx5xx.yaml | sed "s/{{appmeshname}}/$APPMESH_NAME/g" | sed "s/{{namespace}}/$APPMESH_SAMPLE_ERROR_TRAFFIC_NAMESPACE/g" | kubectl apply -f -
  9. 输入以下命令来查找流量生成器的名称:

    kubectl get pod -n $APPMESH_SAMPLE_TRAFFIC_NAMESPACE

    流量生成器位于 NAME 列中,以 traffic-generator 开头

  10. 输入以下命令来查找虚拟服务的名称:

    kubectl get virtualservice.appmesh.k8s.aws -n $APPMESH_SAMPLE_TRAFFIC_NAMESPACE
  11. 输入以下命令,在流量发生器 pod 中远程执行。使用您在步骤 9 中找到的流量生成器名称来替换 traffic-generator-name

    kubectl exec -ti traffic-generator-name bash -n $APPMESH_SAMPLE_TRAFFIC_NAMESPACE
  12. 使用您在步骤 10 中找到的虚拟服务的名称多次运行 curl 命令。

    curl virtual_servie_name:9080;echo
  13. 输入以下命令退出 pod:

    Exit
  14. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  15. 在运行集群的 AWS 区域中,选择指标。App Mesh 指标位于 ContainerInsights/Prometheus 命名空间中。

  16. 要查看 CloudWatch Logs 事件,请在导航窗格中选择日志组。这些事件位于日志组 /aws/containerinsights/your_cluster_name/prometheus 的日志流 kubernetes-pod-appmesh-envoyappmesh 中。

App Mesh 故障排除

以下内容可以帮助您对 App Mesh 测试设置进行故障排除。

Pod 已初始化,处于待处理状态

此示例设置创建 20 个 pod。您可以输入以下命令来检查是否有任何 pod 仍处于待处理状态:

kubectl get pod -n $APPMESH_SYSTEM_NAMESPACE kubectl get pod -n $APPMESH_SAMPLE_TRAFFIC_NAMESPACE kubectl get pod -n $APPMESH_SAMPLE_ERROR_TRAFFIC_NAMESPACE

如果有任何 pod 待处理,则您的集群可能没有足够的 CPU 或内存容量来预置所需的 pod。要解决这个问题,请为您的集群预置一个新的 EC2 实例。

运行 Load Generator 时出错

运行 Load Generator 时,您可能会看到以下消息:

curl: (7) Failed to connect to jazz.appmesh-sample-traffic-test.svc.cluster.local port 9080: Connection refused

这可能是因为节点组上未设置 App Mesh IAM 策略造成的。要解决此问题,请将 AWSAppMeshFullAccess 策略添加到您的 Amazon EKS 或 Kubernetes 节点组的 IAM 角色中。在 Amazon EKS 上,此节点组的名称类似于 eksctl-integ-test-eks-prometheus-NodeInstanceRole-ABCDEFHIJKL。在 Kubernetes 上,它可能类似于 nodes.integ-test-kops-prometheus.k8s.local

完成此操作后,请确认已创建示例服务网格。从 https://console.amazonaws.cn/app-mesh/ 打开 App Mesh 控制台。将控制台设置为运行集群的 AWS 区域,然后选择网格。您应该看到一个名为 appmesh-sample 的新网格。

删除 App Mesh 测试环境

完成使用 App Mesh 和流量生成器进行测试后,请使用以下命令删除不必要的资源。

输入以下命令删除示例流量:

curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/prometheus-beta/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_traffic/appmesh/appmesh_traffic_sample_4xx5xx.yaml | sed "s/{{appmeshname}}/$APPMESH_NAME/g" | sed "s/{{namespace}}/$APPMESH_SAMPLE_ERROR_TRAFFIC_NAMESPACE/g" | kubectl delete -f -curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/prometheus-beta/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_traffic/appmesh/appmesh_traffic_sample.yaml | sed "s/{{appmeshname}}/$APPMESH_NAME/g" | sed "s/{{namespace}}/$APPMESH_SAMPLE_TRAFFIC_NAMESPACE/g" | kubectl delete -f -

输入以下命令删除 App Mesh 控制器和注入器:

kubectl delete namespace appmesh-system-sample

删除 App Mesh 控制器集群级别的对象:

kubectl delete clusterrole appmesh-controller kubectl delete clusterrolebinding appmesh-controller

删除 App Mesh 注入器集群级别的对象:

kubectl delete clusterrole appmesh-inject kubectl delete clusterrolebinding appmesh-inject kubectl delete MutatingWebhookConfiguration appmesh-inject