8.3 Containere, orkestrering og cloud-native
Overblik og motivation
En container pakker en applikation sammen med dens afhængigheder i én enkelt, portabel, isoleret enhed. Den kører på samme måde på en bærbar, i et testmiljø og i produktion. Orkestreringsplatforme, mest fremtrædende Kubernetes, planlægger og styrer store mængder containere på tværs af flåder af maskiner. De håndterer placering, skalering, sundhed, netværk og genopretning. Cloud-native er den bredere arkitekturstil bygget på disse fundamenter: applikationer designet som løst koblede, uafhængigt udrulbare, horisontalt skalerbare tjenester, der forudsætter en dynamisk, selvhelende infrastruktur.
For store teams løser containere og orkestrering ét svært problem. I skal køre mange tjenester, bygget af mange teams, pålideligt og effektivt på delt infrastruktur. Containere giver hvert team en ensartet pakkerings- og runtime-kontrakt, hvilket afskaffer “det virker på min maskine”-klassen af fejl. Orkestrering skjuler de enkelte maskiner bag et fælles fundament, så teams udruller til en platform frem for til servere. Denne standardisering er, hvad lader jer drive hundredvis eller tusinder af tjenester uden, at hvert team genopfinder udrulning, skalering og robusthed.
Virksomheds- og offentlige adoptanter får portabilitet, robusthed og en vej væk fra indlåsning. Til gengæld arver de reel kompleksitet og nye sikkerhedsansvar. En containerplatform er kraftfuld netop fordi den er programmerbar og dynamisk, hvilket betyder, at I skal styre den omhyggeligt. Imageproveniens, isolation mellem lejere, netværkspolitik og omkostning bliver alle platformsanliggender. Offentlige adoptanter tilføjer i stigende grad suverænitetskrav: kontrol over, hvor data opbevares, og hvem der kan få adgang til dem. Det gør evnen til at køre ensartede arbejdsbyrder på tværs af valgte miljøer til en strategisk kapabilitet, ikke blot en teknisk detalje.
Grundprincipper
- Pak applikationer som små, enkeltformåls, uforanderlige containerimages.
- Praktisér imagehygiejne: minimale baseimages, fastlåste versioner, scannet for sårbarheder og signeret.
- Design applikationer til at være tilstandsløse og horisontalt skalerbare, hvor det er muligt, og eksternalisér tilstand.
- Behandl orkestreringsplatformens ønsket-tilstand-model som sandhedskilden, og lad den selvhele.
- Håndhæv isolation og mindste privilegium mellem lejere, arbejdsbyrder og namespaces.
- Følg twelve-factor-principperne, en metodologi til at bygge bortskaffelige, konfigurationseksternaliserede, horisontalt skalerbare apps, og udvid dem for distribuerede systemers virkelighed.
- Gør omkostning til et førsteklasses, synligt ingeniøranliggende, ikke en eftertanke.
- Foretræk portable, standardbaserede abstraktioner for at bevare strategisk fleksibilitet.
Anbefalinger
Praktisér stringent imagehygiejne
Containerimaget er jeres grundlæggende enhed af tillid og udrulning, så behandl det derefter. Begynd fra minimale, betroede baseimages for at skrumpe angrebsfladen. Fastlås afhængigheds- og baseimageversioner for reproducerbarhed. Scan hvert image for kendte sårbarheder i buildpipelinen, og bloker dem med kritiske fund. Signér images, og verificér signaturer ved udrulning, så kun godkendte, uændrede images kører. Hold et kurateret internt register af hærdede baseimages, som teams bygger fra. Det spreder gode sikkerhedsstandarder automatisk.
Brug Kubernetes-mønstre frem for at genopfinde dem
Kubernetes belønner teams, der adopterer dets etablerede mønstre, og straffer teams, der kæmper imod dets model. Brug deklarative manifester til ønsket tilstand. Tilføj sundhedsprober, så platformen kan opdage og erstatte usunde instanser. Sæt ressourceanmodninger og -grænser, så planlæggeren kan pakke arbejdsbyrder sikkert. Brug horisontal autoskalering til elastisk efterspørgsel. Til driftslogik, der skal køre kontinuerligt, såsom at styre en database, rotere certifikater eller afstemme brugerdefinerede ressourcer, brug operatormønstret, som koder menneskelig driftsviden ind i software, der iagttager tilstand og handler. Modstå trangen til at bygge skræddersyet orkestrering oven på platformen. Foretræk de native konstruktioner.
Design multi-tenancy bevidst
Når mange teams deler en klynge, er isolation et sikkerheds- og pålidelighedskrav, ikke en finesse. Brug namespaces som lejergrænser. Håndhæv ressourcekvoter, så ingen lejer kan sulte andre. Anvend netværkspolitikker til at begrænse trafik til det, der eksplicit er tilladt. Brug rollebaseret adgangskontrol (RBAC) til at begrænse, hvad hvert team kan gøre. For arbejdsbyrder med stærkere isolationsbehov så overvej separate klynger eller stærkere sandboxing. Afgør tidligt, om jeres model er blød multi-tenancy (betroede interne teams) eller hård multi-tenancy (gensidigt mistroende arbejdsbyrder), fordi de to kræver vidt forskellige kontroller.
Byg cloud-native, twelve-factor og videre
Twelve-factor-metodologien, med dens eksplicitte afhængigheder, konfiguration i miljøet, tilstandsløse processer, bortskaffelighed og så videre, forbliver en fremragende baseline for tjenester, der trives på en dynamisk platform. Udvid den for de tilføjede realiteter i distribuerede systemer. Design til delvis fejl. Gør operationer idempotente og genforsøgbare. Eksponér sundhed og telemetri. Behandl observerbarhed som en indbygget funktion frem for et tilføjet lag. Eksternalisér al tilstand til administrerede datatjenester, så applikationsinstanser forbliver bortskaffelige og horisontalt skalerbare.
Planlæg multi-cloud-, hybrid- og suveræne strategier pragmatisk
Portabilitet er værdifuld, men forfølg den med åbne øjne. Standardisér på portable abstraktioner som containere, Kubernetes og åbne API’er, så arbejdsbyrder kan flytte, hvis det er nødvendigt. Men undgå fælden at afvise enhver administreret tjeneste, hvilket bytter reel produktivitet for hypotetisk portabilitet. For hybride og suveræne krav så design, så de samme arbejdsbyrder og pipelines kan køre i en valgt region, et privat datacenter eller en suveræn cloud, der opfylder jurisdiktions- og dataopbevaringsregler. Gør suverænitets- og opbevaringsgrænserne eksplicitte i arkitektur og politik.
Gør omkostning synlig med FinOps
I elastiske cloudmiljøer er omkostning en direkte konsekvens af ingeniørbeslutninger, så giv ingeniører synlighed og ansvarlighed. Tag ressourcer til omkostningsallokering. Tilskriv forbrug til teams og tjenester. Vis omkostningsdata sammen med ydelsesmålinger. Dimensionér arbejdsbyrder rigtigt, brug autoskalering til at matche efterspørgsel, og indvind inaktive ressourcer. Etablér en FinOps-praksis, der bringer ingeniørarbejde, økonomi og produkt sammen, så cloudforbrug bliver et fælles, kontinuerligt ansvar frem for en kvartalsvis overraskelse.
Afvejninger: fordele og ulemper
| Valg | Fordele | Ulemper | Bedst egnet |
|---|---|---|---|
| Kubernetes | Kraftfuld, portabel, enormt økosystem | Stejl kompleksitet; driftsbyrde | Mange tjenester i skala |
| Administreret containertjeneste | Mindre driftsbyrde; hurtigere start | Noget indlåsning; mindre kontrol | Teams, der vil have enkelhed |
| Enkelt delt klynge | Effektiv ressourceudnyttelse | Sværere isolation; sprængradius | Betroede interne lejere |
| Klynge pr. lejer | Stærk isolation | Højere omkostning og overhead | Mistroende eller regulerede arbejdsbyrder |
| Multi-cloud-portabilitet | Fleksibilitet; undgår indlåsning | Laveste fællesnævner-tjenester | Strategisk risikoreduktion |
| Dybe administrerede tjenester hos én cloud | Maksimal produktivitet | Leverandørafhængighed | Hastighedsfokuserede teams |
Den overordnede afvejning er kapabilitet versus kompleksitet. Kubernetes og cloud-native arkitekturer leverer elasticitet, robusthed og fart. Men de pålægger en betydelig drifts- og kognitiv byrde, som små teams rutinemæssigt undervurderer. På samme måde bytter jagten på fuld multi-cloud-portabilitet produktivitet for valgmuligheder. Det rette svar afhænger af skala og risiko. Store organisationer med mange teams og stærke styringsbehov retfærdiggør som regel investeringen. Mindre indsatser er ofte bedre tjent med administrerede tjenester, der skjuler kompleksiteten.
Spørgsmål til drøftelse med dit team
Signerer I images og verificerer signaturer ved udrulning, og blokerer en kritisk sårbarhed faktisk buildet? Imaget er jeres enhed af tillid, så forsyningskæden omkring det fortjener hårde porte, ikke advarsler. Afgør, om kun signerede, verificerede images kan køre, om scanning blokerer kritiske fund eller blot logger dem, og hvem der vedligeholder det kuraterede register af hærdede baseimages, teams bygger fra. For virksomheds- og offentlige arbejdsbyrder er det ofte et compliancekrav, og det er også jeres bedste forsvar mod en forgiftet afhængighed, der når produktion. Tag den nuværende tilstand med: hvilken andel af kørende images kommer fra jeres hærdede base, hvor mange bærer upatchede kritiske CVE’er, og om noget usigneret image i øjeblikket kan planlægges. Hvis et kritisk fund ikke stopper en udrulning, er jeres scanner pynt.
Hvordan forhindrer ressourceanmodninger, -grænser og kvoter, at én arbejdsbyrde sulter sine naboer, uden at lade dyr kapacitet stå ubrugt? På en delt klynge kan en arbejdsbyrde uden grænser få alt omkring sig til at gå ned eller blive throttlet, og kvoter sat for generøst spilder de udnyttelsesgevinster, der retfærdiggør platformen. Afgør fornuftige standarder, hvem der justerer dem, og hvordan I fanger arbejdsbyrder uden anmodninger overhovedet. I skala er det både en pålidelighedskontrol og en omkostningskontrol, fordi korrekt dimensionering er, hvor meget af FinOps-besparelsen bor. Tag data med: nuværende klyngeudnyttelse, hvor ofte arbejdsbyrder bliver smidt ud eller throttlet, og hvilke namespaces der ingen kvoter har. Målet er tæt, sikker pakning, så behandl manglende grænser som en fejl, platformen afviser.
Hvilken tilstand må leve inde i en container, og hvor går alt andet hen? Cloud-native robusthed afhænger af bortskaffelige instanser, platformen kan omplanlægge efter behag, og det holder kun, hvis vigtig tilstand bor i administrerede datatjenester frem for på containerens lokale disk. Afgør reglen eksplicit, fordi tilstand gemt i en container ved et uheld bliver til datatab ved næste omplanlægning. For teams, der migrerer ældre applikationer, er det ofte den sværeste del, da ældre tjenester forudsætter et stabilt lokalt filsystem. Tag en fortegnelse med: hvilke tjenester skriver lokal tilstand, hvilke er afhængige af sticky sessions eller node-affinitet, og hvad der skal til for at eksternalisere hver. Indtil tilstand er ekstern, har I containere, der ser elastiske ud, men faktisk ikke kan flyttes.
Når mange teams deler en klynge, er jeres isolationsmodel så bevidst valgt som blød eller hård multi-tenancy, og matcher kontrollerne det valg? Namespaces adskiller betroede interne teams, men de rummer ikke en arbejdsbyrde, der er aktivt fjendtlig eller kompromitteret, og at behandle blød tenancy, som om den var hård, er en sikkerhedshændelse, der venter på at ske. Afgør pr. arbejdsbyrde, om lejere blot har brug for fair deling eller må antages at mistro hinanden, og afstem så kontrollerne: namespaces, kvoter, netværkspolitikker og RBAC til det bløde tilfælde, separate klynger eller stærkere sandboxing til det hårde. For en stor organisation driver denne beslutning omkostning direkte, fordi en klynge pr. lejer er langt dyrere end delte namespaces, så I vil bruge isolationsbudgettet kun, hvor trusselsmodellen kræver det. Tag lejerfortegnelsen med: hvilke arbejdsbyrder deler en klynge i dag, hvilke håndterer reguleret eller eksternt vendt trafik, og hvor netværkspolitik stadig er tillad-alt som standard. I virksomheds- og offentlige sammenhænge er blanding af mistroende arbejdsbyrder under blød tenancy netop det fund, en revisor vil flage, så navngiv grænsen, før de gør.
Hvor meget betaler I for multi-cloud-portabilitet, og vil I nogensinde faktisk bruge den? At standardisere på containere, Kubernetes og åbne API’er holder arbejdsbyrder flytbare, men at afvise enhver administreret tjeneste for at bevare den mulighed bytter reel, daglig produktivitet for portabilitet, organisationen måske aldrig udøver. Afgør, hvor portabilitet er et reelt krav, såsom en suverænitets- eller udtrædelsesforpligtelse, I har underskrevet, versus hvor den er et trøstetæppe, der sinker hvert team. Det modstridende hensyn er hastighed: dybe administrerede tjenester leverer funktioner hurtigere, og laveste-fællesnævner-arkitektur er en stående skat på hvert team. Tag dokumentationen med: hvilke administrerede tjenester I har undgået, og hvad det kostede i ingeniørtid, om I nogensinde har flyttet en arbejdsbyrde mellem udbydere, og hvad jeres kontrakter faktisk forpligter jer til. For offentlige og regulerede adoptanter kan dataopbevarings- og suveræn-cloud-regler gøre portabilitet ufravigelig, så design, så de samme manifester og pipelines kører i en suveræn region og en privat enklave, men vær ærlige om, at det er en complianceomkostning frem for gratis forsikring.
Kan hvert team se, hvad det bruger, og ejer nogen regningen, før den bliver en overraskelse? På en elastisk platform er omkostning et direkte output af ingeniørbeslutninger, men uden omkostningsallokeringstags og synlige dashboards løber forbruget til en fælles pulje, ingen føler ansvar for, til økonomi eskalerer. Afgør, hvordan I tilskriver omkostning til teams og tjenester, hvem der gennemgår den, og om ingeniører ser omkostning ved siden af ydelsesmålinger eller kun hører om den en gang i kvartalet. Spændingen er mellem ansvarlighed og friktion: pres omkostning for hårdt, og hver beslutning bliver en budgetforhandling, ignorer den, og inaktive, overdimensionerede arbejdsbyrder akkumulerer stille. Tag tallene med: nuværende forbrug pr. team, hvor meget kapacitet der står ledig eller overdimensioneret, og hvor hurtigt en løbsk arbejdsbyrde ville blive bemærket. For virksomheds- og offentlige budgetter er utilskrevet cloudforbrug både en styringssvigt og en reel finansiel risiko, så rejs en FinOps-praksis, der sætter ingeniørarbejde, økonomi og produkt i den samme samtale frem for at afstemme bagefter.
Sektorperspektiv
Startup. Ræk efter en administreret containertjeneste frem for en selvhostet Kubernetes-klynge: med et par tjenester og ingen platformsingeniør er kontrolplaner en distraktion, I ikke har råd til. Pak små images fra en minimal base, fastlås versioner, tilføj én sårbarhedsscanning til buildet, og læg al tilstand i en administreret database, så instanser forbliver bortskaffelige. Spring namespaces, operatorer og multi-cloud-portabilitet over, til I faktisk har tjenesterne og folkene til at retfærdiggøre dem.
Lille virksomhed. Uden en dedikeret platformsspecialist og med et stramt budget så læn jer hårdt op ad administrerede tjenester, og lad udbyderen køre den orkestrering, I ellers skulle bemande. Behandl containergrundlæggende som jeres sikkerhedsgulv: minimale images, versionsfastlåsning og en scanning i pipelinen giver det meste af beskyttelsen for lidt indsats. Foretræk at købe en understøttet platform frem for at bygge en, og bevar nok portabilitet, standardcontainere og åbne API’er, til at I ikke er fanget, hvis priser eller vilkår ændres.
Stor virksomhed. Opgaven er platformsstyring på tværs af mange teams: et centralt platformsteam, der leverer hærdede baseimages, signerings- og scanningsporte, namespace-tenancy med kvoter, netværkspolitik og RBAC, plus omkostningsallokeringstags og et FinOps-dashboard. Standardisér udrulningskontrakten, så hundredvis af tjenester fungerer på samme måde, og styr sikkerhed, multi-tenancy og omkostning centralt, mens teams selvbetjener udrulning. Finansiér platformsteamet ordentligt, fordi en underbemandet platform bliver den flaskehals, hele organisationen venter på.
Offentlig sektor. Suverænitet, dataopbevaring og offentlig ansvarlighed former arkitekturen. Kør arbejdsbyrder på standardcontainere og Kubernetes, så de samme pipelines kører i en suveræn region og en akkrediteret on-premises-enklave, og kod opbevarings- og adgangsgrænser som politik frem for konvention. Hent images fra et internt hærdet register, anvend hård multi-tenancy på de mest følsomme data, og bevar den portabilitet, der giver jer robusthed og forhandlingsstyrke, da indkøbsregler ofte forbyder indlåsning hos én leverandør.
Eksempler
Startup. Et startup på seks personer pakker sine to tjenester som små containerimages bygget fra en minimal base og kører dem på en administreret containertjeneste frem for en selvhostet Kubernetes-klynge, så ingen skal vogte kontrolplaner. De fastlåser baseimageversioner og tilføjer en sårbarhedsscanning til deres build, men springer bevidst de tungere orkestreringsfunktioner over, til de faktisk har mere end en håndfuld tjenester. Tilstand bor i en administreret Postgres-database, hvilket holder containerne bortskaffelige og lader platformen genstarte eller skalere dem uden datatab.
Stor virksomhed. Et telekommunikationsfirma kører adskillige hundrede mikrotjenester på delte Kubernetes-klynger. Et platformsteam leverer hærdede baseimages, håndhæver imagesignering og sårbarhedsporte og isolerer forretningsenheder i namespaces med kvoter, netværkspolitikker og RBAC. Omkostningsallokeringstags og et FinOps-dashboard tilskriver forbrug til hver produktlinje, og autoskalering dimensionerer kapacitet efter efterspørgsel. Produktteams udruller dusinvis af gange om dagen til en ensartet platform uden at styre servere. Firmaet bevarer central kontrol over sikkerhed og omkostning.
Offentlig sektor. En national sundhedstjeneste skal holde borgerdata inden for landets grænser og under national juridisk kontrol. Den kører sine arbejdsbyrder i en suveræn cloudregion med standardcontainere og Kubernetes, så de samme pipelines og manifester også kører i et akkrediteret on-premises-miljø til de mest følsomme data. Opbevarings- og adgangsgrænser er kodet som politik, images hentes fra et internt hærdet register, og hård multi-tenancy isolerer følsomme arbejdsbyrder. Portabilitet på tværs af den suveræne region og den private enklave giver tjenesten robusthed og forhandlingsstyrke uden at ofre compliance.
Business case: motivation, ROI og TCO
ROI af containere og orkestrering kommer af højere ressourceudnyttelse, hurtigere og mere pålidelige udrulninger, elastisk skalering der matcher forbrug til efterspørgsel og forbedret robusthed gennem selvhelbredelse. Standardisering på en fælles platform reducerer duplikeret indsats på tværs af teams og fremskynder onboarding, fordi hver tjeneste følger den samme udrulnings- og driftskontrakt.
TCO-analysen skal være ærlig om driftsbyrden. Adoptionsomkostninger omfatter platformsingeniørmedarbejdere, træning, sikkerhedsværktøj til images og klynger og den løbende indsats med at drive selve platformen. Omkostningen ved ikke at adoptere omfatter inkonsistent skræddersyet udrulning på tværs af teams, dårlig udnyttelse af dyr infrastruktur, skrøbelig manuel skalering og vanskelighed ved at opfylde robusthedskrav og suverænitetskrav. For ledelsen hviler sagen på skala. Under et bestemt antal tjenester betaler kompleksiteten sig muligvis ikke, og en administreret tjeneste er klogere. Men i virksomheds- og offentlig skala er en styret cloud-native platform typisk det mest omkostningseffektive og robuste fundament, forudsat at I finansierer platformsteamet til at drive den ordentligt.
Anti-mønstre og faldgruber
- Fede, uscannede images. Oppustede images bygget fra upålidelige baser bærer unødvendige sårbarheder og sinker alt.
- Kubernetes til alt. At adoptere en kompleks orkestrator til en håndfuld simple tjenester køber kompleksitet uden udbytte.
- Ignorerede ressourcegrænser. Uden anmodninger og grænser kan én arbejdsbyrde sulte eller crashe sine naboer.
- Blød tenancy til fjendtlige arbejdsbyrder. At støtte sig til namespaces alene for at isolere mistroende lejere er en sikkerhedshændelse, der venter på at ske.
- Tilstandsfulde containere ved et uheld. At gemme vigtig tilstand inde i bortskaffelige containere fører til datatab ved omplanlægning.
- Omkostningsblindhed. At behandle cloudforbrug som fast overhead frem for et ingeniøroutput fører til løbske regninger.
- Portabilitetsteater. At afvise alle administrerede tjenester for at bevare portabilitet, organisationen aldrig faktisk vil bruge.
Modenhedsmodel
Niveau 1: Opstart. Containere bruges ad hoc, hvis overhovedet. Images er håndbygget og uscannede, udrulning er manuel og reaktiv, og der er ingen fælles platform, omkostningssynlighed eller isolationsmodel.
Niveau 2: Udvikling. Teams containeriserer applikationer og adopterer en orkestrator, men praksis varierer mellem grupper. Imagescanning, ressourcegrænser og signering er inkonsistente, og omkostning og multi-tenancy er ikke systematisk styret.
Niveau 3: Standardisering. En standardiseret platform er dokumenteret og håndhævet i hele organisationen: hærdede baseimages, signerings- og scanningsporte, namespace-baseret tenancy med kvoter og netværkspolitik, RBAC og omkostningsallokering. Cloud-native og twelve-factor-mønstre er den forventede norm frem for et lokalt valg.
Niveau 4: Styring. Platformen måles og styres mod baselines. I følger klyngeudnyttelse, andelen af kørende images bygget fra den hærdede base, upatchede kritiske sårbarheder, udrulningsfrekvens og ændringsfejlrate, udsmidnings- og throttling-rater samt omkostning pr. team og tjeneste mod budget. Porte håndhæves på denne dokumentation: manglende ressourcegrænser og usignerede images afvises automatisk, og afvigelse fra standarden udløser handling frem for en advarsel.
Niveau 5: Orkestrering. Platformen er selvbetjent og selvhelende, integreret på tværs af organisationen og adaptiv. FinOps dimensionerer og indvinder løbende kapacitet, portabel arkitektur understøtter hybride og suveræne krav, og platformen forbedres løbende ud fra målt brug og pensionerer og erstatter komponenter, efterhånden som arbejdsbyrder, omkostning og risikobilledet skifter.
Idéer til drøftelse
- Ved hvilken skala holder adoption af Kubernetes op med at være kompleksitet for sin egen skyld og begynder at betale sig?
- Hvor går den rette grænse mellem blød og hård multi-tenancy for jeres arbejdsbyrder?
- Hvor meget bør I investere i multi-cloud-portabilitet versus produktiviteten ved dybe administrerede tjenester?
- Hvordan giver I ingeniører reel omkostningsansvarlighed uden at forvandle hver beslutning til en budgetforhandling?
- Hvad er jeres styringsmodel for baseimages, og hvem vedligeholder det hærdede register?
- Hvordan former suverænitets- og dataopbevaringskrav jeres platformsarkitektur?
Vigtigste pointer
- Containere standardiserer pakning og runtime; orkestrering standardiserer drift i skala.
- Imagehygiejne, altså minimale, fastlåste, scannede, signerede images, er grundlæggende sikkerhed.
- Brug native Kubernetes-mønstre og operatorer frem for at bygge skræddersyet orkestrering.
- Vælg en multi-tenancy-model bevidst ud fra, hvor meget arbejdsbyrderne stoler på hinanden.
- Følg twelve-factor, og udvid det for distribuerede systemers realiteter som delvis fejl og observerbarhed.
- Behandl omkostning som et ingeniøroutput, og styr det kontinuerligt gennem FinOps.
Referencer og videre læsning
- Adam Wiggins, The Twelve-Factor App (methodology).
- Brendan Burns, Joe Beda, and Kelsey Hightower, Kubernetes Up & Running.
- Bilgin Ibryam and Roland Huß, Kubernetes Patterns.
- Cornelia Davis, Cloud Native Patterns.
- J.R. Storment and Mike Fuller, Cloud FinOps.
- Liz Rice, Container Security.
- Cloud Native Computing Foundation (CNCF), cloud-native definition and landscape.