Configure External Access through a NodePort Service
Learn how to expose your Redpanda cluster to clients outside of your Kubernetes cluster by using a NodePort Service. Here's what you'll need to do:
- Set the
external.type
field toNodePort
to create a NodePort Service that exposes the brokers' listeners. - Advertise your brokers to the outside world using either a custom domain or the IP addresses of their worker nodes.
Advertising IP addresses of worker nodes is not supported for clusters with TLS enabled. Instead, use custom domains.
How external access works with a NodePort Service
By default, Redpanda clusters are exposed through a NodePort Service. When the external.type
field is set to NodePort
, the Helm chart creates a NodePort Service that routes external traffic to the listener ports on the Redpanda brokers.
Prerequisites
Install rpk on your local machine so that you can test connections to your Redpanda cluster from outside Kubernetes.
Review the best practices.
Understand Kubernetes networking for Redpanda.
Make sure that your Kubernetes cluster is accessible through your desired node port range. You may need to edit your inbound firewall rules.
Advertise a custom domain
To configure your Redpanda brokers to advertise a custom domain, you must give each broker a subdomain and configure your DNS records to point those subdomains at the addresses of the brokers' corresonding worker nodes.
Your brokers can advertise one of the following:
Advertise the default Redpanda subdomains
You can use a DNS provider to create A/AAAA records that route traffic from the default Redpanda subdomains to the addresses of the corresponding worker nodes. The default subdomains are redpanda-<ordinal-number>
, where redpanda
is the name of the chart and the <ordinal-number>
placeholder is generated by the StatefulSet.
Get a domain from a domain registrar.
Specify your domain name in the
external.domain
configuration.Replace
<custom-domain>
with your domain.- --values
- --set
custom-domain.yamlexternal:
enabled: true
domain: <custom-domain>
type: NodePorthelm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--values custom-domain.yaml --reuse-values --waithelm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--set external.enabled=true \
--set external.type=NodePort \
--set external.domain=<custom-domain> \
--waitnoteFor default values and documentation for configuration options, see the
values.yaml
file.Find out on which worker nodes your Redpanda brokers are running.
kubectl get pod -n redpanda \
-o=custom-columns=NODE:.spec.nodeName,NAME:.metadata.name -l \
app.kubernetes.io/component=redpanda-statefulsetFind the IP address of each worker node.
kubectl get node -o wide
Update the A/AAAA records for your domain so that each subdomain (hostname) points to the correct worker node's IP address.
Hostname IP address redpanda-0 <worker-node-ip-1>
redpanda-1 <worker-node-ip-2>
redpanda-2 <worker-node-ip-3>
warningIP addresses can change. If the IP addresses of your worker nodes change, you must reconfigure your DNS records with the new IP addresses.
Wait for your DNS changes to be propagated.
Use your custom domain to communicate with the Redpanda cluster from outside the Kubernetes cluster:
- TLS Enabled
- TLS Disabled
Save the root certificate authority (CA) to your local file system outside Kubernetes:
kubectl -n redpanda get secret redpanda-default-root-certificate -o go-template='{{ index .data "ca.crt" | base64decode }}' > ca.crt
Get information about the cluster:
rpk cluster info \
--tls-enabled \
--tls-truststore=ca.crt \
--brokers redpanda-0.<custom-domain>:31092
rpk cluster info --brokers redpanda-0.<custom-domain>:31092
Advertise custom subdomains
You can give each Redpanda broker a custom subdomain to advertise instead of the default subdomains. Then, you can use a DNS provider to create A/AAAA records that route traffic from the custom subdomains to the addresses of the corresponding worker nodes.
Get a domain from a domain registrar.
Choose an option to configure the subdomains:
To use fully custom subdomains, do the following.
Replace
<custom-domain>
with your domain, and replace the placeholders in theexternal.addresses
configuration with your own subdomains in the order that you want them to be applied to the Redpanda brokers. The subdomains must be given to each Redpanda broker in order of the StatefulSet replicas. For example, the Redpanda broker running inside theredpanda-0
Pod advertises<subdomain-for-broker-0>.<custom-domain>
.- --values
- --set
custom-subdomain.yamlexternal:
enabled: true
type: NodePort
domain: <custom-domain>
addresses:
- <subdomain-for-broker-0>
- <subdomain-for-broker-1>
- <subdomain-for-broker-2>helm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--values custom-subdomain.yaml --reuse-values --waithelm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--set external.enabled=true \
--set external.type=NodePort \
--set external.domain=<custom-domain> \
--set "external.addresses={<subdomain-for-broker0>,<subdomain-for-broker1>,<subdomain-for-broker2>}" \
--waitnoteFor default values and documentation for configuration options, see the
values.yaml
file.Or, to use custom subdomains that are suffixed with the index of the StatefulSet replica, do the following.
Replace
<custom-domain>
with your domain, and replace<custom-subdomain>
with your subdomain.This configuration renames your Pods to
<subdomain>-<ordinal-number>
. Your Redpanda brokers will advertise the<subdomain>-<ordinal-number>.<custom-domain>
address.- --values
- --set
custom-subdomain-ordinal.yamlfullnameOverride: <custom-subdomain>
external:
enabled: true
type: NodePort
domain: <custom-domain>helm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--values custom-subdomain-ordinal.yaml --reuse-values --waithelm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--set external.enabled=true \
--set external.type=NodePort \
--set external.domain=<custom-domain> \
--set fullnameOverride=<custom-subdomain> \
--waitnoteFor default values and documentation for configuration options, see the
values.yaml
file.
Find out on which worker nodes your Redpanda brokers are running.
kubectl get pod -n redpanda \
-o=custom-columns=NODE:.spec.nodeName,NAME:.metadata.name -l \
app.kubernetes.io/component=redpanda-statefulsetFind the IP address of each worker node.
kubectl get node -o wide
Update the A/AAAA records for your domain so that each hostname points to the correct worker node's IP address.
Hostname IP address <subdomain-for-broker-0>
<worker-node-ip-1>
<subdomain-for-broker-1>
<worker-node-ip-2>
<subdomain-for-broker-2>
<worker-node-ip-3>
warningIP addresses can change. If the IP addresses of your worker nodes change, you must reconfigure your DNS records with the new IP addresses.
Wait for your DNS changes to be propagated.
Use your custom domain to communicate with the Redpanda cluster from outside the Kubernetes cluster:
- TLS Enabled
- TLS Disabled
Save the root certificate authority (CA) to your local file system outside Kubernetes:
kubectl -n redpanda get secret redpanda-default-root-certificate -o go-template='{{ index .data "ca.crt" | base64decode }}' > ca.crt
Get information about the cluster:
rpk cluster info \
--tls-enabled \
--tls-truststore=ca.crt \
--brokers <subdomain-for-broker-0>.<custom-domain>:31092
rpk cluster info --brokers <subdomain-for-broker-0>.<custom-domain>:31092
Use IP addresses
You can configure each Redpanda broker to advertise the IP address of the worker node on which it's running.
If your cluster has TLS enabled (default), you must advertise custom domains because the Helm chart adds custom domains to the SAN list of TLS certificates and not IP addresses. Therefore, IP addresses assigned to worker nodes must be made resolvable by DNS names to ensure secure TLS access.
While adding entries to the /etc/hosts
file may work for development purposes, it's not a suitable approach for production environments. In production, you'll need to update your organization's DNS service to make the IP addresses resolvable by DNS names. Updating your organization's DNS service ensures that users can access your services securely without encountering any SSL/TLS warnings or errors.
Deploy Redpanda with TLS disabled and enable the NodePort Service type:
- --values
- --set
loadbalancer-tls-disabled.yamlexternal:
enabled: true
type: NodePort
tls:
enabled: falsehelm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--values loadbalancer-tls-disabled.yaml --reuse-values --waithelm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--set external.enabled=true \
--set external.type=NodePort \
--set tls.enabled=false \
--waitnoteFor default values and documentation for configuration options, see the
values.yaml
file.Find out on which worker nodes your Redpanda brokers are running.
kubectl get pod -n redpanda \
-o=custom-columns=NODE:.spec.nodeName,NAME:.metadata.name -l \
app.kubernetes.io/component=redpanda-statefulsetFind the IP address of each worker node.
kubectl get node -o wide
Add the IP addresses of each worker node to the
external.addresses
field in order. For example, the first IP address in the list is assigned toredpanda-0
, the second is assigned toredpanda-1
, and so on.- --values
- --set
external-access-ip-addresses.yamlexternal:
addresses:
- <worker-node-ip-1>
- <worker-node-ip-2>
- <worker-node-ip-3>helm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--values external-access-ip-addresses.yaml --reuse-values --waithelm upgrade --install redpanda redpanda/redpanda -n redpanda --create-namespace \
--set external.enabled=true \
--set external.type=NodePort \
--set tls.enabled=false \
--set external.domain=<custom-domain> \
--set "external.addresses={<worker-node-ip1>,<worker-node-ip2>,<worker-node-ip3>}" \
--waitnoteFor default values and documentation for configuration options, see the
values.yaml
file.warningIP addresses can change. If the IP addresses of your worker nodes change, you must reconfigure the Redpanda brokers and all your external clients with the new IP addresses.
Use the IP addresses to communicate with the Redpanda cluster from outside the Kubernetes cluster:
rpk cluster info --brokers <worker-node-ip>:31092
Next steps
Configure security for your listeners.