Vi kommer att utföra Canary-distributionen manuellt via GitOps och skapa/ändra de viktigaste Kubernetes-resurserna. Den här artikeln är främst avsedd för introduktion med hur distributionen fungerar i Kubernetes Canary, eftersom det finns mer effektiva metoder för automation, som vi kommer att överväga i följande artiklar.
Med Canary-strategin tillämpas uppdateringar först på endast en undergrupp av användare. Genom övervakning, loggdata, manuell testning eller andra återkopplingskanaler testas releasen innan den släpps till alla användare.
Kubernetes Deployment (rullande uppdatering)
Standardstrategin för Kubernetes Deployment är rullande uppdatering, där ett visst antal poddar lanseras med nya versioner av bilderna. Om de skapades utan problem avslutas poddar med gamla versioner av bilder och nya poddar skapas parallellt.
GitOps
Vi använder GitOps i det här exemplet eftersom vi:
använder Git som en enda källa till sanning
vi använder Git Operations för att bygga och distribuera (inga andra kommandon än git-tagg/merge behövs)
Exempel
Låt oss ta en bra praxis - att ha ett arkiv för applikationskod och ett för infrastruktur.
Applikationsförråd
Detta är ett mycket enkelt Python+Flask API som returnerar ett svar som JSON. Vi kommer att bygga paketet via GitlabCI och skicka resultatet till Gitlab-registret. I registret har vi två olika versioner:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
Den enda skillnaden mellan dem är ändringen i den returnerade JSON-filen. Vi använder denna applikation för att så enkelt som möjligt visualisera vilken version vi kommunicerar med.
Infrastrukturförråd
I denna kålrot kommer vi att distribuera via GitlabCI till Kubernetes, .gitlab-ci.yml är som följer:
Vi skickar dessa ändringar till arkivet från vilket distributionen kommer att starta (via GitlabCI) och ser som ett resultat:
Vår tjänst kommer att peka på båda implementeringarna, eftersom båda har appväljaren. På grund av Kubernetes standardrandomisering bör vi se olika svar för ~10 % av förfrågningarna:
Det nuvarande tillståndet för vår applikation (GitOps, hämtat från Git as a Single Source Of Truth) är närvaron av två distributioner med aktiva repliker, en för varje version.
~10 % av användarna blir bekanta med en ny version och testar den oavsiktligt. Nu är det dags att leta efter fel i loggarna och övervakningsdata för att hitta problem.
Steg 2: Släpp den nya versionen till alla användare
Vi bestämde oss för att allt gick bra och nu måste vi rulla ut den nya versionen till alla användare. För att göra detta uppdaterar vi helt enkelt deploy.yaml installera en ny version av bilden och antalet repliker lika med 10. In deploy-canary.yaml vi ställer tillbaka antalet repliker till 0. Efter implementeringen blir resultatet följande:
Sammanfattningsvis
För mig hjälper det att köra distributionen manuellt på detta sätt att förstå hur enkelt det kan konfigureras med hjälp av k8s. Eftersom Kubernetes låter dig uppdatera allt via ett API, kan dessa steg automatiseras genom skript.
En annan sak som behöver implementeras är en ingångspunkt för testaren (LoadBalancer eller via Ingress) genom vilken endast den nya versionen kan nås. Den kan användas för manuell surfning.
I framtida artiklar kommer vi att kolla in andra automatiserade lösningar som implementerar det mesta av det vi har gjort.