比较坎坷的 “Quick” Start

最近想复习一下argo workflow,于是打算从官方文档开始,按照文档的步骤一步步来。然而,事情并没有那么顺利。官方的 docker/whalesay 镜像在新的docker版本下不支持了,这导致数百个以此为基础的hello world示例都无法正常运行。于是我决定自己构建一个镜像,来替代官方的docker/whalesay镜像。

1 创建本地k8s集群

用miniKube创建一个本地的k8s集群,方便测试。

brew install minikube
minikube start
minikube dashboard

2 下载argo workflow

kubectl create namespace argo
kubectl apply -n argo -f https://github.com/argoproj/argo-workflows/releases/download/v<<ARGO_WORKFLOWS_VERSION>>/quick-start-minimal.yaml

3 构建自己的镜像

Copy whalesay 的逻辑到 argosay

这个大概用法就是 argosay [command] [args], 然后根据command执行不同的逻辑。

  • 如果command是空的,就输出"hello argo"
  • 如果command是assert_contains,就在第二个参数中查找第三个参数
  • 如果command是cat,就输出第二个参数的内容
  • 如果command是echo,就输出第二个参数的内容
  • 如果command是exit,就退出
  • 如果command是sleep,就睡眠
  • 如果command是sh,就执行第二个参数的shell命令
  • 其他情况,就退出
# argosay

#!/bin/sh
set -eu

case ${1:-} in
  '')
    echo "hello argo"
    ;;
  assert_contains)
    grep -F "$3" "$2"
  ;;
  cat)
    cat "$2"
  ;;
  echo)
    case $# in
    1) echo "hello argo" ;;
    2) echo "$2" ;;
    3)
      mkdir -p "$(dirname $3)"
      echo "$2" > "$3"
      sleep 0.1 ;# sleep so the PNS executor has time to secure root file
      ;;
    default)
      exit 1
    esac
    ;;
  exit)
    exit "${2:-0}"
    ;;
  sleep)
    sleep "$2"
    ;;
  sh)
    sh "${2:-0}"
    ;;
  *)
    exit 1
esac

构建镜像

先写一个Dockerfile:

FROM alpine:latest

COPY argosay /usr/local/bin/argosay

RUN chmod +x /usr/local/bin/argosay

ENTRYPOINT ["/usr/local/bin/argosay"]

登录docker hub,创建一个新的repository,然后push镜像。

docker login

docker build -t argosay .
docker tag argosay:latest <<DOCKER_HUB_USERNAME>>/argosay:latest
docker push <<DOCKER_HUB_USERNAME>>/argosay:latest

写新的workflow manifest

# argo-demo.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: argosay-example-
spec:
  entrypoint: argosay-example
  templates:
  - name: argosay-example
    container:
      image: <<DOCKER_HUB_USERNAME>>/argosay:latest  # 替换为您在远程仓库中的镜像路径
      command: ["/usr/local/bin/argosay"]
      args: ["echo", "hello world!"]

4 提交workflow

argo submit -n argo --watch argo-demo.yaml

# 查看workflow
argo list -n argo
argo get -n argo <<WORKFLOW_NAME>>
argo logs -n argo <<WORKFLOW_NAME>>

5 UI查看

kubectl port-forward svc/argo-server -n argo 2746:2746
open http://localhost:2746