Automate Harness Kubernetes Delegate Setup
You can use a simple script to support GitOps scenarios where you want to name, configure, and install a Harness Kubernetes Delegate from a repo.
Developers often need to create Delegates in multiple cluster in their environments (DEV, UAT, SIT, STAGE, PROD, etc). This script method gives developers a quick alternative to using the manual process in the Harness Manager.
In this topic:
- Before You Begin
- Step 1: Download the Base Delegate
- Step 2: Create the Script
- Step 3: Create a New Delegate
- Step 4: Deploy the Delegate
- Step 5: Add the Script and File to Your Repo
- Option 1: Deploy using the Script
- Notes
- Next Steps
Before You Begin
Step 1: Download the Base Delegate
You will use one Harness Kubernetes Delegate as the base for all of the Delegates you generate automatically.
- In Harness, click Setup, and then click Harness Delegates.
- Click Download Delegate, and then click Kubernetes YAML. The Delegate settings appear.
- Enter a name for the Delegate, select a Profile (the default is named Primary), and click Download.The name is limited to
^[a-z0-9-]+$
because it is a StatefulSet name. Remember this when generating Delegates automatically.The harness-delegate-kubernetes.tar.gz file is downloaded. - Extract the file by double-clicking it or using the command
tar -zxvf harness-delegate-kubernetes.tar.gz
.
The harness-delegate-kubernetes folder is where you will save your script. The folder contains the harness-delegate.yaml file for the Delegate. Your script will use this file to create additional Delegate YAML files.
Step 2: Create the Script
The script you will create uses harness-delegate.yaml to generate a new Delegate YAML file.
Each time you run the script, you will provide a new Delegate name.
Let's create the script:
In the harness-delegate-kubernetes folder, create a file and paste in the following script:
SRC_FILE=harness-delegate.yaml
TMP_FILE=harness-delegate.tmp
DELEGATE_NAME=$1
if [ $# -lt 1 ]; then
echo "usage utils.sh <name>"
exit 0
fi
DST_FILE=harness-${DELEGATE_NAME}.yaml
if [ -f $DST_FILE ]; then
echo "File $DST_FILE exists. Exiting..."
exit 1
fi
if [ ! -f ${TMP_FILE} ]; then
echo "creating $TMP_FILE"
cp $SRC_FILE $TMP_FILE
dname=$(sed -n "1,/^.*harness.io.name/s?^.*harness.io/name: ??p" $TMP_FILE)
sed -i -e "s/$dname/DELEGATENAME/" $TMP_FILE
fi
echo "creating $DST_FILE"
cp $TMP_FILE $DST_FILE
sed -i -e "s/DELEGATENAME/${DELEGATE_NAME}/" $DST_FILESave the file and name it utils.sh.
Open a Terminal and navigate to the harness-delegate-kubernetes folder where you saved your script.
Enter the following command to make the utils.sh file executable:
chmod a+x utils.sh
Now the script is ready to run.
Step 3: Create a New Delegate
When you use the utils.sh script to generate a new Delegate YAML file, you will run the following command:
./utils.sh <name>
You will supply a name for the <name>
parameter passed to the script.
There are many different conventions for naming the Delegate. Many customers use a combination of the following to create a unique Delegate name:
- environment prefix
- application name
- namespace
The name is limited to ^[a-z0-9-]+$
because it is a StatefulSet name.
Here is an example using the name mydelegate-dev
with utils.sh:
./utils.sh mydelegate-dev
The output is:
creating harness-delegate.tmp
creating harness-mydelegate-dev.yaml
If you look in the harness-delegate-kubernetes folder you will see the new YAML file created using the name you provided: harness-mydelegate-dev.yaml.
If you open the file you will see that the Delegate spec uses the name you provided:
...
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
harness.io/app: harness-delegate
harness.io/account: lnfzrf
harness.io/name: mydelegate-dev
# Name must contain the six letter account identifier: lnfzrf
name: mydelegate-dev-lnfzrf
namespace: harness-delegate
spec:
replicas: 1
selector:
matchLabels:
harness.io/app: harness-delegate
harness.io/account: lnfzrf
harness.io/name: mydelegate-dev
...
A suffix such as -lnfzrf
is a Harness convention for identifying the Harness account. Do not remove it.
Step 4: Deploy the Delegate
To install the new Delegate you created with the script, do the following:
- Log into your Kubernetes cluster.
- Use
kubectl apply
as shown below:
```
kubectl apply -f harness-mydelegate-dev.yaml
```
The output is:
namespace/harness-delegate created
clusterrolebinding.rbac.authorization.k8s.io/harness-delegate-cluster-admin created
secret/mydelegate-dev-proxy created
statefulset.apps/mydelegate-dev-sdqvgx created
Step 5: Add the Script and File to Your Repo
You can now add the harness-delegate-kubernetes folder containing the script and harness-delegate.yaml to your repo.
Now your developers do not need to use the Harness Manager to create Delegates. They can use the utils.sh script in your repo to create new Delegates and then install them in their target cluster.
Option 1: Deploy using the Script
If you want to use the utlis.sh script to both create and deploy the new Delegate, you can add the following line to the end the utlis.sh script:
kubectl apply -f $DST_FILE
Add this line before making the script executable, and then save the script and run chmod a+x utils.sh
to make it executable.
Now you can copy the harness-delegate-kubernetes folder containing the script and harness-delegate.yaml to your cluster and simply run script using the new Delegate name:
./utils.sh <name>
The new Delegate is created and deployed in the cluster.
Notes
- Selectors and Scopes — Harness does not support a way to automatically add Selectors or Delegate Scope for Delegates. Currently, you must add these attributes to Delegate manually in the Harness Manager.
- Delete a Delegate — To delete a Harness Delegate from your Kubernetes cluster, delete the StatefulSet for the Delegate. Deleting the pod without deleting the StatefulSet will result in the pod being recreated.
For example, if you have the Delegate pod namemydelegate-vutpmk-0
, you can delete the StatefulSet with the following command:$ kubectl delete statefulset -n harness-delegate mydelegate-vutpmk
Note that the-0
suffix in the pod name is removed for the StatefulSet name.