在 Kubernetes 中使用 StatefulSet 部署 Kafka 集群需要注意以下几个方面。
- 创建一个 ConfigMap
ConfigMap 可以用来存放 Kafka 的配置文件,例如 server.properties
等。在创建 ConfigMap 时可以指定这些配置文件的内容,例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: kafka-configmap
data:
server.properties: |
broker.id=0
listeners=PLAINTEXT://$(hostname -f):9092
advertised.listeners=PLAINTEXT://$(hostname -f):9092
log.dirs=/var/lib/kafka/data
zookeeper.connect=zookeeper-service-headless:2181/kafka
- 创建一个 Headless Service
为了让每个 Kafka 实例都有唯一的 hostname 和 network identity,我们需要创建一个 Headless Service 来分配独立的 hostname。
apiVersion: v1
kind: Service
metadata:
name: kafka-service-headless
spec:
ports:
- name : client
port : 9092
targetPort : client
clusterIP : None
selector :
app : kafka
- 创建一个 StatefulSet
下面是一个简单的 Kafka StatefulSet 配置示例,其中 replicas
指定了副本数,serviceName
指定了使用的 Headless Service 名称,volumeClaimTemplates
定义了每个 Pod 使用的 PVC。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: kafka-statefulset
spec:
serviceName: kafka-service-headless
replicas: 3
selector:
matchLabels:
app: kafka
template:
metadata:
labels:
app: kafka
spec:
containers:
- name : kafka
image : wurstmeister/kafka:2.13-2.8.0
command :
- /bin/bash
- -c
- |
/opt/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties --override broker.id=$(hostname|awk -F'-' '{print $NF}') --override listeners=PLAINTEXT://$(hostname -f):9092 --override advertised.listeners=PLAINTEXT://$(hostname -f):9092
ports :
- containerPort : 9092
name : client
env :
- name : KAFKA_ADVERTISED_HOST_NAME
valueFrom :
fieldRef :
fieldPath : metadata.name
- name : KAFKA_ZOOKEEPER_CONNECT
value : zookeeper-service-headless:2181/kafka
volumeMounts :
- name : data-volume
mountPath : /var/lib/kafka/data
- name : config-volume
mountPath : /etc/kafka/
volumes :
- name : data-volume
persistentVolumeClaim :
claimName : pvc-kafka-data
- name : config-volume
configMap :
name : kafka-configmap
terminationGracePeriodSeconds: 10
dnsPolicy: ClusterFirstWithHostNet
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name:pvc-kafka-data
spec:
accessModes:
- ReadWriteOnce
resources :
requests :
storage : 20Gi
这个配置将创建三个 Kafka 实例,每个实例都有自己的 PVC 存储卷和配置文件。StatefulSet 会按照 kafka-0
、kafka-1
、kafka-2
的顺序为 Pod 分配唯一的 hostname 和 network identity。我们可以使用 DNS 来访问这些实例:
PLAINTEXT://kafka-0.kafka-service-headless.default.svc.cluster.local:9092
PLAINTEXT://kafka-1.kafka-service-headless.default.svc.cluster.local:9092
PLAINTEXT://kafka-2.kafka-service-headless.default.svc.cluster.local:9092
这样,我们就成功地使用 Kubernetes StatefulSet 部署了一个 Kafka 集群。