linkerd2/bin/test-scale

169 lines
4.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# This test script deploys the following:
# - 1 Linkerd control-plane
# - 5 NAMESPACES x 5 REPLICAS of each:
# - Emojivoto demo app
# - Books demo app
# - Lifecycle / bb test environment
#
# Usage:
# test-scale /path/to/linkerd [namespace]
set -e
NAMESPACES=5
REPLICAS=5
# TODO: share these functions with test-run
check_linkerd_binary(){
printf 'Checking the linkerd binary...'
case "$linkerd_path" in
/*)
;;
*)
printf '\n[%s] is not an absolute path\n' "$linkerd_path"
exit 1
;;
esac
if [ ! -x "$linkerd_path" ]; then
printf '\n[%s] does not exist or is not executable\n' "$linkerd_path"
exit 1
fi
exit_code=0
"$linkerd_path" version --client > /dev/null 2>&1 || exit_code=$?
if [ $exit_code -ne 0 ]; then
printf '\nFailed to run linkerd version command\n'
exit $exit_code
fi
printf '[ok]\n'
}
check_if_k8s_reachable(){
printf 'Checking if there is a Kubernetes cluster available...'
exit_code=0
kubectl --request-timeout=5s get ns > /dev/null 2>&1 || exit_code=$?
if [ $exit_code -ne 0 ]; then
printf '\nFailed to connect to Kubernetes cluster\n'
exit $exit_code
fi
printf '[ok]\n'
}
linkerd_path=$1
if [ -z "$linkerd_path" ]; then
echo "usage: ${0##*/} /path/to/linkerd [namespace]" >&2
exit 64
fi
check_linkerd_binary
check_if_k8s_reachable
linkerd_version=$("$linkerd_path" version --client --short)
linkerd_namespace=${2:-l5d-scale}
#
# Deploy Linkerd
#
"$linkerd_path" -l "$linkerd_namespace" install | kubectl apply -f -
"$linkerd_path" -l "$linkerd_namespace" check --expected-version="$linkerd_version"
"$linkerd_path" -l "$linkerd_namespace" install-sp | kubectl apply -f -
#
# Deploy Books
#
BOOKS_BACKEND=$(curl -s https://raw.githubusercontent.com/BuoyantIO/booksapp/main/k8s/mysql-backend.yml)
AUTHORS_SP=$(curl -s https://run.linkerd.io/booksapp/authors.swagger)
BOOKS_SP=$(curl -s https://run.linkerd.io/booksapp/books.swagger)
WEBAPP_SP=$(curl -s https://run.linkerd.io/booksapp/webapp.swagger)
# deploy books backend and service profiles to N namespaces
for ((i=1; i <= NAMESPACES; i++)); do
booksns=$linkerd_namespace-books-$i
kubectl create ns "$booksns"
echo "$BOOKS_BACKEND" | kubectl apply -n "$booksns" -f -
echo "$AUTHORS_SP" | bin/linkerd profile -n "$booksns" authors --open-api - | kubectl apply -f -
echo "$BOOKS_SP" | bin/linkerd profile -n "$booksns" books --open-api - | kubectl apply -f -
echo "$WEBAPP_SP" | bin/linkerd profile -n "$booksns" webapp --open-api - | kubectl apply -f -
done
BOOKS_APP=$(curl -s https://raw.githubusercontent.com/BuoyantIO/booksapp/main/k8s/mysql-app.yml)
# add "-sleep=10ms" param to the traffic app (~100rps)
traffic_param=" - \"webapp:7000\""
sleep_param=$(cat <<-END
- "-sleep=10ms"
- "webapp:7000"
END
)
BOOKS_APP="${BOOKS_APP/$traffic_param/$sleep_param}"
# inject
BOOKS_APP=$(echo "$BOOKS_APP" | "$linkerd_path" -l "$linkerd_namespace" inject -)
# deploy books apps to N namespaces
for ((i=1; i <= NAMESPACES; i++)); do
booksns=$linkerd_namespace-books-$i
echo "waiting for $booksns mysql-init to complete..."
kubectl -n "$booksns" wait --for=condition=complete --timeout=5m job/mysql-init
echo "$BOOKS_APP" | kubectl apply -n "$booksns" -f -
kubectl -n "$booksns" scale --replicas=$REPLICAS deploy/authors deploy/books deploy/webapp
done
#
# Deploy Emojivoto
#
EMOJIVOTO=$(curl -s https://run.linkerd.io/emojivoto.yml)
# delete namespace
EMOJIVOTO=$(echo "$EMOJIVOTO" | tail -n +6)
emojins='namespace: emojivoto'
EMOJIVOTO="${EMOJIVOTO//$emojins/}"
emojins=.emojivoto:
newns=:
EMOJIVOTO="${EMOJIVOTO//$emojins/$newns}"
# inject
EMOJIVOTO=$(echo "$EMOJIVOTO" | "$linkerd_path" -l "$linkerd_namespace" inject -)
for ((i=1; i <= NAMESPACES; i++)); do
emojins=$linkerd_namespace-emoji-$i
kubectl create ns "$emojins"
echo "$EMOJIVOTO" | kubectl apply -n "$emojins" -f -
kubectl -n "$emojins" scale --replicas=$REPLICAS deploy/emoji deploy/voting deploy/web
done
#
# Lifecycle / bb
#
LIFECYCLE=$(curl -s https://raw.githubusercontent.com/linkerd/linkerd-examples/master/lifecycle/lifecycle.yml)
# inject
LIFECYCLE=$(echo "$LIFECYCLE" | $linkerd_path -l "$linkerd_namespace" inject -)
for ((i=1; i <= NAMESPACES; i++)); do
lifecyclens=$linkerd_namespace-lifecycle-$i
kubectl create ns "$lifecyclens"
echo "$LIFECYCLE" | kubectl apply -n "$lifecyclens" -f -
kubectl -n "$lifecyclens" scale --replicas=$REPLICAS deploy/bb-broadcast deploy/bb-p2p deploy/bb-terminus
done
#
# Watch performance
#
watch "$linkerd_path" -l "$linkerd_namespace" stat ns