Kontejnery v Azure a interní síťová komunikace

TLDR: mějte vše v kontejnerech, nebo použijte Dapr nebo jiný message broker. Interní komunikace z VM do kontejneru? Možná funguje. S časem se zlepší a dříve to podle všeho fungovalo.

Zkratky použité:
ACA → Azure Container App
ACI → Azure Container Instances

Když mi zadali dockerizovat službu, řekl jsem si: „Snadné. Už jsem to dělal.” O pár týdnů později jsem měl funkční a otestovaný kontejner po portaci staré aplikace .NET 4.3. Žádné exploze. Skvělý začátek.

Tým se sešel, aby otestoval komunikaci kontejneru s VM přes internet. Nebylo to hladké, ale po lehkém „popostrčení” (tj. debugování) začali komunikovat. Zapsali jsme si seznam úkolů, dali si kávu, poslali něco vlažně optimistického CTO a šli domů.

Pak přišla realita: Jak přimět VM, aby komunikovalo s kontejnerem přes interní síť?

Privátní komunikace: Peklo na zemi

Služba byla nasazena jako Azure Container Apps (ACA). Přepnutí prostředí ACA na privátní síťování mi zobrazilo label (Preview). Co by se mohlo pokazit? Ukázalo se, že všechno.

Povolení privátního síťování automaticky vytvořilo novou skupinu zdrojů, ke které jsem neměl přístup. Rychlá zpráva správci systému a mohl jsem pokračovat.

Po pár úpravách jsem viděl slabou jiskru života s tcpping na portu služby. Curl? Mrtvý. Změnil jsem porty. Teď už ani tcpping nefungoval. Vrátil jsem je zpět. Už nic.

V tu chvíli jsem si kladl existenciální otázky.

Googlení pro zachování rozumu

YouTube na záchranu? Ne. Jediný tutoriál, který jsem našel, byl dva roky starý. Nakonec jsem narazil na oficiální Microsoft návod, který byl měsíc starý. Haleluja! Až na to, že byl neúplný, takže jsem musel cross-referencovat CLI verzi, aby to začalo „fungovat”.

Nakonec se automaticky zaregistrovala interní URL kontejneru v privátní DNS zóně. Úspěch? Ne. Služba stále nefungovala. A kontejner začal padat, protože postupování podle oficiálních kroků Microsoftu rozbilo komunikaci s Key Vaultem. Key Vault! Základ celé služby. Skvělé.

“Statické” IP adresy a ACI

Zoufalý, vyzkoušel jsem Azure Container Instances (ACI). Ty mají velmi málo funkcí, žádné automatické aktualizace, škálování dle požadavků atd. Tyto dostávají IP ze subnetu. Perfektní, ne? NE. Statické IP? Zapomeňte. IP se mění při každém restartu kontejneru.

Nejlepší část? Potřebuji lokální URL/IP kontejneru před spuštěním služby. A jediný způsob, jak ho získat? Spustit kontejner a poté se zeptat Azure CLI na jeho IP. Skvělé.

Tak jsem napsal rychlý bash skript s jq, který sebere IP a automaticky aktualizuje konfigurační soubor. Bylo to chytré? Ano. Připadal jsem si, jako bych svůj projekt obalil lepicí páskou? Taky ano.

Závěrečné myšlenky

Jak tu sedím s pivem v ruce a přemýšlím o posledních dnech, zde je můj verdikt:

Ano, technicky je možné to zprovoznit. Ale upřímně? Nestojí to za to. Ušetřete si čas, rozum a játra. Buď přejděte kompletně na kontejnery, nebo použijte Dapr. Cokoliv jiného dopadne takto.

Na zdraví pro přežití cloudu! 🍻