Skip to content

Example API Gateway with Contour

Example: API Gateway with Contour: Create one HTTPRoute instance per event

We already covered here how to deploy L4 and L7 routing on multiple Kubernetes clusters securely and programmatically with Sveltos.

With the event driven framework, we are taking a step forward: programmatically generate/update HTTPRoutes:

  1. Define a Sveltos Event as creation/deletion of specific Service instances (in our example, the Service instances we are interested in are in the namespace eng and are exposing port 80);
  2. Define what add-ons to deploy in response to such events: an HTTPRoute instance defined as a template. Sveltos will instantiate this template using information from Services in the managed clusters that are part of the event defined in #1

Example - EventSource Definition

```yaml cat > eventsource.yaml <<EOF


apiVersion: lib.projectsveltos.io/v1beta1 kind: EventSource metadata: name: eng-http-service spec: collectResources: true resourceSelectors: - group: "" version: "v1" kind: "Service" namespace: eng evaluate: | function evaluate() hs = {} hs.matching = false if obj.spec.ports ~= nil then for _,p in pairs(obj.spec.ports) do if p.port == 80 then hs.matching = true end end end return hs end EOF ```

Example - EventTrigger Definition

cat > eventtrigger.yaml <<EOF
---
apiVersion: lib.projectsveltos.io/v1beta1
kind: EventTrigger
metadata:
  name: service-network-policy
spec:
  sourceClusterSelector:
    matchLabels:
      env: fv
  eventSourceName: eng-http-service
  oneForEvent: true
  policyRefs:
  ...
  - name: http-routes
    namespace: default
    kind: ConfigMap
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: http-routes
  namespace: default
  annotations:
    projectsveltos.io/template: ok
data:
  http-route.yaml: |
    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: {{ .Resource.metadata.name }}
      namespace: {{ .Resource.metadata.namespace }}
      labels:
        {{ range $key, $value := .Resource.spec.selector }}
        {{ $key }}: {{ $value }}
        {{ end }}
    spec:
      parentRefs:
      - group: gateway.networking.k8s.io
        kind: Gateway
        name: contour
        namespace: projectcontour
      hostnames:
      - "local.projectcontour.io"
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /{{ .Resource.metadata.name }}
        backendRefs:
        - kind: Service
          name: {{ .Resource.metadata.name }}
          port: {{ (index .Resource.spec.ports 0).port }}
EOF

Anytime a Service exposing port 80 is created in any matching cluster and in the namespace eng, an HTTPRoute instance will get deployed.

Full example definitions (with all YAMLs) can be found here.