k8s 通过kafka operator部署kafka集群

 

使用的operator是strimzi,官方文档:https://strimzi.io/quickstarts/

1、应用 Strimzi 安装文件,包括 `<Strimzi-install-files>`ClusterRolesClusterRoleBindings一些自定义资源定义( CRD)。CRD 定义了用于自定义资源(例如CRDs<Cafka-container-class>` 等)的模式,这些资源将用于管理 Kafka 集群、主题和用户。

kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka-2' -n kafka-2

 

配置节点亲和性和容忍让operator部署在特定节点组的机器(可选)

wget -O strimzi-install.sh 'https://strimzi.io/install/latest?namespace=kafka-2'

 

大概在24785行

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: strimzi-cluster-operator
  labels:
    app: strimzi
  namespace: kafka-2
spec:
  replicas: 1
  selector:
    matchLabels:
      name: strimzi-cluster-operator
      strimzi.io/kind: cluster-operator
  template:
    metadata:
      labels:
        name: strimzi-cluster-operator
        strimzi.io/kind: cluster-operator
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              # 使用正确的标签键
              - key: eks.amazonaws.com/nodegroup
                operator: In
                values:
                - EKS-Prod-StatefulSet-1V31
      # 在这里添加 tolerations
      tolerations:
      - key: "app"
        operator: "Equal"
        value: "statefulset"
        effect: "NoSchedule"
      serviceAccountName: strimzi-cluster-operator

 

 

2、查看操作员的日志

kubectl logs deployment/strimzi-cluster-operator -n kafka-2 -f

 

3、创建一个新的 Kafka 自定义资源,以获取 Apache Kafka 集群

vim kafka-single-node.yaml

 

pod亲和性和容忍自行添加(可选)

apiVersion: kafka.strimzi.io/v1
kind: KafkaNodePool
metadata:
  name: kafka
  namespace: kafka-3
  labels:
    strimzi.io/cluster: mq
spec:
  replicas: 3
  roles:
    - controller
    - broker
  storage:
    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 1500Gi
        deleteClaim: false
        kraftMetadata: shared
        class: gp3-us-west-2c
  resources:
    requests:
      cpu: "300m"
      memory: "1Gi"
  template:
    pod:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: eks.amazonaws.com/nodegroup
                operator: In
                values:
                - EKS-Prod-Kafka-Logging
      tolerations:
      - key: "app"
        operator: "Equal"
        value: "kafka"
        effect: "NoSchedule"
---
apiVersion: kafka.strimzi.io/v1
kind: Kafka
metadata:
  name: mq
  namespace: kafka-3
spec:
  kafka:
    version: 4.1.1
    metadataVersion: 4.1-IV1
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
    config:
      offsets.topic.replication.factor: 2
      transaction.state.log.replication.factor: 2
      transaction.state.log.min.isr: 2
      default.replication.factor: 2
      min.insync.replicas: 2
      log.retention.hours: 8
      log.segment.bytes: 1073741824
      # 可选:topic消息限制
      message.max.bytes: 67108864
      replica.fetch.max.bytes: 73400320
      fetch.max.bytes: 75497472
      max.request.size: 7340032
      # 可选:确保外部listener的通告地址正确(Strimzi会自动生成,此配置可省略)
      advertised.listeners: "#{KAFKA_ADVERTISED_LISTENERS}"
  entityOperator:
    topicOperator: {}
    userOperator: {}
    # 修正:使用正确的template语法
    template:
      pod:
        # 修正:在entityOperator的template下直接配置
        metadata:
          labels:
            eks.amazonaws.com/nodegroup: EKS-Prod-Kafka-Logging
        # 修正:这里可能需要使用affinity而不是nodeSelector
        affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: eks.amazonaws.com/nodegroup
                  operator: In
                  values:
                  - EKS-Prod-Kafka-Logging
        tolerations:
          - key: "app"
            operator: "Equal"
            value: "kafka"
            effect: "NoSchedule"
      # 为deployment配置
      deployment:
        metadata:
          labels:
            eks.amazonaws.com/nodegroup: EKS-Prod-Kafka-Logging

 

 

提供外部访问(可选)

apiVersion: kafka.strimzi.io/v1
kind: KafkaNodePool
metadata:
  name: kafka
  namespace: kafka-3
  labels:
    strimzi.io/cluster: mq
spec:
  replicas: 3
  roles:
    - controller
    - broker
  storage:
    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 1500Gi
        deleteClaim: false
        kraftMetadata: shared
        class: gp3-us-west-2c
  resources:
    requests:
      cpu: "300m"
      memory: "1Gi"
  template:
    pod:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: eks.amazonaws.com/nodegroup
                operator: In
                values:
                - EKS-Prod-Kafka-Logging
      tolerations:
      - key: "app"
        operator: "Equal"
        value: "kafka"
        effect: "NoSchedule"
---
apiVersion: kafka.strimzi.io/v1
kind: Kafka
metadata:
  name: mq
  namespace: kafka-3
spec:
  kafka:
    version: 4.1.1
    metadataVersion: 4.1-IV1
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
      # 新增外部NodePort listener(核心修改)
      - name: external
        port: 9094  # 容器内独立端口,避免和内部9092冲突
        type: nodeport
        tls: false
        configuration:
          # 指定外部访问的NodePort和broker映射
          bootstrap:
            nodePort: 32518  # 你暴露的外部NodePort
          brokers:
            - broker: 0      # 第一个broker ID(Kraft模式从0开始)
              nodePort: 32519
            - broker: 1      # 第二个broker ID
              nodePort: 32520
            - broker: 2      # 第三个broker ID
              nodePort: 32521
    config:
      offsets.topic.replication.factor: 2
      transaction.state.log.replication.factor: 2
      transaction.state.log.min.isr: 2
      default.replication.factor: 2
      min.insync.replicas: 2
      log.retention.hours: 8
      log.segment.bytes: 1073741824
      # 可选:topic消息最大限制
      message.max.bytes: 67108864
      replica.fetch.max.bytes: 73400320
      fetch.max.bytes: 75497472
      max.request.size: 73400320
      # 可选:确保外部listener的通告地址正确(Strimzi会自动生成,此配置可省略)
      advertised.listeners: "#{KAFKA_ADVERTISED_LISTENERS}"
  entityOperator:
    topicOperator: {}
    userOperator: {}
    # 修正:使用正确的template语法
    template:
      pod:
        # 修正:在entityOperator的template下直接配置
        metadata:
          labels:
            eks.amazonaws.com/nodegroup: EKS-Prod-Kafka-Logging
        # 修正:这里可能需要使用affinity而不是nodeSelector
        affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: eks.amazonaws.com/nodegroup
                  operator: In
                  values:
                  - EKS-Prod-Kafka-Logging
        tolerations:
          - key: "app"
            operator: "Equal"
            value: "kafka"
            effect: "NoSchedule"
      # 为deployment配置
      deployment:
        metadata:
          labels:
            eks.amazonaws.com/nodegroup: EKS-Prod-Kafka-Logging

 

 

 

kc apply -f kafka-single-node.yaml

 

4、查看pod运行状态

image

 

posted @ 2025-12-19 10:08  苦逼yw  阅读(13)  评论(0)    收藏  举报