結論から言うと、cronの指定はダブルクォートで囲んで、文字列だと明記しましょう。
NG
spec:
schedule: */5 * * * *
OK
spec:
schedule: "*/5 * * * *"
ただ、これはOKなので紛らわしい
spec:
schedule: 0 * * * *
何が起きているか
*から始まる値はエイリアスとみなされるので、
* * * * *
は
" * * * *"
という名前のエイリアスだとみなされます。しかしエイリアスは空白文字を許さないので、表題の"expected alphabetic or numeric character, but found ' '"となってしまいます。
どうして気づかなかったか
yamlを直接書いてればIDEがエラー吐いてくれるので気づくんですが、
spec:
schedule: ${SCHEDULE}
という感じでこのcron行は外部から注入できるようにしてデプロイしてたので気づきませんでした。
gitlabでも同様なバグが有ったらしい https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/2284
エイリアスに使えない文字について
実は実装依存のよう。libyamlでは.や/も使えるようだけど(https://github.com/yaml/libyaml/pull/170/files) pyyamlでは使えない。