Argo Workflow
官方有一篇关于本地运行Argo Workflow
的介绍:https://argoproj.github.io/argo-workflows/running-locally/。
本地搭建的Argo Workflow基于v3.1.5
版本,搭建开发环境也踩了一些坑,做下笔记,方便后面的同学有所准备。
一、服务准备
::: warning
MacOS
环境先安装好brew
命令:https://brew.sh/
:::
1、Golang
至少安装v1.15
以上版本。
2、Yarn
brew install yarn
3、Docker
https://docs.docker.com/docker-for-mac/install/
4、Kustomize
当前使用到的是v3.8.8版本:https://github.com/kubernetes-sigs/kustomize/releases/tag/kustomize/v3.8.8
下载对应的预编译二进制打包文件,解压后拷贝一份放到$GOPATH/bin
目录下(全局用);再拷贝一份到argo-workflow
项目的dist
目录下(后面argo编译的时候需要)。
5、Protoc
brew install protobuf
6、Minikube
https://minikube.sigs.k8s.io/docs/start/
三、设置hosts别名
便于后续服务的内部别名访问,修改 /etc/hosts
:
127.0.0.1 dex
127.0.0.1 minio
127.0.0.1 postgres
127.0.0.1 mysql
四、编译运行服务
1、使用本地MySQL
由于我本地安装有mysql,因此argo-workflows项目安装的mysql会与我本地的端口号冲突。于是在我本地的MySQL上创建一个argo数据库以及对应的账号,不使用minikube中的MySQL服务。
1)创建argo
数据库以及mysql
账号
CREATE DATABASE `argo`;
CREATE USER 'mysql'@'%' IDENTIFIED BY 'password';
GRANT ALL ON argo.* TO 'mysql'@'%';
2)注释掉argo-workflows
项目中的端口转发
2、执行代码编译&运行
在argo-workflows项目根目录下执行以下命令执行编译安装argo-workflows相关服务到本地,并在minikube中创建相应的argo资源:
make start PROFILE=mysql
编译将会使用mysql
服务(默认使用的是pgsql
)。
::: tip
当argo相关服务启动后,可以发现argo数据库被初始化了相关数据表。
:::
五、检查服务状态
1、Argo Server API
::: warning 注意查看终端日志输出信息,不是HTTPS访问。 :::
2、Argo UI
::: warning 初次访问的时候会比较慢,注意查看终端日志输出信息。 :::
3、MinIO UI
账号:admin
密码:password
六、构建Image镜像
::: info 正常完整编译约5分钟左右。 :::
1、构建镜像
**这一步是非常重要的,否则你无法创建workflow资源,因为argo相关的image在本地没有,拉取镜像会失败。**执行以下命令编译即可:
eval $(minikube -p minikube docker-env) && make build
::: tip
其中的 eval $(minikube -p minikube docker-env)
命令用以设置当前的Docker
为Minikube
的Docker
,后续常见错误中有介绍。
:::
2、常见错误
1)checksum mismatch
如果遇到checksum mismatch
的问题:
由于编译是使用的Docker
执行,因此找到Dockerfile
对应的地址,去掉go.sum
即可。
2)unrecognized import path "golang.org/x/sys": reading https://golang.org/x/sys?go-get=1: 404 Not Found
编译阶段报错:
可能由于GFW
的关系无法访问对应的地址,在国内想好好撸代码真的是太不容易了,在go.mod
中增加一个replace
吧:
golang.org/x/sys => github.com/golang/sys v0.0.0-20200317113312-5766fd39f98d
3)FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
我花了数个小时没有解决通该问题,由于本次开发不会涉及到UI的修改,因此可以把Dockerfile
中涉及到ui
的部分注释掉。随后重新执行编译命令即可。

4)Container image "argoproj/argoexec:latest" is not present with pull policy of Never
运行阶段报错:
参考argo官方issue:[https://github.com/argoproj/argo-workflows/issues/3672](https://github.com/argoproj/argo-workflows/issues/3672)
主要原因也就是说Minikube
使用的Docker
和系统安装的Docker
不一样,我们之前编译的镜像在默认情况下都是编译到了系统的Docker
上。因此我们需要在编译的Shell终端上执行一下 eval $(minikube -p minikube docker-env)
命令,设置当前的Docker
为Minikube
的Docker
,随后重新执行编译即可:
eval $(minikube -p minikube docker-env) && make build