Can I use kafka over Internet?
Asked Answered
G

4

11

Is kafka suitable for Internet-use?

More precisely, what I want is to expose kafka topics as "public interface", then external consumers (or producers) can connect to it. Is it possible?

I hear there are problems if I want to use the cluster in both internal and external networks, because it is then hard to configure advertised.host.name. Is that true?

And do I have to expose zookeeper as well? I think the new consumer/producer api no longer need that.

Garibald answered 5/9, 2017 at 2:27 Comment(2)
I see this cwiki.apache.org/confluence/display/KAFKA/… . Not sure if it is of relevanceGaribald
Put a django/flask rest api in front of it.Uncleanly
D
12

Kafka's wire protocol is TCP-based and works fine over the public internet. In the latest versions of Kafka you can configure multiple interfaces for both internal and external traffic. Examples of Kafka over the internet in production include several Kafka-as-a-Service offerings from Heroku, IBM MessageHub, and Confluent Cloud.

You do not need to expose zookeeper if the Kafka clients use the new consumer API.

You may also choose to expose a REST Proxy such as the open source Confluent REST Proxy as a more client firewall friendly interface since it runs over HTTP(S) and will not be blocked by most corporate or personal firewalls.

Dunseath answered 5/9, 2017 at 5:14 Comment(0)
H
11

I would personally not expose the Kafka server directly to clients via TCP for these reasons, only to name a few:

  • If a bad client opens too many connections this may affect the stability of the Kafka platform and may affects other clients too
    • Too many open files on the Kafka server, HW/SW settings and OS tuning is needed to limit uncontrolled clients
  • If you need to add a Kafka server to increase scalability, you may need to go through a lot of low level configuration (firewall, IPs visibility, certificates, etc.) on both client and server side. Other product address these problems using gateways or proxies: Coherence uses extend proxy clients, tibco EMS uses routed destinations, other SW (many JMS servers) use Store&Forward mechanisms, etc.
  • Maintenance of the Kafka nodes, in case of clients attached to the Kafka servers, will have to consider also the needs of clients and the SLA (service level aggreement) that have been defined with the client (ex. 24*7*365)
  • If you use Kafka also as a back end service, a multi layered architecture should be taken into consideration: FE gateways and BE services, etc.
  • Other considerations require to understand what exacly you consider to be an external (over the internet) consumer/producer in your system. Is it a component of your system that needs to access the Kafka servers? Are they internal or external to your organization, etc. ...

Naturally all these considerations can be correctly addressed also using a TCP direct connection to the Kafka servers, but I would personally use a different solution.

  • HTTP proxies
  • Or at least I would use a dedicated FE Kafka server (or couple of servers for HA) dedicated for each client that forward the messages to the main Kafka group of servers
Hyperplasia answered 25/6, 2018 at 15:5 Comment(0)
L
5

It is possible to expose Kafka over the internet (in fact, that's how managed Kafka providers such as Aiven and Instaclustr make their money) but you have to ensure that it is adequately secured. At minimum:

  • ZooKeeper nodes should reside in a private subnet and not be routable from outside. ZK's security is inadequate and, at any rate, it is no longer required to bootstrap Kafka clients with ZK address(es).
  • Limit access to the brokers at the network level. If all your clients connect from a trusted network, then set appropriate firewall rules. If in AWS, use VPC peering or Direct Connect if you are connecting cloud-to-cloud or cloud-to-ground. If most of your clients are on a trusted network but a relative minority are not, force the latter to go via a VPN tunnel. Finally, if you want to allow connectivity from arbitrary locations, you'll just have to allow * on port 9092 (or whichever port you configure the brokers to listen on); just make sure that the other ports are closed.
  • Enable TLS (SSL) for client-broker connections. This is easily configured with a self-signed CA. Depending on how you expose your listeners, you may need to disable SSL hostname verification on the client. (The certificate chain of trust breaks if the advertised host names don't match the certificate's common name.) The clients will need the CA certificate installed. (Same CA that signed the brokers' certs.)
  • Optionally, you may enable mutual TLS authentication; however, this is logistically more taxing, as it requires each client to have its own private key that is signed by a CA trusted by the broker.
  • Use SASL to authenticate the client to the broker and create individual users for each application and each person that is expected to access the cluster.
  • Issue minimally-sufficient cluster- and topic-level access privileges in the ACLs for each user, following the Principle of Least Privilege (PoLP).

One other thing to bear in mind: Not all tooling supports SASL/SSL connectivity and some tools actually require a connection to ZooKeeper nodes (which will not be reachable in the above setup). Make sure any tooling you rely on uses the 'new' style of connectivity directly to the Kafka brokers and does not require a Zookeeper connection.

Laughton answered 10/10, 2019 at 8:22 Comment(1)
we did this evaluation and effectively came to the exact same conclusion. Your answer is solid!Chaplain
E
1

Beyond configuring client TLS, brokers have to have public IPs which we try to avoid. Normally for other services we hide everything behind load balancers. Would this be possible with kafka?

I'm not sure the Confluent REST proxy hosted on a public server is a real option when you need the high performance batching of the java producer client.

Embroideress answered 9/10, 2017 at 23:27 Comment(2)
AFAIK you can not hide a kafka cluster behind a load balancer because each producer must connect directly to the specific broker that is leader of the partition the producer needs to write to.Explicate
Correct @guido, you must allow for direct connection from the clients to the brokers (TCP proxies will work, but you can't load balance). However, you can use the load balancer for the bootstrapping process. In fact, that's commonly done when Kafka is deployed in Kubernetes -- the clients connect over the service address, and then discover the broker addresses.Laughton

© 2022 - 2024 — McMap. All rights reserved.