CentOS 7에서 Kafka 3.7 단일 노드 구축: Zookeeper + SSL 인증 및 공중망 프록시 연동 가이드

1. 필요한 패키지 다운로드

먼저 JDK 1.8, Zookeeper 3.8.4, 그리고 Kafka 3.7.0 바이너리를 준비합니다. JDK는 별도로 다운로드해야 합니다.

wget https://downloads.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
wget https://archive.apache.org/dist/kafka/3.7.0/kafka_2.13-3.7.0.tgz

2. Java 환경 변수 설정

JDK 압축을 풀고 전역 환경 변수를 등록합니다.

tar xf jdk-8u201-linux-x64.tar.gz -C /usr/local
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/jdk1.8.0_201
export CLASSPATH=$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile.d/java.sh
echo $JAVA_HOME

3. Zookeeper 설치 및 설정

Zookeeper 압축을 풀고 심볼릭 링크를 생성한 후 설정 파일을 수정합니다.

tar xf apache-zookeeper-3.8.4-bin.tar.gz -C /usr/local
cd /usr/local
ln -sv apache-zookeeper-3.8.4-bin zookeeper
cd zookeeper/conf/
cp zoo_sample.cfg zoo.cfg

vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Data/zookeeper
clientPort=2181
admin.enableServer=true
admin.serverPort=8888

4. Kafka 설치 및 SSL 인증서 생성

Kafka 압축을 풀고 SSL 디렉터리를 생성한 후 인증서를 발급합니다.

tar xf kafka_2.13-3.7.0.tgz -C /usr/local
cd /usr/local
ln -sv kafka_2.13-3.7.0 kafka
cd kafka
mkdir ssl && cd ssl

인증서 생성을 위한 스크립트를 작성합니다.

vim cert.sh
#!/bin/bash

BASE_DIR=/usr/local/kafka/ssl
CERT_OUTPUT_PATH="$BASE_DIR"
PASSWORD=javsWNHqCseSXPEj
KEY_STORE="$CERT_OUTPUT_PATH/kafka.keystore"
TRUST_STORE="$CERT_OUTPUT_PATH/kafka.truststore"
KEY_PASSWORD=$PASSWORD
STORE_PASSWORD=$PASSWORD
TRUST_KEY_PASSWORD=$PASSWORD
TRUST_STORE_PASSWORD=$PASSWORD
CLUSTER_NAME=demo-kafka-client
CERT_AUTH_FILE="$CERT_OUTPUT_PATH/ca-cert"
CLUSTER_CERT_FILE="$CERT_OUTPUT_PATH/${CLUSTER_NAME}-cert"
DAYS_VALID=36500
D_NAME="CN=kafka.example.com, OU=dev, O=example, L=Seoul, ST=Seoul, C=KR"

mkdir -p $CERT_OUTPUT_PATH

keytool -keystore $KEY_STORE -alias $CLUSTER_NAME -validity $DAYS_VALID -genkey -keyalg RSA -storepass $STORE_PASSWORD -keypass $KEY_PASSWORD -dname "$D_NAME"

openssl req -new -x509 -keyout "$CERT_OUTPUT_PATH/ca-key" -out "$CERT_AUTH_FILE" -days "$DAYS_VALID" -passin pass:"$PASSWORD" -passout pass:"$PASSWORD" -subj "/C=KR/ST=Seoul/L=Seoul/O=Example/CN=ExampleCA"

keytool -keystore "$TRUST_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$TRUST_STORE_PASSWORD" -keypass "$TRUST_KEY_PASSWORD" -noprompt

keytool -keystore "$KEY_STORE" -alias "$CLUSTER_NAME" -certreq -file "$CLUSTER_CERT_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt

openssl x509 -req -CA "$CERT_AUTH_FILE" -CAkey $CERT_OUTPUT_PATH/ca-key -in "$CLUSTER_CERT_FILE" -out "${CLUSTER_CERT_FILE}-signed" -days "$DAYS_VALID" -CAcreateserial -passin pass:"$PASSWORD"

keytool -keystore "$KEY_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt

