Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Docker Swarm, Kubernetes, u Mesos huma l-aktar oqfsa popolari għall-orkestrazzjoni tal-kontejners. Fit-taħdita tiegħu, Arun Gupta jqabbel l-aspetti li ġejjin ta 'Docker, Swarm, u Kubernetes:

  • Żvilupp lokali.
  • Funzjonijiet ta' skjerament.
  • Applikazzjonijiet b'ħafna kontenituri.
  • Skoperta tas-servizz.
  • Skala tas-servizz.
  • Ħidmiet ta' run-one.
  • Integrazzjoni ma' Maven.
  • Aġġornament "rolling".
  • Ħolqien ta' cluster ta' database Couchbase.

Bħala riżultat, int ser tikseb fehim ċar ta 'dak li kull għodda ta' orkestrazzjoni għandha x'toffri u titgħallem kif tuża dawn il-pjattaformi b'mod effettiv.

Arun Gupta huwa t-teknologu ewlieni għall-prodotti open-source f'Amazon Web Services, li ilu jiżviluppa l-komunitajiet tal-iżviluppaturi Sun, Oracle, Red Hat u Couchbase għal aktar minn 10 snin. Għandu esperjenza estensiva ta' xogħol fit-tmexxija ta' timijiet trans-funzjonali li qed jiżviluppaw u jimplimentaw strateġija għal kampanji u programmi ta' kummerċjalizzazzjoni. Huwa mexxa timijiet ta 'inġiniera Sun, huwa wieħed mill-fundaturi tat-tim Java EE u l-kreatur tal-fergħa tal-Istati Uniti ta' Devoxx4Kids. Arun Gupta huwa l-awtur ta’ aktar minn elfejn post fil-blogs tal-IT u ta taħditiet f’aktar minn 2 pajjiż.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 1
Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 2

Il-linja 55 fiha COUCHBASE_URI li tipponta lejn dan is-servizz tad-database, li nħoloq ukoll bl-użu tal-fajl tal-konfigurazzjoni Kubernetes. Jekk tħares lejn il-linja 2, tista 'tara tip: Is-servizz huwa s-servizz li qed noħloq imsejjaħ couchbase-service, u l-istess isem huwa elenkat fuq il-linja 4. Hawn taħt hemm xi portijiet.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Il-linji ewlenin huma 6 u 7. Fis-servizz ngħid, "Ħej, dawn huma t-tikketti li qed infittex!", u dawn it-tikketti huma xejn aktar minn ismijiet ta' par varjabbli, u l-linja 7 tipponta lejn il-couchbase-rs-pod tiegħi applikazzjoni. Dawn li ġejjin huma l-portijiet li jipprovdu aċċess għal dawn l-istess tikketti.

Fuq il-linja 19 noħloq tip ġdid ReplicaSet, il-linja 31 fiha l-isem tal-immaġni, u l-linji 24-27 jindikaw il-metadata assoċjata mal-pod tiegħi. Dan huwa eżattament dak li qed ifittex is-servizz u għalxiex għandha ssir il-konnessjoni. Fl-aħħar tal-fajl hemm xi tip ta’ konnessjoni bejn il-linji 55-56 u 4, li tgħid: “uża dan is-servizz!”

Allura, nibda s-servizz tiegħi meta jkun hemm sett ta 'repliki, u peress li kull sett ta' repliki għandu l-port tiegħu bit-tikketta korrispondenti, huwa inkluż fis-servizz. Mill-aspett ta 'żviluppatur, inti sempliċiment iċempel is-servizz, li mbagħad juża s-sett ta' repliki li għandek bżonn.

Bħala riżultat, għandi pod WildFly li jikkomunika mal-backend tad-database permezz tas-Servizz Couchbase. Kapaċi nuża l-frontend b'diversi pods WildFly, li jikkomunika wkoll mal-backend tal-couchbase permezz tas-servizz tal-couchbase.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Aktar tard se nħarsu lejn kif servizz li jinsab barra l-cluster jikkomunika permezz tal-indirizz IP tiegħu ma 'elementi li jinsabu ġewwa l-cluster u li għandhom indirizz IP intern.

Allura, kontenituri mingħajr stat huma kbar, imma kemm hu tajjeb li tuża kontenituri stateful? Ejja nħarsu lejn is-settings tas-sistema għal kontenituri bi stat, jew persistenti. F'Docker, hemm 4 approċċi differenti għat-tqassim tal-ħażna tad-dejta li għandek tagħti attenzjoni għalihom. L-ewwel huwa Implicit Per-Container, li jfisser li meta tuża kontenituri couchbase, MySQL jew MyDB satateful, kollha jibdew bis-Sandbox default. Jiġifieri, dak kollu li huwa maħżun fid-database huwa maħżun fil-kontenitur innifsu. Jekk il-kontenitur jisparixxi, id-dejta tisparixxi flimkien magħha.

