You are browsing documentation for an outdated version. See the latest documentation here.
Configuring https redirect
Learn to configure the Kong Ingress Controller to redirect HTTP request to HTTPS so that all communication from the external world to your APIs and microservices is encrypted.
Before you begin ensure that you have Installed Kong Ingress Controller in your Kubernetes cluster and are able to connect to Kong.
Before you begin ensure that you have Installed Kong Ingress Controller in your Kubernetes cluster and are able to connect to Kong.
Prerequisites
Install Kong
You can install Kong in your Kubernetes cluster using Helm.
-
Add the Kong Helm charts:
helm repo add kong https://charts.konghq.com helm repo update
-
Install Kong Ingress Controller and Kong Gateway with Helm:
helm install kong kong/ingress -n kong --create-namespace
Test connectivity to Kong
Kubernetes exposes the proxy through a Kubernetes service. Run the following commands to store the load balancer IP address in a variable named PROXY_IP
:
-
Populate
$PROXY_IP
for future commands:HOST=$(kubectl get svc --namespace kong kong-gateway-proxy -o jsonpath='{.status.loadBalancer.ingress[0].ip}') PORT=$(kubectl get svc --namespace kong kong-gateway-proxy -o jsonpath='{.spec.ports[0].port}') export PROXY_IP=${HOST}:${PORT} echo $PROXY_IP
-
Ensure that you can call the proxy IP:
curl -i $PROXY_IP
The results should look like this:
HTTP/1.1 404 Not Found Content-Type: application/json; charset=utf-8 Connection: keep-alive Content-Length: 48 X-Kong-Response-Latency: 0 Server: kong/3.0.0 {"message":"no Route matched with those values"}
If you are not able to connect to Kong, read the deployment guide.
Setup a Sample service
-
Create an httpbin service in the cluster and proxy it.
kubectl apply -f https://raw.githubusercontent.com/Kong/kubernetes-ingress-controller/v2.11.0/deploy/manifests/httpbin.yaml
The results should look like this:
service/httpbin created deployment.apps/httpbin created
-
Create an Ingress rule to proxy the
httpbin
service.$ echo ' apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo annotations: konghq.com/strip-path: "true" spec: ingressClassName: kong rules: - http: paths: - path: /test pathType: ImplementationSpecific backend: service: name: httpbin port: number: 80 ' | kubectl apply -f -
The results should look like this:
ingress.networking.k8s.io/demo created
-
Test the Ingress rule.
$ curl -i $PROXY_IP/test/status/200
The results should look like this:
HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 0 Connection: keep-alive Server: gunicorn/19.9.0 Date: Wed, 27 Sep 2023 10:37:46 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true X-Kong-Upstream-Latency: 3 X-Kong-Proxy-Latency: 1 Via: kong/3.3.1
Setup HTTPS redirect
To instruct Kong to redirect all HTTP requests matching this Ingress rule to HTTPS, update its annotations.
-
Limit the protocols of the Ingress rule to HTTPS only and issue a 308 redirect.
$ kubectl patch ingress demo -p '{"metadata":{"annotations":{"konghq.com/protocols":"https","konghq.com/https-redirect-status-code":"308"}}}'
The results should look like this:
ingress.networking.k8s.io/demo patched
-
Make a plain-text HTTP request to Kong and a redirect is issued.
$ curl $PROXY_IP/test/headers -I
The results should look like this:
HTTP/1.1 308 Permanent Redirect Date: Tue, 06 Aug 2019 18:04:38 GMT Content-Type: text/html Content-Length: 167 Connection: keep-alive Location: https://192.0.2.0/test/headers Server: kong/1.2.1
The Location
header contains the URL you need to use for an HTTPS
request. This URL varies depending on your installation method. You can also get the IP address of the load balancer for Kong and send a HTTPS request to test.
Test the configuration
- Send a request to the
Location
URL.$ curl -k https://$PROXY_IP/test/headers
The results should look like this:
{ "headers": { "Accept": "*/*", "Connection": "keep-alive", "Host": "192.0.2.0", "User-Agent": "curl/8.1.2", "X-Forwarded-Host": "192.0.2.0" } }
Kong correctly serves the request only on HTTPS protocol and redirects the user if the HTTP protocol is used. The -k
flag in cURL skips certificate validation as the certificate served by Kong is a self-signed one. If you are serving this traffic through a domain that you control and have configured TLS properties for it, then the flag won’t
be necessary.
If you have a domain that you control but don’t have TLS/SSL certificates for it, see Using cert-manager with Kong guide which can get TLS certificates setup for you automatically. And it’s free, thanks to Let’s Encrypt!