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
๋ง ์ ์ํด์ ์ธ๋ถ ํธ๋ํฝ ๋ฐ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค๊ณ ํฉ๋๋ค.
(์ด๋ ๊ฒ ์ ์๋๋ฐ๋ ์์ง ์์ ํ ์ดํดํ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋คโฆ;;)