9
votes

TimeoutException: le délai d'expiration a expiré lors de la récupération des métadonnées du sujet Kafka

J'ai essayé de déployer Kafka avec un registre de schéma localement à l'aide de Kubernetes. Cependant, les journaux du pod de registre de schéma affichent ce message d'erreur:

apiVersion: v1
kind: Service
metadata:
  name: zookeeper
spec:
  ports:
    - name: client
      port: 2181
  selector:
    app: zookeeper
---
apiVersion: v1
kind: Service
metadata:
  name: zookeeper-1
spec:
  ports:
    - name: client
      port: 2181
    - name: followers
      port: 2888
    - name: election
      port: 3888
  selector:
    app: zookeeper
    server-id: "1"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: zookeeper-1
spec:
  selector:
    matchLabels:
      app: zookeeper
      server-id: "1"
  replicas: 1
  template:
    metadata:
      labels:
        app: zookeeper
        server-id: "1"
    spec:
      volumes:
        - name: data
          emptyDir: {}
        - name: wal
          emptyDir:
            medium: Memory
      containers:
        - name: server
          image: elevy/zookeeper:v3.4.7
          env:
            - name: MYID
              value: "1"
            - name: SERVERS
              value: "zookeeper-1"
            - name: JVMFLAGS
              value: "-Xmx2G"
          ports:
            - containerPort: 2181
            - containerPort: 2888
            - containerPort: 3888
          volumeMounts:
            - mountPath: /zookeeper/data
              name: data
            - mountPath: /zookeeper/wal
              name: wal

Quelle pourrait être la raison de ce comportement? ' Afin d'exécuter Kubernetes localement, j'utilise la version Minikube v0.32.0 avec la version Kubernetes v1.13.0

Ma configuration Kafka:

apiVersion: v1
kind: Service
metadata:
  name: kafka-1
spec:
  ports:
    - name: client
      port: 9092
  selector:
    app: kafka
    server-id: "1"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka-1
spec:
  selector:
    matchLabels:
      app: kafka
      server-id: "1"
  replicas: 1
  template:
    metadata:
      labels:
        app: kafka
        server-id: "1"
    spec:
      volumes:
        - name: kafka-data
          emptyDir: {}
      containers:
        - name: server
          image: confluent/kafka:0.10.0.0-cp1
          env:
            - name: KAFKA_ZOOKEEPER_CONNECT
              value: zookeeper-1:2181
            - name: KAFKA_ADVERTISED_HOST_NAME
              value: kafka-1
            - name: KAFKA_BROKER_ID
              value: "1"
          ports:
            - containerPort: 9092
          volumeMounts:
            - mountPath: /var/lib/kafka
              name: kafka-data
---
apiVersion: v1
kind: Service
metadata:
  name: schema
spec:
  ports:
    - name: client
      port: 8081
  selector:
    app: kafka-schema-registry
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka-schema-registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka-schema-registry
  template:
    metadata:
      labels:
        app: kafka-schema-registry
    spec:
      containers:
        - name: kafka-schema-registry
          image: confluent/schema-registry:3.0.0
          env:
            - name: SR_KAFKASTORE_CONNECTION_URL
              value: zookeeper-1:2181
            - name: SR_KAFKASTORE_TOPIC
              value: "_schema_registry"
            - name: SR_LISTENERS
              value: "http://0.0.0.0:8081"
          ports:
            - containerPort: 8081

Configuraion Zookeeper:

ERROR Server died unexpectedly:  (io.confluent.kafka.schemaregistry.rest.SchemaRegistryMain:51)
org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata


3 commentaires

À propos, les images Docker confluent / sont obsolètes. Et confluentinc / sont préférés. Et mentionné précédemment, rencontrez-vous des problèmes avec les graphiques Helm? docs.confluent.io/current/installation/ installant_cp /…


Je n'ai pas de problèmes avec les graphiques Helm. J'ai besoin de déployer des solutions Kafka personnalisées sans Helm, c'est pourquoi j'essaye de le faire


Cependant, je ne vois rien de très personnalisé. Kafka n'est vraiment installé que d'une seule manière, et peut-être que les valeurs de configuration sont un peu modifiées, mais toutes les applications personnalisées construites autour de Kafka + Schema Registry peuvent être définies dans des fichiers YAML séparés


3 Réponses :


11
votes
security.protocol=SSL 

3 commentaires

@AdrianMitev J'utilisais Spring-boot Kafka, donc j'ai fini par utiliser les propriétés d'application par défaut de spring-boot pour configurer la connexion. Mon erreur est venue d'essayer de créer une classe @Configuration pour créer la connexion et cela m'a donné l'erreur de délai d'expiration.


Cela a résolu le problème pour moi. Le courtier (que je ne contrôle pas) a été configuré pour toujours utiliser le port 9092 , mais avec SSL activé. J'avais supposé que c'était du texte en clair. Merci Anders!


Je vous remercie! Dans mon cas, j'avais mal configuré un service dans Kubernetes qui attendait une variable d'environnement facultative contenant une clé API en cas de connexion via SSL, et mon secret a été mal nommé. Parce que je l'ai ensuite pointé vers un point de terminaison SSL, je me suis retrouvé avec ce délai. Bien que je ne sois pas familier avec le protocole Kafka, je pense que le client attendait que le serveur dise bonjour et que le serveur s'attendait à ce que le client effectue une poignée de main SSL.



3
votes

Une fois, j'ai résolu ce problème en redémarrant ma machine, mais cela s'est reproduit et je ne voulais pas redémarrer ma machine, donc je l'ai corrigé avec cette propriété dans le fichier server.properties

advertised.listeners=PLAINTEXT://localhost:9092


0 commentaires

1
votes

La récupération des métadonnées des sujets par Kafka échoue pour deux raisons:

Raison 1 Si le serveur d'amorçage n'accepte pas vos connexions, cela peut être dû à un problème de proxy comme un VPN ou certains groupes de sécurité au niveau du serveur.

Raison 2: Non-concordance dans le protocole de sécurité où l'attendu peut être SASL_SSL et le réel peut être SSL. ou l'inverse ou il peut être PLAIN.


0 commentaires