Delivering modern cloud-native applications with open source technologies on Azure Kubernetes Service
Linkerd is a service sidecar designed to give service owners automatic observability, reliability, and runtime diagnostics for their service without requiring configuration or code changes. Linkerd is also a service mesh, running across an entire cluster to provide platform-wide telemetry, security, and reliability.
Linkerd is a graduated Cloud Native Computing Foundation (CNCF) project.
This lab will focus on the v2 release of Linkerd
Note: This lab uses a CLI tools that must be installed on your local machine. You will need to connect to your cluster from a local bash shell on your machine. (hint: use
az aks get-credentials
to setup access locally)
Remove the application pods/services from the cluster. We will re-deploy with linkerd.
helm uninstall service-tracker-ui -n hackfest
helm uninstall weather-api -n hackfest
helm uninstall quakes-api -n hackfest
helm uninstall flights-api -n hackfest
helm uninstall data-api -n hackfest
Install linkerd CLI on your machine
curl -sL https://run.linkerd.io/install | sh
export PATH=$PATH:$HOME/.linkerd2/bin
# verify CLI (ignore that the server version is unavailable)
linkerd version
Client version: stable-2.11.0
Server version: unavailable
Validate your Kubernetes cluster
linkerd check --pre
...
Status check results are [ok]
Install linkerd server components into AKS
linkerd install | kubectl apply -f -
Validate
linkerd check
...
Status check results are [ok]
Install viz extension
linkerd viz install | kubectl apply -f - # install the on-cluster metrics stack
Open the Dashboard
linkerd viz dashboard
Browse the dashboard:
Use helm template
to create manifest for injection
helm template ./kubernetes-hackfest/charts/data-api > ./kubernetes-hackfest/data-api.yaml
helm template ./kubernetes-hackfest/charts/flights-api > ./kubernetes-hackfest/flights-api.yaml
helm template ./kubernetes-hackfest/charts/quakes-api > ./kubernetes-hackfest/quakes-api.yaml
helm template ./kubernetes-hackfest/charts/weather-api > ./kubernetes-hackfest/weather-api.yaml
helm template ./kubernetes-hackfest/charts/service-tracker-ui > ./kubernetes-hackfest/service-tracker-ui.yaml
Re-deploy application using linkerd inject
linkerd inject ./kubernetes-hackfest/data-api.yaml | kubectl apply -n hackfest -f -
linkerd inject ./kubernetes-hackfest/flights-api.yaml | kubectl apply -n hackfest -f -
linkerd inject ./kubernetes-hackfest/quakes-api.yaml | kubectl apply -n hackfest -f -
linkerd inject ./kubernetes-hackfest/weather-api.yaml | kubectl apply -n hackfest -f -
linkerd inject ./kubernetes-hackfest/service-tracker-ui.yaml | kubectl apply -n hackfest -f -
Load test and review traffic in Dashboard
Note: There are a few ways we could create traffic on the API layer. You could create a load test pod in the cluster that hits the API’s on internal IP addresses. Below is a simple setup just for lab purposes.
Expose one of the API’s as a public IP
kubectl patch svc flights-api -n hackfest -p '{"spec":{"type":"LoadBalancer"}}'
Get the IP address of one of your API’s
kubectl get svc flights-api -n hackfest
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
flights-api ClusterIP 10.0.75.165 13.10.293.100 3003/TCP 100s
Create a variable with the URL
export APP_URL=http://<your_ip_address>:3003/status
while true; do curl -o /dev/null -s -w "%{http_code}\n" $APP_URL; sleep 1; done
Try some other Linkerd features
In this section you’ll have to work out the solution on your own. Some steps have been provided but ultimately you’ll need to use Linkerd to determine what’s going wrong with your application.
Install emojivoto
curl -sL https://run.linkerd.io/emojivoto.yml | linkerd inject - | kubectl apply -f -
Launch the Linkerd dashboard
linkerd viz dashboard
Browse the dashboard:
Figure out what’s breaking emojivoto!
Still having trouble? View the step by step cli commands here.
In this section we will diagnose and repair an issue with a sample application using Linkerd’s service profile resource.
Install Booksapp
kubectl create ns booksapp
curl -sL https://run.linkerd.io/booksapp.yml | kubectl -n booksapp apply -f -
Access the app
You can do this a number of different ways, expose it via a load balancer, add a mapping for your ingress, or port-forward it via the cli. We will show how to get to it from the cli.
kubectl -n booksapp port-forward svc/webapp 7000
Make some service profiles
# Create our first service profile using a swagger file
curl -sL https://run.linkerd.io/booksapp/webapp.swagger | linkerd -n booksapp profile --open-api - webapp
# Inspect the resulting yaml
# Begin applying service profiles
curl -sL https://run.linkerd.io/booksapp/webapp.swagger | linkerd -n booksapp profile --open-api - webapp | kubectl -n booksapp apply -f -
curl -sL https://run.linkerd.io/booksapp/authors.swagger | linkerd -n booksapp profile --open-api - authors | kubectl -n booksapp apply -f -
curl -sL https://run.linkerd.io/booksapp/books.swagger | linkerd -n booksapp profile --open-api - books | kubectl -n booksapp apply -f -
# Check out the new service profile objects
kubectl get serviceprofile
Diagnose our app using serviceprofiles
We’re going to use the linkerd cli to inspect our routes. Routes come from service profiles and allow us to instrument things like retries.
linkerd viz -n booksapp routes svc/webapp
linkerd viz -n booksapp routes deploy/webapp --to svc/books
linkerd viz -n booksapp routes deploy/books --to svc/authors
Fix it with retries
Now that we’ve diagnosed the issue we can repair it using serviceprofiles!
# Edit the service profile for the authors service
kubectl -n booksapp edit sp/authors.booksapp.svc.cluster.local
# in the editor go down to the route named HEAD /authors/{id}.json and add a new value after the name.
## Add the following to the yaml at the same indent as name:
## isRetryable: true
Now you should be able to watch booksapp begin succeeding on it’s end to end calls. For more information along with a step by step video please see this talk.