visit
There are many challenges that engineering teams face when attempting to incorporate a multi-cloud approach into their infrastructure goals. Kubernetes does a good job of addressing some of these issues, but managing the communication of clusters that span multiple cloud providers in multiple regions can become a daunting task for teams. Often this requires complex VPNs and special firewall rules to multi-cloud cluster communication.
In this post, I will be introducing you to Skupper, an open source project for enabling secure communication across Kubernetes cluster. Skupper allows your application to span multiple cloud providers, data centers, and regions. Let's see it in action!
In this tutorial, you will deploy the productpage and ratings services on a remote, public cluster in namespace
aws-eu-west
and the details and reviews services in a local, on-premises cluster in namespace laptop
.OverviewFigure 1 - Bookinfo service deploymentIf all services were installed on the public cluster, then the application would work as originally designed. However, since two of the services are on the laptop cluster, the application fails. productpage can not send requests to details or to reviews.
This demo will show how Skupper can solve the connectivity problem presented by this arrangement of service deployments.Figure 2 - Bookinfo service deployment with Skupper
kubectl
command-line tool, version 1.15 or later ()skupper
command-line tool, the latest version ()Namespace
aws-eu-west
:$ kubectl apply -f public-cloud.yaml
service/productpage created
deployment.extensions/productpage-v1 created
service/ratings created
deployment.extensions/ratings-v1 created
Namespace
laptop
:$ kubectl apply -f private-cloud.yaml
service/details created
deployment.extensions/details-v1 created
service/reviews created
deployment.extensions/reviews-v3 created
Namespace
aws-eu-west
:kubectl expose deployment/productpage-v1 --port 9080 --type LoadBalancer
The Bookinfo application is accessed from the public internet through this ingress port to the productpage service.
The web address for the Bookinfo application can be discovered from namespace
aws-eu-west
:$ echo $(kubectl get service/productpage -o jsonpath='//{.status.loadBalancer.ingress[0].hostname}:9080')
Open the address in a web browser. Productpage responds but the page will show errors as services in namespace
laptop
are not reachable.We can fix that now.Namespace
laptop
:skupper init
Namespace
aws-eu-west
:skupper init
Now the Skupper infrastructure is running. Use
skupper status
in each console terminal to see that Skupper is available.The
skupper connection-token <file>
command directs Skupper to generate a secret token file with certificates that grant permission to other Skupper instances to connect to this Skupper's network.Note: Protect this file as you would do for any file that holds login credentials.skupper connect <file>
command directs Skupper to connect to another Skupper's network. This step completes the Skupper connection.Note that in this arrangement the Skupper instances join to form peer networks. Typically the Skupper opening the network port will be on the public cluster. A cluster running on
laptop
may not even have an address that is reachable from the internet. After the connection is made, the Skupper network members are peers and it does not matter which Skupper opened the network port and which connected to it.The console terminals in this demo are run by the same user on the same host. This makes the token file in the ${HOME} directory available to both terminals. If your terminals are on different machines then you may need to use
scp
or a similar tool to transfer the token file to the system hosting the laptop
terminal.Namespace
aws-eu-west
:skupper connection-token ${HOME}/PVT-to-PUB-connection-token.yaml
Namespace
laptop
:skupper connect ${HOME}/PVT-to-PUB-connection-token.yaml
Namespace
aws-eu-west
:$ skupper status
Skupper enabled for "aws-eu-west". It is connected to 1 other sites.
Namespace
laptop
:$ skupper status
Skupper enabled for "laptop". It is connected to 1 other sites.
You now have a Skupper network capable of multi-cluster communication but no services are associated with it. This step uses the
kubectl annotate
command to notify Skupper that a service is to be included in the Skupper network.Skupper uses the annotation as the indication that a service must be virtualized. The service that receives the annotation is the physical target for network requests and the proxies that Skupper deploys in other namespaces are the virtual targets for network requests. The Skupper infrastructure then routes requests between the virtual services and the target service.Namespace
aws-eu-west
:$ kubectl annotate service ratings skupper.io/proxy=http
service/ratings annotated
Namespace
laptop
:$ kubectl annotate service details skupper.io/proxy=http
service/details annotated
$ kubectl annotate service reviews skupper.io/proxy=http
service/reviews annotated
Skupper is now making the annotated services available to every namespace in the Skupper network. The Bookinfo application will work as the productpage service on the public cluster has access to the details and reviews services on the private cluster and as the reviews service on the private cluster has access to the ratings service on the public cluster.
The web address for the Bookinfo app can be discovered from namespace
aws-eu-west
:$ echo $(kubectl get service/productpage -o jsonpath='//{.status.loadBalancer.ingress[0].hostname}:9080')
Namespace
aws-eu-west
:skupper delete
kubectl delete -f public-cloud.yaml
Namespace
laptop
:skupper delete
kubectl delete -f private-cloud.yaml
Previously posted at .