Note: this demo uses a sample application from a separate repo (Kubernetes Hackfest)
-
Kubernetes secret
export RGNAME=oss-summit-west export COSMOSNAME=briarosssummit export APPINSIGHTS_INSTRUMENTATIONKEY=<replace me> export MONGODB_USER=$(az cosmosdb show --name $COSMOSNAME --resource-group $RGNAME --query "name" -o tsv) export MONGODB_PASSWORD=$(az cosmosdb list-keys --name $COSMOSNAME --resource-group $RGNAME --query "primaryMasterKey" -o tsv) kubectl create secret generic cosmos-db-secret --from-literal=user=$MONGODB_USER --from-literal=pwd=$MONGODB_PASSWORD --from-literal=appinsights=$APPINSIGHTS_INSTRUMENTATIONKEY -n tracker
-
Run app
kubectl apply -f ./k8s/ -n tracker OR kubectl apply -f ./data-api.yaml -n tracker kubectl apply -f ./data-api-2.yaml -n tracker
-
Generate activity (Artillery)
https://github.com/chzbrgr71/load-test-artillery
# simple test az container create --name flights-load-test1 --image chzbrgr71/loadtest:v2.0 --resource-group aci -o tsv --cpu 1 --memory 1 --environment-variables load_duration=-1 load_rate=5 load_url=104.40.29.56:3003/latest az container delete --yes --resource-group aci --name flights-load-test1 # run all export FLIGHTS_IP=$(kubectl get svc --namespace tracker flights-api -o jsonpath='{.status.loadBalancer.ingress[0].ip}') && echo $FLIGHTS_IP export QUAKES_IP=$(kubectl get svc --namespace tracker quakes-api -o jsonpath='{.status.loadBalancer.ingress[0].ip}') && echo $QUAKES_IP export WEATHER_IP=$(kubectl get svc --namespace tracker weather-api -o jsonpath='{.status.loadBalancer.ingress[0].ip}') && echo $WEATHER_IP for i in 1 2; do az container create --name flights-load-test${i} -l westus --image chzbrgr71/loadtest:v2.0 --resource-group aci -o tsv --cpu 1 --memory 1 --environment-variables load_duration=-1 load_rate=2 load_url=$FLIGHTS_IP:3003/latest az container create --name quakes-load-test${i} -l westus --image chzbrgr71/loadtest:v2.0 --resource-group aci -o tsv --cpu 1 --memory 1 --environment-variables load_duration=-1 load_rate=2 load_url=$QUAKES_IP:3012/latest az container create --name weather-load-test${i} -l westus --image chzbrgr71/loadtest:v2.0 --resource-group aci -o tsv --cpu 1 --memory 1 --environment-variables load_duration=-1 load_rate=2 load_url=$WEATHER_IP:3015/latest done
-
Show application
export WEB_URL=http://$(kubectl get svc --namespace tracker service-tracker-ui -o jsonpath='{.status.loadBalancer.ingress[0].ip}'):8080 && echo $WEB_URL
-
Install Linkerd
linkerd check --pre linkerd install | kubectl apply -f - linkerd check kubectl -n linkerd get deploy linkerd dashboard linkerd stat namespaces
-
Mesh application
# data-api first linkerd inject ./k8s/data-api.yaml | kubectl apply -n tracker -f - linkerd inject ./data-api-2.yaml | kubectl apply -n tracker -f - # the rest linkerd inject ./k8s/ | kubectl apply -n tracker -f - # 1 by 1 linkerd inject ./k8s/data-api-2.yaml | kubectl apply -n tracker -f - linkerd inject ./k8s/flights-api-canary.yaml | kubectl apply -n tracker -f - linkerd inject ./k8s/flights-api-v1.yaml | kubectl apply -n tracker -f - linkerd inject ./k8s/quakes-api.yaml | kubectl apply -n tracker -f - linkerd inject ./k8s/weather-api.yaml | kubectl apply -n tracker -f - linkerd inject ./k8s/service-tracker-ui.yaml | kubectl apply -n tracker -f - linkerd inject ./k8s/debug-pod.yaml | kubectl apply -n tracker -f -
-
Show Dashboard
linkerd dashboard
-
Interesting Linkerd commands
linkerd stat namespaces linkerd stat deployments -n tracker linkerd top namespace/tracker linkerd edges pod -n tracker
-
SMI Traffic Split
-
Remove flights-api
kubectl delete deploy -n tracker flights-api kubectl delete service -n tracker flights-api
-
Deploy v1
linkerd inject ./k8s/flights-api-v1.yaml | kubectl apply -n tracker -f -
-
Deploy canary build
linkerd inject ./k8s/flights-api-canary.yaml | kubectl apply -n tracker -f -
-
Debug pod
linkerd inject ./k8s/debug-pod.yaml | kubectl apply -n tracker -f - kubectl exec -it debug-57bf5cdf6-7j2mg -n tracker bash curl http://flights-api.tracker.svc.cluster.local:3003/status curl http://flights-api-v1.tracker.svc.cluster.local:3003/status curl http://flights-api-canary.tracker.svc.cluster.local:3003/status while true; do curl http://flights-api.tracker.svc.cluster.local:3003/status; sleep 1; done while true; do curl http://flights-api-canary.tracker.svc.cluster.local:3003/status; sleep 1; done
-
SMI Traffic Split
kubectl apply -f ./traffic-split.yaml -n tracker
-
-
Stop load testing
for i in 1 2; do az container delete --yes --resource-group aci --name flights-load-test${i} az container delete --yes --resource-group aci --name quakes-load-test${i} az container delete --yes --resource-group aci --name weather-load-test${i} done
-
Unmesh app
# 1 by 1 linkerd inject ./k8s/data-api-2.yaml | kubectl delete -n tracker -f - linkerd inject ./k8s/flights-api-canary.yaml | kubectl delete -n tracker -f - linkerd inject ./k8s/flights-api-v1.yaml | kubectl delete -n tracker -f - linkerd inject ./k8s/quakes-api.yaml | kubectl delete -n tracker -f - linkerd inject ./k8s/weather-api.yaml | kubectl delete -n tracker -f - linkerd inject ./k8s/service-tracker-ui.yaml | kubectl delete -n tracker -f - linkerd inject ./k8s/debug-pod.yaml | kubectl delete -n tracker -f -
kubectl delete -f ./traffic-split.yaml -n tracker kubectl delete -f ./k8s/ -n tracker
-
Uninstall Linkerd
linkerd install --ignore-cluster | kubectl delete -f -