It-tieni huwa Espliċitu Per-Kontenitur, meta toħloq ħażna speċifika bil-volum ta 'docker toħloq kmand u taħżen id-dejta fiha. It-tielet approċċ Per-Host huwa assoċjat mal-immappjar tal-ħażna, meta dak kollu maħżun fil-kontenitur huwa simultanjament duplikat fuq il-host. Jekk il-kontenitur ifalli, id-dejta tibqa’ fuq il-host. Dan tal-aħħar huwa l-użu ta 'diversi hosts Multi-Host, li huwa rakkomandabbli fl-istadju tal-produzzjoni ta' diversi soluzzjonijiet. Ejja ngħidu li l-kontenituri tiegħek bl-applikazzjonijiet tiegħek qed jaħdmu fuq il-host, iżda trid taħżen id-dejta tiegħek x'imkien fuq l-Internet, u għal dan tuża mapping awtomatiku għal sistemi distribwiti.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Kull wieħed minn dawn il-metodi juża post ta 'ħażna speċifiku. Impliċita u Espliċita Per-Kontenitur jaħżnu dejta fuq l-host f'/var/lib/docker/volumes. Meta tuża l-metodu Per-Host, il-ħażna hija mmuntata ġewwa l-kontenitur, u l-kontenitur innifsu huwa mmuntat fuq l-ospitant. Għal multihosts, jistgħu jintużaw soluzzjonijiet bħal Ceph, ClusterFS, NFS, eċċ.

Jekk kontenitur persistenti jfalli, id-direttorju tal-ħażna jsir inaċċessibbli fl-ewwel żewġ każijiet, iżda fl-aħħar żewġ każijiet jinżamm l-aċċess. Madankollu, fl-ewwel każ, tista’ taċċessa r-repożitorju permezz ta’ host Docker li jaħdem fuq magna virtwali. Fit-tieni każ, id-data lanqas se tintilef, għax ħloqt ħażna Espliċita.

Jekk l-host ifalli, id-direttorju tal-ħażna ma jkunx disponibbli fl-ewwel tliet każijiet; fl-aħħar każ, il-konnessjoni mal-ħażna ma tiġix interrotta. Fl-aħħarnett, il-funzjoni kondiviża hija kompletament eskluża għall-ħażna fl-ewwel każ u hija possibbli fil-bqija. Fit-tieni każ, tista 'taqsam il-ħażna skont jekk id-database tiegħek tappoġġjax ħażna distribwita jew le. Fil-każ ta 'Per-Host, id-distribuzzjoni tad-dejta hija possibbli biss fuq host partikolari, u għal multihost hija pprovduta minn espansjoni ta' cluster.

Dan għandu jitqies meta jinħolqu kontenituri stateful. Għodda oħra utli ta’ Docker hija l-plugin tal-Volum, li jaħdem fuq il-prinċipju ta’ “batteriji preżenti, iżda jridu jiġu sostitwiti.” Meta tibda kontenitur Docker, jgħid, "Ħej, ladarba tibda kontenitur b'database, tista' taħżen id-dejta tiegħek f'dan il-kontenitur!" Din hija l-karatteristika awtomatika, iżda tista 'tbiddelha. Dan il-plugin jippermettilek tuża network drive jew xi ħaġa simili minflok database tal-kontenitur. Tinkludi sewwieq default għall-ħażna bbażata fuq l-ospitanti u tippermetti l-integrazzjoni tal-kontenitur ma 'sistemi ta' ħażna esterni bħal Amazon EBS, Azure Storage u GCE Persistent disks.

Is-slide li jmiss turi l-arkitettura tal-plugin Docker Volume.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Il-kulur blu jirrappreżenta l-klijent Docker assoċjat mal-host Docker blu, li għandu magna tal-ħażna Lokali li tipprovdilek kontenituri għall-ħażna tad-dejta. L-aħdar jindika l-Plugin Client u l-Plugin Daemon, li huma wkoll konnessi mal-host. Huma jipprovdu l-opportunità li taħżen id-dejta fil-ħażna tan-netwerk tat-tip ta 'Backend tal-Ħżin li għandek bżonn.

