Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kubernetes: should I use HTTPS to communicate between services

Let's say I'm using an GCE ingress to handle traffic from outside the cluster and terminate TLS (https://example.com/api/items), from here the request gets routed to one of two services that are only available inside the cluster. So far so good.

What if I have to call service B from service A, should I go all the way and use the cluster's external IP/domain and use HTTPS (https://example.com/api/user/1) to call the service or could I use the internal IP of the service and use HTTP (http://serviceb/api/user/1)? Do I have to encrypt the data or is it "safe" as long as it isn't leaving the private k8s network?

What if I want to have "internal" endpoints that should only be accessible from within the cluster - when I'm always using the external https-url those endpoints would be reachable for everyone. Calling the service directly, I could just do a http://serviceb/internal/info/abc.

like image 220
Philipp Kyeck Avatar asked Jan 09 '18 11:01

Philipp Kyeck


People also ask

How do you communicate between two services in Kubernetes?

In Kubernetes, pods can communicate with each other a few different ways: Containers in the same Pod can connect to each other using localhost , and then the port number exposed by the other container. A container in a Pod can connect to another Pod using its IP address.

Should internal services use https?

Encrypting traffic is generally a good thing, so enabling HTTPS is always recommended. Yes, you could argue that internal traffic doesn't need to be encrypted, because you trust your internal network.

How one Microservices communicate with each other in Kubernetes?

The recommended way to manage the communication between microservices in Kubernetes is to use Services. You can have one helm chart per microservice.


1 Answers

What if I have to call service B from service A, should I go all the way and use the cluster's external IP/domain and use HTTPS (https://example.com/api/user/1) to call the service or could I use the internal IP of the service and use HTTP (http://serviceb/api/user/1)?

If you need to use the features that you API Gateway is offering (authentication, cache, high availability, load balancing) then YES, otherwise DON'T. The External facing API should contain only endpoints that are used by external clients (from outside the cluster).

Do I have to encrypt the data or is it "safe" as long as it isn't leaving the private k8s network?

"safe" is a very relative word and I believe that there are no 100% safe networks. You should put in the balance the probability of "somebody" or "something" sniffing data from the network and the impact that it has on your business if that happens.

If this helps you: for any project that I've worked for (or I heard from somebody I know), the private network between containers/services was more than sufficient.

What if I want to have "internal" endpoints that should only be accessible from within the cluster - when I'm always using the external https-url those endpoints would be reachable for everyone.

Exactly what I was saying on top of the answer. Keeping those endpoints inside the cluster makes them inaccessible by design from outside.

One last thing, managing a lot of SSL certificates for a lot of internal services is a pain that one should avoid if not necessary.

like image 69
Constantin Galbenu Avatar answered Sep 20 '22 18:09

Constantin Galbenu