Kafka sur Kubernetes — est-ce une bonne chose ?

Bienvenue, Habr !

Nous avons été les premiers à introduire le thÚme sur le marché russe Kafka et nous continuons à surveiller son développement. En particulier, nous avons trouvé intéressant le sujet de l'interaction entre Kafka et Kubernetes. Un article général (et plutÎt prudent) article sur ce sujet a été publié sur le blog de la société Confluent en octobre dernier, écrit par Gwen Shapira. Aujourd'hui, nous souhaitons attirer votre attention sur un article plus récent, d'avril, de Johann Gyger, qui, bien qu'il ait posé une question dans le titre, traite le sujet de maniÚre plus concrÚte, accompagnant le texte de liens intéressants. Pardonnez-nous cette traduction libre de « chaos monkey », si vous le pouvez !

Kafka sur Kubernetes — est-ce une bonne chose ?

Introduction

Kubernetes est destinĂ© Ă  fonctionner avec des charges de travail sans Ă©tat. En gĂ©nĂ©ral, ces charges de travail se prĂ©sentent sous forme d'architecture Ă  microservices, elles sont lĂ©gĂšres, se prĂȘtent bien Ă  la scalabilitĂ© horizontale, obĂ©issent aux principes des applications en 12 facteurs, permettent de travailler avec des disjoncteurs (circuit breakers) et des chaos monkeys.

Kafka, de l'autre cÎté, agit essentiellement comme une base de données distribuée. Ainsi, lors de son utilisation, vous devez gérer l'état, qui est beaucoup plus lourd qu'un microservice. Kubernetes prend en charge les charges de travail avec état, mais, comme l'indique Kelsey Hightower dans ses deux tweets, il faut les manipuler avec précaution :

Certains pensent que si l'on dĂ©ploie Kubernetes sur une charge de travail avec Ă©tat, cela devient une base de donnĂ©es complĂštement gĂ©rĂ©e, capable de rivaliser avec RDS. Ce n'est pas le cas. Peut-ĂȘtre qu'avec suffisamment d'efforts, en ajoutant des composants supplĂ©mentaires et en engageant une Ă©quipe d'ingĂ©nieurs SRE, il serait possible de construire une RDS sur Kubernetes.

Je recommande toujours d'exercer une extrĂȘme prudence lors du dĂ©ploiement de charges de travail avec Ă©tat sur Kubernetes. La plupart de ceux qui se demandent si « je peux exĂ©cuter des charges de travail avec Ă©tat sur Kubernetes » n'ont pas suffisamment d'expĂ©rience avec Kubernetes et souvent pas avec la charge de travail en question.

Alors, faut-il lancer Kafka sur Kubernetes ? Une question inverse est : Kafka fonctionnera-t-il mieux sans Kubernetes ? C'est pourquoi je veux souligner dans cet article comment Kafka et Kubernetes se complÚtent, et quels piÚges peuvent se présenter lors de leur combinaison.

Temps d'exécution

Parlons d'une chose fondamentale : l'environnement d'exécution tel quel.

Processus

Les courtiers Kafka sont pratiques pour travailler avec le CPU. TLS peut introduire certains coûts. Cela dit, les clients Kafka peuvent solliciter davantage le CPU s'ils utilisent le chiffrement, mais cela n'affecte pas les courtiers.

Mémoire

Les courtiers Kafka consomment de la mémoire. La taille de la mémoire heap JVM est généralement limitée à 4-5 Go, mais vous aurez également besoin de beaucoup de mémoire systÚme, car Kafka utilise activement le cache de pages. Dans Kubernetes, définissez correctement les limites des conteneurs sur les ressources et les demandes.

Stockage de données

Le stockage de donnĂ©es dans des conteneurs est Ă©phĂ©mĂšre – les donnĂ©es sont perdues lors du redĂ©marrage. Pour les donnĂ©es de Kafka, vous pouvez utiliser un volume, et l'effet sera similaire : les donnĂ©es de votre courtier seront perdues aprĂšs l'arrĂȘt. Vos messages peuvent quand mĂȘme ĂȘtre conservĂ©s sur d'autres courtiers en tant que rĂ©pliques. Donc, aprĂšs le redĂ©marrage, le courtier en panne doit d'abord rĂ©pliquer toutes les donnĂ©es, et ce processus peut prendre un certain temps. emptyDirC'est pourquoi il est recommandĂ© d'utiliser un stockage de donnĂ©es persistant. Qu'il s'agisse d'un stockage persistant non local avec un systĂšme de fichiers XFS ou, plus prĂ©cisĂ©ment, ext4. N'utilisez pas NFS. Je vous prĂ©viens. NFS versions v3 ou v4 ne fonctionneront pas. En rĂ©sumĂ©, le courtier Kafka s'arrĂȘtera s'il ne peut pas supprimer le rĂ©pertoire contenant les donnĂ©es en raison d'un problĂšme de 'renommages stupides', problĂ©matique sous NFS. Si je ne vous ai pas encore convaincu, lisez trĂšs attentivement

cet article. Le stockage de donnĂ©es doit ĂȘtre non local, afin que Kubernetes puisse choisir plus efficacement un nouveau nƓud aprĂšs un redĂ©marrage ou une relocalisation..

Réseau

Comme pour la plupart des systĂšmes distribuĂ©s, la performance de Kafka dĂ©pend fortement du fait que les latences rĂ©seau soient minimales et la bande passante maximale. N'essayez pas de placer tous les courtiers sur le mĂȘme nƓud, car cela rĂ©duira la disponibilitĂ©. Si un nƓud Kubernetes Ă©choue, l'ensemble du cluster Kafka Ă©chouera Ă©galement. Évitez Ă©galement de rĂ©partir le cluster Kafka sur plusieurs centres de donnĂ©es. Il en va de mĂȘme pour le cluster Kubernetes. Un bon compromis dans ce cas est de choisir diffĂ©rentes zones de disponibilitĂ©.

Configuration

Manifestes standard

Le site de Kubernetes dispose d'un trĂšs bon guide sur la configuration de ZooKeeper Ă  l'aide de manifestes. Étant donnĂ© que ZooKeeper fait partie de Kafka, c'est un bon point de dĂ©part pour se familiariser avec les concepts de Kubernetes qui s'appliquent ici. Une fois que vous les aurez compris, vous pourrez utiliser les mĂȘmes concepts avec le cluster Kafka.

  • Sous: un pod est l'unitĂ© dĂ©ployable minimale dans Kubernetes. Un pod contient votre charge de travail et correspond Ă  un processus dans votre cluster. Un pod peut contenir un ou plusieurs conteneurs. Chaque serveur ZooKeeper dans l'ensemble et chaque courtier dans le cluster Kafka fonctionneront dans un pod distinct.
  • StatefulSet: un StatefulSet est un objet Kubernetes qui gĂšre plusieurs charges de travail Ă  Ă©tat, et ces charges nĂ©cessitent de la coordination. Les StatefulSets offrent des garanties concernant le partage d'ordre des pods et leur unicitĂ©.
  • Services sans tĂȘte: les services permettent de dĂ©coupler les pods des clients Ă  l'aide d'un nom logique. Kubernetes s'occupe alors de l'Ă©quilibrage de charge. Cependant, lors des opĂ©rations avec des charges de travail Ă  Ă©tat, comme avec ZooKeeper et Kafka, les clients doivent communiquer avec une instance spĂ©cifique. C'est ici que les services sans tĂȘte sont utiles : dans ce cas, le client aura toujours un nom logique, mais il ne sera pas nĂ©cessaire de s'adresser directement au pod.
  • Volume pour le stockage Ă  long terme: de tels volumes sont nĂ©cessaires pour la configuration de stockage Ă  long terme de blocs non locaux, comme mentionnĂ© ci-dessus.

Sur Yolean fournit un ensemble complet de manifestes qui facilitent le démarrage avec Kafka sur Kubernetes.

Diagrammes Helm

Helm est un gestionnaire de paquets pour Kubernetes, comparable aux gestionnaires de paquets pour les systÚmes d'exploitation comme yum, apt, Homebrew ou Chocolatey. Il facilite l'installation de paquets logiciels prédéfinis, décrits dans les graphiques Helm. Un graphique Helm bien conçu simplifie une tùche complexe : comment configurer correctement tous les paramÚtres pour utiliser Kafka sur Kubernetes. Il existe plusieurs graphiques Kafka : le officiel se trouve en état d'incubation, il y en a un de Confluent, un autre de Bitnami.

Les opérateurs

Étant donnĂ© que Helm prĂ©sente certains inconvĂ©nients, un autre outil connaĂźt un grand succĂšs : les opĂ©rateurs Kubernetes. Un opĂ©rateur ne se contente pas d'emballer des logiciels pour Kubernetes, mais vous permet Ă©galement de dĂ©ployer ces logiciels et de les gĂ©rer.

Dans la liste des opérateurs impressionnants deux opérateurs pour Kafka sont mentionnés. L'un d'eux est Strimzi. Avec Strimzi, il est facile de mettre en place un cluster Kafka en quelques minutes. Pour la plupart, aucune configuration n'est nécessaire, de plus, l'opérateur offre certaines fonctionnalités intéressantes, comme le chiffrement TLS de type « point à point » à l'intérieur du cluster. Confluent fournit également son propre opérateur.

Performance

Il est trÚs important de tester les performances en fournissant à votre instance Kafka installée des points de contrÎle. De tels tests peuvent vous aider à identifier d'éventuels goulets d'étranglement avant que les problÚmes ne surviennent. Heureusement, Kafka propose déjà deux outils pour tester les performances : kafka-producer-perf-test.sh et kafka-consumer-perf-test.sh. Assurez-vous de les utiliser activement. Pour référence, vous pouvez vous référer aux résultats décrits par ce post Jay Kreps, ou vous orienter vers cet aperçu Amazon MSK par Stéphane Maarek.

Opérations

Surveillance

La transparence dans le systÚme est trÚs importante - sinon, vous ne comprendrez pas ce qui se passe. Aujourd'hui, il existe un solide ensemble d'outils permettant le suivi basé sur des métriques de style cloud-native. Deux outils populaires pour cela sont Prometheus et Grafana. Prometheus peut collecter des métriques de tous les processus Java (Kafka, Zookeeper, Kafka Connect) à l'aide de l'exportateur JMX - de la maniÚre la plus simple. Si vous ajoutez les métriques cAdvisor, vous serez en mesure de disposer d'une image plus complÚte des ressources utilisées dans Kubernetes.

Strimzi propose un exemple trÚs pratique de tableau de bord Grafana pour Kafka. Il visualise les métriques clés, comme les secteurs non répliqués ou ceux qui sont hors ligne. Tout y est trÚs clair. Ces métriques sont complétées par des informations sur l'utilisation des ressources et la performance, ainsi que des indicateurs de stabilité. Ainsi, vous obtenez une surveillance de base du cluster Kafka sans effort !

Kafka sur Kubernetes — est-ce une bonne chose ?

Source : strimzi.io/docs/master/#kafka_dashboard

Il serait judicieux de complĂ©ter cela par une surveillance des clients (mĂ©triques pour les consommateurs et producteurs), ainsi que par une surveillance de la latence (pour cela, il y a Burrow) et une surveillance complĂšte – pour cela, utilisez Kafka Monitor.

Journalisation

La journalisation est une autre tùche essentielle. Assurez-vous que tous les conteneurs de votre installation Kafka enregistrent des logs dans stdout et stderr, et veillez à ce que votre cluster Kubernetes agrége tous les logs dans une infrastructure de journalisation centrale, comme Elasticsearch.

Vérification de la fonctionnalité

Kubernetes utilise des probes de « vivacitĂ© » (liveness) et de disponibilitĂ© (readiness) pour vĂ©rifier si vos pods fonctionnent correctement. Si la vĂ©rification de vivacitĂ© Ă©choue, Kubernetes arrĂȘtera ce conteneur, puis le redĂ©marrera automatiquement si la politique de redĂ©marrage est dĂ©finie en consĂ©quence. Si la vĂ©rification de disponibilitĂ© Ă©choue, Kubernetes isolera ce pod des requĂȘtes. Ainsi, dans de telles situations, aucune intervention manuelle n'est nĂ©cessaire, ce qui est un grand avantage.

Déploiement des mises à jour

Les StatefulSet prennent en charge les mises à jour automatiques : en choisissant la stratégie RollingUpdate, chaque pod Kafka sera mis à jour un par un. Cela permet de réduire la durée des interruptions à zéro.

Mise Ă  l’échelle

La mise à l'échelle d'un cluster Kafka est une tùche complexe. Cependant, dans Kubernetes, il est trÚs simple de mettre à l'échelle des pods à un certain nombre de réplicas, ce qui signifie que vous pouvez définir de maniÚre déclarative autant de brokers Kafka que vous le souhaitez. Le plus difficile dans ce cas est la réaffectation des secteurs aprÚs une montée en charge ou avant une réduction de charge. Encore une fois, Kubernetes vous aidera avec cette tùche.

Administration

Les tĂąches liĂ©es Ă  l'administration de votre cluster Kafka, notamment la crĂ©ation de sujets et la rĂ©affectation de partitions, peuvent ĂȘtre effectuĂ©es Ă  l'aide des scripts shell disponibles, en ouvrant l'interface de ligne de commande dans vos pods. Cependant, cette solution n'est pas trĂšs Ă©lĂ©gante. Strimzi prend en charge la gestion des sujets via un autre opĂ©rateur. Il y a encore des amĂ©liorations Ă  apporter.

Sauvegarde et restauration

La disponibilité de Kafka dépendra également de celle de Kubernetes. Si votre cluster Kubernetes tombe, dans le pire des cas, le cluster Kafka tombera aussi. Selon la loi de Murphy, cela se produira inévitablement et vous perdrez des données. Pour réduire le risque, il est essentiel de bien réfléchir à la stratégie de sauvegarde. Vous pouvez utiliser MirrorMaker, une autre option consiste à utiliser S3 comme décrit dans ce article de Zalando.

Conclusion

Pour les petits ou moyens clusters Kafka, il est certainement judicieux d'utiliser Kubernetes, car cela offre une flexibilitĂ© supplĂ©mentaire et simplifie le travail avec les opĂ©rateurs. Si vous faites face Ă  des exigences non fonctionnelles trĂšs strictes concernant la latence et/ou la bande passante, il serait peut-ĂȘtre prĂ©fĂ©rable d'envisager une autre option de dĂ©ploiement.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster