Vad är canary deployment? En praktisk guide för SRE

Summary

Vad är canary deployment? Det är en releasestrategi som skickar en ny version till en liten andel av produktionstrafiken, ofta 5 procent, och jämför den mot den stabila versionen under ett fast fönster. Håller felfrekvens och latens mot kontrollen breddas utrullningen i steg. Gör den inte det avbryts den och rullas tillbaka. Metoden begränsar skadeområdet, men fungerar bara med mätetal per version och tillräcklig trafik för att ge en signal.

Ingenjör som tittar på canary- och baslinjens latensgrafer på två skärmar, med en liten gul kanariefigur på skrivbordet

Canary deployment är en releasemetod där du skickar en ny version till en liten del av produktionstrafiken, jämför den mot versionen som redan körs, och bara breddar utrullningen om siffrorna håller. Vad är canary deployment i praktiken? Det är en deploy med en inbyggd beslutspunkt: ändringen når först 1 till 5 procent av användarna, och en mätning avgör om den fortsätter eller rullas tillbaka.

Resten av guiden går igenom hur det fungerar, var det brukar fallera och vad du bör automatisera.

Det tredje natten-larmet som en canary hade kunnat förvandla till ett Slack-meddelande

En deploy går ut klockan 16.40 en torsdag. Felfrekvensen i checkout-tjänsten stiger från 0,2 procent till 4 procent. Ingen märker det förrän ett supportärende dyker upp två timmar senare, och då har varje användare kört den nya builden. Rollbacken tar 25 minuter eftersom migreringen är halvt applicerad.

Kör du samma ändring som en canary på 5 procent av trafiken blir skadan avgränsad. Ungefär var tjugonde användare ser buggen, jämförelsen mot kontrollgruppen fallerar inom några minuter och pipelinen stannar. Post-mortemen handlar då om vad canaryn fångade, inte om vad den missade.

Liten gul kanariefågel sittande på en lykthake i en mörk gruvtunnel

Namnet kommer från kolgruvorna, där kanariefågeln slutade sjunga innan luften blev dödlig. Din lilla kohort spelar samma roll. Den förhindrar inte den dåliga releasen. Den begränsar vilka som andas in den.

Vad en canary deployment faktiskt gör, steg för steg

Google SRE Workbook definierar canarying som en partiell, tidsbegränsad utrullning av en ändring plus en utvärdering som avgör om utrullningen fortsätter. Delmängden som kör ändringen är canaryn. Resten av flottan är kontrollen. Det spelar roll, eftersom det gör en canary till ett A/B-test på din egen tillförlitlighet, inte till en långsam deploy.

En typisk sekvens ser ut så här:

Loopen är enkel. Det svåra är jämförelsesteget, som de flesta team implementerar som att någon tittar på en dashboard.

Canary, blue-green eller rolling: vilken passar din felbild

Dessa tre blandas ihop hela tiden, så här är skillnaden som spelar roll när du väljer.

Välj blue-green när risken är en trasig deploy som du kan upptäcka med ett smoke-test och rulla tillbaka på sekunder. Välj canary när risken är en subtil regression som bara verklig trafik blottlägger: en p99-latens som långsamt kryper uppåt, ett minnesläckage, en frågeplan som faller över på produktionsdatas form.

Hoppa över canary om tjänsten har mycket låg trafik. Med några hundra requests i timmen ger en skiva på 5 procent en handfull mätpunkter och ingen signal. Workbooken säger det rakt ut: mycket få förfrågningar ger ingen användbar signal för varierade arbetslaster.

Varför din canary på 1 procent troligen ljuger för dig

Här är felet som drabbar team under de första tre månaderna. Canaryn tar 5 procent av trafiken och misslyckas med 20 procent av sina requests. Felfrekvensen för hela tjänsten rör sig från 0,2 till ungefär 1,2 procent. Ditt larmtröskelvärde är 2 procent. Ingenting larmar.

Aggregerad övervakning döljer fel i canaryn. Samma aritmetik finns i SRE Workbooken: en canary som misslyckas med 20 procent av requests på 5 procent av trafiken syns bara som en total felfrekvens på 1 procent. Du måste bryta ned mätetalen per population, canary mot kontroll, annars försvinner signalen i nämnaren.

Flygvy över en motorväg där ett körfält är avspärrat med orange koner medan övriga körfält flyter normalt

Tre andra fallgropar är värda att känna till:

Välj gate-mätetalen och automatisera aborten innan du shippar

Utgå från dina SLI:er. Har du redan en tillgänglighets-SLI och en latens-SLI för tjänsten är det dina två första grindar. En rimlig startuppsättning för en requestdriven tjänst:

Trösklar är där team förlorar veckor. Sätter du dem för snävt avbryts varje canary på brus, och ingenjörer lär sig att överköra grinden. Sätter du dem för löst går en dålig build igenom. Se över dem enligt schema. En grind som aldrig avbrutit något på sex månader är antingen perfekt eller dekorativ, och du bör ta reda på vilket.

Håll också aggregeringsintervallet för mätetalen kortare än eller lika med canary-fönstret. En rollup på 10 minuter över en canary på 5 minuter gör allt grumligt.

Manuell canary-analys skalar illa. Vid tio deploys om dagen sitter ingen och stirrar på en dashboard i 30 minuter varje gång, så grinden blir tyst ett "såg bra ut". Mönstret som håller är en automatisk domare: definiera SLO:n, definiera jämförelsen, och låt en kontroller avbryta och rulla tillbaka när canaryn bränner felbudget snabbare än kontrollen.

Det är problemet som upstreamapis AI Pilot riktar sig mot. Den läser SLO-signalen under utrullningen och utlöser en automatisk rollback när felfrekvensen passerar tröskeln du har satt. Den mäter felfrekvens och latens mot den stabila kohorten, inget mer mystiskt än så. Har du redan Argo Rollouts-analysmallar med en bra Prometheus-fråga har du i stort sett samma förmåga, och du bör säga det till den som säljer dig magi. Där en hostad pilot förtjänar sin plats är över heterogena stackar, där varje team annars skulle underhålla egna analysmallar.

Ett vanligt felmönster: team automatiserar steget framåt men aldrig steget bakåt. En pipeline som bara vet hur den går framåt är ett transportband.

En canary i konfig: så ser stegen ut i Argo Rollouts

På Kubernetes uttrycker Argo Rollouts canary-specen sekvensen som en lista med steg. Här är en kondenserad version i den form dokumentationen beskriver:

strategy:
  canary:
    steps:
      - setWeight: 5
      - pause: { duration: 30m }
      - analysis:
          templates:
            - templateName: error-rate-vs-baseline
      - setWeight: 25
      - pause: { duration: 30m }
      - setWeight: 50
      - pause: {}

Två detaljer från dokumentationen förtjänar uppmärksamhet. Utan trafikrouter approximeras vikten med antalet pods, på bästa möjliga sätt: 10 repliker på 10 procent innebär en canary-pod och nio stabila. Det är replikmatematik, inte requestmatematik. Och en pause: {} utan duration väntar tills någon kör kubectl argo rollouts promote, vilket är en mänsklig grind som du kanske eller kanske inte vill ha.

Om analyssteget fallerar avbryts utrullningen. Det är den delen du ska investera i.

Industriell kontrollpanel med en skyddad röd återställningsknapp och rader av gröna indikatorlampor

Feature flags och jämförelsedata: den andra halvan av en säker canary

Infrastruktur-canaries delar trafik per instans eller pod. Flaggbaserade canaries delar per användare, konto eller valfritt attribut du kan rikta mot. De två besvarar olika frågor. Den första frågar om den nya builden är frisk. Den andra frågar om det nya beteendet är acceptabelt, och låter dig stänga av det utan en ny deploy.

