Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run a https secured app in kubernetes cluster

I want to run my app inside kubernetes cluster on https and expose it outside the cluster also over https. I created the pod and exposed the port 443. After that I created a ClusterIP service which connects to the pod on port 443 and expose also port 443. Lastly, I created an ingress which connects to the service on port 443. I deployed all of these resources using helm chart on GKE. I use NGINX Ingress controller. You can find the chart here.

When I access the app internally in the cluster over https it works.

curl https://my-nginx.https-app-64-production --cacert /etc/nginx/ssl/tls.crt
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

But when I access it using external url then I get below error.

curl https://staging.vs-creator.iotcrawler.eu/
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.9.1</center>
</body>
</html>

I am not able to figure out what is going wrong. I suspect it is to do with ingress controller configuration. Please help me on this.

like image 935
Rohit Bohara Avatar asked Jun 15 '26 19:06

Rohit Bohara


1 Answers

Use below annotation in ingress resourece

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

From the docs

Using backend-protocol annotations is possible to indicate how NGINX should communicate with the backend service. (Replaces secure-backends in older versions) Valid Values: HTTP, HTTPS, GRPC, GRPCS, AJP and FCGI

By default NGINX uses HTTP while forwarding the request to backend pod which leads to 400 The plain HTTP request was sent to HTTPS port because the backend pod is expecting HTTPS request.

like image 197
Arghya Sadhu Avatar answered Jun 17 '26 10:06

Arghya Sadhu



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!