Il-plugin Docker Volume jista 'jintuża mal-ħażna Portworx. Il-modulu PX-Dev fil-fatt huwa kontenitur li tmexxi li jgħaqqad mal-host Docker tiegħek u jippermettilek taħżen faċilment id-dejta fuq Amazon EBS.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Il-klijent Portworx jippermettilek tissorvelja l-istatus ta 'diversi kontenituri tal-ħażna li huma konnessi mal-host tiegħek. Jekk iżżur il-blog tiegħi, tista' taqra kif tagħmel l-aħjar użu minn Portworx ma' Docker.

Il-kunċett tal-ħażna f'Kubernetes huwa simili għal Docker u huwa rappreżentat minn direttorji li huma aċċessibbli għall-kontenitur tiegħek f'pod. Huma indipendenti mill-ħajja ta 'kull kontenitur. L-aktar tipi ta’ ħażna komuni disponibbli huma hostPath, nfs, awsElasticBlockStore, u gsePersistentDisk. Ejja nagħtu ħarsa lejn kif jaħdmu dawn il-ħwienet f'Kubernetes. Tipikament, il-proċess ta 'konnessjoni tagħhom jikkonsisti fi 3 passi.

L-ewwel hija li xi ħadd min-naħa tan-netwerk, ġeneralment amministratur, jipprovdilek ħażna persistenti. Hemm fajl ta 'konfigurazzjoni PersistentVolume korrispondenti għal dan. Sussegwentement, l-iżviluppatur tal-applikazzjoni jikteb fajl ta’ konfigurazzjoni msejjaħ PersistentVolumeClaim, jew talba għall-ħażna tal-PVC, li tgħid: “Għandi 50GB ta’ ħażna distribwita pprovduti, iżda sabiex nies oħra jużaw ukoll il-kapaċità tiegħu, qed ngħid lil dan il-PVC li bħalissa jien. jeħtieġ biss 10 GB". Fl-aħħarnett, it-tielet pass huwa li t-talba tiegħek tkun immuntata bħala ħażna, u l-applikazzjoni li għandha l-pod, jew is-sett tar-replika, jew xi ħaġa simili, tibda tużaha. Huwa importanti li wieħed jiftakar li dan il-proċess jikkonsisti fit-3 passi msemmija u huwa skalabbli.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Is-slide li jmiss turi l-Kubernetes Persistence Container tal-arkitettura AWS.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Ġewwa r-rettangolu kannella li jirrappreżenta l-cluster Kubernetes, hemm nodu ewlieni wieħed u żewġ nodi tal-ħaddiema, indikati bl-isfar. Wieħed min-nodi tal-ħaddiema fih pod oranġjo, ħażna, kontrollur replika, u kontenitur aħdar Docker Couchbase. Ġewwa l-cluster, fuq in-nodi, rettangolu vjola jindika s-Servizz aċċessibbli minn barra. Din l-arkitettura hija rakkomandata għall-ħażna tad-dejta fuq l-apparat innifsu. Jekk meħtieġ, nista' naħżen id-dejta tiegħi fl-EBS barra l-cluster, kif muri fil-pjastra li jmiss. Dan huwa mudell tipiku għall-iskala, iżda hemm aspett finanzjarju li għandek tikkonsidra meta tużah - il-ħażna tad-dejta x'imkien fuq in-netwerk jista 'jkun aktar għali milli fuq host. Meta tagħżel soluzzjonijiet ta 'kontejners, dan huwa wieħed mill-argumenti ta' piż.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Eżatt bħal ma 'Docker, tista' tuża kontenituri persistenti ta 'Kubernetes ma' Portworx.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Dan huwa dak li fit-terminoloġija attwali ta 'Kubernetes 1.6 tissejjaħ "StatefulSet" - mod ta' kif taħdem ma 'applikazzjonijiet Stateful li tipproċessa avvenimenti dwar il-waqfien tal-Pod u t-twettiq ta' Graceful Shutdown. Fil-każ tagħna, applikazzjonijiet bħal dawn huma databases. Fil-blog tiegħi tista' taqra kif toħloq StatefulSet f'Kubernetes billi tuża Portworx.
Ejja nitkellmu dwar l-aspett tal-iżvilupp. Kif għedt, Docker għandu 2 verżjonijiet - CE u EE, fl-ewwel każ qed nitkellmu dwar verżjoni stabbli tal-Edizzjoni tal-Komunità, li tiġi aġġornata darba kull 3 xhur, b'kuntrast mal-verżjoni aġġornata ta 'kull xahar ta' EE. Tista' tniżżel Docker għal Mac, Linux jew Windows. Ladarba jkun installat, Docker jaġġorna awtomatikament u huwa faċli ħafna li tibda.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Għal Kubernetes, nippreferi l-verżjoni Minikube - huwa mod tajjeb biex tibda bil-pjattaforma billi toħloq cluster fuq nodu wieħed. Biex jinħolqu gruppi ta 'diversi nodi, l-għażla tal-verżjonijiet hija usa': dawn huma kops, kube-aws (CoreOS + AWS), kube-up (skaduti). Jekk qed tfittex li tuża Kubernetes ibbażat fuq AWS, nirrakkomanda li tingħaqad mal-AWS SIG, li jiltaqa' onlajn kull nhar ta' Ġimgħa u jippubblika varjetà ta' materjali interessanti dwar il-ħidma ma' AWS Kubernetes.

Ejja nħarsu lejn kif isir Rolling Update fuq dawn il-pjattaformi. Jekk ikun hemm raggruppament ta 'diversi nodi, allura juża verżjoni speċifika tal-immaġni, pereżempju, WildFly:1. Aġġornament kontinwu jfisser li l-verżjoni tal-immaġini tiġi sostitwita b'mod sekwenzjali b'waħda ġdida fuq kull nodu, wieħed wara l-ieħor.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Biex tagħmel dan, nuża l-kmand tal-aġġornament tas-servizz docker (isem tas-servizz), li fih nispeċifika l-verżjoni l-ġdida tal-immaġni WildFly: 2 u l-metodu tal-aġġornament update-parallelism 2. In-numru 2 ifisser li s-sistema se taġġorna 2 immaġini tal-applikazzjoni fl-istess ħin, imbagħad aġġornament ta '10 sekondi dewmien 10s, wara li l-immaġini 2 li jmiss se jiġu aġġornati fuq 2 nodi aktar, eċċ. Dan il-mekkaniżmu sempliċi ta' aġġornament rolling huwa pprovdut lilek bħala parti minn Docker.

F'Kubernetes, aġġornament kontinwu jaħdem bħal dan. Il-kontrollur tar-replikazzjoni rc joħloq sett ta 'repliki tal-istess verżjoni, u kull pod f'dan il-webapp-rc huwa pprovdut b'tikketta li tinsab f'etcd. Meta jkolli bżonn pod, nuża s-Servizz tal-Applikazzjoni biex naċċessa r-repożitorju tal-etcd, li jipprovdini l-pod billi tuża t-tikketta speċifikata.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

F'dan il-każ, għandna 3 imżiewed fil-kontrollur tar-Replikazzjoni li jħaddem l-applikazzjoni tal-verżjoni WildFly 1. Meta naġġornaw fl-isfond, jinħoloq kontrollur ta 'replikazzjoni ieħor bl-istess isem u indiċi fl-aħħar - - xxxxx, fejn x huma numri każwali, u bl-istess tikketti. Issa s-Servizz tal-Applikazzjoni għandu tliet imżiewed bil-verżjoni l-antika tal-applikazzjoni u tliet imżiewed bil-verżjoni l-ġdida fil-kontrollur tar-Replikazzjoni l-ġdid. Wara dan, il-miżwed qodma jitħassru, il-kontrollur tar-replikazzjoni bil-miżwed il-ġodda jingħata isem ġdid u jitħaddem.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Ejja ngħaddu għall-monitoraġġ. Docker għandu ħafna kmandi ta 'monitoraġġ integrati. Pereżempju, l-interface tal-linja tal-kmand tal-istatistiċi tal-kontenitur docker jippermettilek li turi informazzjoni dwar l-istat tal-kontenituri lill-console kull sekonda - użu tal-proċessur, użu tad-disk, tagħbija tan-netwerk. L-għodda Docker Remote API tipprovdi dejta dwar kif il-klijent jikkomunika mas-server. Juża kmandi sempliċi, iżda huwa bbażat fuq l-API Docker REST. F'dan il-każ, il-kliem REST, Flash, Remote tfisser l-istess ħaġa. Meta tikkomunika mal-host, hija REST API. Id-Docker Remote API jippermettilek tikseb aktar informazzjoni dwar it-tħaddim tal-kontenituri. Il-blog tiegħi jiddeskrivi d-dettalji tal-użu ta' dan il-monitoraġġ mal-Windows Server.

Il-monitoraġġ tal-avvenimenti tas-sistema docker meta jħaddem cluster multi-host jagħmilha possibbli li tinkiseb data dwar ħabta tal-host jew ħabta tal-kontejners fuq host speċifiku, servizzi ta’ skalar, u affarijiet simili. Jibda b'Docker 1.20, jinkludi Prometheus, li jinkorpora endpoints f'applikazzjonijiet eżistenti. Dan jippermettilek li tirċievi metriċi permezz HTTP u turihom fuq dashboards.