keytool -keystore "$KEY_STORE" -alias "${CLUSTER_NAME}" -import -file "${CLUSTER_CERT_FILE}-signed" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt
sh cert.sh
# 생성된 파일 설명
# ca-cert: CA 인증서 (브로커 간 공유 금지)
# demo-kafka-client-cert-signed: 서명된 Kafka 인증서 (브로커 간 공유 금지)
# kafka.keystore: Kafka 키스토어 (모든 클라이언트와 브로커에 필요)
# kafka.truststore: Kafka 트러스트스토어 (모든 클라이언트와 브로커에 필요)

5. Kafka 서버 설정

서버 설정 파일(config/server.properties)을 다음과 같이 수정합니다.

broker.id=0
log.dirs=/Data/kafka
num.partitions=1

# 네트워크 설정
listeners=SSL://0.0.0.0:9092
advertised.listeners=SSL://kafka.example.com:9092
ssl.keystore.location=/usr/local/kafka/ssl/kafka.keystore
ssl.keystore.password=javsWNHqCseSXPEj
ssl.key.password=javsWNHqCseSXPEj
ssl.truststore.location=/usr/local/kafka/ssl/kafka.truststore
ssl.truststore.password=javsWNHqCseSXPEj
ssl.endpoint.identification.algorithm=
ssl.client.auth=required

# 브로커 간 통신 프로토콜
security.inter.broker.protocol=SSL

# 성능 설정
num.network.threads=5
num.io.threads=16
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
num.recovery.threads.per.data.dir=4

# 로그 설정
log.segment.bytes=1073741824
log.retention.hours=168
log.retention.bytes=10737418240
log.retention.check.interval.ms=300000
log.flush.interval.messages=50000
log.flush.interval.ms=5000

# 복제 설정 (단일 노드)
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
default.replication.factor=1

# Zookeeper 연결
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=18000
zookeeper.session.timeout.ms=18000

group.initial.rebalance.delay.ms=0

6. 서비스 실행

데이터 디렉터리를 생성하고 권한을 설정한 후 Zookeeper와 Kafka를 실행합니다.

useradd avatar
mkdir -pv /Data/{kafka,zookeeper}
chown -R avatar:avatar /Data
chown -R avatar:avatar /usr/local/kafka_2.13-3.7.0/
chown -R avatar:avatar /usr/local/apache-zookeeper-3.8.4-bin/

# Zookeeper 실행
su - avatar
cd /usr/local/zookeeper/bin/
./zkServer.sh start
./zkServer.sh status
netstat -tnlp

# Kafka 실행
cd /usr/local/kafka/bin/
./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
netstat -tnlp

7. 클라이언트 SSL 설정

클라이언트가 사용할 SSL 설정 파일을 생성합니다.

vim client-ssl.config
bootstrap.servers=kafka.example.com:9092
security.protocol=SSL
ssl.keystore.location=/usr/local/kafka/ssl/kafka.keystore
ssl.keystore.password=javsWNHqCseSXPEj
ssl.truststore.location=/usr/local/kafka/ssl/kafka.truststore
ssl.truststore.password=javsWNHqCseSXPEj
ssl.endpoint.identification.algorithm=
ssl.key.password=javsWNHqCseSXPEj

8. 기능 검증

토픽을 생성하고 생산자/소비자를 통해 메시지 전송을 테스트합니다.

# 토픽 생성
./kafka-topics.sh --create --topic test-topic-ssl --bootstrap-server kafka.example.com:9092 --command-config client-ssl.config
./kafka-topics.sh --describe --topic test-topic-ssl --bootstrap-server kafka.example.com:9092 --command-config client-ssl.config
./kafka-topics.sh --list --bootstrap-server kafka.example.com:9092 --command-config client-ssl.config

# 생산자 실행 (터미널 1)
./kafka-console-producer.sh --broker-list kafka.example.com:9092 --topic test-topic-ssl --producer.config client-ssl.config

# 소비자 실행 (터미널 2)
./kafka-console-consumer.sh --bootstrap-server kafka.example.com:9092 --topic test-topic-ssl --from-beginning --consumer.config client-ssl.config

태그: kafka SSL ZooKeeper CentOS7 인증서

6월 27일 00:23에 게시됨