Доступ к битнами / кафкам вне кластера kubernetes - PullRequest
0 голосов
/ 20 октября 2019

В настоящее время я использую изображение bitnami / kafka (https://hub.docker.com/r/bitnami/kafka) и развертываю его на kubernetes.

  • Мастер kubernetes: 1
  • Работники kubernetes: 3

Внутри кластера другое приложение может найти kafka. Проблема возникает при попытке получить доступ к контейнеру kafka снаружи кластера. При чтении я читаю, что нам нужно установить свойство "advertised.listener =PLAINTTEXT: // имя_хоста: номер_порта "для внешних клиентов kafka.

В настоящее время я ссылаюсь на" https://github.com/bitnami/charts/tree/master/bitnami/kafka". Внутри моего файла values.yaml я добавил

значений. yaml

  • AdvertiseListeners1: 10.21.0.191

и statefulset.yaml

    - name: KAFKA_CFG_ADVERTISED_LISTENERS
      value: 'PLAINTEXT://{{ .Values.advertisedListeners }}:9092' 

Дляодин экземпляр kafka работает нормально.

Но для кластера kafka с 3 узлами я изменил некоторые настройки, как показано ниже: values.yaml

  • advertisedListeners1: 10.21.0.191
  • AdvertiseledListeners2: 10.21.0. 192
  • advertisedListeners3: 10.21.0.193

и Statefulset.yaml

    - name: KAFKA_CFG_ADVERTISED_LISTENERS
      {{- if $MY_POD_NAME := "kafka-0" }}
      value: 'PLAINTEXT://{{ .Values.advertisedListeners1 }}:9092'
      {{- else if $MY_POD_NAME := "kafka-1" }}
      value: 'PLAINTEXT://{{ .Values.advertisedListeners2 }}:9092'
      {{- else if $MY_POD_NAME := "kafka-2" }}
      value: 'PLAINTEXT://{{ .Values.advertisedListeners3 }}:9092'
      {{- end }}

Ожидаемый результат состоит в том, что все 3 экземпляра kafka должныполучить для свойства advertised.listener значение ip-адреса рабочих узлов.

пример:

  • kafka-0 -> "PLAINTEXT: //10.21.0.191: 9092"

  • kafka-1 -> "PLAINTEXT: //10.21.0.192: 9092"

  • kafka-3 -> "PLAINTEXT: //10.21.0.193:9092"

В настоящее время только один модуль Кафки запущен и работает, а два других находятся в состоянии аварийного отключения.

и другие два модуля отображают ошибку как:

[2019-10-20 13: 09: 37,753] INFO [LogDirFailureHandler]: запуск (kafka.server.ReplicaManager $ LogDirFailureHandler) [2019-10-20 13: 09: 37,786] ОШИБКА [KafkaServer id = 1002] Неустранимая ошибка при запуске KafkaServer. Подготовка к закрытию (kafka.server.KafkaServer) java.lang.IllegalArgumentException: требование не выполнено: настроенные конечные точки 10.21.0.191:9092 в объявленных слушателях уже зарегистрированы посредником 1001 по адресу scala.Predef $ .require (Predef.scala: 224)по адресу kafka.server.KafkaServer $$ anonfun $ createBrokerInfo $ 2.apply (KafkaServer.scala: 399) по адресу kafka.server.KafkaServer $$ anonfun $ createBrokerInfo $ 2.apply (KafkaServer.scala: 397) по адресу scala.Rizable.able. $ class.foreach (ResizableArray.scala: 59) в scala.collection.mutable.ArrayBuffer.foreach (ArrayBuffer.scala: 48) в kafka.server.KafkaServer.createBrokerInfo (KafkaServer.scala: 397) в kafka.server.Kзапуск (KafkaServer.scala: 261) в kafka.server.KafkaServerStartable.startup (KafkaServerStartable.scala: 38) в kafka.Kafka $ .main (Kafka.scala: 84) в kafka.Kafka.main (Kafka.scala)

Это означает, что логика, применяемая в statefulset.yaml, не работает. Может кто-нибудь помочь мне в решении этого ..?

Буду признателен за любую помощь ..

Вывод kubectl get statefulset kafka -o yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  creationTimestamp: "2019-10-29T07:04:12Z"
  generation: 1
  labels:
    app.kubernetes.io/component: kafka
    app.kubernetes.io/instance: kafka
    app.kubernetes.io/managed-by: Tiller
    app.kubernetes.io/name: kafka
    helm.sh/chart: kafka-6.0.1
  name: kafka
  namespace: default
  resourceVersion: "12189730"
  selfLink: /apis/apps/v1/namespaces/default/statefulsets/kafka
  uid: d40cfd5f-46a6-49d0-a9d3-e3a851356063
spec:
  podManagementPolicy: Parallel
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/component: kafka
      app.kubernetes.io/instance: kafka
      app.kubernetes.io/name: kafka
  serviceName: kafka-headless
  template:
    metadata:
      creationTimestamp: null
      labels:
        app.kubernetes.io/component: kafka
        app.kubernetes.io/instance: kafka
        app.kubernetes.io/managed-by: Tiller
        app.kubernetes.io/name: kafka
        helm.sh/chart: kafka-6.0.1
      name: kafka
    spec:
      containers:
      - env:
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.podIP
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        - name: KAFKA_CFG_ZOOKEEPER_CONNECT
          value: kafka-zookeeper
        - name: KAFKA_PORT_NUMBER
          value: "9092"
        - name: KAFKA_CFG_LISTENERS
          value: PLAINTEXT://:$(KAFKA_PORT_NUMBER)
        - name: KAFKA_CFG_ADVERTISED_LISTENERS
          value: PLAINTEXT://10.21.0.191:9092
        - name: ALLOW_PLAINTEXT_LISTENER
          value: "yes"
        - name: KAFKA_CFG_BROKER_ID
          value: "-1"
        - name: KAFKA_CFG_DELETE_TOPIC_ENABLE
          value: "false"
        - name: KAFKA_HEAP_OPTS
          value: -Xmx1024m -Xms1024m
        - name: KAFKA_CFG_LOG_FLUSH_INTERVAL_MESSAGES
          value: "10000"
        - name: KAFKA_CFG_LOG_FLUSH_INTERVAL_MS
          value: "1000"
        - name: KAFKA_CFG_LOG_RETENTION_BYTES
          value: "1073741824"
        - name: KAFKA_CFG_LOG_RETENTION_CHECK_INTERVALS_MS
          value: "300000"
        - name: KAFKA_CFG_LOG_RETENTION_HOURS
          value: "168"
        - name: KAFKA_CFG_LOG_MESSAGE_FORMAT_VERSION
        - name: KAFKA_CFG_MESSAGE_MAX_BYTES
          value: "1000012"
        - name: KAFKA_CFG_LOG_SEGMENT_BYTES
          value: "1073741824"
        - name: KAFKA_CFG_LOG_DIRS
          value: /bitnami/kafka/data
        - name: KAFKA_CFG_DEFAULT_REPLICATION_FACTOR
          value: "1"
        - name: KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR
          value: "1"
        - name: KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR
          value: "1"
        - name: KAFKA_CFG_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM
          value: https
        - name: KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR
          value: "1"
        - name: KAFKA_CFG_NUM_IO_THREADS
          value: "8"
        - name: KAFKA_CFG_NUM_NETWORK_THREADS
          value: "3"
        - name: KAFKA_CFG_NUM_PARTITIONS
          value: "1"
        - name: KAFKA_CFG_NUM_RECOVERY_THREADS_PER_DATA_DIR
          value: "1"
        - name: KAFKA_CFG_SOCKET_RECEIVE_BUFFER_BYTES
          value: "102400"
        - name: KAFKA_CFG_SOCKET_REQUEST_MAX_BYTES
          value: "104857600"
        - name: KAFKA_CFG_SOCKET_SEND_BUFFER_BYTES
          value: "102400"
        - name: KAFKA_CFG_ZOOKEEPER_CONNECTION_TIMEOUT_MS
          value: "6000"
        image: docker.io/bitnami/kafka:2.3.0-debian-9-r88
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 2
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: kafka
          timeoutSeconds: 5
        name: kafka
        ports:
        - containerPort: 9092
          name: kafka
          protocol: TCP
        readinessProbe:
          failureThreshold: 6
          initialDelaySeconds: 5
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: kafka
          timeoutSeconds: 5
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /bitnami/kafka
          name: data
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 1001
        runAsUser: 1001
      terminationGracePeriodSeconds: 30
  updateStrategy:
    type: RollingUpdate
  volumeClaimTemplates:
  - metadata:
      creationTimestamp: null
      name: data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 8Gi
      volumeMode: Filesystem
    status:
      phase: Pending
status:
  collisionCount: 0
  currentReplicas: 3
  currentRevision: kafka-56ff499d74
  observedGeneration: 1
  readyReplicas: 1
  replicas: 3
  updateRevision: kafka-56ff499d74
  updatedReplicas: 3

1 Ответ

1 голос
/ 30 октября 2019

Я вижу, что у вас есть некоторые проблемы с передачей различных переменных среды для разных модулей в StatefulSet.

Вы пытаетесь достичь этого с помощью шаблонов helm:

- name: KAFKA_CFG_ADVERTISED_LISTENERS
  {{- if $MY_POD_NAME := "kafka-0" }}
  value: 'PLAINTEXT://{{ .Values.advertisedListeners1 }}:9092'
  {{- else if $MY_POD_NAME := "kafka-1" }}
  value: 'PLAINTEXT://{{ .Values.advertisedListeners2 }}:9092'
  {{- else if $MY_POD_NAME := "kafka-2" }}
  value: 'PLAINTEXT://{{ .Values.advertisedListeners3 }}:9092'
  {{- end }}

В Руководство по шаблону helm Вы можете найти это объяснение:

В шаблонах Helm переменная является именованной ссылкой на другой объект. Это следует за формой $ name. Переменные назначаются с помощью специального оператора присваивания:: =.

Теперь давайте посмотрим на ваш код:

{{- if $MY_POD_NAME := "kafka-0" }}

Это присваивание переменной, а не сравнение и после этого присваивания, if оператор оценивает это выражение как true, и поэтому в вашем манифесте staefulset yaml вы видите это как вывод:

- name: KAFKA_CFG_ADVERTISED_LISTENERS
    value: PLAINTEXT://10.21.0.191:9092

Чтобы заставить его работать должным образом, вам не следуетиспользовать шаблонный шлем. Это не сработает.

Один из способов сделать это - создать отдельную переменную окружения для каждого узла kafka и передать все эти переменные всем модулям, например:

- env:
  - name: MY_POD_NAME
    valueFrom:
      fieldRef:
        apiVersion: v1
        fieldPath: metadata.name
  - name: KAFKA_0
      value: 10.21.0.191
  - name: KAFKA_1
      value: 10.21.0.192
  - name: KAFKA_2
      value: 10.21.0.193
#  - name: KAFKA_CFG_ADVERTISED_LISTENERS
#      value: PLAINTEXT://$MY_POD_NAME:9092

а также создайте свой собственный образ докера с измененным стартовым скриптом, который будет экспортировать переменную KAFKA_CFG_ADVERTISED_LISTENERS с соответствующим значением в зависимости от MY_POD_NAME.

Если вы не хотите создавать свой собственный образ, вы можете создать ConfigMapс измененным entrypoint.sh и смонтируйте его вместо старого entrypoint.sh (вы также можете использовать любой другой файл, просто посмотрите здесь для получения дополнительной информации о том, как создается образ kafka).

Монтаж ConfigMap выглядит следующим образом:

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
    - name: test-container
      image: docker.io/bitnami/kafka:2.3.0-debian-9-r88
      volumeMounts:
      - name: config-volume
        mountPath: /entrypoint.sh
        subPath: entrypoint.sh
  volumes:
    - name: config-volume
      configMap:
        # Provide the name of the ConfigMap containing the files you want
        # to add to the container
        name: kafka-entrypoint-config
        defaultMode: 0744 # remember to add proper (executable) permissions

apiVersion: v1
kind: ConfigMap
metadata:
  name: kafka-entrypoint-config
  namespace: default
data:
  entrypoint.sh: |
    #!/bin/bash
    # Here add modified entrypoint script

Пожалуйста, дайте мне знать, если это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...