简介
AWS App Mesh是一个服务网,它提供应用级网络,使您的服务能够轻松地在多种类型的计算基础设施上相互通信。此外,它还为您的应用程序提供了端到端的可视性和高可用性。此外,它使用Envoy一个开源代理,使其与广泛的AWS合作伙伴和开源工具兼容,用于连接和监控微服务。
App Mesh的组成部分
服务网- 服务网是驻扎在其中的服务之间的网络流量的逻辑边界。
虚拟服务-虚拟服务是真实服务的抽象,由虚拟节点直接或通过虚拟路由器间接提供。
虚拟节点- 一个虚拟节点作为一个特定任务组的逻辑指针,如ECS服务或Kubernetes部署。当你创建一个虚拟节点时,你必须为你的任务组指定服务发现名称。
Envoy代理 - Envoy代理配置你的微服务任务组,以使用你为虚拟路由器和虚拟节点设置的App Mesh服务网格流量规则。以及你需要在创建了你的虚拟节点、虚拟路由器、路由和虚拟服务后,将Envoy容器添加到你的任务组。
虚拟路由器- 虚拟路由器为你的网状结构中的一个或多个虚拟服务处理流量。
路由- 路由与虚拟路由器相关联,以便将符合服务名称前缀的流量引导到一个或多个虚拟节点。
先决条件
- AWS账户
- EKS集群
- AWS CLI
- Eksctl
- Kubectl
- ECR注册表
- 安装了3.0或更高版本的Helm。
让我们开始设置
1.连接到AWS账户
aws configure (Provide Access Key, Secret Access Key and Region)
2.2. 首先,如果你没有任何现有的EKS集群,请创建一个EKS集群。
eksctl create cluster --name mesh-test-cluster --version 1.21 --region ap-
south-1 --zones ap-south-1a,ap-south-1b --nodegroup-name cls-nodes --node-
type t2.micro --nodes 2


3.3.进一步与EKS集群连接,更新Kubeconfig。
aws eks --region ap-south-1 update-kubeconfig --name mesh-test-cluster


4.4.在Helm中添加eks-charts资源库
helm repo add eks https://aws.github.io/eks-charts
5.安装App Mesh Kubernetes自定义资源定义(CRD)
kubectl apply -k "https://github.com/aws/eks-charts/stable/appmesh-controller
/crds?ref=master"


6.创建appmesh-system命名空间
kubectl create ns appmesh-system


7.为你的集群创建一个OpenID Connect(OIDC)身份提供者
eksctl utils associate-iam-oidc-provider --region=ap-south-1 --cluster mesh-
test-cluster --approve


8.8.创建一个IAM角色,将AWSAppMeshFullAccess和AWSCloudMapFullAccess策略附加到其中,并将其绑定到appmesh-controller Kubernetes服务账户。
eksctl create iamserviceaccount \
--cluster mesh-test-cluster \
--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


9.部署App Mesh控制器。
helm upgrade -i appmesh-controller eks/appmesh-controller \
--namespace appmesh-system \
--set region=ap-south-1 \
--set serviceAccount.create=false \
--set serviceAccount.name=appmesh-controller


10.10.最后,验证控制器pod是否在运行


创建网格
当我们完成了app-mesh-contoller的设置后,我们可以继续进行Mesh创建。
我们可以通过Aws-cli、AWS Console和Kubernetes native yaml来创建Mesh。然而,现在我将使用yaml创建。
让我们创建一个Mesh.yaml文件,内容如下:
apiVersion: appmesh.k8s.aws/v1beta2
kind: Mesh
metadata:
name: knol-mesh
spec:
namespaceSelector:
matchLabels:
mesh: knol-mesh
11.创建Mesh并验证


12.由于Mesh已经创建,我们可以通过在命名空间中添加如下标签来启用/禁用sidecar注入。
创建一个文件namespace.yaml,加入以下内容:
apiVersion: v1
kind: Namespace
metadata:
name: mesh-workload
labels:
appmesh.k8s.aws/sidecarInjectorWebhook: enabled


**注意:**一旦你启用了注入,你需要有Mesh组件,否则现有的pods,如果被终止将不会出现等待Mesh资源。


13.此外,其余的网状资源也可以通过Aws-cli、AWS控制台和Kubernetes本地yaml来创建。现在我们将使用yaml来创建。
虚拟节点
用以下内容创建virtual-node.yaml并应用:
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualNode
metadata:
name: knol-service
namespace: mesh-workload
spec:
awsName: knol-service-virtual-node
podSelector:
matchLabels:
app: knol-service
listeners:
- portMapping:
port: 80
protocol: http
serviceDiscovery:
dns:
hostname: knol-service.mesh-workload.svc.cluster.local


虚拟路由器和路由
用下面的内容创建virtual-route.yaml并应用:
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualRouter
metadata:
namespace: mesh-workload
name: knol-service
spec:
awsName: knol-service-virtual-router
listeners:
- portMapping:
port: 80
protocol: http
routes:
- name: route
httpRoute:
match:
prefix: /
action:
weightedTargets:
- virtualNodeRef:
name: knol-service
weight: 1


虚拟服务
创建具有以下内容的virtual-service.yaml并应用:
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualService
metadata:
name: knol-service
namespace: mesh-workload
spec:
awsName: knol-service-virtual-service
provider:
virtualRouter:
virtualRouterRef:
name: knol-service


14.一旦所有的资源都被创建,我们就可以创建服务和部署。
创建一个服务账户。
用下面的内容创建serviceaccount.yaml并应用:
apiVersion: v1
kind: ServiceAccount
metadata:
name: knol-service
namespace: mesh-workload
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::Account_ID:role/appmesh_role


注意: 用上面创建的角色更新角色-arn,将AWSAppMeshFullAccess和AWSCloudMapFullAccess策略附加到它。
部署工作负载
用以下内容创建deployment.yaml文件并应用:
apiVersion: v1
kind: Service
metadata:
name: knol-service
namespace: mesh-workload
labels:
app: knol-service
spec:
selector:
app: knol-service
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: knol-service
namespace: mesh-workload
labels:
app: knol-service
spec:
replicas: 1
selector:
matchLabels:
app: knol-service
template:
metadata:
labels:
app: knol-service
spec:
serviceAccountName: knol-service
containers:
- name: nginx
image: nginx:1.19.0
ports:
- containerPort: 80


在成功实施上述步骤后,我们可以看到pod已经出现了一个sidecar容器,它将负责建立服务之间的通信。


最终,作为一个结果,集群中的所有服务都可以通过调用相应的服务名称来相互通信。


**注意:**App Mesh默认不允许任何流量进入Mesh之外。如果你的应用被设计为连接Mesh外的其他资源,你可能需要为Mesh启用出口流量。
总结
在这篇文章中,我们了解了如何在EKS集群中设置AWS App Mesh。