在k3s集群中安装Argo Workflow并执行一个最简单的hello world
1. 前言
最近搭建了k3s集群,然后想着换个云原生的CI/CD工具,所以瞅中了Argo,但是没想到这个工具不管是文档,安装还是使用上感觉和Jenkins都差一大截。
很多点甚至在官方文档中都没有提到!!!WTF,在找解决方案的过程中发现,甚至有些是2022年的issues就发现了他们文档让人误解,让我怀疑这个开源工具是否具有足够的后备力量进行更新。
希望不会写成一篇吐槽文。
2. 安装Argo Workflow
2.1 安装前提
- k8s集群或者k3s集群,或者minikube之类的
- 熟悉一些kubectl的语法
2.2 安装
安装的过程看起来简单,从官网上的文档quick-start来看,两条命令即可:
其中${ARGO_WORKFLOWS_VERSION}要改为你期望安装的版本,你可以使用v3.6.4
kubectl create namespace argo
kubectl apply -n argo -f "https://github.com/argoproj/argo-workflows/releases/download/${ARGO_WORKFLOWS_VERSION}/quick-start-minimal.yaml"
使用命令kubectl get all -n argo 便能看到启动了两个pod

接着因为你已经配置了域名访问,所以直接使用域名进行打开即可
2.3 配置Access Token
打开后的页面如图,此时可以看到如果要进行登录,有2种办法:
- 一个是Single Sign-on,
- 配置Access Token
这里我们选择第二种Access Token,因为我们期望自动化工作流不仅能在web ui上使用,还能通过CLI进行执行

而创建这个Access Token就是Argo文档Access Token中很大的一个坑。
原文档中创建的k8s service account只给到了很少的权限:list,update 一般我们创建的时候肯定想一步到位对不,至少文档上也应该给个链接说明都有哪些权限,但是没有!!
那一页的文档真的就只是告诉你怎么创建一个简单的service account,和最简单的使用。。

google了半天终于在某个人的博客中发现了有人和我碰到了一样的问题: Installing Argo Workflows with ui access explained step by step
当中写道:
在访问 argo 工作流的用户界面之前,我们需要一个访问令牌。这有点让我困惑,因为在正常安装过程中并没有创建默认秘钥,入门指南中也没有提及令牌创建文档流程,ui 角色示例的文档也在另一页上。

看到这我简直像找到了知己,没有这个博客我还真不知道怎么继续下去,贴一下文章中的文档:Argo Security
而我们要做的就是从Argo Security中的描述的一个完整的权限yaml进行创建,这里已经帮你整理好了,而且那份Argo Security文档 中的权限甚至没有包含pod, service的创建和删除
创建一个argo-setup.yaml,然后粘贴以下文本,大概内容是创建一个 ServiceAccount、ClusterRole,然后使用 ClusterRoleBinding 把 ClusterRole 和ServiceAccount绑定起来,最后还有一个Secret
而所有的权限你可以直接看 ClusterRole 的,高亮部分则是配置了这个角色有哪些资源
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: argo-service-account
namespace: argo
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: argo-cluster-role
rules:
- apiGroups:
- ""
resources:
- pods
- pods/exec
verbs:
- create
- get
- list
- watch
- update
- patch
- delete
- apiGroups:
- ""
resources:
- configmaps
verbs:
- get
- watch
- list
- apiGroups:
- ""
resources:
- persistentvolumeclaims
- persistentvolumeclaims/finalizers
verbs:
- create
- update
- delete
- get
- apiGroups:
- argoproj.io
resources:
- workflows
- workflows/finalizers
- workflowtasksets
- workflowtasksets/finalizers
- workflowartifactgctasks
verbs:
- get
- list
- watch
- update
- patch
- delete
- create
- apiGroups:
- argoproj.io
resources:
- workflowtemplates
- workflowtemplates/finalizers
- clusterworkflowtemplates
- clusterworkflowtemplates/finalizers
verbs:
- get
- list
- watch
- apiGroups:
- argoproj.io
resources:
- workflowtaskresults
verbs:
- list
- watch
- deletecollection
- apiGroups:
- ""
resources:
- serviceaccounts
verbs:
- get
- list
- apiGroups:
- argoproj.io
resources:
- cronworkflows
- cronworkflows/finalizers
verbs:
- get
- list
- watch
- update
- patch
- delete
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- "policy"
resources:
- poddisruptionbudgets
verbs:
- create
- get
- delete
- apiGroups:
- ""
resources:
- secrets
verbs:
- get
resourceNames:
- argo-workflows-agent-ca-certificates
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: argo-cluster-rolebinding
subjects:
- kind: ServiceAccount
name: argo-service-account
namespace: argo
roleRef:
kind: ClusterRole
name: argo-cluster-role
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: Secret
metadata:
name: argo-service-account-token
namespace: argo
annotations:
kubernetes.io/service-account.name: argo-service-account
type: kubernetes.io/service-account-token
当你创建好文件后,直接kubectl apply -f argo-setup.yaml 就行,就会创建对应的service account, 如果你要整个删除也只需要kubectl delete -f argo-setup.yaml
2.4 查看你的access token
这一步是最简单的了,执行后应该能看到token
ARGO_TOKEN="Bearer $(kubectl get secret argo-service-account-token -n argo -o=jsonpath='{.data.token}' | base64 --decode)"
echo $ARGO_TOKEN

