【问题标题】:Running local development kafka in kubernetes with Kind and persisting volumes在 kubernetes 中使用 Kind 和持久卷运行本地开发 kafka
【发布时间】:2022-01-10 00:42:31
【问题描述】:

我正在运行一个 Dev Linux 机器并设置一个本地 Kafka 以在 Kubernetes 上进行开发(从 docker-compose 移动以学习和练习 pourposes)与 Kind 并且一切正常,但我现在正在尝试从 Kafka 映射卷和 Zookeeper 到主机,但我只能处理 Kafka 卷。 对于 zookeeper,我配置并将数据和日志路径映射到一个卷,但内部目录没有在主机上公开(这发生在 kafka 映射中),它只显示数据和日志文件夹,但实际上没有内容存在host 所以重启 zookeeper 会重置状态。

我想知道在使用 Kind 并映射来自不同 pod 的多个目录时是否存在限制或不同的方法,我错过了什么?为什么只有 Kafka 卷在主机上成功持久化。

完整的设置以及如何运行它的自述文件位于pv-pvc-setup 文件夹下的on Github。

Zookeeper 有意义的配置、部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    service: zookeeper
  name: zookeeper
spec:
  replicas: 1
  selector:
    matchLabels:
      service: zookeeper
  strategy: {}
  template:
    metadata:
      labels:
        network/kafka-network: "true"
        service: zookeeper
    spec:
      containers:
        - env:
            - name: TZ
            - name: ZOOKEEPER_CLIENT_PORT
              value: "2181"
            - name: ZOOKEEPER_DATA_DIR
              value: "/var/lib/zookeeper/data"
            - name: ZOOKEEPER_LOG_DIR
              value: "/var/lib/zookeeper/log"
            - name: ZOOKEEPER_SERVER_ID
              value: "1"
          image: confluentinc/cp-zookeeper:7.0.1
          name: zookeeper
          ports:
            - containerPort: 2181
          resources: {}
          volumeMounts:
            - mountPath: /var/lib/zookeeper
              name: zookeeper-data
      hostname: zookeeper
      restartPolicy: Always
      volumes:
        - name: zookeeper-data
          persistentVolumeClaim:
            claimName: zookeeper-pvc

永久卷声明:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: zookeeper-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: zookeeper-local-storage
  resources:
    requests:
      storage: 5Gi

持续音量:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: zookeeper-pv
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: zookeeper-local-storage
  capacity:
    storage: 5Gi
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /var/lib/zookeeper

种类配置:

apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
  - role: control-plane
  - role: worker
    extraPortMappings:
      - containerPort: 30092 # internal kafka nodeport
        hostPort: 9092 # port exposed on "host" machine for kafka
      - containerPort: 30081 # internal schema-registry nodeport
        hostPort: 8081 # port exposed on "host" machine for schema-registry
    extraMounts:
      - hostPath: ./tmp/kafka-data
        containerPath: /var/lib/kafka/data
        readOnly: false
        selinuxRelabel: false
        propagation: Bidirectional
      - hostPath: ./tmp/zookeeper-data
        containerPath: /var/lib/zookeeper
        readOnly: false
        selinuxRelabel: false
        propagation: Bidirectional

正如我提到的设置工作正常,我现在只是试图确保相关的 kafka 和 zookeeper 卷映射到持久性外部存储(在本例中为本地磁盘)。

【问题讨论】:

  • 从这里开始 - strimzi.io 或者至少使用 Confluent 现有的 Helm 图表
  • 我认为你的问题是./tmp 与/tmp 不一样,而且你真的不应该使用 tmp 文件夹来存储数据
  • 嗨,谢谢我知道这个项目。这不是我要找的。正如我所提到的,这是出于学习和学习目的,问题不在于运行本地 Kafka 本身,我在这里的设置可以正常工作。我只是想解决具有多个容器和特定种类的持久存储的问题。
  • 我的意思是 Strimzi 1) 适用于种类 2) 已经找到了持久存储。在任何情况下,./tmp/kafka-data 都会创建一个相对目录,并且应该是您设置的 Zookeeper 数据旁边的文件夹
  • 好的,现在可以了。我为 zookeeper 的每个目录(数据和日志)创建了一个特定的映射和 pv/pvc,并在 kind-config 上为每个目录创建了一个特定的条目。另外,我注意到主机文件夹以 root 身份创建的权限问题,这可能是由于 docker 运行特权用户,所以我确保使用我用来在主机上运行 kind 的同一用户预先创建文件夹一切正常,完整设置在这里 -> github.com/mmaia/kafka-local-kubernetes 在 pv-pvc-setup 文件夹下。感谢您提供的提示,我现在将学习存储类解决方案。

标签: kubernetes apache-kafka apache-zookeeper kind


【解决方案1】:

我终于解决了。我在初始设置中遇到了 2 个主要问题,现已修复。

需要预先创建用于在本地主机上保存数据的文件夹,以便它们与用于创建初始 Kind 集群的uid:guid 相同,如果没有,文件夹将无法正确保存数据.

为来自 zookeeper 的每个持久文件夹(数据和日志)创建特定的持久卷和持久卷声明,并在 kind-config 上配置它们。这是最终的 kind-config:

apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
  - role: control-plane
  - role: worker
    extraPortMappings:
      - containerPort: 30092 # internal kafka nodeport
        hostPort: 9092 # port exposed on "host" machine for kafka
      - containerPort: 30081 # internal schema-registry nodeport
        hostPort: 8081 # port exposed on "host" machine for schema-registry
    extraMounts:
      - hostPath: ./tmp/kafka-data
        containerPath: /var/lib/kafka/data
        readOnly: false
        selinuxRelabel: false
        propagation: Bidirectional
      - hostPath: ./tmp/zookeeper-data/data
        containerPath: /var/lib/zookeeper/data
        readOnly: false
        selinuxRelabel: false
        propagation: Bidirectional
      - hostPath: ./tmp/zookeeper-data/log
        containerPath: /var/lib/zookeeper/log
        readOnly: false
        selinuxRelabel: false
        propagation: Bidirectional

使用持久卷和持久卷声明的完整设置可在此 repo 中获得,如果您想为了好玩而运行它,请提供进一步的说明。 https://github.com/mmaia/kafka-local-kubernetes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2018-04-18
    • 1970-01-01
    • 2022-08-17
    • 2019-08-11
    相关资源
    最近更新 更多