actions-runner-controllerを試してみる

kubernetes上でself hosted runnerが動かせるみたい。docker in kubernetesだったら欲しいので試してみる。

結果、最強でした。

# quick start

https://github.com/actions/actions-runner-controller/blob/master/docs/quickstart.md

### 1. cert-manager を入れる

また後で調べることにして、とりあえず getting-start にある通りインストールする。

```
🎐 ❯ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml
```

### 2. ARC を入れる

2023-01-15時点の最新は `v0.26.0`

https://github.com/actions/actions-runner-controller/releases/tag/v0.26.0

```
🎐 ❯ kubectl apply -f https://github.com/actions/actions-runner-controller/releases/download/v0.26.0/actions-runner-controller.yaml
...
Error from server (Invalid): error when creating "https://github.com/actions/actions-runner-controller/releases/download/v0.26.0/actions-runner-controller.yaml": CustomResourceDefinition.apiextensions.k8s.io "runnerdeployments.actions.summerwind.dev" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
Error from server (Invalid): error when creating "https://github.com/actions/actions-runner-controller/releases/download/v0.26.0/actions-runner-controller.yaml": CustomResourceDefinition.apiextensions.k8s.io "runnerreplicasets.actions.summerwind.dev" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
Error from server (Invalid): error when creating "https://github.com/actions/actions-runner-controller/releases/download/v0.26.0/actions-runner-controller.yaml": CustomResourceDefinition.apiextensions.k8s.io "runners.actions.summerwind.dev" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
```

too long はサーバー側デプロイをすれば問題なく通るはずなので、一旦削除してから入れ直す。

```
🎐 ❯ kubectl delete -f https://github.com/actions/actions-runner-controller/releases/download/v0.26.0/actions-runner-controller.yaml
🎐 ❯ kubectl apply --server-side -f https://github.com/actions/actions-runner-controller/releases/download/v0.26.0/actions-runner-controller.yaml
...
Error from server (Forbidden): deployments.apps "controller-manager" is forbidden: unable to create new content in namespace actions-runner-system because it is being terminated
Error from server (Forbidden): certificates.cert-manager.io "serving-cert" is forbidden: unable to create new content in namespace actions-runner-system because it is being terminated
Error from server (Forbidden): issuers.cert-manager.io "selfsigned-issuer" is forbidden: unable to create new content in namespace actions-runner-system because it is being terminated

🎐 ❯ kubectl apply --server-side  -f https://github.com/actions/actions-runner
```
エラーが出たけど、これは削除即追加の時のエラーっぽい。そもそも削除する必要もなかったか。

PATが必要なので作って登録する。
試しに repo:* と　workflow をつけてみた。

> 追記: [このページ](https://github.com/actions/actions-runner-controller/blob/master/docs/authenticating-to-the-github-api.md) によると repo:* だけで大丈夫そう

```
🎐 ❯ kubectl create secret generic controller-manager \
    -n actions-runner-system \
    --from-literal=github_token=REPLACE_YOUR_TOKEN_HERE
```

### 3. runner を作成する

`self-host-runner/runner-deployment.yaml` に作成した。

```runner-deployment.yaml
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment
metadata:
  name: runner-rec-adio
spec:
  replicas: 1
  template:
    spec:
      repository: sun-yryr/Rec-adio
```

```
🎐 ❯ kubectl apply -f self-host-runner/runner-deployment.yaml
Error from server (InternalError): error when creating "self-host-runner/runner-deployment.yaml": Internal error occurred: failed calling webhook "validate.runnerdeployment.actions.summerwind.dev": failed to call webhook: Post "https://webhook-service.actions-runner-system.svc:443/validate-actions-summerwind-dev-v1alpha1-runnerdeployment?timeout=10s": x509: certificate signed by unknown authority
```

デフォルトの場合、namespaceを `actions-runner-system` にしないと証明書関連で落ちちゃうのか。下記のyamlなら通る。

```runner-deployment.yaml
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment
metadata:
  name: runner-rec-adio
  namespace: actions-runner-system
spec:
  replicas: 1
  template:
    spec:
      repository: sun-yryr/Rec-adio
```

出てきた！
![スクリーンショット 2023-01-15 19.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286025/fc74dfeb-f2e4-a725-e758-728312c10d58.png)

# 軽く調査

- runnerとdockerの2つのコンテナが動いている。
- runner内ではdockerコマンドが利用できる。おそらくdockerコンテナの方のdockerソケットを見ている気がする。
- 動かしてみたところ、ワークフローが1つ終わる（正常 or 異常）ごとにコンテナをリセットしている。最強
    - 同時に発生するワークフローは待ち時間が長くなってしまうので、[スケーリング](https://github.com/actions/actions-runner-controller/blob/master/docs/automatically-scaling-runners.md) を設定した方が良さそう。
- しばらくワークフロー発生させてたら勝手にpod2つになった（すぐ消えたので、ローリングアップデート的処理で2つ生える時間なだけだったかもしれない）