Use cases for Amazon EKS Anywhere (EKS-A) with Gloo Mesh, an enhanced Istio service mesh
This blog will cover popular use cases and describe how to set up Amazon EKS Anywhere (EKS-A) and an Istio service mesh with Solo.io’s Gloo Mesh.
Hybrid cloud refers to the unification of public cloud and on-premises infrastructure. Leveraging compute environments across both environments allows you take advantage of the cost-effective scalability of public cloud as well as the dedicated and regulatory compliance benefits of private cloud. The true benefits of a hybrid cloud environment can be leveraged when your developers are able to consistently deploy and run their applications. The physical or virtual location, and other specifics of the underlying infrastructure should be abstracted from the developers and applications.
Amazon Elastic Kubernetes Service (EKS) lets you quickly create Kubernetes clusters across the AWS datacenter. The new EKS Anywhere offering extends this same experience to your datacenter and by allowing you to create and operate Kubernetes clusters on-premises, including on your own VMs and bare metal servers. Together, EKS and EKS-A take care of providing the environment for your developers to seamlessly and consistently deploy their applications anywhere.
The next piece of the puzzle is a service mesh – controlling, securing and observing the traffic flow between your microservices, regardless of where they are running. Gloo Mesh is enterprise Istio with multi-cluster and multi-mesh management capabilities across multiple clusters and VMs. Gloo Mesh can discover services, coordinate service meshes, configure and observe behavior, federate policies, and enforce security consistently.
Gloo Mesh uses a dedicated management plane and agents running on the mesh clusters to simplify service mesh adoption and add powerful networking capabilities. Gloo Mesh can discover meshes/workloads, establish federated identity, enable global traffic routing and load balancing, access control policy, centralized observability and more.
In this example, we’re going to use Gloo Mesh’s VirtualMesh resource to group the two Istio meshes across the public and private data centers into a single virtual mesh.
apiVersion: networking.mesh.gloo.solo.io/v1 kind: VirtualMesh metadata: name: virtual-mesh namespace: gloo-mesh spec: mtlsConfig: autoRestartPods: true shared: rootCertificateAuthority: generated: {} federation: selectors: - {} meshes: - name: istiod-istio-system-cluster1 namespace: gloo-mesh - name: istiod-istio-system-cluster2 namespace: gloo-mesh
Gloo Mesh handles all the complexities of managing identities, certificates, federation and generation of Istio ServiceEntry, DestinationRule and VirtualService resources that are needed for cross-cluster communication. Having your applications be able to run anywhere and securely talk to one another opens up a world of new use cases. Let’s take a look at a few popular ones.
Migrating to cloud with EKS-A and Istio service mesh
Incrementally migrate a workload to a different cluster without downtime. In this example, if we wanted to migrate Hello World from cluster1 (on-premises) to cluster2 (public cloud), you can deploy them both in parallel, and then use Gloo Mesh traffic shift policies to specify both as your destination from your existing gateway.
apiVersion: networking.enterprise.mesh.gloo.solo.io/v1beta1 kind: VirtualHost metadata: name: hw-virtualhost namespace: gloo-mesh spec: domains: - 'myapp.com' routes: - matchers: - uri: exact: /helloworld name: helloworld routeAction: destinations: - kubeService: name: helloworld namespace: ns1 clusterName: cluster1 weight: 90 - kubeService: name: helloworld namespace: ns2 clusterName: cluster2 weight: 10
This will generate an Istio VirtualService that does a 90-10 traffic shift on requests coming from ingress gateway on cluster1 to helloworld services on both clusters. If everything is working OK, you can point your domain to the ingress gateway in cluster2 instead of cluster1 and complete your migration.
Canary traffic shifting with EKS-A and Istio service mesh
In the previous example, we covered a north-south traffic flow. East-West traffic (between microservices) can also be controlled similarly using a Traffic Policy.
This allows you to deploy new versions of any microservice in a different cluster and perform tests by sending a subset of the traffic to the canary version.
apiVersion: networking.mesh.gloo.solo.io/v1 kind: TrafficPolicy metadata: namespace: gloo-mesh name: reviews-tp spec: destinationSelector: - kubeServiceRefs: services: - clusterName: cluster1 name: reviews namespace: default httpRequestMatchers: - headers: - name: end-user value: '.*@acme.com' regex: true policy: trafficShift: destinations: - kubeService: clusterName: cluster2 name: reviews namespace: default subset: version: v3
This traffic policy inspects the requests going to reviews in cluster1. If the request header has end-user that matches the email *@acme.com, it sends the request to reviews in cluster2 instead. This lets you test new functionality without deploying any applications to your production cluster or impacting your normal users.
Locality-based load balancing and failover with EKS-A and Istio service mesh
In a production environment, it’s common practice to add high availability and performance to the system by having multiple instances of an application running across clusters, zones, and regions. Traffic should be routed to the closest available destination, or be routed to a failover destination if issues occur.
Gloo Mesh’s VirtualDestination API lets you group microservices together into a single “global” endpoint. The composing services can be configured with outlier detection and the ability of the system to detect unresponsive services. Traffic will automatically be sorted into priority levels by proximity to the orginiating service, and failover when priorities become unhealthy.
apiVersion: networking.enterprise.mesh.gloo.solo.io/v1beta1 kind: VirtualDestination metadata: name: reviews-vd namespace: gloo-mesh spec: hostname: reviews.global port: number: 9080 protocol: http localized: outlierDetection: consecutiveErrors: 1 maxEjectionPercent: 100 interval: 5s baseEjectionTime: 30s destinationSelectors: - kubeServiceMatcher: labels: app: reviews virtualMesh: name: virtual-mesh namespace: gloo-mesh --- apiVersion: networking.mesh.gloo.solo.io/v1 kind: TrafficPolicy metadata: name: reviews-shift-failover namespace: gloo-mesh spec: destinationSelector: - kubeServiceRefs: services: - clusterName: cluster1 name: reviews namespace: default policy: trafficShift: destinations: - virtualDestination: name: reviews-vd namespace: gloo-mesh
In this example, the VirtualDestination is grouping the reviews service in all clusters under the single hostname “reviews.global”. The TrafficPolicy then redirects the local reviews traffic to the global hostname. Now, when productpage on cluster1 tries to talk to reviews, it will be routed to reviews on cluster1 as expected. If that reviews service fails the health check, it will be ejected from the routing list, and new requests will start flowing to reviews in cluster2.
You can set up your own EKS-A and Istio service mesh solution with Gloo Mesh and tackle the service-to-service communication challenges of microservices in a hybrid environment. The use cases covered in this post are just the basics.
Try Gloo Mesh, Gloo Mesh Gateway, and Gloo Portal today!
You can request a free trial of Gloo Mesh today here.
Join the #gloo-mesh and #gloo-portal channels in the Solo.io Slack.
See a comparison of Gloo Mesh editions and open source Istio.
Read our other blogs about how Solo works with Amazon EKS Anywhere: