Canary-implementatie in Kubernetes #2: Argo-implementaties

We zullen de k8s-native Argo Rollouts-implementatiecontroller en GitlabCI gebruiken om Canary-implementaties naar Kubernetes uit te voeren

Canary-implementatie in Kubernetes #2: Argo-implementaties

https://unsplash.com/photos/V41PulGL1z0

Artikelen in deze serie

Canarische inzet

Wij hopen dat je leest eerste deel, waar we kort hebben uitgelegd wat Canary Deployments zijn. We hebben ook laten zien hoe u dit kunt implementeren met behulp van standaard Kubernetes-bronnen.

Argo-uitrol

Argo Rollouts is een native implementatiecontroller van Kubernetes. Het biedt een CRD (Custom Resource Definition) voor Kubernetes. Dankzij dit kunnen we een nieuwe entiteit gebruiken: Rollout, dat blauw-groene en kanarie-implementaties beheert met verschillende configuratie-opties.

Argo Rollouts-controller gebruikt door een aangepaste bron Rollout, Maakt aanvullende implementatiestrategieën mogelijk, zoals blauwgroen en kanarie voor Kubernetes. Bron Rollout biedt functionaliteit gelijkwaardig Deployment, alleen met aanvullende implementatiestrategieën.
hulpbron Deployments heeft twee strategieën voor implementatie: RollingUpdate и Recreate. Hoewel deze strategieën in de meeste gevallen geschikt zijn, worden er voor implementatie op servers op zeer grote schaal aanvullende strategieën gebruikt, zoals blauw-groen of kanarie, die niet beschikbaar zijn in de Deployment-controller. Om deze strategieën in Kubernetes te gebruiken, moesten gebruikers scripts schrijven bovenop hun implementaties. De Argo Rollouts Controller stelt deze strategieën bloot als eenvoudige, declaratieve, configureerbare parameters.
https://argoproj.github.io/argo-rollouts

Er is ook Argo CI, dat een handige webinterface biedt voor gebruik met Rollouts, daar zullen we in het volgende artikel naar kijken.

Argo-rollouts installeren

Serverzijde

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

In onze infrastructuurraap (zie hieronder) hebben we install.yaml al toegevoegd als i/k8s/argo-rollouts/install.yaml. Op deze manier zal GitlabCI het in het cluster installeren.

Clientzijde (kubectl-plug-in)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

Voorbeeld toepassing

Het is een goede gewoonte om aparte repository's te hebben voor applicatiecode en infrastructuur.

Opslagplaats voor de applicatie

Kim Wuestkamp/k8s-implementatievoorbeeld-app

Dit is een heel eenvoudige Python+Flask API die een antwoord retourneert als JSON. We zullen het pakket bouwen met GitlabCI en het resultaat naar de Gitlab Registry pushen. In het register hebben we twee verschillende releaseversies:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

Het enige verschil tussen beide is het geretourneerde JSON-bestand. Wij gebruiken deze applicatie om zo eenvoudig mogelijk te visualiseren met welke versie wij communiceren.

Opslagplaats voor infrastructuur

In deze repository zullen we GitlabCI gebruiken voor implementatie in Kubernetes, .gitlab-ci.yml ziet er als volgt uit:

image: traherom/kustomize-dockerbefore_script:
   - printenv
   - kubectl versionstages:
 - deploydeploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s    only:
     - master

Om het zelf uit te voeren heb je een cluster nodig, je kunt Gcloud gebruiken:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

Je moet vorken https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure en maak een variabele KUBECONFIG in GitlabCI, dat de configuratie voor toegang zal bevatten kubectl naar uw cluster.

Hier U leest hoe u inloggegevens voor een cluster (Gcloud) kunt verkrijgen.

Infrastructuur Yaml

Binnen de infrastructuurrepository hebben we service:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: rollout-canary
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

en uitrol.yaml:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
 replicas: 10
 revisionHistoryLimit: 2
 selector:
   matchLabels:
     id: rollout-canary
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       imagePullPolicy: Always
 strategy:
   canary:
     steps:
     - setWeight: 10
     # Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # two minutes

Rollout werkt hetzelfde als Implementatie. Als we geen updatestrategie instellen (zoals hier Canary), zal deze zich gedragen als de standaard Rolling Update-implementatie.

We definiëren twee stappen in yaml voor de implementatie van kanaries:

  1. 10% van het verkeer naar Canary (wacht op handmatige OK)
  2. 50% verkeer naar Canary (wacht 2 minuten en ga dan door naar 100%)

Eerste implementatie uitvoeren

Na de eerste implementatie zien onze resources er als volgt uit:

Canary-implementatie in Kubernetes #2: Argo-implementaties

En we krijgen alleen een reactie van de eerste versie van de applicatie:

Canary-implementatie in Kubernetes #2: Argo-implementaties

Kanarie-implementatie uitvoeren

Stap 1: 10% verkeer

Om een ​​kanarie-implementatie te starten, hoeven we alleen maar de imageversie te wijzigen, zoals we gewoonlijk doen met implementaties:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
...
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...

En we pushen veranderingen, dus Gitlab CI wordt geïmplementeerd en we zien de veranderingen:

Canary-implementatie in Kubernetes #2: Argo-implementaties

Als we nu toegang krijgen tot de service:

Canary-implementatie in Kubernetes #2: Argo-implementaties

Geweldig! We zitten midden in onze kanarie-inzet. We kunnen de voortgang zien door het volgende uit te voeren:

kubectl argo rollouts get rollout rollout-canary

Canary-implementatie in Kubernetes #2: Argo-implementaties

Stap 2: 50% verkeer:

Laten we nu verder gaan met de volgende stap: 50% van het verkeer omleiden. We hebben deze stap geconfigureerd om handmatig te worden uitgevoerd:

kubectl argo rollouts promote rollout-canary # continue to step 2

Canary-implementatie in Kubernetes #2: Argo-implementaties

En onze applicatie retourneerde 50% van de reacties uit nieuwe versies:

Canary-implementatie in Kubernetes #2: Argo-implementaties

En uitrolbeoordeling:

Canary-implementatie in Kubernetes #2: Argo-implementaties

Prachtig.

Stap 3: 100% verkeer:

We hebben het zo ingesteld dat na 2 minuten de stap van 50% automatisch eindigt en de stap van 100% begint:

Canary-implementatie in Kubernetes #2: Argo-implementaties

En de applicatie-uitvoer:

Canary-implementatie in Kubernetes #2: Argo-implementaties

En uitrolbeoordeling:

Canary-implementatie in Kubernetes #2: Argo-implementaties

De inzet van de kanaries is voltooid.

Meer voorbeelden met Argo Rollouts

Er zijn hier meer voorbeelden, zoals het instellen van omgevingsvoorbeelden en vergelijkingen op basis van kanarie:

https://github.com/argoproj/argo-rollouts/tree/master/examples

Video over Argo Rollouts en Argo CI

Ik raad deze video echt aan, deze laat zien hoe Argo Rollouts en Argo CI samenwerken:

Totaal

Ik hou echt van het idee om CRD's te gebruiken die de creatie van extra soorten implementaties of replicasets beheren, verkeer omleiden, enz. De samenwerking met hen verloopt soepel. Vervolgens wil ik graag de integratie met Argo CI testen.

Er lijkt echter een grote fusie van Argo CI en Flux CI op komst, dus ik zou kunnen wachten tot de nieuwe release uitkomt: Argo Flux.

Heeft u ervaring met Argo Rollouts of Argo CI?

Lees ook andere artikelen op onze blog:

Bron: www.habr.com

Voeg een reactie