接着填入web ui的窗口,即可登录

登录后可别以为就万事大吉,能在web ui进行使用了,nonono, 虽然你使用的是这个token登录,对应的是这个token的权 限,但是在页面上submit new workflow都是用的default account

会抛出这个异常, 那你肯定怀疑那我刚刚创建的那个service account干嘛用??这就不得不到CLI部分了

3. 使用CLI
官方文档:https://argo-workflows.readthedocs.io/en/latest/walk-through/argo-cli/
这个CLI的安装更是重量级,Argo 文档中跳了两个页面,最后到GitHub Release Page中才说明,而且是给你一段shell, 让你自己去执行。。。

这里咱们直接一点,点开GitHub Releases page, 然后下载对应的版本到你的服务器上,需要是server节点。
再进行解压,然后增加执行权限,其实就是页面上的那段shell, 但是我好奇的时候为什么他们不写的完善点,直接./xxx.sh执行不是更好吗?
#增加权限
chmod +x "argo-$ARGO_OS-amd64"
#移动到bin目录
mv "./argo-$ARGO_OS-amd64" /usr/local/bin/argo
#测试是否生效
argo version
如图:

终于上面的步骤你都完美的执行完了,想着这下我总可以使用一个简单的例子试试了吧。
没错,咱们来试试!
打开Argo Workflow Examples,然后复制 hello-world.yaml, 你也可以直接复制下面的内容
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: hello-world-
labels:
workflows.argoproj.io/archive-strategy: "false"
annotations:
workflows.argoproj.io/description: |
This is a simple hello world example.
spec:
entrypoint: hello-world
templates:
- name: hello-world
container:
image: busybox
command: [echo]
args: ["hello world"]
接着执行
argo submit -n argo --watch hello-world.yaml
可能会碰到以下错误:
如果你的也是k3s那么执行下面这个命令
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
如果你发现workflow好像正在执行,那么你可就是高兴的太早了,因为这样的执行和你在web ui上执行时没什么区别,service account还是用的默认的那个。 不出意料的话会出现下面这个错误:

错误的原因也就是这个service account没有权限,那么我们解决的办法也很简单,就是使用之前创建的那个有权限的service account进行执行
argo submit -n argo --watch hello-world.yaml --serviceaccount argo-service-account
当出现下面这个时,表示你终于完成了所有的安装:

接着你回到web ui上看,能看到对应的workflow了

如果你要查看日志则可以在web ui或是命令行上查看
kubectl logs hello-world-kx92r -n argo
