Kanarų diegimas Kubernetes Nr. 1: Gitlab CI

Naudosime „Gitlab CI“ ir rankinį „GitOps“, kad įdiegtume ir naudotume „Canary“ diegimą „Kubernetes“

Kanarų diegimas Kubernetes Nr. 1: Gitlab CI

Straipsniai iš šios serijos:

„Canary“ diegimą atliksime rankiniu būdu per „GitOps“ ir kurdami / modifikuodami pagrindinius „Kubernetes“ išteklius. Šis straipsnis pirmiausia skirtas įžangai su tuo, kaip diegimas veikia „Kubernetes Canary“, nes yra veiksmingesnių automatizavimo metodų, kuriuos apsvarstysime kituose straipsniuose.


Kanarų diegimas Kubernetes Nr. 1: Gitlab CI

https://www.norberteder.com/canary-deployment/

Kanarų dislokavimas

Taikant Kanarų strategiją, naujinimai pirmiausia taikomi tik tam tikram vartotojų pogrupiui. Stebėjimo, žurnalo duomenų, rankinio testavimo ar kitais grįžtamojo ryšio kanalais leidimas išbandomas prieš išleidžiant jį visiems vartotojams.

„Kubernetes“ diegimas (atnaujinamas)

Numatytoji „Kubernetes“ diegimo strategija yra nuolatinis atnaujinimas, kai paleidžiamas tam tikras skaičius rinkinių su naujomis vaizdų versijomis. Jei jie buvo sukurti be problemų, ankštys su senomis vaizdų versijomis nutraukiamos ir lygiagrečiai sukuriamos naujos.

„GitOps“

Šiame pavyzdyje naudojame „GitOps“, nes:

  • naudojant Git kaip vienintelį tiesos šaltinį
  • kūrimui ir diegimui naudojame „Git Operations“ (nereikia jokių kitų komandų, išskyrus „git tag“ / „merge“)

Pavyzdys

Imkimės gerosios praktikos – turėti vieną saugyklą programos kodui ir vieną infrastruktūros.

Programų saugykla

Tai labai paprasta Python+Flask API, kuri atsakymą pateikia kaip JSON. Mes sukursime paketą per GitlabCI ir perkelsime rezultatą į Gitlab registrą. Registre turime dvi skirtingas leidimo versijas:

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

Vienintelis skirtumas tarp jų yra grąžinto JSON failo pakeitimas. Naudojame šią programą norėdami kuo lengviau įsivaizduoti, su kuria versija bendraujame.

Infrastruktūros saugykla

Šioje ropėje mes įdiegsime per GitlabCI į Kubernetes, .gitlab-ci.yml yra toks:

image: traherom/kustomize-docker

before_script:
   - printenv
   - kubectl version

stages:
 - deploy

deploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s

   only:
     - master

Norėdami jį paleisti patys, jums reikės klasterio, galite naudoti „Gcloud“:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b

gcloud compute firewall-rules create incoming-80 --allow tcp:80

Jums reikia šakės https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure ir sukurti kintamąjį KUBECONFIG GitlabCI, kuriame bus prieigos konfigūracija kubectl į savo klasterį.

Galite perskaityti, kaip gauti klasterio kredencialus („Gcloud“) čia.

Infrastruktūra Yaml

Infrastruktūros saugykloje teikiame paslaugą:

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

Ir dislokavimas deploy.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: app
spec:
 replicas: 10
 selector:
   matchLabels:
     id: app
     type: main
 template:
   metadata:
     labels:
       id: app
       type: main
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

Ir dar vienas dislokavimas deploy-canary.yaml:

kind: Deployment
metadata:
 name: app-canary
spec:
 replicas: 0
 selector:
   matchLabels:
     id: app
     type: canary
 template:
   metadata:
     labels:
       id: app
       type: canary
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

Atminkite, kad programoje „app-deploy“ dar nėra apibrėžtų kopijų.

Pradinis diegimas

Norėdami pradėti pradinį diegimą, galite rankiniu būdu paleisti GitlabCI dujotiekį pagrindinėje šakoje. Po to kubectl turėtų išvesti šiuos duomenis:

Kanarų diegimas Kubernetes Nr. 1: Gitlab CI

Mes matome app diegimas su 10 kopijų ir app-canary su 0. Taip pat yra LoadBalancer, iš kurio galime pasiekti per curl per išorinį IP:

while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

Kanarų diegimas Kubernetes Nr. 1: Gitlab CI

Matome, kad mūsų bandomoji programa pateikia tik „v1“.

Vykdomas Kanarų dislokavimas

1 veiksmas: kai kuriems vartotojams išleiskite naują versiją

Failo deploy-canary.yaml ir naujos versijos vaizde kopijų skaičių nustatėme į 1:

kind: Deployment
metadata:
 name: app-canary
spec:
 replicas: 1
 selector:
   matchLabels:
     id: app
     type: canary
 template:
   metadata:
     labels:
       id: app
       type: canary
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

Byloje deploy.yaml pakeitėme kopijų skaičių į 9:

kind: Deployment
metadata:
 name: app
spec:
 replicas: 9
 selector:
   matchLabels:
     id: app
...

Šiuos pakeitimus perkeliame į saugyklą, iš kurios prasidės diegimas (per GitlabCI), ir matome:

Kanarų diegimas Kubernetes Nr. 1: Gitlab CI

Mūsų paslauga nurodys abu diegimus, nes abiejuose yra programos parinkiklis. Dėl numatytojo „Kubernetes“ atsitiktinės atrankos, turėtume matyti skirtingus atsakymus ~ 10% užklausų:

Kanarų diegimas Kubernetes Nr. 1: Gitlab CI

Dabartinė mūsų programos būsena (GitOps, paimta iš Git kaip vienas tiesos šaltinis) yra du diegimai su aktyviomis kopijomis, po vieną kiekvienai versijai.

~10% vartotojų susipažįsta su nauja versija ir netyčia ją išbando. Dabar pats laikas patikrinti, ar žurnaluose ir stebėjimo duomenyse nėra klaidų, kad būtų galima rasti problemų.

2 veiksmas: išleiskite naują versiją visiems vartotojams

Nusprendėme, kad viskas klostėsi gerai ir dabar turime išleisti naują versiją visiems vartotojams. Norėdami tai padaryti, mes tiesiog atnaujiname deploy.yaml įdiegiant naują vaizdo versiją ir kopijų skaičių, lygų 10. In deploy-canary.yaml nustatome kopijų skaičių atgal į 0. Po įdiegimo rezultatas bus toks:

Kanarų diegimas Kubernetes Nr. 1: Gitlab CI

Sumavimas

Man rankinis diegimo vykdymas tokiu būdu padeda suprasti, kaip lengvai jį galima konfigūruoti naudojant k8s. Kadangi „Kubernetes“ leidžia atnaujinti viską per API, šiuos veiksmus galima automatizuoti naudojant scenarijus.

Kitas dalykas, kurį reikia įdiegti, yra testerio įėjimo taškas (LoadBalancer arba per Ingress), per kurį galima pasiekti tik naują versiją. Jis gali būti naudojamas rankiniam naršymui.

Kituose straipsniuose apžvelgsime kitus automatizuotus sprendimus, kurie įgyvendina didžiąją dalį to, ką padarėme.

Taip pat skaitykite kitus mūsų tinklaraščio straipsnius:

Šaltinis: www.habr.com

Добавить комментарий