Kafka listeners
vs. advertised.listeners
ํ์ฌ์์ Confluent๋ฅผ ํตํด Kafka ํด๋ฌ์คํฐ๋ฅผ ์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด ์นดํ์นด์ ๋ํด์ ์ข๋ ์์ธํ ์๊ณ , ์ ๋ฌธ์ฑ์ ๊ฐ์ถ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์ด์ 2025๋ ๋ชฉํ๋ก Confluent์ Kafka ์๊ฒฉ์ฆ์ธ Confluent Certified Developer for Apache Kafkaยฎ ์๊ฒฉ์ฆ์ ์ค๋นํ๊ณ ์์ต๋๋ค โ๏ธ ์ ์ฒด ํฌ์คํธ๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ด๊ฐ๋ฉฐ
๋ก์ปฌ Kubernetes ํ๊ฒฝ์ Kafka ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ปจํธ๋กค๋ฌ ๋
ธ๋ 3๊ฐ, ๋ธ๋ก์ปค ๋
ธ๋ 3๊ฐ๋ก ๊ตฌ์ฑ ํ๋๋ฐ์. ์ด๋ด์๊ฐ! KsqlDB๋ฅผ ์ฐ์ตํ๊ธฐ ์ํด ๋์ด ksqldb-server
๊ฐ ๋ธ๋ก์ปค์ ์ ๋๋ก ์ ์์ ํ์ง ๋ชปํ๋ ํ์์ ๊ฒฝํํ๊ฒ ๋์์ต๋๋ค.
$ curl -X GET http://localhost:8088/info
curl: (7) Failed to connect to localhost port 8088: Connection refused
์ฌ์ค bitnami-kafka์ helm chart์ REAEDME๋ฅผ ์ ์ฝ์ด๋ณด๋ฉด, ์๋์ ๊ฐ์ ๊ตฌ์ ์ด ์์ต๋๋ค.
In order to access Kafka Brokers from outside the cluster, an additional listener and advertised listener must be configured. Additionally, a specific service per kafka pod will be created. - bitnami-kafka helm chart
์ฆ, โAdvertised Listenerโ๋ฅผ ์ ๋๋ก ์ค์ ํ์ง ์์ ์ธ๋ถ ์ ์์ด ์ํํ์ง ์์๋ ๊ฒ ์ ๋๋ค. ๊ทธ๋์์ ํด๋ฌ์คํฐ์ ๋ธ๋ก์ปค์ ์ ์ํด์ Kafka CLI๋ฅผ ์คํํด์ ์ด ํ์์ ๋ฐ๊ฒฌํ์ง ๋ชป ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๊ณ๊ธฐ๋ก ์นดํ์นด ํด๋ฌ์คํฐ์ ์ธํ
ํ๋ listeners
์ advertised.listeners
์ต์
์ ๋ํด ์ดํด๋ณด๊ฒ ๋์๊ณ , ๊ทธ ๋ด์ฉ์ ์ ๋ฐฉ์๋๋ก ์ ๋ฆฌํด๋ณด๊ณ ์ ํฉ๋๋ค.
Broker Listeners
listeners
listeners=PLAINTEXT://0.0.0.0:9092
๋ธ๋ก์ปค๊ฐ ๋ฐ์ธ๋ฉํ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ ํฌํธ๋ฅผ ์ ์ํ๋ Config ์ ๋๋ค. ๋ธ๋ก์ปค๊ฐ ์ด๋ค IP์ ํฌํธ์์ ํธ๋ํฝ์ ์์ ํ ์ง ์ ์ ํฉ๋๋ค.
์ด๋, PLAINTEXT
๋ ์นดํ์นด์์ ์ฌ์ฉํ๋ ๋ฆฌ์ค๋ ํ๋กํ ์ฝ ์ค ํ๋๋ก ์ํธํ ์์ด ๊ธฐ๋ณธ TCP ํต์ ํ๋ ํ๋กํ ์ฝ ์
๋๋ค. ์ธ๋ถ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ๋ฆฌ์ค๋ ํ๋กํ ์ฝ์ ์ง์ํฉ๋๋ค.
ํ๋กํ ์ฝ | ์ค๋ช |
---|---|
PLAINTEXT |
์ํธํ ์์ด ๊ธฐ๋ณธ TCP ํต์ (๊ธฐ๋ณธ๊ฐ) |
SSL |
TLS/SSL์ ์ฌ์ฉํ์ฌ ์ํธํ๋ ํต์ |
SASL_PLAINTEXT |
SASL ์ธ์ฆ ์ฌ์ฉ, ํ์ง๋ง ๋ฉ์์ง๋ ์ํธํ๋์ง ์์ |
SASL_SSL |
SASL ์ธ์ฆ + TLS/SSL ์ํธํ |
0.0.0.0
์ ๋ชจ๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ๋งํฉ๋๋ค. ์ด๊ฒ์ ์ด๋ค IP ์ฃผ์๋ก ์์ฒญ์ด ์ค๋๋ผ๋ ๋ชจ๋ ์์ฒญ์ ์๋ฝํ๋ค๋ ๊ฒ์ ๋งํฉ๋๋ค.
0.0.0.0
์ธ์๋ ์๋์ ๊ฐ์ด ๋คํธ์ํฌ ์ธํฐํ์ด์ค ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ค์ ๊ฐ | ์๋ฏธ |
0.0.0.0 |
๋ชจ๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์์ ์ฐ๊ฒฐ ํ์ฉ (๋ด๋ถ, ์ธ๋ถ ํฌํจ) |
127.0.0.1 |
์ค์ง localhost(๋ฃจํ๋ฐฑ)์์๋ง ์ฐ๊ฒฐ ๊ฐ๋ฅ (์ธ๋ถ ์ ๊ทผ ๋ถ๊ฐ) |
192.168.1.10 |
ํน์ ๋ด๋ถ ๋คํธ์ํฌ์์๋ง ์ฐ๊ฒฐ ๊ฐ๋ฅ |
10.0.0.5 |
ํน์ VPC ๋คํธ์ํฌ์์๋ง ์ฐ๊ฒฐ ๊ฐ๋ฅ |
203.0.113.15 |
ํน์ ๊ณต์ธ IP์์๋ง ์ฐ๊ฒฐ ๊ฐ๋ฅ |
advertised.listeners
advertised.listeners=PLAINTEXT://my.kafka.broker.com:9092
ํด๋ผ์ด์ธํธ(ํ๋ก๋์, ์ปจ์๋จธ)๊ฐ ๋ธ๋ก์ปค์ ์ ์ํ ๋, ์ด๋ค ์ฃผ์๋ก ์ ๊ทผํด์ผ ํ๋์ง ์๋ ค์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ๋ธ๋ก์ปค์ ํด๋ผ์ด์ธํธ๊ฐ ์ํตํ๋ ๊ณผ์ ์ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- ํด๋ผ๋ ์ค์ ๋
bootstrap.servers
์ฃผ์๋ฅผ ์ฌ์ฉํด Kafka ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐ์ ์๋ ํฉ๋๋ค. - ๋ธ๋ก์ปค๋ ํด๋ฌ์คํฐ์ ์ ์ฒด ์ ๋ณด๋ฅผ ํฌํจํ ๋ฉํ๋ฐ์ดํฐ ์๋ต์ ํด๋ผ์๊ฒ ๋ณด๋
๋๋ค.
- ์ด๋, ๊ฐ ๋ธ๋ก์ปค์
advertised.listeners
๊ฐ์ ํฌํจํด ๋ณด๋ด์ค๋๋ค.
- ์ด๋, ๊ฐ ๋ธ๋ก์ปค์
- ํด๋ผ๋ ๋ฆฌ๋ ํํฐ์
์ ์์ ํ ๋ธ๋ก์ปค๋ฅผ ์ฐพ๊ณ , ๊ทธ ๋ธ๋ก์ปค์ ํต์ ํ๊ธฐ ์ํด ๊ฐ ๋ธ๋ก์ปค์ ๋ด๊ฒจ ์๋
advertised.listeners
์ฃผ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด advertised.listeners
๊ฐ์ด ์ ์ค์ ๋์ด ์์ด์ผ ํด๋ฌ์คํฐ ์ธ๋ถ์ ํด๋ผ์ด์ธํธ๊ฐ ์นดํ์นด ํด๋ฌ์คํฐ์ ์ ์์ ์ผ๋ก ์ํตํ ์ ์์ต๋๋ค.
bitnami-kafka
์ ๋ bitnami-kafka์ helm chart๋ฅผ ์ด์ฉํด Kubernetes on Kafka ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ์์ต๋๋ค. advertised.listeners
๋ฅผ ์ค์ ํ๊ธฐ ์ํด values.yaml
ํ์ผ์ ์๋์ ๊ฐ์ด ์ธํ
ํ์์ต๋๋ค.
listeners:
client:
protocol: 'PLAINTEXT' # no auth
controller:
protocol: 'PLAINTEXT' # no auth
externalAccess:
enabled: true
controller:
service:
type: NodePort
broker:
service:
type: NodePort
autoDiscovery:
enabled: true
serviceAccount:
create: true
rbac:
create: true
bitnami-kafka์์๋ ์ธ๋ถ ์ ์์ ํ๊ธฐ ์ํด์ externalAccess.enabled=true
๋ก ์ค์ ํด์ค์ผ ํฉ๋๋ค.
์ด๋, Kubernetes Service์ ํ์
์ ๋ญ๋ก ํ ์ง ์ง์ ํด์ผ ํ๋๋ฐ, ์ ๋ NodePort
๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bitnami-kafka ClusterIP 10.43.165.141 <none> 9092/TCP,9095/TCP 11h
bitnami-kafka-broker-0-external NodePort 10.43.209.77 <none> 9094:31770/TCP 11h
bitnami-kafka-broker-1-external NodePort 10.43.227.177 <none> 9094:30447/TCP 11h
bitnami-kafka-broker-2-external NodePort 10.43.207.221 <none> 9094:31014/TCP 11h
bitnami-kafka-broker-headless ClusterIP None <none> 9094/TCP,9092/TCP 11h
bitnami-kafka-controller-0-external NodePort 10.43.240.235 <none> 9094:31401/TCP 11h
bitnami-kafka-controller-1-external NodePort 10.43.222.244 <none> 9094:31073/TCP 11h
bitnami-kafka-controller-2-external NodePort 10.43.178.28 <none> 9094:30316/TCP 11h
bitnami-kafka-controller-headless ClusterIP None <none> 9094/TCP,9092/TCP,9093/TCP 11h
externalAccess.enabled=true
๋ก ์ค์ ํ๋ฉด ๊ฐ ๋ธ๋ก์ปค์ ์ปจํธ๋กค๋ฌ๋ง๋ค NodePort
ํ์
์ Kubernetes Service๊ฐ ์์ฑ ๋ฉ๋๋ค.
์ ๊ฒฝ์ฐ๋ ๋ก์ปฌ Kubernetes์ด๊ธฐ ๋๋ฌธ์, Ingress
๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค. ๋ง์ฝ EKS ํ๊ฒฝ์ด์๋ค๋ฉด, ๋ธ๋ก์ปค ๋ณ๋ก Ingress๋ฅผ ๋ง๋ค๊ณ ๋ธ๋ก์ปค์ ํ ๋น๋ public DNS ๊ฐ์ ํ์ฉํ ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ ๊ฒ ์ธํ ํ ํ์๋ KsqlDB Pod์ด ์นดํ์นด ํด๋ฌ์คํฐ์ ์ ์์ ์ผ๋ก ํต์ ํ๊ฒ ๋์์ต๋๋ค! ๋ค๋ง, ๋ก์ปฌ์์ ์คํํ๋ Kafka-Streams๋ Kubernetes ํ๊ฒฝ์ด ์๋๋ผ ๋ก์ปฌ IntelliJ์์ ์คํํ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ bitnami-kafka ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐ๋์ง ๋ชปํ๋ ํ์์ ๊ฒช์์ต๋๋ค.
Advertised Listeners๊ฐ ํ์ํ ์นดํ์นด ์ปดํฌ๋ํธ๋ค
์นดํ์นด์๋ ๋ธ๋ก์ปค ๋ง๊ณ ๋ Advertised Listeners ์ค์ ์ด ํ์ํ ์ปดํฌ๋ํธ๋ค์ด ์กด์ฌํฉ๋๋ค.
Kafka Broker
advertised.listeners
ํด๋ผ์ด์ธํธ๊ฐ ์นดํ์นด ํด๋ฌ์คํฐ์ ์ ์ ํ์ ๋, ์ด๋ค ๋ฆฌ๋ ํํฐ์ ๊ณผ ํต์ ํด์ผ ํ๋์ง ์๊ธฐ ์ํด Advertised Listeners ์ค์ ์ด ํ์ํฉ๋๋ค.
Kafka Connect
CONNECT_REST_ADVERTISED_HOST_NAME
CONNECT_REST_ADVERTISED_PORT
Kafka Connect๋ฅผ ๋ฉํฐ ์์ปค๋ก ์ด์ํ ๋ ํ์ํ ์ต์ ์ ๋๋ค. Kafka Connect๊ฐ ๋ฉํฐ ์์ปค๋ก ๋์ํ ๋๋ ๊ฐ ์์ปค๊ฐ ์ ์ด์์๋์ง ํ์ธ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ Advertised Listeners๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋์ผ Task๊ฐ ์์ปค ๋ ธ๋๋ค์๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถ๋ฐฐ๋ฉ๋๋ค.
Kafka Connect ํด๋ฌ์คํฐ๋ ๋ฆฌ๋ ๋ ธ๋์ ํ๋ก์ ๋ ธ๋๋ก ์ด๋ค์ง๋๋ค. ์ด๋, Advertised Listeners๊ฐ ์ ๋๋ก ์ค์ ๋์ด ์์ด์ผ ๋ฆฌ๋ ๋ ธ๋๊ฐ ๋ค๋ฅธ ์์ปค ๋ ธ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ง์ฝ ์ ์ ํ ์ค์ ๋์ด ์์ง ์์๋ค๋ฉด, ํ์คํฌ๊ฐ ์์ปค ๋ ธ๋์ ์ ๋๋ก ํ ๋น๋์ง ์์ต๋๋ค.
KsqlDB
KSQL_ADVERTISED_LISTENERS
KsqlDB์ ์ ์ํ๋ ํด๋ผ์ด์ธํธ๋ค ksql-cli
์ Kafka Connect๊ฐ KsqlDB์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ์ฃผ์ ์
๋๋ค. ์ด ๊ฐ์ด ์ ๋๋ก ์ค์ ๋์ด ์์ง ์๋ค๋ฉด, ksql-cli
๊ฐ ์ ๋๋ก ๋์ํ์ง ์์ต๋๋ค
์์ ๊ณผ์ ์์ bitnami-kafka์ Advertised Listeners๋ฅผ ์ ๋๋ก ์ค์ ํ๋ ๊ณผ์ ์ ๋ํด์ ์๊ฐ ํ๋๋ฐ์. bitnami-kafka์ Advertised Listeners๋ง ์ ๋๋ก ์ค์ ํ์ ๋๋ ksqldb-server
๋ ์ ์ ์ ๊ทผ ํ์์ง๋ง, ksqldb-cli
๋ ksqldb-server
์ ์ ๊ทผํ์ง ๋ชปํ๋ ๋ฌธ์ ๋ฅผ ๊ฒช์์ต๋๋ค.
๊ทธ๋์ ksqldb-server
๋ฅผ ๋ํ๋ก์ด ํ ๋, ์๋์ ๊ฐ์ด ์ค์ ์ด ํ์ ํ์ต๋๋ค.
...
containers:
- name: ksqldb-server
# https://hub.docker.com/r/confluentinc/ksqldb-server
image: confluentinc/ksqldb-server:0.29.0
ports:
- containerPort: 8088
env:
- name: KSQL_LISTENERS
value: "http://0.0.0.0:8088"
- name: KSQL_ADVERTISED_LISTENERS
value: "http://0.0.0.0:8088,http://ksqldb-service.kafka.svc.cluster.local:8088"
- name: KSQL_BOOTSTRAP_SERVERS
value: "bitnami-kafka.kafka.svc.cluster.local:9092"
- name: KSQL_SECURITY_PROTOCOL
value: "PLAINTEXT"
- name: KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE
value: "true"
- name: KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE
value: "true"
๋ถ๋ก
Empty Advertised Listeners
๋ง์ฝ Advertised Listeners ๊ฐ์ด ์ค์ ๋์ง ์์ผ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก Listeners์ ์ค์ ๋ ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
If this is not set, the value for
listeners
will be used. Unlikelisteners
, it is not valid to advertise the0.0.0.0
meta-address.
๊ทธ๋ฌ๋ listeners
์๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ธฐ ๋๋ฌธ์, Advertised Listener๊ฐ ๊ทธ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ ๋๋ก ๋์ํ์ง ์๊ฒ ๋ฉ๋๋ค.
INTERNAL
, EXTERNAL
ํ๋กํ ์ฝ
์ข
์ข
listeners
์ ๊ฐ์ด ์๋์ ๊ฐ์ด ์ธํ
๋๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
listeners=INTERNAL://192.168.1.10:9092,EXTERNAL://0.0.0.0:9093
advertised.listeners=INTERNAL://192.168.1.10:9092,EXTERNAL://public-broker.mydomain.com:9093
INTERNAL
? EXTERNAL
? ์์์๋ PLAINTEXT://...
๋ก ์ค์ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด์๋๋ฐ, ์ด๋ฐ ๊ฒฝ์ฐ๋ ์ด๋ค ๊ฒฝ์ฐ์ธ์ง ๊ถ๊ธํด์ก์ต๋๋ค.
์นดํ์นด์์๋ ๋ด๋ถ ์๋น์ค์ ์ธ๋ถ ํด๋ผ์ด์ธํธ์ ์ ๊ทผ์ ๋ถ๋ฆฌํด ๊ด๋ฆฌํ ์ ์๋ค๊ณ ํฉ๋๋ค. listeners
์ ์์ฑ๋ ๋ด์ฉ์ ํด์ํด๋ณด๋ฉด
INTERNAL://192.168.1.10:9092
- ๋ด๋ถ ์๋น์ค๋
9092
ํฌํธ๋ฅผ ํตํด ์ ์ํ ์ ์๋ค.
- ๋ด๋ถ ์๋น์ค๋
EXTERNAL://0.0.0.0:9093
- ์ธ๋ถ ํด๋ผ์ด์ธํธ๋
9093
ํฌํธ๋ฅผ ํตํด์ ์ ์ํ ์ ์๋ค.
- ์ธ๋ถ ํด๋ผ์ด์ธํธ๋
๊ทธ๋ฆฌ๊ณ advertised.listeners
์ ๋ด์ฉ์ ํด์ํ๋ฉด
INTERNAL://192.168.1.10:9092
- ๋ด๋ถ ์๋น์ค๋ VPC ๋ง ๋ด์ Cluster IP๋ก ์ ๊ทผํด์ผ ํ๋ค.
EXTERNAL://public-broker.mydomain.com:9093
- ์ธ๋ถ ์ ๊ทผ์ ์์ hostname์ผ๋ก ์ ์ํด์ผ ํ๋ค.
advertised.listeners
์ INTERNAL
๊ณผ EXTERNAL
2๊ฐ์ ์ฃผ์๊ฐ ์ค์ ๋์๋๋ฐ์. ํด๋ผ์ด์ธํธ๊ฐ ๋ฉํ๋ฐ์ดํฐ ํธ๋์์ดํฌ ๊ณผ์ ์์ ์ ๋ฌ ๋ฐ์ advertised.listeners
์ ์ฃผ์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ด INTERNAL
์ ์ํ๋ค๋ฉด, INTERNAL
๋ก ์๋๋ผ๋ฉด EXTERNAL
์ ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ํ๋ค๋ฉด, INTERNAL
๋ง ์ ์ํด์ ๋ด๋ถ ํธ๋ํฝ๋ง ๋ฐ๋๋ก ๋ง๋ค ์๋ ์๊ณ , EXTERNAL
๋ง ์ ์ํด์ ์ธ๋ถ ํธ๋ํฝ ๋ฐ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค๊ณ ํฉ๋๋ค.
(์ด๋ ๊ฒ ์ ์๋๋ฐ๋ ์์ง ์์ ํ ์ดํดํ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋คโฆ;;)