Canary is een term in DevOps die zijn oorsprong heeft in de mijnbouw. Zie ook mijn pagina over de canary-app op een Raspberry Pi Cluster.
Een canary applicatie is dus een test-applicatie om te zien of deze levensvatbaar is voordat de versie in productie wordt genomen. Deze keer wordt de controle via ingress en annotations afgehandeld.
Project go-app
In Rancher wordt eerst een project aangemaakt met de naam ‘go-app’ door eenvoudigweg voor ‘Project toevoegen‘ te kiezen.
Hierna worden twee namespaces toegevoegd, ‘canary’ en ‘production’. Hiervoor klik je op het zojuist aangemaakt project, waarschijnlijk onderaan de pagina met projecten, en kies dan rechtsboven voor ‘Add namespace‘. Geef de naam op en laat de rest leeg/standaard.
In het scherm staan nu beide namespaces onder ‘In dit project’. Klik nu in het Rancher-menu op ‘Resources‘ en vervolgens op ‘Workloads‘
app-canary
Kies nu rechtsboven voor ‘deploy‘ om de canary-deployment toe te voegen. Vul de gegevens in zoals hieronder aangegeven:
Vul vervolgens de gegevens in voor de readinessProbe en de livenessProbe:
Uiteraard gaan we de labels toevoegen, hiervoor dienen de ‘Advanced settings‘ zichtbaar gemaakt te worden via de link onderaan rechts.
Uit security-oogpunt is het niet toegestaan dat de docker container als root kan ‘draaien’ dus selecteren we de optie RunAsNonRoot. Daarnaast geven we een bepaalde hoeveelheid resources aan deze applicatie, namelijk 5Mib geheugen en 2milli CPUs, zowel als request als voor de limit.
en kies voor ‘Launch‘
app-production
Hetzelfde doen we nu voor de production-app, met de volgende opties: (let op de namespace!)
kies voor ‘Launch‘ om de deployment te maken in de ‘production’ namespace.
Services
Om de applicaties te kunnen benaderen wordt gebruik gemaakt van ClusterIP services. We gaan gebruik maken van een ‘selector‘ die het label ‘app=kubeapp’ gebruikt. Kies onder Resources -> Workloads voor ‘Service Discovery‘ en rechtsboven voor ‘Add record‘. Vul de gegevens alsvolgt in: (gebruik ‘show advanced options’ voor de port-mapping)
kies onderaan voor ‘Create‘ en doe vervolgens hetzelfde maar dan voor de namespace ‘production’:
Nadat beide services aangemaakt zijn gaan we een Ingress load-balancer aanmaken die het binnenkomende verkeer zal verdelen tussen de canary en de production applicatie. Kies onder Resources -> Workloads voor ‘Load Balancer‘ en rechtsboven voor ‘Add Ingress‘.
Een voorwaarde is nu dat je een hostname ingeeft die via DNS resolved kan worden naar het IP adres van de rancher-cluster. Er is een mogelijkheid om deze hostname te genereren m.b.v. ‘xip.io’.
Kies dan in de Ingress-configuratie voor de namespace ‘production’, voor een service-rule (verwijder de Workload-rule met ‘-‘) en selecteer daar voor de service ‘app-svc’ en port ‘8080’:
Voor dezelfde Ingress voor de ‘canary’ namespace vullen we hetzelfde in maar voegen we een tweetal ‘Annotations’ in via ‘Add Annotation’:
Hier wordt dus de ‘weight‘ bepaald voor het inkomende verkeer. Ingesteld is nu dat 25% naar de canary-service gaat en de rest dus naar production. Kies tenslotte voor ‘Save‘
Test
Ga met een browser naar de URL die gedefinieerd is in de Ingress, in mijn geval is dat http://app.digitalinfo.nl Er verschijnt versie 1.1 of versie 2.1 van de app, afhankelijk welke endpoint gekozen wordt door de Ingress LB.