{"id":71213,"date":"2020-02-24T16:09:17","date_gmt":"2020-02-24T13:09:17","guid":{"rendered":"https:\/\/prohoster.info\/blog\/opredelyaem-podhodyashhij-razmer-dlya-klastera-kafka-v-kubernetes"},"modified":"2020-03-03T16:14:29","modified_gmt":"2020-03-03T13:14:29","slug":"opredelyaem-podhodyashhij-razmer-dlya-klastera-kafka-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/opredelyaem-podhodyashhij-razmer-dlya-klastera-kafka-v-kubernetes","title":{"rendered":"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Przyp. t\u0142um.<\/b>: W tym artykule firma Banzai Cloud dzieli si\u0119 przyk\u0142adem wykorzystania swoich specjalnych narz\u0119dzi do uproszczenia zarz\u0105dzania Kafka w ramach Kubernetes. Podane instrukcje ilustruj\u0105, jak okre\u015bli\u0107 optymalny rozmiar infrastruktury i skonfigurowa\u0107 Kafka w celu osi\u0105gni\u0119cia wymaganej przepustowo\u015bci.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/8a598ec7db091c2944a6442f9bc124da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nApache Kafka to rozproszona platforma streamingu do budowy niezawodnych, skalowalnych i wydajnych system\u00f3w strumieniowych czasu rzeczywistego. Jej imponuj\u0105ce mo\u017cliwo\u015bci mo\u017cna rozszerzy\u0107 za pomoc\u0105 Kubernetes. Dlatego opracowali\u015bmy <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/banzaicloud\/kafka-operator\">operatora Kafka Open Source<\/a><\/noindex> oraz narz\u0119dzie o nazwie <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/docs\/supertubes\/overview\/\">Supertubes<\/a><\/noindex>. Umo\u017cliwia uruchamianie Kafka w Kubernetes oraz korzystanie z jej r\u00f3\u017cnych funkcji, takich jak precyzyjna konfiguracja brokera, skalowanie na podstawie metryk z rebalanceingiem, \u015bwiadomo\u015b\u0107 rozk\u0142adu zasob\u00f3w (rack awareness), \"mi\u0119kkie\" <i>(graceful)<\/i> wdra\u017canie aktualizacji itd.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p>Wypr\u00f3buj Supertubes w swoim klastrze:<\/p>\n<pre><code class=\"bash\">curl https:\/\/getsupertubes.sh | sh oraz supertubes install -a --no-democluster --kubeconfig<\/code><\/pre>\n<p>\nLub skontaktuj si\u0119 z <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/docs\/supertubes\/cli\/reference\/\">dokumentacji<\/a><\/noindex>. Mo\u017cesz tak\u017ce poczyta\u0107 o niekt\u00f3rych funkcjonalno\u015bciach Kafka, kt\u00f3rych obs\u0142uga zosta\u0142a zautomatyzowana za pomoc\u0105 Supertubes i operatora Kafka. Ju\u017c o nich pisali\u015bmy na blogu:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/blog\/kafka-operator\/\">Oh no! Jeszcze jeden operator Kafka dla Kubernetes<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/blog\/kafka-alert\/\">Monitoruj i zarz\u0105dzaj Kafka na podstawie metryk Prometheus<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/blog\/kafka-rack-awareness\/\">\u015awiadomo\u015b\u0107 rozk\u0142adu zasob\u00f3w Kafka w Kubernetes<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/blog\/kafka-on-istio-performance\/\">Uruchamianie Apache Kafka w Istio \u2014 benchmarking<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/blog\/kafka-topic-user-management\/\">U\u017cytkownicy uwierzytelnieni i kontrolowani dost\u0119p do klastr\u00f3w z operatorem Kafka<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/blog\/kafka-rolling-upgrade\/\">Rolowanie aktualizacji Kafka oraz dynamiczna konfiguracja w Kubernetes<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/blog\/kafka-envoy-protocol-filter\/\">Filtr protoko\u0142u Envoy dla Kafka, w sieci<\/a><\/noindex>.<\/li>\n<\/ul>\n<\/blockquote>\n<p>\nDecyduj\u0105c si\u0119 na uruchomienie klastra Kafka w Kubernetes, na pewno napotkasz problem okre\u015blenia optymalnego rozmiaru podstawowej infrastruktury oraz konieczno\u015b\u0107 precyzyjnej konfiguracji Kafka, aby spe\u0142ni\u0107 wymagania dotycz\u0105ce przepustowo\u015bci. Maksymalna wydajno\u015b\u0107 ka\u017cdego brokera zale\u017cy od wydajno\u015bci komponent\u00f3w infrastruktury, na kt\u00f3rej dzia\u0142a, takich jak pami\u0119\u0107, procesor, pr\u0119dko\u015b\u0107 dysku, przepustowo\u015b\u0107 sieci itd.<\/p>\n<p>Idealnie, konfiguracja brokera powinna by\u0107 taka, aby wszystkie elementy infrastruktury by\u0142y wykorzystywane na maksymalnych mo\u017cliwo\u015bciach. Jednak w rzeczywisto\u015bci taka konfiguracja jest do\u015b\u0107 trudna. Bardziej prawdopodobne jest, \u017ce u\u017cytkownicy b\u0119d\u0105 konfigurowa\u0107 broker\u00f3w w taki spos\u00f3b, aby maksymalizowa\u0107 wykorzystanie jednego lub dw\u00f3ch komponent\u00f3w (dysku, pami\u0119ci lub procesora). Og\u00f3lnie rzecz bior\u0105c, broker pokazuje maksymaln\u0105 wydajno\u015b\u0107, gdy jego konfiguracja pozwala na pe\u0142ne wykorzystanie najwolniejszego komponentu. W ten spos\u00f3b mo\u017cemy uzyska\u0107 przybli\u017cone wyobra\u017cenie o obci\u0105\u017ceniu, z kt\u00f3rym jeden broker jest w stanie sobie poradzi\u0107.<\/p>\n<p>Teoretycznie, mo\u017cemy r\u00f3wnie\u017c oszacowa\u0107 liczb\u0119 broker\u00f3w potrzebnych do obs\u0142ugi okre\u015blonego obci\u0105\u017cenia. Jednak w praktyce istnieje tak wiele wariant\u00f3w konfiguracji na r\u00f3\u017cnych poziomach, \u017ce oszacowanie potencjalnej wydajno\u015bci okre\u015blonej konfiguracji jest do\u015b\u0107 trudne (je\u015bli nie niemo\u017cliwe). Innymi s\u0142owy, bardzo trudno jest zaplanowa\u0107 konfiguracj\u0119, opieraj\u0105c si\u0119 na jakiej\u015b okre\u015blonej wydajno\u015bci.<\/p>\n<p>Dla u\u017cytkownik\u00f3w Supertubes zwykle stosujemy nast\u0119puj\u0105ce podej\u015bcie: zaczynamy od pewnej konfiguracji (infrastruktura + ustawienia), nast\u0119pnie mierzymy jej wydajno\u015b\u0107, dostosowujemy ustawienia brokera i powtarzamy proces jeszcze raz. Dzieje si\u0119 to, dop\u00f3ki potencja\u0142 najwolniejszego komponentu infrastruktury nie zostanie ca\u0142kowicie wykorzystany.<\/p>\n<p>W ten spos\u00f3b uzyskujemy ja\u015bniejszy obraz tego, ile broker\u00f3w jest potrzebnych klasterowi, aby poradzi\u0107 sobie z okre\u015blonym obci\u0105\u017ceniem (liczba broker\u00f3w zale\u017cy r\u00f3wnie\u017c od innych czynnik\u00f3w, takich jak minimalna liczba replik wiadomo\u015bci dla zapewnienia niezawodno\u015bci, liczba lider\u00f3w partycji itp.). Ponadto uzyskujemy wyobra\u017cenie o tym, dla kt\u00f3rego komponentu infrastruktury po\u017c\u0105dane by\u0142oby pionowe skalowanie.<\/p>\n<p>W tym artykule om\u00f3wimy kroki, kt\u00f3re podejmujemy, aby \u201ewycisn\u0105\u0107 maksimum\u201d z najwolniejszych komponent\u00f3w w pocz\u0105tkowych konfiguracjach i zmierzy\u0107 przepustowo\u015b\u0107 klastra Kafka. Wysoko niezawodna konfiguracja wymaga co najmniej trzech dzia\u0142aj\u0105cych broker\u00f3w (<code>min.insync.replicas=3<\/code>), rozmieszczonych w trzech r\u00f3\u017cnych strefach dost\u0119pno\u015bci. Do konfiguracji, skalowania i monitorowania infrastruktury Kubernetes wykorzystujemy nasz\u0105 w\u0142asn\u0105 platform\u0119 zarz\u0105dzania kontenerami dla hybrydowych chmur \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/banzaicloud\/pipeline\">Pipeline<\/a><\/noindex>. Wspiera ona on-premise (bare metal, VMware) oraz pi\u0119\u0107 typ\u00f3w chmur (Alibaba, AWS, Azure, Google, Oracle) i ich wszelkie kombinacje.<\/p>\n<h2>Przemy\u015blenia dotycz\u0105ce infrastruktury i konfiguracji klastra Kafka<\/h2>\n<p>\nW przedstawionych poni\u017cej przyk\u0142adach wybrali\u015bmy AWS jako dostawc\u0119 us\u0142ug chmurowych oraz EKS jako dystrybucj\u0119 Kubernetes. Podobn\u0105 konfiguracj\u0119 mo\u017cna zrealizowa\u0107 z wykorzystaniem <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/banzaicloud\/pke\">PKE<\/a><\/noindex> \u2014 dystrybucji Kubernetes od Banzai Cloud, certyfikowanej przez CNCF.<\/p>\n<h3>Dysk<\/h3>\n<p>\nAmazon oferuje r\u00f3\u017cne <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSEC2\/latest\/UserGuide\/ebs-volume-types.html\">typy wolumen\u00f3w EBS<\/a><\/noindex>. Na podstawie <i>gp2<\/i> i <i>io1<\/i> opieraj\u0105 si\u0119 dyski SSD, jednak aby zapewni\u0107 wysok\u0105 przepustowo\u015b\u0107 <i>gp2<\/i> wykorzystuje zgromadzone kredyty <i>(I\/O credits)<\/i>, dlatego preferowali\u015bmy typ <i>io1<\/i>, kt\u00f3ry oferuje stabiln\u0105 wysok\u0105 przepustowo\u015b\u0107.<\/p>\n<h3>Typy instancji<\/h3>\n<p>\nWydajno\u015b\u0107 Kafka mocno zale\u017cy od pami\u0119ci podr\u0119cznej strony systemu operacyjnego, dlatego potrzebujemy instancji z wystarczaj\u0105c\u0105 ilo\u015bci\u0105 pami\u0119ci dla broker\u00f3w (JVM) i pami\u0119ci podr\u0119cznej strony. Instancja <i>c5.2xlarge<\/i> \u2014 to dobry pocz\u0105tek, poniewa\u017c ma 16 GB pami\u0119ci i <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSEC2\/latest\/UserGuide\/ebs-optimized.html\">jest zoptymalizowana do pracy z EBS<\/a><\/noindex>. Jej wad\u0105 jest to, \u017ce mo\u017ce zapewnia\u0107 maksymaln\u0105 wydajno\u015b\u0107 przez nie wi\u0119cej ni\u017c 30 minut w ci\u0105gu 24 godzin. Je\u015bli obci\u0105\u017cenie wymaga maksymalnej wydajno\u015bci przez d\u0142u\u017cszy czas, warto zastanowi\u0107 si\u0119 nad innymi typami instancji. Tak w\u0142a\u015bnie zrobili\u015bmy, decyduj\u0105c si\u0119 na <i>c5.4xlarge<\/i>. Zapewnia maksymaln\u0105 przepustowo\u015b\u0107 na poziomie <b>593,75 MB\/s<\/b>. Maksymalna przepustowo\u015b\u0107 wolumenu EBS <i>io1<\/i> jest wy\u017csza ni\u017c dla instancji <i>c5.4xlarge<\/i>, dlatego najwolniejszym elementem infrastruktury zdaje si\u0119 by\u0107 przepustowo\u015b\u0107 I\/O tego typu instancji (co powinny r\u00f3wnie\u017c potwierdzi\u0107 wyniki naszych test\u00f3w obci\u0105\u017ceniowych).<\/p>\n<h3>Sie\u0107<\/h3>\n<p>\nPrzepustowo\u015b\u0107 sieci powinna by\u0107 wystarczaj\u0105co du\u017ca w por\u00f3wnaniu z wydajno\u015bci\u0105 instancji VM i dysku, w przeciwnym razie sie\u0107 staje si\u0119 w\u0105skim gard\u0142em. W naszym przypadku interfejs sieciowy <i>c5.4xlarge<\/i> obs\u0142uguje pr\u0119dko\u015b\u0107 do 10 Gb\/s, co znacznie przekracza przepustowo\u015b\u0107 I\/O instancji VM.<\/p>\n<h3>Rozmieszczanie broker\u00f3w<\/h3>\n<p>\nBrokerzy powinni by\u0107 rozwijani (planowani w Kubernetes) na dedykowanych w\u0119z\u0142ach, aby unikn\u0105\u0107 konkurencji z innymi procesami o zasoby CPU, pami\u0119ci, sieci i dysku.<\/p>\n<h3>Wersja Java<\/h3>\n<p>\nLogicznym wyborem jest Java 11, poniewa\u017c jest zgodna z Dockerem w tym sensie, \u017ce JVM prawid\u0142owo okre\u015bla procesory i pami\u0119\u0107 dost\u0119pne dla kontenera, w kt\u00f3rym dzia\u0142a broker. Wiedz\u0105c, \u017ce limity procesor\u00f3w s\u0105 wa\u017cne, JVM wewn\u0119trznie i przezroczysto ustawia liczb\u0119 w\u0105tk\u00f3w GC i w\u0105tk\u00f3w kompilatora JIT. U\u017cyli\u015bmy obrazu Kafka <code>banzaicloud\/kafka:2.13-2.4.0<\/code>, zawieraj\u0105cego wersj\u0119 Kafka 2.4.0 (Scala 2.13) na Java 11.<\/p>\n<blockquote><p>Je\u015bli chcesz dowiedzie\u0107 si\u0119 wi\u0119cej o Java\/JVM w Kubernetes, zwr\u00f3\u0107 uwag\u0119 na nasze publikacje:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/blog\/java-resource-limits\/\">Dlaczego moja aplikacja Java otrzymuje OOMKilled<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/blog\/java10-container-sizing\/\">Jak prawid\u0142owo wymiarowa\u0107 kontenery dla aplikacji Java 10<\/a><\/noindex>.<\/li>\n<\/ul>\n<\/blockquote>\n<p><\/p>\n<h3>Ustawienia pami\u0119ci brokera<\/h3>\n<p>\nIstniej\u0105 dwa kluczowe aspekty konfiguracji pami\u0119ci brokera: ustawienia dla JVM i dla pod\u00f3w Kubernetes. Limit pami\u0119ci ustawiony dla poda powinien by\u0107 wi\u0119kszy ni\u017c maksymalny rozmiar sterty, aby JVM mia\u0142a miejsce na metaprzestrze\u0144 Java, kt\u00f3ra znajduje si\u0119 w jej w\u0142asnej pami\u0119ci, oraz na pami\u0119\u0107 podr\u0119czn\u0105 systemu operacyjnego, kt\u00f3r\u0105 Kafka aktywnie wykorzystuje. W naszych testach uruchomili\u015bmy brokery Kafka z parametrami <code>-Xmx4G -Xms2G<\/code>, a limit pami\u0119ci dla poda wynosi\u0142 <code>10 Gi<\/code>. Zauwa\u017c, \u017ce ustawienia pami\u0119ci dla JVM mo\u017cna uzyskiwa\u0107 automatycznie za pomoc\u0105 <code>-XX:MaxRAMPercentage<\/code> i <code>-X:MinRAMPercentage<\/code>, w oparciu o limit pami\u0119ci dla poda.<\/p>\n<h3>Ustawienia procesora brokera<\/h3>\n<p>\nOg\u00f3lnie rzecz bior\u0105c, mo\u017cna poprawi\u0107 wydajno\u015b\u0107, zwi\u0119kszaj\u0105c r\u00f3wnoleg\u0142o\u015b\u0107 poprzez zwi\u0119kszenie liczby w\u0105tk\u00f3w u\u017cywanych przez Kafka. Im wi\u0119cej procesor\u00f3w dost\u0119pnych dla Kafka, tym lepiej. W naszym te\u015bcie zacz\u0119li\u015bmy od limitu 6 procesor\u00f3w i stopniowo (iteracyjnie) zwi\u0119kszyli\u015bmy ich liczb\u0119 do 15. Ponadto ustawili\u015bmy <code>num.network.threads=12<\/code> w ustawieniach brokera, aby zwi\u0119kszy\u0107 liczb\u0119 w\u0105tk\u00f3w przyjmuj\u0105cych dane z sieci i je przesy\u0142aj\u0105cych. Natychmiast zauwa\u017cyli\u015bmy, \u017ce brokerzy-zwrotnicy nie mog\u0105 otrzymywa\u0107 replik wystarczaj\u0105co szybko, wi\u0119c podnie\u015bli\u015bmy <code>num.replica.fetchers<\/code> do 4, aby zwi\u0119kszy\u0107 pr\u0119dko\u015b\u0107, z jak\u0105 brokerzy-zwrotnicy replikowali wiadomo\u015bci od lider\u00f3w.<\/p>\n<h3>Narz\u0119dzie do generowania obci\u0105\u017cenia<\/h3>\n<p>\nNale\u017cy upewni\u0107 si\u0119, \u017ce potencja\u0142 wybranego generatora obci\u0105\u017cenia nie wyczerpie si\u0119, zanim klaster Kafka (kt\u00f3rego benchmark jest przeprowadzany) osi\u0105gnie maksymalne obci\u0105\u017cenie. Innymi s\u0142owy, konieczne jest wcze\u015bniejsze oszacowanie mo\u017cliwo\u015bci narz\u0119dzia do generowania obci\u0105\u017cenia oraz wybranie dla niego typ\u00f3w instancji z wystarczaj\u0105c\u0105 liczb\u0105 procesor\u00f3w i pami\u0119ci. W takim przypadku nasze narz\u0119dzie b\u0119dzie wytwarza\u0107 wi\u0119ksze obci\u0105\u017cenie, ni\u017c klaster Kafka mo\u017ce znie\u015b\u0107. Po wielu pr\u00f3bach zdecydowali\u015bmy si\u0119 na trzy instancje <i>c5.4xlarge<\/i>, w ka\u017cdej z kt\u00f3rych uruchomiono generator.<\/p>\n<h2>Benchmarking<\/h2>\n<p>\nPomiar wydajno\u015bci to iteracyjny proces, kt\u00f3ry obejmuje nast\u0119puj\u0105ce etapy:<\/p>\n<ul>\n<li> konfiguracja infrastruktury (klaster EKS, klaster Kafka, narz\u0119dzie generuj\u0105ce obci\u0105\u017cenie oraz Prometheus i Grafana);<\/li>\n<li> generowanie obci\u0105\u017cenia przez okre\u015blony czas w celu filtrowania przypadkowych odchyle\u0144 w zbieranych wynikach wydajno\u015bci;<\/li>\n<li> dostosowanie infrastruktury i konfiguracji brokera na podstawie obserwowanych wynik\u00f3w wydajno\u015bci;<\/li>\n<li> powtarzanie procesu, a\u017c osi\u0105gni\u0119ty zostanie wymagany poziom przepustowo\u015bci klastra Kafka. Musi on by\u0107 stabilnie reprodukowalny i wykazywa\u0107 minimalne wahania przepustowo\u015bci.<\/li>\n<\/ul>\n<p>\nW nast\u0119pnym rozdziale opisano kroki, jakie zosta\u0142y podj\u0119te w trakcie benchmarku testowego klastra.<\/p>\n<h3>Narz\u0119dzia<\/h3>\n<p>\nDo szybkiego uruchomienia podstawowej konfiguracji, generowania obci\u0105\u017cenia i pomiaru wydajno\u015bci u\u017cyto nast\u0119puj\u0105cych narz\u0119dzi:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/docs\/pipeline\/overview\/\">Banzai Cloud Pipeline<\/a><\/noindex> do zarz\u0105dzania klastrem EKS od Amazon i <noindex><a rel=\"nofollow\" href=\"https:\/\/prometheus.io\/\">Prometheus<\/a><\/noindex> (do zbierania metryk Kafka i infrastruktury) oraz <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/\">Grafana<\/a><\/noindex> (do wizualizacji tych metryk). Skorzystali\u015bmy z <b>zintegrowanych<\/b> do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/banzaicloud\/pipeline\">Pipeline<\/a><\/noindex> us\u0142ug, kt\u00f3re zapewniaj\u0105 federacyjne monitorowanie, centralizowane zbieranie log\u00f3w, skanowanie podatno\u015bci, przywracanie po awarii, bezpiecze\u0144stwo na poziomie korporacyjnym i wiele innych.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jamiealquiza\/sangrenel\">Sangrenel<\/a><\/noindex> to narz\u0119dzie do testowania obci\u0105\u017cenia klastra Kafka.<\/li>\n<li> Pulpity Grafana do wizualizacji metryk Kafka i infrastruktury: <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/grafana\/dashboards\/10123\">Kubernetes Kafka<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/grafana\/dashboards\/1860\">Node Exporter<\/a><\/noindex>.<\/li>\n<li> Supertubes CLI dla maksymalnie prostego konfigurowania klastra Kafka w Kubernetes. Zookeeper, operator Kafka, Envoy i wiele innych komponent\u00f3w zosta\u0142o zainstalowanych i odpowiednio skonfigurowanych do uruchomienia klastra Kafka gotowego do produkcji w Kubernetes.\n<ul>\n<li> klonujemy odpowiednie repozytorium z github: <i>supertubes CLI<\/i> skorzystaj z instrukcji podanych <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/docs\/supertubes\/cli\/install\/\">tutaj<\/a><\/noindex>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/23ecf423b1ea66813406943ae7eabf61.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Klaster EKS<\/h3>\n<p>\nPrzygotuj klaster EKS z wydzielonymi w\u0119z\u0142ami roboczymi <i>c5.4xlarge<\/i> w r\u00f3\u017cnych strefach dost\u0119pno\u015bci dla pod\u00f3w z brokerami Kafka, a tak\u017ce na dedykowane w\u0119z\u0142y dla generatora obci\u0105\u017cenia i infrastruktury monitoruj\u0105cej.<\/p>\n<pre><code class=\"bash\">banzai cluster create -f https:\/\/raw.githubusercontent.com\/banzaicloud\/kafka-operator\/master\/docs\/benchmarks\/infrastructure\/cluster_eks_202001.json<\/code><\/pre>\n<p>\nGdy klaster EKS b\u0119dzie gotowy, w\u0142\u0105cz jego zintegrowan\u0105 <noindex><a rel=\"nofollow\" href=\"https:\/\/banzaicloud.com\/docs\/pipeline\/features\/integrated-services\/\">us\u0142ug\u0119 monitorowania<\/a><\/noindex> \u2014 ona wdro\u017cy Prometheus i Grafana w klastrze.<\/p>\n<h3>Komponenty systemowe Kafka<\/h3>\n<p>\nZainstaluj komponenty systemowe Kafka (Zookeeper, kafka-operator) w EKS za pomoc\u0105 supertubes CLI:<\/p>\n<pre><code class=\"bash\">supertubes install -a --no-democluster --kubeconfig<\/code><\/pre>\n<p><\/p>\n<h3>Klaster Kafka<\/h3>\n<p>\nDomy\u015blnie w EKS u\u017cywane s\u0105 wolumeny EBS typu <i>gp2<\/i>, dlatego nale\u017cy utworzy\u0107 oddzieln\u0105 klas\u0119 przechowywania na podstawie wolumen\u00f3w <i>io1<\/i> dla klastra Kafka:<\/p>\n<pre><code class=\"plaintext\">kubectl create -f - &lt;&lt;EOF\napiVersion: storage.k8s.io\/v1\nkind: StorageClass\nmetadata:\n  name: fast-ssd\nprovisioner: kubernetes.io\/aws-ebs\nparameters:\n  type: io1\n  iopsPerGB: &quot;50&quot;\n  fsType: ext4\nvolumeBindingMode: WaitForFirstConsumer\nEOF<\/code><\/pre>\n<p>\nUstaw parametr dla broker\u00f3w <code>min.insync.replicas=3<\/code> i wdro\u017cenie pod\u00f3w broker\u00f3w na w\u0119z\u0142ach w trzech r\u00f3\u017cnych strefach dost\u0119pno\u015bci:<\/p>\n<pre><code class=\"bash\">supertubes cluster create -n kafka --kubeconfig  -f https:\/\/raw.githubusercontent.com\/banzaicloud\/kafka-operator\/master\/docs\/benchmarks\/infrastructure\/kafka_202001_3brokers.yaml --wait --timeout 600<\/code><\/pre>\n<p><\/p>\n<h3>Tematy<\/h3>\n<p>\nR\u00f3wnocze\u015bnie uruchomili\u015bmy trzy egzemplarze generatora obci\u0105\u017cenia. Ka\u017cdy z nich pisze do swojego tematu, co oznacza, \u017ce potrzebujemy w sumie trzech temat\u00f3w:<\/p>\n<pre><code class=\"bash\">supertubes cluster topic create -n kafka --kubeconfig  -f -&lt;&lt;EOF\napiVersion: kafka.banzaicloud.io\/v1alpha1\nkind: KafkaTopic\nmetadata:\n  name: perftest1\nspec:\n  name: perftest1\n  partitions: 12\n  replicationFactor: 3\n  retention.ms: &#039;28800000&#039;\n  cleanup.policy: delete\nEOF\n\nsupertubes cluster topic create -n kafka --kubeconfig  -f -&lt;&lt;EOF\napiVersion: kafka.banzaicloud.io\/v1alpha1\nkind: KafkaTopic\nmetadata:\n    name: perftest2\nspec:\n  name: perftest2\n  partitions: 12\n  replicationFactor: 3\n  retention.ms: &#039;28800000&#039;\n  cleanup.policy: delete\nEOF\n\nsupertubes cluster topic create -n kafka --kubeconfig  -f -&lt;&lt;EOF\napiVersion: kafka.banzaicloud.io\/v1alpha1\nkind: KafkaTopic\nmetadata:\n  name: perftest3\nspec:\n  name: perftest3\n  partitions: 12\n  replicationFactor: 3\n  retention.ms: &#039;28800000&#039;\n  cleanup.policy: delete\nEOF<\/code><\/pre>\n<p>\nDla ka\u017cdego tematu wsp\u00f3\u0142czynnik replikacji wynosi 3 \u2014 minimalnie zalecana warto\u015b\u0107 dla wysoko dost\u0119pnych system\u00f3w produkcyjnych.<\/p>\n<h3>Narz\u0119dzie do generowania obci\u0105\u017cenia<\/h3>\n<p>\nUruchomili\u015bmy trzy instancje generatora obci\u0105\u017cenia (ka\u017cda pisa\u0142a do oddzielnego tematu). Dla pod\u00f3w generatora obci\u0105\u017cenia nale\u017cy ustawi\u0107 affinno\u015b\u0107 w\u0119z\u0142a, aby by\u0142y planowane tylko na dedykowane dla nich w\u0119z\u0142y:<\/p>\n<pre><code class=\"plaintext\">apiVersion: extensions\/v1beta1\nkind: Deployment\nmetadata:\n  labels:\n    app: loadtest\n  name: perf-load1\n  namespace: kafka\nspec:\n  progressDeadlineSeconds: 600\n  replicas: 1\n  revisionHistoryLimit: 10\n  selector:\n    matchLabels:\n      app: loadtest\n  strategy:\n    rollingUpdate:\n      maxSurge: 25%\n      maxUnavailable: 25%\n    type: RollingUpdate\n  template:\n    metadata:\n      creationTimestamp: null\n      labels:\n        app: loadtest\n    spec:\n      affinity:\n        nodeAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            nodeSelectorTerms:\n            - matchExpressions:\n              - key: nodepool.banzaicloud.io\/name\n                operator: In\n                values:\n                - loadgen\n      containers:\n      - args:\n        - -brokers=kafka-0:29092,kafka-1:29092,kafka-2:29092,kafka-3:29092\n        - -topic=perftest1\n        - -required-acks=all\n        - -message-size=512\n        - -workers=20\n        image: banzaicloud\/perfload:0.1.0-blog\n        imagePullPolicy: Always\n        name: sangrenel\n        resources:\n          limits:\n            cpu: 2\n            memory: 1Gi\n          requests:\n            cpu: 2\n            memory: 1Gi\n        terminationMessagePath: \/dev\/termination-log\n        terminationMessagePolicy: File\n      dnsPolicy: ClusterFirst\n      restartPolicy: Always\n      schedulerName: default-scheduler\n      securityContext: {}\n      terminationGracePeriodSeconds: 30<\/code><\/pre>\n<p>\nKilka kwestii, na kt\u00f3re nale\u017cy zwr\u00f3ci\u0107 uwag\u0119:<\/p>\n<ul>\n<li> Generator obci\u0105\u017cenia generuje wiadomo\u015bci o d\u0142ugo\u015bci 512 bajt\u00f3w i publikuje je w Kafka w partiach po 500 wiadomo\u015bci.<\/li>\n<li> Za pomoc\u0105 argumentu <code>-required-acks=all<\/code> publikacja jest uznawana za udan\u0105, gdy wszystkie zsynchronizowane repliki wiadomo\u015bci zosta\u0142y odebrane i potwierdzone przez broker\u00f3w Kafka. Oznacza to, \u017ce w benchmarku mierzyli\u015bmy nie tylko pr\u0119dko\u015b\u0107 dzia\u0142ania lider\u00f3w otrzymuj\u0105cych wiadomo\u015bci, ale tak\u017ce ich nast\u0119pc\u00f3w replikuj\u0105cych wiadomo\u015bci. Celem tego testu nie jest ocena pr\u0119dko\u015bci odczytu przez konsument\u00f3w <i>(consumers)<\/i> niedawno przyj\u0119tych wiadomo\u015bci, kt\u00f3re wci\u0105\u017c pozostaj\u0105 w pami\u0119ci podr\u0119cznej systemu operacyjnego, oraz jej por\u00f3wnanie z pr\u0119dko\u015bci\u0105 odczytu wiadomo\u015bci przechowywanych na dysku.<\/li>\n<li> Generator obci\u0105\u017cenia jednocze\u015bnie uruchamia 20 worker\u00f3w (<code>-workers=20<\/code>). Ka\u017cdy worker zawiera 5 producer\u00f3w, kt\u00f3rzy wsp\u00f3lnie korzystaj\u0105 z po\u0142\u0105czenia workera z klastrem Kafka. W rezultacie ka\u017cdy generator ma 100 producer\u00f3w i wszyscy oni wysy\u0142aj\u0105 wiadomo\u015bci do klastra Kafka.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Obserwacja stanu klastra<\/h3>\n<p>\nPodczas testowania obci\u0105\u017ceniowego klastra Kafka obserwowali\u015bmy r\u00f3wnie\u017c jego stan, aby upewni\u0107 si\u0119, \u017ce nie ma restart\u00f3w pod\u00f3w, niesynchronizowanych replik oraz maksymalnej przepustowo\u015bci z minimalnymi fluktuacjami:<\/p>\n<ul>\n<li> Generator obci\u0105\u017cenia zapisuje standardowe statystyki dotycz\u0105ce liczby opublikowanych wiadomo\u015bci i poziomu b\u0142\u0119d\u00f3w. Procent b\u0142\u0119d\u00f3w powinien pozostawa\u0107 na poziomie <code>0,00%<\/code>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/linkedin\/cruise-control\">Cruise Control<\/a><\/noindex>, rozwini\u0119ty przez kafka-operatora, oferuje panel monitorowania, na kt\u00f3rym mo\u017cemy r\u00f3wnie\u017c obserwowa\u0107 stan klastra. Aby przejrze\u0107 ten panel, wykonaj:\n<pre><code class=\"bash\">supertubes cluster cruisecontrol show -n kafka --kubeconfig<\/code><\/pre>\n<\/li>\n<li> Poziom ISR <i>(liczba replik \u201ein-sync\u201d)<\/i> shrink i expansion wynosi 0.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Wyniki pomiar\u00f3w<\/h2>\n<p><\/p>\n<h3>3 broker\u00f3w, rozmiar wiadomo\u015bci \u2014 512 bajt\u00f3w<\/h3>\n<p>\nZ partycjami r\u00f3wnomiernie roz\u0142o\u017conymi na trzech brokerach uda\u0142o nam si\u0119 osi\u0105gn\u0105\u0107 wydajno\u015b\u0107 <i>~500 Mb\/s (oko\u0142o 990 tys. wiadomo\u015bci na sekund\u0119)<\/i>:<\/p>\n<p><img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/df65ff6a1a26e28d5e5a7a5ab1a20d98.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/15c5883c0056c651f0a0bd14e9991967.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/9b708fa5ce809b0d059cba9f5edfbb2f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZu\u017cycie pami\u0119ci przez maszyn\u0119 wirtualn\u0105 JVM nie przekroczy\u0142o 2 GB:<\/p>\n<p><img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/3320e2eea891055cc0935da492d18ee9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/6e3976c310309aa8be45fa3fdf547750.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/94baa1b689ae854693fb7cc4ed6e105e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrzepustowo\u015b\u0107 dysku osi\u0105gn\u0119\u0142a maksymaln\u0105 przepustowo\u015b\u0107 I\/O w\u0119z\u0142a na wszystkich trzech instancjach, na kt\u00f3rych dzia\u0142a\u0142y brokery:<\/p>\n<p><img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/408139ad33cda1294755660df1c128a8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/391d2df0ddfe82f94abdb200370ff775.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/e7e9fd021a2cdc71992ce672363a78ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZ danych dotycz\u0105cych wykorzystania pami\u0119ci przez w\u0119z\u0142y wynika, \u017ce buforowanie systemowe i pami\u0119\u0107 podr\u0119czna zaj\u0119\u0142y ~10-15 GB:<\/p>\n<p><img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/781887507e01a4903b86871961ff9260.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/63f10177f01342039f04192ea93c8bca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/48b992cc73a968b3d3b1442f96562c4e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>3 broker\u00f3w, rozmiar wiadomo\u015bci \u2014 100 bajt\u00f3w<\/h3>\n<p>\nZmniejszenie rozmiaru wiadomo\u015bci powoduje spadek przepustowo\u015bci o oko\u0142o 15-20%: wp\u0142ywa to na czas potrzebny na przetworzenie ka\u017cdej wiadomo\u015bci. Ponadto obci\u0105\u017cenie procesora wzros\u0142o prawie dwukrotnie.<\/p>\n<p><img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/2f7dc5a94da371cfe17c9e0fc0ec1941.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/986160a3a4e099a0dbb8aeefaf6f1c2f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/c08244457bf4dbfadf52838d4ea2969e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPoniewa\u017c na w\u0119z\u0142ach broker\u00f3w wci\u0105\u017c s\u0105 niewykorzystane rdzenie, wydajno\u015b\u0107 mo\u017cna zwi\u0119kszy\u0107 poprzez zmian\u0119 konfiguracji Kafka. To nie jest proste zadanie, dlatego aby zwi\u0119kszy\u0107 przepustowo\u015b\u0107 lepiej pracowa\u0107 z wiadomo\u015bciami o wi\u0119kszym rozmiarze.<\/p>\n<h3>4 broker\u00f3w, rozmiar wiadomo\u015bci \u2014 512 bajt\u00f3w<\/h3>\n<p>\nMo\u017cna \u0142atwo zwi\u0119kszy\u0107 wydajno\u015b\u0107 klastra Kafka, dodaj\u0105c nowe brokery i utrzymuj\u0105c r\u00f3wnowag\u0119 partycji (zapewnia to r\u00f3wnomierne roz\u0142o\u017cenie obci\u0105\u017cenia mi\u0119dzy brokerami). W naszym przypadku po dodaniu brokera przepustowo\u015b\u0107 klastra wzros\u0142a do <i>~580 Mb\/s (~1,1 mln wiadomo\u015bci na sekund\u0119)<\/i>. Wzrost okaza\u0142 si\u0119 mniejszy ni\u017c oczekiwano: w du\u017cej mierze wynika to z braku r\u00f3wnowagi partycji (nie wszyscy brokerzy dzia\u0142aj\u0105 na szczycie mo\u017cliwo\u015bci).<\/p>\n<p><img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/8c8d2e70739add3c3f88fe42acf98c46.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/a6e4812270c04487de0ad39b996a13f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/6162c04cfb87b9d9cd0f3147a4ae1647.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/dae5de3b14be212c679f3627a3b77d7b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZarz\u0105dzanie pami\u0119ci\u0105 JVM pozosta\u0142o poni\u017cej 2 GB:<\/p>\n<p><img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/0bca07a817d7da3104b08de10979f049.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/7e1e64f80ec140f13e171cfe3be930ce.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/5e9700b1e54e45f9cd5fa018ec07dba1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/4ba0c4b59bfe72bcb0d2f22056c47d79.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa prac\u0119 broker\u00f3w z pami\u0119ci\u0105 wp\u0142yn\u0119\u0142a nier\u00f3wnowaga partycji:<\/p>\n<p><img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/2b8ed3c21adf70c751d1daa6d4c41895.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/77b980869b99903d9de5cd7d43d79291.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/f2f9569a3a1ef0ce35e89b2e52e4a8b2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Okre\u015blamy odpowiedni rozmiar klastra Kafka w Kubernetes\" src=\"\/wp-content\/uploads\/2020\/02\/191d6d97b32b2128c5cfd3914171de15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Wnioski<\/h2>\n<p>\nPrzedstawione powy\u017cej podej\u015bcie iteracyjne mo\u017ce by\u0107 rozszerzone, aby obj\u0105\u0107 bardziej z\u0142o\u017cone scenariusze, obejmuj\u0105ce setki konsument\u00f3w, repartitioning, wdra\u017cane aktualizacje, ponowne uruchamianie pod\u00f3w itp. Wszystko to pozwala nam oceni\u0107 granice mo\u017cliwo\u015bci klastra Kafka w r\u00f3\u017cnych warunkach, zidentyfikowa\u0107 w\u0105skie gard\u0142a w jego dzia\u0142aniu i znale\u017a\u0107 sposoby ich przezwyci\u0119\u017cenia.<\/p>\n<p>Opracowali\u015bmy Supertubes do szybkiego i \u0142atwego wdra\u017cania klastra, jego konfiguracji, dodawania\/usuwania broker\u00f3w i temat\u00f3w, reagowania na powiadomienia oraz zapewnienia prawid\u0142owego dzia\u0142ania Kafka w Kubernetes w og\u00f3le. Naszym celem jest pom\u00f3c skupi\u0107 si\u0119 na podstawowym zadaniu (\"generowa\u0107\" i \"konsumowa\u0107\" wiadomo\u015bci Kafka), a ca\u0142\u0105 ci\u0119\u017ck\u0105 prac\u0119 powierzy\u0107 Supertubes i kafka operatorowi.<\/p>\n<p>Je\u015bli interesuj\u0105 Ci\u0119 technologie i projekty Open Source Banzai Cloud, \u015bled\u017a firm\u0119 na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/banzaicloud\">GitHub<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.linkedin.com\/company\/banzaicloud\">LinkedIn<\/a><\/noindex> lub <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/BanzaiCloud\">Twitter<\/a><\/noindex>.<\/p>\n<h2>P.S. od t\u0142umacza<\/h2>\n<p>\nPrzeczytaj tak\u017ce na naszym blogu:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">Jedna historia z operatorem Redis w K8s oraz mini-przegl\u0105d narz\u0119dzi do analizy danych tej bazy danych.<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/450662\/\">K\u0142opotliwa migracja RabbitMQ do Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/329224\/\">zetcd od CoreOS: Zast\u0119puj\u0105c ZooKeeper\u2026 magazynem etcd<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/488920\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Banzai Cloud \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0451 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 Kafka \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Kubernetes. \u041f\u0440\u0438\u0432\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0430\u043c\u0443 Kafka \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438. Apache Kafka \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0445, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71214,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71213","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Banzai Cloud \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0451 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 Kafka \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Kubernetes.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/opredelyaem-podhodyashhij-razmer-dlya-klastera-kafka-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kafka \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Banzai Cloud \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0451 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 Kafka \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Kubernetes.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/opredelyaem-podhodyashhij-razmer-dlya-klastera-kafka-v-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-24T13:09:17+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:29+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Okre\u015blamy odpowiedni rozmiar dla klastra Kafka w Kubernetes | ProHoster","description":"Przyp. t\u0142um.: W tym artykule firma Banzai Cloud dzieli si\u0119 przyk\u0142adem wykorzystania swoich specjalnych narz\u0119dzi do u\u0142atwienia eksploatacji Kafka w ramach Kubernetes.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/opredelyaem-podhodyashhij-razmer-dlya-klastera-kafka-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kafka \u0432 Kubernetes | ProHoster","og:description":"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Banzai Cloud \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0451 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 Kafka \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Kubernetes.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/opredelyaem-podhodyashhij-razmer-dlya-klastera-kafka-v-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-24T13:09:17+00:00","article:modified_time":"2020-03-03T13:14:29+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71213","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:06:22","updated":"2022-10-04 20:58:00","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/71213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=71213"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/71213\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/71214"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=71213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=71213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=71213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}