Karatteristika oħra ta 'monitoraġġ hija cAdvisor (qosor għal konsulent tal-kontejners). Dan janalizza u jipprovdi dejta dwar l-użu tar-riżorsi u l-prestazzjoni minn kontenituri li jmexxu, u jipprovdi metriċi ta’ Prometheus mill-ewwel. Il-ħaġa speċjali dwar din l-għodda hija li tipprovdi biss data għall-aħħar 60 sekonda. Għalhekk, trid tkun tista' tiġbor din id-dejta u tpoġġiha f'database sabiex tkun tista' tissorvelja proċess fit-tul. Jista 'jintuża wkoll biex juri l-metriċi tad-dashboard b'mod grafiku bl-użu ta' Grafana jew Kibana. Il-blog tiegħi għandu deskrizzjoni dettaljata ta' kif tuża cAdvisor biex tissorvelja l-kontenituri billi tuża d-dashboard Kibana.

Is-slide li jmiss turi kif jidher l-output tal-endpoint Prometheus u l-metriċi disponibbli biex jintwerew.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Fin-naħa t'isfel tax-xellug tara metriċi għal talbiet HTTP, tweġibiet, eċċ., Fuq il-lemin hemm il-wiri grafiku tagħhom.

Kubernetes jinkludi wkoll għodod ta 'monitoraġġ integrati. Din is-slide turi cluster tipiku li fih master wieħed u tliet nodi tal-ħaddiema.

Konferenza tar-Renju Unit DEVOXX. Agħżel qafas: Docker Swarm, Kubernetes jew Mesos. Parti 3

Kull wieħed min-nodi tax-xogħol fih cAdvisor imniedi awtomatikament. Barra minn hekk, hemm Heapster, monitoraġġ tal-prestazzjoni u sistema ta 'ġbir ta' metriċi kompatibbli mal-verżjoni Kubernetes 1.0.6 u ogħla. Heapster jippermettilek li tiġbor mhux biss metriċi tal-prestazzjoni ta 'tagħbija tax-xogħol, imżiewed u kontenituri, iżda wkoll avvenimenti u sinjali oħra ġġenerati mill-cluster kollu. Biex tiġbor id-dejta, titkellem mal-Kubelet ta 'kull pod, awtomatikament jaħżen l-informazzjoni fid-database InfluxDB, u joħroġha bħala metriċi lid-daxxbord Grafana. Madankollu, żomm f'moħħok li jekk qed tuża miniKube, din il-karatteristika mhix disponibbli awtomatikament, għalhekk ikollok tuża addons għall-monitoraġġ. Allura kollox jiddependi minn fejn tmexxi l-kontenituri u liema għodod ta 'monitoraġġ tista' tuża awtomatikament u li għandek bżonn tinstalla bħala add-ons separati.

Is-slide li jmiss turi dashboards ta' Grafana li juru l-istatus ta' tħaddim tal-kontenituri tiegħi. Hemm ħafna dejta interessanti hawnhekk. Naturalment, hemm ħafna għodod kummerċjali ta 'monitoraġġ tal-proċess ta' Docker u Kubernetes, bħal SysDig, DataDog, NewRelic. Xi wħud minnhom għandhom perjodu ta’ prova b’xejn ta’ 30 sena, u għalhekk tista’ tipprova ssib dik li jaqbillek l-aħjar. Personalment, nippreferi nuża SysDig u NewRelic, li jintegraw tajjeb ma' Kubernetes. Hemm għodod li jintegraw tajjeb kemm fil-pjattaformi Docker kif ukoll fil-Kubernetes.

Xi reklami 🙂

Grazzi talli bqajt magħna. Tħobb l-artikoli tagħna? Trid tara aktar kontenut interessanti? Appoġġuna billi tagħmel ordni jew tirrakkomanda lill-ħbieb, Cloud VPS għall-iżviluppaturi minn $4.99, analogu uniku ta 'servers ta' livell ta 'dħul, li ġie ivvintat minna għalik: Il-verità kollha dwar VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps minn $19 jew kif taqsam server? (disponibbli b'RAID1 u RAID10, sa 24 core u sa 40GB DDR4).

Dell R730xd 2 darbiet orħos fiċ-ċentru tad-dejta Equinix Tier IV f'Amsterdam? Hawn biss 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV minn $199 fl-Olanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - minn $99! Aqra dwar Kif tibni l-infrastruttura corp. klassi bl-użu ta 'servers Dell R730xd E5-2650 v4 li jiswew 9000 ewro għal ċenteżmu?

Sors: www.habr.com

Żid kumment