deploiement-kafak-kube
Comment déployer Kafka sur Docker et DigitalOcean Kubernetes
Introduction Apache Kafka est une plateforme open-source de traitement d'événements et de flux distribués, écrite en Java, conçue pour traiter des flux de données exigeants en temps réel.
Elle est conçue pour être tolérante aux pannes et prendre en charge des centaines
de nœuds par cluster. L'exécution efficace d'un plus grand nombre de nœuds nécessite des processus de conteneurisation et d'orchestration pour une utilisation optimale des ressources, tels que Kubernetes
.
Prérequis
- Docker installé sur votre machine. Ubuntu
- Docker Compose installé sur votre machine. Pour Ubuntu.
- Un cluster
DigitalOcean
Kubernetes v1.23+ avec votre connexion configurée commekubectl
par défaut. Les instructions relatives à la configuration de kubectl figurent à l'étape Connexion à votre cluster lors de la création de votre cluster. Pour créer un clusterKubernetes
sur DigitalOcean, lisez le Quickstart Kubernetes. - Le gestionnaire de paquets Helm 3 installé sur votre machine locale.
- Une compréhension de Kafka, y compris les sujets, les
producteurs
et lesconsommateurs
.
Étape 1 – Exécution de Kafka à l'aide de Docker Compose
Dans cette section, vous apprendrez à exécuter Kafka en utilisant Docker Compose en mode KRaft. L'utilisation de KRaft rationalise la configuration globale et l'utilisation des ressources car aucune instance ZooKeeper n'est nécessaire.
Tout d'abord, vous définirez une image Docker qui contient une version Kafka décompressée. Vous l'utiliserez pour tester la connexion au conteneur Kafka en utilisant les scripts inclus.
Vous allez stocker les commandes nécessaires dans un Dockerfile
.
Créez-le et ouvrez-le pour le modifier :
sudo nano Dockerfile
FROM ubuntu:latest AS build
RUN apt-get update
RUN apt-get install curl default-jre -y
WORKDIR /kafka-test
RUN curl -o kafka.tgz https://dlcdn.apache.org/kafka/3.7.0/kafka_2.13-3.7.0.tgz
RUN tar -xzf kafka.tgz --strip-components=1
Le conteneur est basé sur la dernière version d'Ubuntu. Après avoir mis à jour le cache des paquets et installé curl et Java, vous téléchargez un paquet Kafka. Au moment de la rédaction de ce document, la dernière version de Kafka
était la 3.7.0. Vous pouvez consulter la dernière version sur la page officielle de téléchargement et remplacer la valeur surlignée si nécessaire.
Ensuite, vous définissez le WORKDIR
(répertoire de travail) à /kafka-test
, dans lequel vous téléchargez et extrayez la version de Kafka. Le paramètre --strip-components=1
est passé à tar pour sauter le premier répertoire de l'archive, qui porte le nom de l'archive elle-même.
Ensuite, vous allez définir la configuration de Docker Compose dans un fichier nommé kafka-compose.yaml
. Créez-le et ouvrez-le pour le modifier en exécutant :
sudo nano kafka-compose.yaml
kafka-compose.yaml
version: '3'
services:
kafka:
image: 'bitnami/kafka:latest'
environment:
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
kafka-test:
build:
dockerfile: Dockerfile
context: .
tty: true
Ici, vous définissez deux services, kafka et kafka-test
. Le service kafka est basé sur la dernière image Bitnami Kafka. Dans la section environnement, vous passez les variables d'environnement nécessaires et leurs valeurs, qui configurent le nœud Kafka pour être autonome avec un ID
de 0.
Pour kafka-test
, vous passez le fichier Docker que vous venez de créer comme base pour la construction de l'image du conteneur. En mettant tty
à true
, vous laissez une session ouverte avec le conteneur.
C'est nécessaire pour le maintenir en vie, car sinon il quitterait le conteneur immédiatement après le démarrage, sans aucune autre commande.
RUN kafka-compose.yaml file:
docker-compose -f kafka-compose.yaml up -d
docker ps -a
- Ouvrez un shell dans le conteneur
kafka-test
en exécutant :
docker exec -it docker_kafka-test_1 bash
Le shell sera déjà positionné dans le répertoire /kafka-test :
root@2a0cd13859e3:/kafka-test#
- Ensuite, essayez de créer un sujet en utilisant
kafka-topics.sh
:
bin/kafka-topics.sh --create --topic first-topic --bootstrap-server kafka:9092
[Notez]
que vous faites référence à Kafka par son nom dans la configuration de Docker Compose (kafka).
Vous vous êtes connecté avec succès au déploiement Kafka depuis le service Docker Compose. Saisissez exit et appuyez sur Entrée pour fermer le shell.
Pour arrêter le déploiement de Docker Compose, exécutez la commande suivante :
docker-compose -f kafka-compose.yaml down
Dans cette étape, vous avez déployé Kafka à l'aide de Docker Compose. Vous avez également testé que Kafka est disponible à partir d'autres conteneurs en déployant une image personnalisée qui contient des scripts shell pour s'y connecter. Dans la suite du tutoriel, vous apprendrez à déployer Kafka sur DigitalOcean Kubernetes.
Étape 2 – Installation de Strimzi sur Kubernetes
Dans cette section, vous allez installer Strimzi sur votre cluster Kubernetes. Cela implique d'ajouter son référentiel à Helm et de créer une version Helm.
Vous devez d’abord ajouter le référentiel Strimzi Helm à Helm, qui contient le graphique Strimzi
:
helm repo add strimzi https://strimzi.io/charts
Output"strimzi" has been added to your repositories
Ensuite, actualisez le cache de Helm pour télécharger son contenu :
helm repo update
Output...Successfully got an update from the "strimzi" chart repository
Update Complete. ⎈Happy Helming!⎈
Enfin, installez Strimzi sur votre cluster en exécutant :
helm install strimzi strimzi/strimzi-kafka-operator
OutputNAME: strimzi
LAST DEPLOYED: ...
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing strimzi-kafka-operator-0.40.0
To create a Kafka cluster refer to the following documentation.
https://strimzi.io/docs/operators/latest/deploying.html#deploying-cluster-operator-helm-chart-str
Strimzi est désormais installé sur votre cluster Kubernetes. Dans la section suivante, vous l'utiliserez pour déployer Kafka sur votre cluster.
Étape 3 – Déploiement d’un cluster Kafka sur Kubernetes
Dans cette section, vous allez déployer un cluster Kafka à un nœud avec ZooKeeper dans votre cluster Kubernetes. Au moment de la rédaction, la prise en charge du déploiement de Kafka à l'aide de KRaft n'était pas généralement disponible dans Strimzi.
Vous stockerez le manifeste Kubernetes pour le déploiement dans un fichier nommé kafka.yaml
. Créez-le et ouvrez-le pour l'éditer :
nano kafka.yaml
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
version: 3.7.0
replicas: 1
listeners:
- name: plain
port: 9092
type: internal
tls: false
- name: tls
port: 9093
type: internal
tls: true
config:
offsets.topic.replication.factor: 1
transaction.state.log.replication.factor: 1
transaction.state.log.min.isr: 1
default.replication.factor: 1
min.insync.replicas: 1
inter.broker.protocol.version: "3.7"
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
zookeeper:
replicas: 1
storage:
type: persistent-claim
size: 100Gi
deleteClaim: false
entityOperator:
topicOperator: {}
userOperator: {}
Le premier bloc de la spécification
(spec) concerne Kafka lui-même. Vous définissez la version, ainsi que le nombre de répliques. Ensuite, vous définissez deux listeners, qui sont des ports que le déploiement Kafka utilisera pour communiquer. Le deuxième écouteur est crypté parce que vous avez mis tls
à true
. Puisque les auditeurs ne peuvent pas entrer en collision, vous attribuez 9093
comme numéro de port pour le second.
Étant donné que vous ne déployez qu'un seul nœud Kafka dans la section de configuration
(config), vous définissez divers facteurs de réplication (pour les sujets, les événements et les répliques) à 1
. Pour le stockage
, vous définissez le type à jbod
(qui signifie "juste un tas de disques"), ce qui vous permet de spécifier plusieurs volumes. Ici, vous définissez un volume de type persistent-claim avec une taille de 100GB
. Cela créera un volume DigitalOcean et l'assignera à Kafka. Vous définissez également deleteClaim
à false pour vous assurer que les données ne sont pas supprimées lorsque le cluster Kafka est détruit.
Pour configurer le déploiement de zookeeper
, vous définissez son nombre de répliques à 1
et lui fournissez une seule revendication persistante de 100 Go
, car seul Kafka prend en charge le type de stockage jbod. Les deux définitions sous entityOperator indiquent à Strimzi de créer des opérateurs à l'échelle du cluster pour gérer les sujets et les utilisateurs Kafka.
kubectl apply -f kafka.yaml
Outputkafka.kafka.strimzi.io/my-cluster created
kubectl get strimzipodset -w
Après quelques minutes, les pods Kafka et Zookeeper seront disponibles et prêts :
OutputNAME PODS READY PODS CURRENT PODS AGE
...
my-cluster-kafka 1 1 1 28s
my-cluster-zookeeper 1 1 1 61s
Pour répertorier les déploiements Kafka, exécutez la commande suivante :
kubectl get kafka
OutputNAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS READY METADATA STATE WARNINGS
my-cluster 1 1
Maintenant que Kafka est en cours d'exécution, vous allez créer un sujet dans celui-ci. Ouvrez un fichier appelé kafka-topic.yaml pour le modifier :
nano kafka-topic.yaml
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: "my-cluster"
spec:
partitions: 1
replicas: 1
Ce KafkaTopic
définit un sujet appelé my-topic
dans le cluster que vous venez de déployer (my-cluster)
.
kubectl apply -f kafka-topic.yaml
Outputkafkatopic.kafka.strimzi.io/my-topic created
Ensuite, répertoriez toutes les rubriques Kafka dans le cluster :
kubectl get kafkatopic
kubectl
affichera la sortie suivante :
OutputNAME CLUSTER PARTITIONS REPLICATION FACTOR READY
my-topic my-cluster 1 1 True
Au cours de cette étape, vous avez déployé Kafka sur votre cluster Kubernetes à l’aide de Strimzi, qui s’occupe des ressources réelles et des instances ZooKeeper. Vous avez également créé une rubrique, que vous utiliserez à l’étape suivante lors de la connexion à Kafka.
Étape 4 – Connexion à Kafka dans Kubernetes
Dans cette section, vous apprendrez à vous connecter à un cluster Kafka déployé sur Kubernetes depuis le cluster.
Grâce à Strimzi, votre déploiement Kafka est déjà disponible pour les pods du cluster. Toute application de l'intérieur peut se connecter au point de terminaison my-cluster-kafka-bootstrap
, qui sera automatiquement résolu en cluster my-cluster
.
Vous allez maintenant déployer un pod temporaire sur Kubernetes en vous basant sur une image Docker fournie par Strimzi.
L'image contient une installation Kafka avec des scripts shell pour produire et consommer des messages textuels (kafka-console-producer.sh
et kafka-console-consumer.sh)
.
kubectl run kafka-producer -ti \
--image=quay.io/strimzi/kafka:0.40.0-kafka-3.7.0 --rm=true --restart=Never \
-- bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic my-topic
Le pod temporaire s'appellera kafka-producer
et utilisera l'image du projet Strimzi. Il sera supprimé à la fin de l'exécution des commandes (--rm=true)
et ne sera jamais redémarré, car il s'agit d'un travail unique. Ensuite, vous passez la commande pour exécuter le script kafka-console-producer.sh
. Comme indiqué précédemment, vous indiquez le désignateur my-cluster-kafka-bootstrap
pour le serveur et my-topic
comme nom de sujet.
OutputIf you don't see a command prompt, try pressing enter.
>
Vous pouvez saisir n'importe quel message texte et appuyer sur Entrée pour l'envoyer au sujet :
OutputIf you don't see a command prompt, try pressing enter.
>Hello World!
>
Pour quitter, appuyez sur CTRL+C
et confirmez avec Entrée
.
Ensuite, exécutez la commande suivante pour exécuter le script consommateur dans le cluster :
Vous devrez peut-être appuyer sur Entrée
pour que la commande soit exécutée. Le résultat sera similaire à celui-ci :
OutputHello World!
...
Vous avez appris à vous connecter à votre déploiement Kafka depuis le cluster. Vous allez maintenant exposer Kafka au monde extérieur.
Étape 5 – Exposer Kafka en dehors de Kubernetes
Dans cette étape, vous exposerez votre déploiement Kafka en externe à l'aide d'un équilibreur de charge. Strimzi dispose d'un moyen intégré de créer et de configurer un équilibreur de charge pour Kafka. Ouvrez kafka.yaml
pour le modifier en exécutant :
sudo nano kafka.yaml
Ajoutez les lignes suivantes à la section des auditeurs
(listeners) :
...
listeners:
- name: plain
port: 9092
type: internal
tls: false
- name: tls
port: 9093
type: internal
tls: true
- name: external
port: 9094
type: loadbalancer
tls: false
...
La partie en surbrillance définit un nouvel écouteur avec le type loadbalancer qui acceptera les connexions au port 9094
sans cryptage TLS
.
Enregistrez et fermez le fichier, puis appliquez le nouveau manifeste en exécutant :
kubectl apply -f kafka.yaml
Outputkafka.kafka.strimzi.io/my-cluster configured
Exécutez la commande suivante pour la voir devenir disponible :
kubectl get service my-cluster-kafka-external-bootstrap -w -o=jsonpath='{.status.loadBalancer.ingress[0].ip}{"\n"}'
Lorsque l'équilibreur de charge qui gère le trafic pour Kafka devient disponible, la sortie sera son adresse IP.
Dans le cadre des prérequis, vous avez téléchargé et extrait la dernière version de Kafka sur votre machine. Accédez à ce répertoire et exécutez le consommateur de la console, en remplaçant votre_lb_ip par le Adresse IP issue de la sortie de la commande précédente :
bin/kafka-console-consumer.sh --bootstrap-server your_lb_ip:9094 --topic my-topic --from-beginning
Vous verrez bientôt les messages lus à partir du sujet, ce qui signifie que vous avez été connecté avec succès :
OutputHello World!
...
Pour supprimer toutes les ressources liées à Strimzi de votre cluster (telles que les déploiements et les rubriques Kafka), exécutez la commande suivante :
kubectl delete $(kubectl get strimzi -o name)
Conclusion
Dans cet article, vous avez déployé Kafka à l’aide de Docker Compose et vérifié que vous pouvez vous y connecter. Vous avez également appris à installer Strimzi
sur votre cluster Kubernetes DigitalOcean et à déployer un cluster Kafka à l’aide des manifestes fournis.