1、制作Kafka镜像
1.1 Dockerfile
FROM harbor.xingxingcar.com/library/jdk:8-centos7
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
ENV VERSION=2.12-2.2.0
ADD ./kafka_${VERSION}.tgz /
ADD ./server.properties /kafka_${VERSION}/config/server.properties
RUN mv /kafka_${VERSION} /kafka
ADD entrypoint.sh /entrypoint.sh
EXPOSE 9092 9999
CMD ["/bin/bash","/entrypoint.sh"]
1.2 server.properties
broker.id={BROKER_ID}
listeners=PLAINTEXT://{LISTENERS}:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs={KAFKA_DATA_DIR}
num.partitions=1
default.replication.factor=3
num.recovery.threads.per.data.dir=1
log.flush.interval.messages=10000
log.flush.interval.ms=1000
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect={ZK_SERVERS}
zookeeper.connection.timeout.ms=6000
1.3 entrypoint.sh
KAFKA_DIR=/kafka
KAFKA_CONF=/kafka/config/server.properties
BROKER_ID=$(( $(hostname | sed 's#.*-##g') + 1 ))
LISTENERS=$(hostname -i)
sed -i s@{BROKER_ID}@${BROKER_ID}@g ${KAFKA_CONF}
sed -i s@{LISTENERS}@${LISTENERS}@g ${KAFKA_CONF}
sed -i s@{KAFKA_DATA_DIR}@${KAFKA_DATA_DIR-/data}@g ${KAFKA_CONF}
sed -i s@{ZK_SERVERS}@${ZK_SERVERS}@g ${KAFKA_CONF}
cd ${KAFKA_DIR}/bin
sed -i '/export KAFKA_HEAP_OPTS/a export JMX_PORT="9999"' kafka-server-start.sh
./kafka-server-start.sh ../config/server.properties
2. 编写yaml文件
[admin@master01 kafka]$cat yaml/kafka.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: kafka
namespace: logging
spec:
serviceName: kafka-svc
replicas: 3
selector:
matchLabels:
app: kafka
template:
metadata:
labels:
app: kafka
spec:
imagePullSecrets:
- name: harbor-admin
containers:
- name: kafka
image: harbor.xx.com/library/kafka:2.12
imagePullPolicy: Always
ports:
- name: client
containerPort: 9092
- name: jmxport
containerPort: 9999
env:
- name: ZK_SERVERS
value: "zookeeper-0.zk-svc:2181,zookeeper-1.zk-svc:2181,zookeeper-2.zk-svc:2181"
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteMany"]
storageClassName: "nfs-provisioner-storage"
resources:
requests:
storage: 50Gi
---
apiVersion: v1
kind: Service
metadata:
name: kafka-svc
namespace: logging
spec:
clusterIP: None
ports:
- name: client
port: 9092
targetPort: 9092
- name: jmx
port: 9999
targetPort: 9999
3. 检查集群
3.1 查看pod ,service
[admin@master01 ~]$kubectl get pod,service -n logging
NAME READY STATUS RESTARTS AGE
pod/kafka-0 1/1 Running 0 15h
pod/kafka-1 1/1 Running 0 15h
pod/kafka-2 1/1 Running 0 15h
pod/zookeeper-0 1/1 Running 0 19h
pod/zookeeper-1 1/1 Running 0 19h
pod/zookeeper-2 1/1 Running 0 19h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kafka-svc ClusterIP None <none> 9092/TCP,9999/TCP 15h
service/zk-svc ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 19h
3.2 使用kafka命令创建一个topic
root@kafka-0:/
> --create \
> --zookeeper zookeeper-0.zk-svc:2181,zookeeper-1.zk-svc:2181,zookeeper-2.zk-svc:2181 \
> --partitions 1 \
> --replication-factor 3 \
> --topic ikun
Created topic ikun.
3.3 模拟消息发布者
root@kafka-0:/
>hello ikun
>hello kunkun
3.4 模拟消息订阅者
root@kafka-2:/
hello ikun
hello kunkun