How you can run your first Argo Workflow on K3s ?
Welcome!
Argo Workflows is an open source container-native workflow engine for orchestrating parallel jobs on Kubernetes. Argo Workflows is implemented as a Kubernetes CRD (Custom Resource Definition). In simple words, Argo is a workflow scheduler where you can run your workflows onto a Kubernetes Cluster, you can containerize different steps within your workflow and then all those steps could be executed as a part of your workflow onto a Kubernets cluster using Argo workflows. Read more
Here we gonna create a simple Argo workflow template that will echo "hello world" using the docker/whalesay container image and this container will be running on our K3s cluster using Argo Workflow template.
Let's get started!! ๐
Before starting
Before proceeding further with the hands-on we need to have some tools and CLI installed locally:
Docker: A containerization tool that we will be using for running K3s cluster on container. Download it from here. To check your installation run command
docker --version
.Output:
Docker version 20.10.11, build dea9396
kubectl: Kubernetes command-line tool that allows you to run commands against Kubernetes clusters. Download it from here. To check your installation run command
kubectl version --client
.Output:
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T18:03:20Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"windows/amd64"}
argo: Argo CLI allows to (amongst other things) submit, watch, and list workflows. Download it from here. To check your installation run command
argo version
.Output:
argo: v3.2.4 BuildDate: 2021-11-18T00:28:05Z GitCommit: 8771ca279c329753e420dbdd986a9c914876b151 GitTreeState: clean GitTag: v3.2.4 GoVersion: go1.16.10 Compiler: gc Platform: windows/amd64
Setting up K3s cluster locally(on Docker)
K3s is a fully conformant lightweight production-ready Kubernetes distribution. As compared to K8s, its easy to install, packaged as a single binary, requires less resources which means it's possible to run a kubernets cluster on anything from 512MB of RAM machines upwards, and we can install it in a fraction of the time, unlike regular K8s.
We are going to use K3d, which is a utility designed to easily run k3s in Docker.K3d makes it very easy to create single and multi-node k3s clusters in docker for local development on Kubernetes.
โ Step 1: Install scripts of current latest release
curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash
If this command doesn't works, you can grab a release binary from the Github release tab and install it yourself.
โ
Step 2: Create a cluster named myK3sCluster
with just a single server node
k3d cluster create myK3sCluster
This command will download the docker image of K3s and setup our cluster on container.
โ
Step 3: To check if myK3sCluster
is successfully running on docker
kubectl get nodes
Output:
NAME STATUS ROLES AGE VERSION
k3d-myk3scluster-server-0 Ready control-plane,master 7h57m v1.21.7+k3s1
Installing Argo Workflows in our K3s cluster
โ
Step 1: Creating a separate namespace
for argo inside our cluster
kubectl create ns argo
kubectl get ns
Output:
NAME STATUS AGE
default Active 8h
kube-system Active 8h
kube-public Active 8h
kube-node-lease Active 8h
argo Active 8h
โ Step 2: Install Argo Workflows
To get started quickly, we can use the quick start manifest which will install Argo Workflow as well as some commonly used components
kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo-workflows/master/manifests/quick-start-postgres.yaml
โ Step 3: Check installation
Verify everything is up running. We need to wait till each pod has running or completed status before moving on.
kubectl get pods -n argo
Output:
NAME READY STATUS RESTARTS AGE
minio-79566d86cb-82c4j 1/1 Running 1 8h
postgres-546d9d68b-8dfqp 1/1 Running 1 8h
workflow-controller-558db44f7-wglh5 1/1 Running 5 8h
argo-server-5d58f6585d-7jx2p 1/1 Running 4 8h
โ Step 4: Accessing Argo Workflows dashboard
As we are running Argo Workflows locally, we can open a port-forward so you can access the namespace/dashboard.
kubectl -n argo port-forward deployment/argo-server 2746:2746
Open the Argo dashboard using URL https://localhost:2746
. Here you can see all your workflows, create them and manage them.
Creating our first Argo Workflow template
I have created a very simple workflow template to echo "hello world" using the docker/whalesay container image from DockerHub. Create a file named hello-world.yaml
, and copy paste the following code.
apiVersion: argoproj.io/v1alpha1
kind: Workflow # new type of k8s spec used to create argo workflows
metadata:
generateName: hello-world- # name of the workflow spec
spec:
entrypoint: whalesay # specifies the initial template that should be invoked i.e whalesay
templates:
- name: whalesay # name of the template
container: # container that will run when this template in invoked
image: docker/whalesay # image that will run inside the cluster
command: [cowsay]
args: ["hello world"]
resources: # limit the resources
limits:
memory: 32Mi
cpu: 100m
โ Step 1: Submitting our workflow
Make sure before running the following codes you should be the folder where you created your hello-world.yaml
file.
argo submit -n argo --watch hello-world.yaml
Output:
Name: hello-world-xpc6d
Namespace: argo
ServiceAccount: default
Status: Running
reated: Tue Jan 18 22:32:07 +0530 (6 seconds ago)
Started: Tue Jan 18 22:32:07 +0530 (6 seconds ago)
Duration: 6 seconds
Progress: 0/0
STEP TEMPLATE PODNAME DURATION MESSAGE
โท hello-world-xpc6d whalesay hello-world-xpc6d 6s
You can see your workflow named hello-world-xpc6d
has started running. Wait till it has finished executing. You can also see your workflow on the dashboard
โ Step 2: Getting logs of our workflow
Here, @latest
tag refers to the recent or the last submitted workflow. You can also replace @latest
with the name of your workflow. For eg. in my case the workflow name would be hello-world-xpc6d
.
argo list -n argo
argo get -n argo @latest
argo logs -n argo @latest
Output:
hello-world-xpc6d: time="2022-01-18T17:02:54.072Z" level=info msg="capturing logs" argo=true
hello-world-xpc6d: _____________
hello-world-xpc6d: < hello world >
hello-world-xpc6d: -------------
hello-world-xpc6d: \
hello-world-xpc6d: \
hello-world-xpc6d: \
hello-world-xpc6d: ## .
hello-world-xpc6d: ## ## ## ==
hello-world-xpc6d: ## ## ## ## ===
hello-world-xpc6d: /""""""""""""""""___/ ===
hello-world-xpc6d: ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
hello-world-xpc6d: \______ o __/
hello-world-xpc6d: \ \ __/
hello-world-xpc6d: \____\______/
Congratulations!! ๐ You successfully ran your first ever simple argo workflow on K3s cluster. I hope this made you curious to explore Argo workflows more deeply. Checkout this, here you can find different types to workflows and templates that you can try running locally.