För flaggdrivna utrullningar spelar verktygen roll. LaunchDarkly har de mest mogna målgruppsreglerna och den mest utvecklade granskningsloggen, och vinner på bredd i ekosystemet. Prissättningen på enterprise-nivå är det vanliga klagomålet bland plattformsledare.

Statsig paketerar experimentering tillsammans med flaggor, vilket passar team som vill ha mätbaserade beslut på samma plattform. Det passar sämre om du bara behöver en nödbrytare.

Den ärliga avvägningen: en flaggplattform ger dig procentuella utrullningar, men de flesta läser inte dina SLO:er av sig själva. Någon måste fortfarande koppla mätetalet till beslutet.

Oavsett vad som styr utrullningen kommer domen från din telemetri. Varje mätetal behöver en version- eller kohortetikett, och din backend måste kunna fråga på den utan en fördröjning på 10 minuter.

Datadog gör detta väl med taggbaserade uppdelningar, och deployment tracking korrelerar releaser med felspikar. Kostnaden vid hög kardinalitet är det du bör modellera innan du taggar allt.

Grafana med Prometheus fungerar om du redan kör det och etiketterar mätetal per rollout-revision. Du får full kontroll, och du äger underhållet.

Vad du mäter för att veta att canary-processen fungerar, och var du startar

En canary-process har egna mätetal. Följ dessa under ett kvartal:

Kör bara en canary i taget per tjänst. Workbooken rekommenderar det starkt, och skälet är praktiskt: två överlappande ändringar gör det omöjligt att avgöra vilken som skadade dig.

Välj en stateless tjänst med tillräckligt med trafik för att ge en signal inom 15 minuter. Lägg till en versionsetikett på dess felmätetal och latensmätetal. Skriv en enda jämförelsefråga, canary mot kontroll. Kör en canary på 5 procent med manuell promote, och notera vad du hade fångat i de tre senaste incidenterna.

Ställ sedan den obekväma frågan: om canaryn hade fallerat klockan 02.00, skulle något ha stoppat den utan att en människa var vaken?

Frequently asked questions

Vad är canary deployment på enkelt språk?
Det är en releasemetod där en ny version först betjänar en liten andel riktig trafik medan den gamla versionen tar resten. Du jämför hälsomätetalen mellan de två grupperna. Håller den nya versionen ökar du dess andel tills den hanterar allt. Håller den inte rullar du tillbaka.
Hur skiljer sig canary deployment från blue-green deployment?
Blue-green håller två fullständiga miljöer och byter all trafik på en gång, så rollbacken är omedelbar men bytet exponerar 100 procent av användarna. En canary exponerar först en liten andel och bedömer den nya versionen mot den gamla på riktig trafik. Canary har mindre skadeområde men högre driftkomplexitet.
Hur stor andel trafik ska en canary få?
Det finns inget universellt tal. Google SRE Workbook använder 5 procent under 30 minuter som exempel. Skivan måste vara tillräckligt stor och köra tillräckligt länge för att ge en statistiskt användbar signal, vilket beror på din trafikvolym och hur likformiga dina requests är.
Vilka mätetal bör styra en canary deployment?
Utgå från dina SLI:er: felfrekvens och latens, jämförda mellan canary och kontroll. Lägg till en mättnadssignal som kan tillskrivas ändringen, och ett affärsmätetal om du kan isolera det per kohort. Undvik brusiga mätetal som rå CPU-användning, och håll listan kort.
Vad är skillnaden mellan canary release och canary deployment?
Vissa team använder canary release för användarnära exponering av en funktion och canary deployment för bredare infrastrukturutrullning. Många behandlar termerna som utbytbara. Det som spelar roll är att en avgränsad kohort får ändringen först och att en mätning avgör vad som händer sedan.
Går det att köra canary deployment utan Kubernetes?
Ja. Alla mekanismer som delar trafik per version fungerar: en lastbalanserare med viktad routing, ett service mesh, en CDN-regel eller en feature flag som riktar sig mot en procentandel användare. Kubernetes-verktyg som Argo Rollouts automatiserar stegen, men mönstret är inte beroende av dem.