mirror of https://github.com/fluxcd/flux2.git
Merge pull request #80 from fluxcd/docs-webhook-receivers
Add webhook receivers guide to docspull/81/head v0.0.3
commit
2e38855396
@ -0,0 +1,138 @@
|
|||||||
|
# Setup Webhook Receivers
|
||||||
|
|
||||||
|
The GitOps toolkit controllers are by design **pull-based**.
|
||||||
|
In order to notify the controllers about changes in Git or Helm repositories,
|
||||||
|
you can setup webhooks and trigger a cluster reconciliation
|
||||||
|
every time a source changes. Using webhook receivers, you can build **push-based**
|
||||||
|
GitOps pipelines that react to external events.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
To follow this guide you'll need a Kubernetes cluster with the GitOps
|
||||||
|
toolkit controllers installed on it.
|
||||||
|
Please see the [get started guide](../get-started/index.md)
|
||||||
|
or the [install command docs](../cmd/tk_install.md).
|
||||||
|
|
||||||
|
The [notification controller](../components/notification/controller.md)
|
||||||
|
can handle events coming from external systems
|
||||||
|
(GitHub, GitLab, Bitbucket, Harbour, Jenkins, etc)
|
||||||
|
and notify the GitOps toolkit controllers about source changes.
|
||||||
|
The notification controller is part of the default toolkit installation.
|
||||||
|
|
||||||
|
## Expose the webhook receiver
|
||||||
|
|
||||||
|
In order to receive Git push or Helm chart upload events, you'll have to
|
||||||
|
expose the webhook receiver endpoint outside of your Kubernetes cluster on
|
||||||
|
a public address.
|
||||||
|
|
||||||
|
The notification controller handles webhook requests on port `9292`.
|
||||||
|
This port can be used to create a Kubernetes LoadBalancer Service or Ingress.
|
||||||
|
|
||||||
|
Create a `LoadBalancer` service:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: receiver
|
||||||
|
namespace: gitops-system
|
||||||
|
spec:
|
||||||
|
type: LoadBalancer
|
||||||
|
selector:
|
||||||
|
app: notification-controller
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 80
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 9292
|
||||||
|
```
|
||||||
|
|
||||||
|
Wait for Kubernetes to assign a public address with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
watch kubectl -n gitops-system get svc/receiver
|
||||||
|
```
|
||||||
|
|
||||||
|
## Define a Git repository
|
||||||
|
|
||||||
|
Create a Git source pointing to a GitHub repository that you have control over:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: source.fluxcd.io/v1alpha1
|
||||||
|
kind: GitRepository
|
||||||
|
metadata:
|
||||||
|
name: webapp
|
||||||
|
namespace: gitops-system
|
||||||
|
spec:
|
||||||
|
interval: 60m
|
||||||
|
url: https://github.com/<GH-ORG>/<GH-REPO>
|
||||||
|
ref:
|
||||||
|
branch: master
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! hint "Authentication"
|
||||||
|
SSH or token based authentication can be configured for private repositories.
|
||||||
|
See the [GitRepository CRD docs](../components/source/gitrepositories.md) for more details.
|
||||||
|
|
||||||
|
## Define a Git repository receiver
|
||||||
|
|
||||||
|
First generate a random string and create a secret with a `token` field:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
TOKEN=$(head -c 12 /dev/urandom | shasum | cut -d ' ' -f1)
|
||||||
|
echo $TOKEN
|
||||||
|
|
||||||
|
kubectl -n gitops-system create secret generic webhook-token \
|
||||||
|
--from-literal=token=$TOKEN
|
||||||
|
```
|
||||||
|
|
||||||
|
Create a receiver for GitHub and specify the `GitRepository` object:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: notification.fluxcd.io/v1alpha1
|
||||||
|
kind: Receiver
|
||||||
|
metadata:
|
||||||
|
name: webapp
|
||||||
|
namespace: gitops-system
|
||||||
|
spec:
|
||||||
|
type: github
|
||||||
|
events:
|
||||||
|
- "ping"
|
||||||
|
- "push"
|
||||||
|
secretRef:
|
||||||
|
name: webhook-token
|
||||||
|
resources:
|
||||||
|
- kind: GitRepository
|
||||||
|
name: webapp
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! hint "Note"
|
||||||
|
Besides GitHub, you can define receivers for **GitLab**, **Bitbucket**, **Harbour**
|
||||||
|
and any other system that supports webhooks e.g. Jenkins, CircleCI, etc.
|
||||||
|
See the [Receiver CRD docs](../components/notification/receiver.md) for more details.
|
||||||
|
|
||||||
|
The notification controller generates a unique URL using the provided token and the receiver name/namespace.
|
||||||
|
|
||||||
|
Find the URL with:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ kubectl -n gitops-system get receiver/webapp
|
||||||
|
|
||||||
|
NAME READY STATUS
|
||||||
|
webapp True Receiver initialised with URL: /hook/bed6d00b5555b1603e1f59b94d7fdbca58089cb5663633fb83f2815dc626d92b
|
||||||
|
```
|
||||||
|
|
||||||
|
On GitHub, navigate to your repository and click on the "Add webhook" button under "Settings/Webhooks".
|
||||||
|
Fill the form with:
|
||||||
|
|
||||||
|
* **Payload URL**: compose the address using the receiver LB and the generated URL `http://<LoadBalancerAddress>/<ReceiverURL>`
|
||||||
|
* **Secret**: use the `token` string
|
||||||
|
|
||||||
|
With the above settings, when you push a commit to the repository, the following happens:
|
||||||
|
|
||||||
|
* GitHub sends the Git push event to the receiver address
|
||||||
|
* Notification controller validates the authenticity of the payload using HMAC
|
||||||
|
* Source controller is notified about the changes
|
||||||
|
* Source controller pulls the changes into the cluster and updates the `GitRepository` revision
|
||||||
|
* Kustomize controller is notified about the revision change
|
||||||
|
* Kustomize controller reconciles all the `Kustomizations` that reference the `GitRepository` object
|
Loading…
Reference in New Issue