kubernetes - 我很难在 gke 上设置 kafka 并且想知道设置它的最佳方式?

标签 kubernetes apache-kafka google-kubernetes-engine

我试图使用 statefulset 在 gke 的集群中部署 zookeeper 和 Kafka 服务器,但 Kafka 和 zookeeper 之间的通信失败,日志中出现错误消息。我想知道在 kubernetes 中设置 Kafka 的最简单方法是什么。

我尝试了以下配置,发现 Kafka 无法与 zookeeper 通信,但不知道为什么?我知道我可能需要 headless 服务,因为通信由 Kafka 和 zookeeper 自己处理。

动物园管理员

apiVersion: v1
kind: Service
metadata:
  name: zookeeper
spec:
  type: LoadBalancer
  selector:
    app: zookeeper
  ports:
  - port: 2181
    targetPort: client
    name: zk-port
  - port: 2888
    targetPort: leader
    name: zk-leader
  - port: 3888
    targetPort: election
    name: zk-election
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zookeeper
spec:
  replicas: 3
  selector:
    matchLabels:
      app: zookeeper
  serviceName: zookeeper
  podManagementPolicy: Parallel
  template:
    metadata:
      labels:
        app: zookeeper
    spec:
      containers:
        - name: zk-pod
          image: zookeeper:latest
          imagePullPolicy: Always
          ports:
            - name: client
              containerPort: 2181
            - name: leader
              containerPort: 2888
            - name: election
              containerPort: 3888
          env:
            - name: ZOO_MY_ID
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: ZOO_TICK_TIME
              value: "2000"
            - name: ZOO_INIT_LIMIT
              value: "5"
            - name: ZOO_SYNC_LIMIT
              value: "2"
            - name: ZOO_SERVERS
              value: zookeeper:2888:3888

卡夫卡
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kafka
spec:
  replicas: 3
  selector:
    matchLabels:
      app: kafka
  serviceName: kafka-svc
  podManagementPolicy: Parallel
  template:
    metadata:
      labels:
        app: kafka
    spec:
      containers:
      - name: kafka
        image: confluentinc/cp-kafka:latest
        ports:
          - containerPort: 9092
            name: client
        env:
          - name: KAFKA_ZOOKEEPER_CONNECT
            value: zookeeper:2181
          - name: KAFKA_ADVERTISED_LISTENERS
            value: kafka.default.svc.cluster.local:9092
---
apiVersion: v1
kind: Service
metadata:
  name: kafka-svc
spec:
  type: LoadBalancer
  selector:
    app: kafka
  ports:
  - port: 9092
    targetPort: client
    name: kfk-port
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: kafka-pdb
spec:
  selector:
    matchLabels:
      app: kafka
  minAvailable: 2

我希望能够向某个主题发送消息并能够读回它们。我一直在使用kafkacat测试连接。

最佳答案

这是 Official Kubernetes Documentation about StateFulsets 中指定的限制之一。 , 那

  • StatefulSets currently require a Headless Service to be responsible for the network identity of the Pods. You are responsible for creating this Service.


所以,正如你提到的,你需要 Headless Service并且您可以轻松地将 headless 服务 yaml 添加到您的配置顶部,类似于下面的两个 StatefulSet:
apiVersion: v1
kind: Service
metadata:
  name: zookeeper
  labels:
    app: zookeeper
spec:
  ports:
  - port: 2181 
    name: someport
  clusterIP: None
  selector:
    app: zookeeper

希望能帮助到你!

关于kubernetes - 我很难在 gke 上设置 kafka 并且想知道设置它的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56259599/

相关文章:

java - 尝试以编程方式通过 jmx 访问 kafka 指标时出错

linux - 如何在具有完全访问权限的 Linux 实例上将 Google Bucket 挂载为本地磁盘

kubernetes - 警告 : networking. k8s.io/v1beta1 Ingress 在 v1.19+ 中已弃用,在 v1.22+ 中不可用;使用networking.k8s.io/v1 Ingress

kubernetes - 如何在kubernetes集群中启用 “ttlAfterFinished=true”?

docker schemaregistry和kafkarest无法启动

apache-kafka - java.lang.ClassNotFoundException : kafka. api.OffsetRequest

google-kubernetes-engine - 通过 gcloud 302.0.0 创建和更新 GKE 集群失败

kubernetes - 如何保护 Google Kubernetes Engine (GKE) 中的只读端口 10255?

kubernetes - Kubectl错误:对象已被修改;请将您的更改应用到最新版本,然后重试

docker - 在不使用任何公共(public)/私有(private) docker 注册表的情况下创建 kubernetes pod