Skip to main content

AppAndObjects Konseptet

Motivasjon​

NÄr du skal skrive mer komplekse manifester for applikasjoner med ekstra ressursser (som ConfigMap, ExternalSecret eller AzureAdApplication), mÄ du som regel legge til variabler, secrets, access policies eller annen konfigurasjon pÄ applikasjonsobjektet ditt. Dette kan vÊre vanskelig Ä koordinere, da ofte navn mÄ stemme pÄ tvers av flere ressursser, og du mÄ huske pÄ sette krevd koknfigurasjon. AppAndObjects lÞser dette ved at du kan legge til ekstra ressursser til din applikasjon og riktig konfigurasjon blir lagt til applikasjonsobjektet ditt automatisk.

Introduksjon​

  • AppAndObjects er et abstraksjonslag i ArgoKit over applikasjonsobjektet som lar deg legge til ekstra ressurser samtidig som du manipulerer applikasjonen.
  • Samler applikasjon og relaterte ressurser i ett wrapper-objekt som renderes til en Kubernetes List.
  • Denne siden forklarer hva AppAndObjects er, hvorfor det finnes, hvordan det fungerer pĂ„ et overordnet nivĂ„, og nĂ„r du bĂžr bruke det.

Innhold​

I stedet for Ä jobbe direkte pÄ ett objekt, jobber vi nÄ pÄ et slags wrapper-objekt med to felter: application og objects. Derav navnet AppAndObjects.

// uten AppAndObjects
{
apiVersion: 'skiperator.kartverket.no/v1alpha1',
kind: 'Application',
metadata: {
name: 'test-app',
},
}

// med AppAndObjects
{
application: {
apiVersion: 'skiperator.kartverket.no/v1alpha1',
kind: 'Application',
metadata: {
name: 'test-app',
},
},
objects: [] // ekstra Kubernetes-ressurser legges her
}

NB! application-feltet kan ogsÄ inneholde et SKIPJob objekt.

Hovedtemaer​

NĂ„r bĂžr du bruke AppAndObjects​

  • NĂ„r du vil knytte applikasjonen din til Ă©n eller flere relaterte ressurser (for eksempel Azure AD, ConfigMap, ExternalSecret) uten Ă„ koordinere navn, secrets og policies manuelt.
  • NĂ„r du Ăžnsker en konsistent mĂ„te Ă„ legge til og fjerne integrasjoner pĂ„, slik at relevant konfigurasjon fĂžlger med automatisk.

NĂ„r trenger du ikke Ă„ bruke AppAndObjects​

  • NĂ„r du skal ha en enkel applikasjon uten tilleggsressurser (men AppAndObjects kan godt brukes her ogsĂ„)

Konseptuell modell​

Wrapper-objektet

  • AppAndObjects representerer applikasjonen som et wrapper-objekt med to felter: application og objects.
  • application er selve applikasjonsobjektet (Skiperator Application eller SKIPJob).
  • objects er en liste med tilleggsressurser som hĂžrer til applikasjonen (for eksempel AzureAdApplication, ConfigMap, ExternalSecret).

Utvidelser med .with*

  • .with*-funksjoner utvider modellen ved Ă„ oppdatere application og samtidig legge til matchende ressurser i objects der dette er relevant.
  • Referanser som f.eks. secrets og policies koordineres i samme operasjon for Ă„ redusere feil og duplisering.

Transformasjon ved rendering

  • Ved rendering transformeres wrapper-objektet til en Kubernetes List med application og alle elementer i objects som separate items
  • Dette gjĂžr at du kan “applye” hele applikasjonen med tilhĂžrende ressurser i Ă©n operasjon.

AppAndObjects funksjoner bruker .with prefiks som betyr at du har en applikasjon med noe ekstra. For eksempel .withAzureAdApplication. Se eksempelet under for hvordan dette ser ut i praksis:

Eksempel med Azure AD Application​

Si at du Þnsker Ä legge til Azure AD i applikasjonen din, da er det et par ting du mÄ gjÞre:

  1. Lage AzureAdApplication-ressursen
  2. Sette access policies i applikasjonen som skal bruke AD
  3. Sette secret Uten AppAndObjects mÄ du koordinere navn/namespace/secret manuelt. Med AppAndObjects hÄndteres dette av .withAzureAdApplication.

Uten App And Objects​

Her definerer vi fĂžrst en ny Skiperator Application med tilhĂžrende access policies for Microsoft, i tillegg til Ă„ legge inn env fra secret som matcher Azure AD Application. Deretter definerer vi en ny AzureAdApplication-ressurs med matchende name og secretPrefix som i steget over.

local argokit = import '../jsonnet/argokit.libsonnet';
local application = argokit.application;

[
application.new('foo-backend')
+ application.withOutboundHttp('login.microsoftonline.com')
+ application.withSecret('foosecrets-foo-ad'),

argokit.azureAdApplication.new(
name='foo-ad',
namespace='foo-team-main',
secretPrefix='foosecrets',
),
]

Med App And Objects​

NÄr vi har AppAndObjects-abstraksjonslaget kan vi fÞrst definere en applikasjon, deretter kalle .withAzureAdApplication pÄ dette objektet. Det vil gjÞre to ting: opprette et AzureAdApplication-objekt, helt likt som i eksempelet over, og legge det til i objects-lista. Deretter vil access policies og env fra secret bli satt med riktig navn. Fordelen er at all konfigurasjon som trengs for Ä legge til Azure AD i applikasjonen din, er bakt inn i .withAzureAdApplication(), sÄ du slipper Ä tenke pÄ det. Det vil ogsÄ fÞre til at dersom du bytter ut/fjerner Azure AD, kan du fjerne ett funksjonskall, sÄ vil annen sammenhengende konfigurasjon ogsÄ bli fjernet.

local argokit = import '../jsonnet/argokit.libsonnet';
local application = argokit.appAndObjects.application; // bruk appAndObjects

application.new('foo-backend')
+ application.withAzureAdApplication(
name='foo-ad',
namespace='foo-team-main',
secretPrefix='foosecrets',
)