如何用EKS设置AWS App Mesh?

417 阅读5分钟

简介

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角色,将AWSAppMeshFullAccessAWSCloudMapFullAccess策略附加到其中,并将其绑定到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。