;

Zájem o kontejnery v Česku stále roste. Jaké jsou jejich výhody?

26. 6. 2019
Doba čtení: 4 minuty

Sdílet

Autor: Master Internet
Kontejnerizace umožňuje efektivněji využívat zdroje, usnadňuje přenositelnost software a zjednodušuje škálování. Zjistěte, jak s kontejnery začít.

O kontejnerech je ve světě informačních technologií hodně slyšet už pár let a zájem českých firem o ně stále roste. Není divu – kontejnery totiž přináší řadu výhod, které tradiční plná virtualizace neumí řešit. „Každý měsíc se nám ozývají další lidé se zájmem o kontejnerové řešení, ať už o robustní managed Kubernetes clustery nebo menší virtuální servery, takzvané VPS, s možností další kontejnerové virtualizace,“ popisuje technický ředitel datacenter Master Internet Martin Žídek.

Kontejnery využije každý, kdo pracuje se software

Kontejnerizace má smysl především pro vývojáře microservices. Jedná se o způsob vývoje a provozování aplikací rozdělených na menší moduly uzavřených v kontejnerech, které spolu komunikují prostřednictvím API. Takto postavené aplikace jsou jednodušší na údržbu, protože moduly jsou relativně jednoduché a mohou v nich být prováděny změny bez nutnosti přestavování celé aplikace. Vývoj microservices je možný díky orchestrátorům, které zvládají management obrovského množství kontejnerů a umožňují například i rolling update – při nasazení nových verzí aplikace udržuje repliky obou verzí pro případný rollback na předešlou verzi.

Z kontejnerových technologií ale může profitovat jednoduše každý, kdo pracuje se software, ať už s vlastním nebo třetích stran. Kontejnery umožňují snadnou portabilitu softwaru, který může běžet podle potřeby na různých přístrojích. Díky kontejnerům mohou fungovat jednotlivé části softwaru odděleně, což zvyšuje jeho celkovou bezpečnost, protože problém jedné části nezasáhne ostatní. Kontejnery jsou nepřekonatelné ve škálování – ať už počet uživatelů aplikace klesá nebo stoupá, s kontejnery lze na změny reagovat takřka okamžitě.

Kontejnery řeší nedostatky klasické virtualizace

Vývoj posledních let ukazuje, že zájem o kontejnery stále roste. Jejich popularita je dána schopností řešit nedostatky klasické plné virtualizace. „U plné virtualizace hypervizor emuluje hardware a každý vzniklý virtuální stroj má nainstalovaný vlastní operační systém. Tím vznikají poměrně vysoké režijní náklady, protože provoz hypervizoru a jednotlivých operačních systémů spotřebovává až 20 % výkonu serveru,“ vysvětluje Žídek.

Kontejnerizace je naopak virtualizací jádra operačního systému – to znamená, že všechny kontejnery běží odděleně vedle sebe v rámci jednoho operačního systému a společně sdílejí paměť, knihovny a další zdroje. Tím jsou režijní náklady sníženy a zdroje se využívají efektivněji. Navíc spuštění jednotlivých kontejnerů je výrazně rychlejší než vytváření nových virtuálních strojů s instalováním operačních systémů.

Přechod na kontejnery a jaké řešení si vybrat

Pokud o využití kontejnerů přemýšlíte, nemusíte se do jejich instalace pouštět sami – řada datacenter  dnes kontejnerová řešení nabízí.

MasterDC nabízí tři varianty managed Kubernetes clusteru:

  1. Pro malé instance kontejnery ve VMware cloudu
  2. Pro velké projekty Kubernetes cluster běžící kompletně na fyzických serverech
  3. Hybridní variantu, která zahrnuje orchestrátor v cloudu a kontejnery běžící na vlastních dedikovaných serverech

Nově Master Internet přichází i s VPS s virtualizací KVM, která umožňuje, aby si zákazník Docker na virtuální stroj nainstaloval sám. „Největší zájem je o hybridní variantu Kubernetes clusteru, kterou dokážeme přizpůsobit každému zákazníkovi na míru,“ říká technický ředitel Masteru.

kontejnery schema

Co je pro přechod na kontejnerové řešení nutné udělat? Technicky lze i velké monolitické aplikace jednoduše zavřít do jednoho kontejneru, tím ale nevyužijeme výhody, které kontejnerizace přináší. Naopak je potřebné veškerý software rozdělit na menší části a uzavřít je do kontejnerů. K rozbití monolitických softwarů je nutná příprava a existují metodologie, které postup popisují.

V kontejnerech je budoucnost i mimo servery

Kontejnerové řešení se postupně vyvíjí už několik dekád a zdá se, že technologie má před sebou velkou budoucnost. V současnosti je její největší přínos ve spojení s microservices, kontejnery se ale dostaly třeba už i do desktopového prostředí. Například Linux spustil kontejnerový systém Flatpak pro distribuci GUI aplikací,“ přibližuje současný vývoj Žídek. Ve Flatpaku mohou uživatelé spouštět aplikace izolovaně od zbytku systému, což zajišťuje větší bezpečnost, zjednodušuje updaty a minimalizuje hromadění nepotřebných dat.

Vedle toho vznikl například i experimentální operační systém Fedora, kde je veškerý software distribuovaný mezi kontejnery. „Vše nasvědčuje tomu, že v budoucnu bude veškerý software distribuovaný ve formě images pro kontejnery a procesy už nebudou běžet v hlavním linuxovém jmenném prostoru,“ myslí si Martin Žídek o budoucnosti kontejnerů v desktopovém prostředí.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »