Mesh resources及设计

App Mesh 设计

App Mesh 在上图中,您可以看到Product Catalog应用中的所有服务都在 App Mesh 中运行。 每个服务都定义了一个 VirtualNode(frontend-nodeprodcatalogproddetail-v1),以及 VirtualService(fontend-nodeprodcatalogproddetail)。 这些 VirtualServices 将流量发送到网格内的 VirtualRouters,后者又指定路由规则, 将流量转发到它们各自的 VirtualNode,并最终到达 Kubernetes 中的service endpoint。

使用App Mesh后将有什么不同?
  • 在功能上,启用mesh的版本将与当前版本完全相同;

    • frontend-node 发出的请求将由 prodcatalog 后端服务处理;
    • prodcatalog 发出的请求将由 proddetail-v1 后端服务处理;
  • 不同之处在于我们将使用 AWS App Mesh 来创建名为 prodcatalogproddetail 的新Virtual Service

App Mesh Resources

Mesh

要将Product Catalog应用迁移到 App Mesh,首先需要创建一个mesh。 还需要将标签应用于 prodcatalog-ns 命名空间,以将新的mesh与其关联,并为其中的 pod 启用自动sidecar注入。

如下面的mesh.yaml ,可以看到我们将所需的标签添加到 prodcatalog-ns 命名空间,并声明了名为 prodcatalog-mesh 的mesh。

---
apiVersion: v1
kind: Namespace
metadata:
  name: prodcatalog-ns
  labels:
    mesh: prodcatalog-mesh
    gateway: ingress-gw
    appmesh.k8s.aws/sidecarInjectorWebhook: enabled
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: Mesh
metadata:
  name: prodcatalog-mesh
spec:
  namespaceSelector:
    matchLabels:
      mesh: prodcatalog-mesh
---
VirtualNode

在 App Mesh 中运行的 Kubernetes 应用对象必须定义为VirtualNode。 它为 App Mesh 提供了对 k8s deployment和service等对象的抽象,并提供了用于通信和路由配置的端点。 查看meshed_app.yaml ,下面是frontend-node 服务的VirtualNode声明:

---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualNode
metadata:
  name: frontend-node
  namespace: prodcatalog-ns
spec:
  podSelector:
    matchLabels:
      app: frontend-node
      version: v1
  listeners:
    - portMapping:
        port: 9000
        protocol: http
  backends:
    - virtualService:
        virtualServiceRef:
          name: prodcatalog
    - virtualService:
        virtualServiceRef:
          name: prodsummary
  serviceDiscovery:
    dns:
      hostname: frontend-node.prodcatalog-ns.svc.cluster.local
  logging:
    accessLog:
      file:
        path: /dev/stdout
---

它使用 podSelector 来标识哪些 Pods 是这个 VirtualNode 的成员。.

VirtualService and VirtualRouter

每个Product Catalog的版本还有 VirtualService 和 VirtualRouter 声明,用于建立到各自端点的路由, 这是通过添加指向 proddetail-v1 virtual node的 Route 来实现的。

在这个例子中,流量将发送到 VirtualRouters,然后将流量路由到 VirtualNodes。 查看 meshed_app.yamlproddetail VirtualService 和 VirtualRouter 将流量路由到后端服务proddetail-v1:

---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualService
metadata:
  name: proddetail
  namespace: prodcatalog-ns
spec:
  awsName: proddetail.prodcatalog-ns.svc.cluster.local
  provider:
    virtualRouter:
      virtualRouterRef:
        name: proddetail-router
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualRouter
metadata:
  name: proddetail-router
  namespace: prodcatalog-ns
spec:
  listeners:
    - portMapping:
        port: 3000
        protocol: http
  routes:
    - name: proddetail-route
      httpRoute:
        match:
          prefix: /
        action:
          weightedTargets:
            - virtualNodeRef:
                name: proddetail-v1
              weight: 100
---

了解了基本结构后,就可以创建mesh及其资源了。