Fix example manifests for webhooks-based scaling (#1354)

* Fix example manifests for webhook based scaling

I tried running these on my k8s cluster and I got some easy to fix errors, so I am committing them here.

* Fix example manifests for webhook autoscaling with workflow_jobs

* Fix the explation on how to setup webhooks on your cluster

* Replace unclear comment with actual code examples

There was a comment instructing users to add minReplicas and
maxReplicas to all the HRA yamls, so I just removed it and added
these attributes to the yamls themselves for clarity.

* Make clear that using the ingress example is just a suggestion

* Apply some text improvements suggested by @mumoshu

* Update examples so the webhook server is exposed on a NodePort

Co-authored-by: Yusuke Kuoka <ykuoka@gmail.com>

* Remove an unnecessary field from one the examples

Co-authored-by: Yusuke Kuoka <ykuoka@gmail.com>

* Apply suggestion from @mumoshu

Co-authored-by: Yusuke Kuoka <ykuoka@gmail.com>

* Remove namespace fields from webhook autoscaler examples

This change was suggested by @mumoshu

* Apply final suggestion from @mumoshu

Co-authored-by: Callum Tait <15716903+toast-gear@users.noreply.github.com>
Co-authored-by: Yusuke Kuoka <ykuoka@gmail.com>
This commit is contained in:
Vinícius Garcia 2022-06-06 20:33:09 -03:00 committed by GitHub
parent 7c4db63718
commit 01c8dc237e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 129 additions and 20 deletions

133
README.md
View File

@ -732,24 +732,118 @@ _[see the values documentation for all configuration options](https://github.com
```console ```console
$ helm upgrade --install --namespace actions-runner-system --create-namespace \ $ helm upgrade --install --namespace actions-runner-system --create-namespace \
--wait actions-runner-controller actions-runner-controller/actions-runner-controller \ --wait actions-runner-controller actions-runner-controller/actions-runner-controller \
--set "githubWebhookServer.enabled=true,githubWebhookServer.ports[0].nodePort=33080" --set "githubWebhookServer.enabled=true,service.type=NodePort,githubWebhookServer.ports[0].nodePort=33080"
``` ```
The above command will result in exposing the node port 33080 for Webhook events. Usually, you need to create an The above command will result in exposing the node port 33080 for Webhook events.
external load balancer targeted to the node port, and register the hostname or the IP address of the external load balancer Usually, you need to create an external load balancer targeted to the node port,
to the GitHub Webhook. and register the hostname or the IP address of the external load balancer to the GitHub Webhook.
Once you were able to confirm that the Webhook server is ready and running from GitHub - this is usually verified by the **With a custom Kubernetes ingress controller:**
GitHub sending PING events to the Webhook server - create or update your `HorizontalRunnerAutoscaler` resources
by learning the following configuration examples. > **CAUTION:** The Kubernetes ingress controllers described below is just a suggestion from the community and
> the ARC team will not provide any user support for ingress controllers as it's not a part of this project.
>
> The following guide on creating an ingress has been contributed by the awesome ARC community and is provided here as-is.
> You may, however, still be able to ask for help on the community on GitHub Discussions if you have any problems.
Kubernetes provides `Ingress` resources to let you configure your ingress controller to expose a Kubernetes service.
If you plan to expose ARC via Ingress, you might not be required to make it a `NodePort` service
(although nothing would prevent an ingress controller to expose NodePort services too):
```console
$ helm upgrade --install --namespace actions-runner-system --create-namespace \
--wait actions-runner-controller actions-runner-controller/actions-runner-controller \
--set "githubWebhookServer.enabled=true"
```
The command above will create a new deployment and a service for receiving Github Webhooks on the `actions-runner-system` namespace.
Now we need to expose this service so that GitHub can send these webhooks over the network with TSL protection.
You can do it in any way you prefer, here we'll suggest doing it with a k8s Ingress.
For the sake of this example we'll expose this service on the following URL:
- https://your.domain.com/actions-runner-controller-github-webhook-server
Where `your.domain.com` should be replaced by your own domain.
> Note: This step assumes you already have a configured `cert-manager` and domain name for your cluster.
Let's start by creating an Ingress file called `arc-webhook-server.yaml` with the following contents:
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: actions-runner-controller-github-webhook-server
namespace: actions-runner-system
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
tls:
- hosts:
- your.domain.com
secretName: your-tls-secret-name
rules:
- http:
paths:
- path: /actions-runner-controller-github-webhook-server
pathType: Prefix
backend:
service:
name: actions-runner-controller-github-webhook-server
port:
number: 80
```
Make sure to set the `spec.tls.secretName` to the name of your TLS secret and
`spec.tls.hosts[0]` to your own domain.
Then create this resource on your cluster with the following command:
```bash
kubectl apply -n actions-runner-system -f arc-webhook-server.yaml
```
**Configuring GitHub for sending webhooks for our newly created webhook server:**
After this step your webhook server should be ready to start receiving webhooks from GitHub.
To configure GitHub to start sending you webhooks, go to the settings page of your repository
or organization then click on `Webhooks`, then on `Add webhook`.
There set the "Payload URL" field with the webhook URL you just created,
if you followed the example ingress above the URL would be something like this:
- https://your.domain.com/actions-runner-controller-github-webhook-server
> Remember to replace `your.domain.com` with your own domain.
Then click on "let me select individual events" and choose `Workflow Jobs`.
You may also want to choose the following event(s) if you use it as a scale trigger in your HRA spec:
- Check runs
- Pushes
- Pull Requests
Later you can remove any of these you are not using to reduce the amount of data sent to your server.
Then click on `Add Webhook`.
GitHub will then send a `ping` event to your webhook server to check if it is working, if it is you'll see a green V mark
alongside your webhook on the Settings -> Webhooks page.
Once you were able to confirm that the Webhook server is ready and running from GitHub create or update your
`HorizontalRunnerAutoscaler` resources by learning the following configuration examples.
- [Example 1: Scale on each `workflow_job` event](#example-1-scale-on-each-workflow_job-event) - [Example 1: Scale on each `workflow_job` event](#example-1-scale-on-each-workflow_job-event)
- [Example 2: Scale up on each `check_run` event](#example-2-scale-up-on-each-check_run-event) - [Example 2: Scale up on each `check_run` event](#example-2-scale-up-on-each-check_run-event)
- [Example 3: Scale on each `pull_request` event against a given set of branches](#example-3-scale-on-each-pull_request-event-against-a-given-set-of-branches) - [Example 3: Scale on each `pull_request` event against a given set of branches](#example-3-scale-on-each-pull_request-event-against-a-given-set-of-branches)
- [Example 4: Scale on each `push` event](#example-4-scale-on-each-push-event) - [Example 4: Scale on each `push` event](#example-4-scale-on-each-push-event)
**Note:** All these examples should have **minReplicas** & **maxReplicas** as mandatory parameters even for webhook driven scaling.
##### Example 1: Scale on each `workflow_job` event ##### Example 1: Scale on each `workflow_job` event
> This feature requires controller version => [v0.20.0](https://github.com/actions-runner-controller/actions-runner-controller/releases/tag/v0.20.0) > This feature requires controller version => [v0.20.0](https://github.com/actions-runner-controller/actions-runner-controller/releases/tag/v0.20.0)
@ -761,16 +855,23 @@ The most flexible webhook GitHub offers is the `workflow_job` webhook, it includ
This webhook should cover most people's needs, please experiment with this webhook first before considering the others. This webhook should cover most people's needs, please experiment with this webhook first before considering the others.
```yaml ```yaml
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment kind: RunnerDeployment
metadata: metadata:
name: example-runners name: example-runners
spec: spec:
template: template:
spec: spec:
repository: example/myrepo repository: example/myrepo
--- ---
apiVersion: actions.summerwind.dev/v1alpha1
kind: HorizontalRunnerAutoscaler kind: HorizontalRunnerAutoscaler
metadata:
name: example-runners
spec: spec:
scaleDownDelaySecondsAfterScaleOut: 300
minReplicas: 1
maxReplicas: 10
scaleTargetRef: scaleTargetRef:
name: example-runners name: example-runners
# Uncomment the below in case the target is not RunnerDeployment but RunnerSet # Uncomment the below in case the target is not RunnerDeployment but RunnerSet
@ -804,6 +905,8 @@ spec:
--- ---
kind: HorizontalRunnerAutoscaler kind: HorizontalRunnerAutoscaler
spec: spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef: scaleTargetRef:
name: example-runners name: example-runners
# Uncomment the below in case the target is not RunnerDeployment but RunnerSet # Uncomment the below in case the target is not RunnerDeployment but RunnerSet
@ -830,6 +933,8 @@ spec:
--- ---
kind: HorizontalRunnerAutoscaler kind: HorizontalRunnerAutoscaler
spec: spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef: scaleTargetRef:
name: example-runners name: example-runners
# Uncomment the below in case the target is not RunnerDeployment but RunnerSet # Uncomment the below in case the target is not RunnerDeployment but RunnerSet
@ -860,6 +965,8 @@ spec:
--- ---
kind: HorizontalRunnerAutoscaler kind: HorizontalRunnerAutoscaler
spec: spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef: scaleTargetRef:
name: example-runners name: example-runners
# Uncomment the below in case the target is not RunnerDeployment but RunnerSet # Uncomment the below in case the target is not RunnerDeployment but RunnerSet
@ -888,6 +995,8 @@ spec:
--- ---
kind: HorizontalRunnerAutoscaler kind: HorizontalRunnerAutoscaler
spec: spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef: scaleTargetRef:
name: example-runners name: example-runners
# Uncomment the below in case the target is not RunnerDeployment but RunnerSet # Uncomment the below in case the target is not RunnerDeployment but RunnerSet
@ -1472,8 +1581,8 @@ spec:
value: "true" value: "true"
# Configure runner with legacy --once instead of --ephemeral flag # Configure runner with legacy --once instead of --ephemeral flag
# WARNING | THIS ENV VAR IS DEPRECATED AND WILL BE REMOVED # WARNING | THIS ENV VAR IS DEPRECATED AND WILL BE REMOVED
# IN A FUTURE VERSION OF ARC. # THIS ENV VAR WILL BE REMOVED SOON.
# THIS ENV VAR WILL BE REMOVED, SEE ISSUE #1196 FOR DETAILS # SEE ISSUE #1196 FOR DETAILS
- name: RUNNER_FEATURE_FLAG_ONCE - name: RUNNER_FEATURE_FLAG_ONCE
value: "true" value: "true"
``` ```