在上图中,您可以看到Product Catalog应用中的所有服务都在 App Mesh 中运行。 每个服务都定义了一个 VirtualNode(
frontend-node
、prodcatalog
和 proddetail-v1
),以及 VirtualService(fontend-node
、prodcatalog
和 proddetail
)。 这些 VirtualServices 将流量发送到网格内的 VirtualRouters,后者又指定路由规则, 将流量转发到它们各自的 VirtualNode,并最终到达 Kubernetes 中的service endpoint。
在功能上,启用mesh的版本将与当前版本完全相同;
frontend-node
发出的请求将由 prodcatalog
后端服务处理;prodcatalog
发出的请求将由 proddetail-v1
后端服务处理;不同之处在于我们将使用 AWS App Mesh
来创建名为 prodcatalog
和 proddetail
的新Virtual Service
要将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
---
在 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 的成员。.
每个Product Catalog的版本还有 VirtualService 和 VirtualRouter 声明,用于建立到各自端点的路由, 这是通过添加指向 proddetail-v1
virtual node的 Route
来实现的。
在这个例子中,流量将发送到 VirtualRouters,然后将流量路由到 VirtualNodes。 查看 meshed_app.yaml
, proddetail
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及其资源了。