Installing Linkerd using Azure DevOps

Similar to a previous post, this is a small guide on how to create some glue code to ensure Linkerd is installed on a Kubernetes cluster.

Pre-Requisites

  • A YAML pipeline
  • A pipeline that can issue kubectl commands. This post has some clues on how to connect to an AKS cluster using the Azure CLI.

Installing Linkerd

First, define a pipeline variable for the version of Linkerd to use.

variables:  
 - name: LinkerdVersion
   value: stable-2.7.0

Then, assuming your agent can issue kubectl commands against a cluster. Meaning, you already connected, then you can proceed with using the plain bash task.

We will use instructions from the official Microsoft docs on how to install Linkerd, with some small modifications.

- bash: |
    set -e

    echo "installing linkerd"
    # Specify the Linkerd version that will be leveraged throughout these instructions
    LINKERD_VERSION=$(LinkerdVersion)

    curl -sLO "https://github.com/linkerd/linkerd2/releases/download/$LINKERD_VERSION/linkerd2-cli-$LINKERD_VERSION-linux"

    sudo cp ./linkerd2-cli-$LINKERD_VERSION-linux /usr/local/bin/linkerd
    sudo chmod +x /usr/local/bin/linkerd

The first line, set -e, will ensure that the pipeline fails when there’s an error in the bash script.

The next steps ensure that the Linkerd CLI is installed on the agent running the pipeline. We’ll use the Linkerd CLI to install Linkerd itself.

But first, check to see if Linkerd is already installed. Because we’ll run some pre-installation checks if Linkerd is truly not installed on the cluster. Once those checks pass, we’ll install Linkerd. Without checking that it’s already installed, the pipeline would fail for clusters in which Linkerd exists.

We’ll check pre-existing installation with kubectl and jq to see if there’s already a linkerd namespace.

LINKERD_NAMESPACE=$(kubectl get ns -o json | jq '.items[].metadata.name | select(.=="linkerd")')
if [ -z "$LINKERD_NAMESPACE" ]
then
  echo "Linkerd not installed. Installing Linkerd"
  echo "Running pre-checks with Linkerd"
  linkerd check --pre

  echo "Installing Linkerd"
  linkerd install | kubectl apply -f -
else 
  echo "Linkerd already installed"
fi

Lastly, we’ll run some checks to verify the health of the installation. Probably a good idea to run regardless if the pipeline installed Linkerd.

echo "Checking installation"
linkerd check

Putting it all together

- bash: |
    set -e

    echo "installing linkerd"
    # Specify the Linkerd version that will be leveraged throughout these instructions
    LINKERD_VERSION=$(LinkerdVersion)

    curl -sLO "https://github.com/linkerd/linkerd2/releases/download/$LINKERD_VERSION/linkerd2-cli-$LINKERD_VERSION-linux"

    sudo cp ./linkerd2-cli-$LINKERD_VERSION-linux /usr/local/bin/linkerd
    sudo chmod +x /usr/local/bin/linkerd

    LINKERD_NAMESPACE=$(kubectl get ns -o json | jq '.items[].metadata.name | select(.=="linkerd")')
    if [ -z "$LINKERD_NAMESPACE" ]
    then
      echo "Linkerd not installed. Installing Linkerd"
      echo "Running pre-checks with Linkerd"
      linkerd check --pre

      echo "Installing Linkerd"
      linkerd install | kubectl apply -f -
    else 
      echo "Linkerd already installed"
    fi
    echo "Checking installation"
    linkerd check
  continueOnError: false

That’s it!