Using the Kong Ingress Controller Addon

Kong Ingress Controller (KIC) running on your minikube server.

  1. Start minikube

    minikube start
    

    It will take a few minutes to get all resources provisioned.

    kubectl get nodes
    

Deploy the Kong Ingress Controller

Enable Kong Ingress Controller via minikube command.

$ minikube addons enable kong

🌟  The 'kong' addon is enabled

Note: this process could take up to five minutes the first time.

Setup environment variables

Next, we will set up an environment variable with the IP address at which Kong is accessible. We can use it to send requests into the Kubernetes cluster.

$ export PROXY_IP=$(minikube service -n kong kong-proxy --url | head -1)
$ echo $PROXY_IP
http://192.168.99.100:32728

Alternatively, you can use minikube tunnel command.


# open another terminal window and run
minikube tunnel

# you may need to enter an admin password because minikube need to use ports 80 and 443 

Let’s test if KIC is up and running.

$ curl -v localhost

*   Trying 127.0.0.1:80...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.86.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Date: Wed, 03 May 2023 01:34:31 GMT
< Content-Type: application/json; charset=utf-8
< Connection: keep-alive
< Content-Length: 48
< X-Kong-Response-Latency: 0
< Server: kong/3.2.2
<
* Connection #0 to host localhost left intact
{"message":"no Route matched with those values"}%

Creating Ingress object

To proxy requests, you need an upstream application to proxy to. Deploying this echo server provides a simple application that returns information about the Pod it’s running in:

echo "
apiVersion: v1
kind: Service
metadata:
  labels:
    app: echo
  name: echo
spec:
  ports:
  - port: 1025
    name: tcp
    protocol: TCP
    targetPort: 1025
  - port: 1026
    name: udp
    protocol: TCP
    targetPort: 1026
  - port: 1027
    name: http
    protocol: TCP
    targetPort: 1027
  selector:
    app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: echo
  name: echo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: echo
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: echo
    spec:
      containers:
      - image: kong/go-echo:latest
        name: echo
        ports:
        - containerPort: 1027
        env:
          - name: NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
        resources: {}
" | kubectl apply -f -

Next, we will create routing configuration to proxy /echo requests to the echo server:

echo "
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echo
  annotations:
    konghq.com/strip-path: 'true'
spec:
  ingressClassName: kong
  rules:
  - host: kong.example
    http:
      paths:
      - path: /echo
        pathType: ImplementationSpecific
        backend:
          service:
            name: echo
            port:
              number: 1027
" | kubectl apply -f -

Let’s test our ingress object.

$ curl -i localhost/echo -H "Host: kong.example"

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 133
Connection: keep-alive
Date: Wed, 03 May 2023 01:59:25 GMT
X-Kong-Upstream-Latency: 1
X-Kong-Proxy-Latency: 1
Via: kong/3.2.2

Welcome, you are connected to node minikube.
Running on Pod echo-f4fdf987c-qdv7s.
In namespace default.
With IP address 10.244.0.6.

Next

Note: Read more about KIC and different use cases in official documentation.