Canary Deployment Kubernetes #1: Gitlab CI

Mēs izmantosim Gitlab CI un manuālo GitOps, lai ieviestu un izmantotu Kanārijas izvietojumu Kubernetes.

Canary Deployment Kubernetes #1: Gitlab CI

Šī cikla raksti:

Kanārijas izvietojumu mēs veiksim roku rokā caur GitOps un galveno Kubernetes resursu izveidi/mainīšanu. Šis raksts ir paredzēts galvenokārt iepazīšanās nolūkiem. ar to, kā Kubernetes darbojas Kanārijas izvietojumā, jo ir efektīvāki automatizācijas paņēmieni, kurus mēs aplūkosim nākamajos rakstos.


Canary Deployment Kubernetes #1: Gitlab CI

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

Kanāru izvietošana

Kanārijas atjaunināšanas stratēģijā vispirms tiek piemēroti tikai daļai lietotāju. Izmantojot uzraudzību, datus no žurnāliem, manuālos testus vai citus atgriezeniskās saites kanālus, laidienu pārbauda pirms tā piemērošanas visiem lietotājiem.

Kubernetes izvietojums (vēlams atjauninājums)

Pamatstratēģija Kubernetes izvietojumam ir vēlams atjauninājums, kurā tiek palaists noteikts jauno attēlu podu skaits. Ja tie tiek izveidoti bez problēmām, vecie attēli tiek pārtraukti, un jauni podi tiek izveidoti blakus.

GitOps

Mēs izmantojam GitOps šajā piemērā, jo mēs:

  • izmantojam Git kā vienīgo patiesības avotu
  • izmantojam Git operācijas būvēšanai un izvietošanai (nav nepieciešamas citas komandas, tikai git tag/merge)

uzbrukumam

Izvērsīsim labu praksi — būt vienam repozitorijam vides kodam un vienam lietotņu kodam.

Lietotņu repozitorijs

Šī ir ļoti vienkārša API, kas uzrakstīta Python+Flask, atgriež atbildi JSON formātā. Mēs izveidosim paku caur GitlabCI un augšupielādēsim rezultātu Gitlab reģistrā. Mums ir divas dažādas izlaišanas versijas reģistrā:

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

Vienīgā atšķirība starp tām ir mainīgais atgrieztais JSON fails. Mēs izmantojam šo lietotni, lai maksimāli vienkārši vizualizētu, ar kuru versiju mēs strādājam.

Infrastruktūru repozitorijs

Šajā repozitorijā mēs izvietosim caur GitlabCI Kubernetes, .gitlab-ci.yml izskatās šādi:

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

Lai to palaistu pats, jums būs nepieciešams klasteris, varat izmantot Gcloud:

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

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

Jums jāizveido forka https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure un jāizveido mainīgais KUBECONFIG GitlabCI, kas saturēs konfigurāciju piekļuvei kubectl jūsu klasterim.

Par to, kā iegūt autentifikācijas datus klasterim (Gcloud), var izlasīt šajā vietā.

Infrastruktūras Yaml

Infrastruktūras repozitorijā mums ir serviss:

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

un izvietojums 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

Un cits izvietojums 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

Pievērsiet uzmanību, ka app-deploy vēl nav noteikts kopiju skaits.

Sākotnējā izvietošanas izpilde

Lai palaistu sākotnējo izvietojumu, jūs varat manuāli palaist GitlabCI caur master zaru. Pēc tam kubectl tam jāizvada sekojošais:

Canary Deployment Kubernetes #1: Gitlab CI

Mēs redzam app izvietojumu ar 10 kopijām un app-canary ar 0. Tāpat ir LoadBalancer, no kura mēs varam piekļūt caur curl pa ārējo IP:

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

Canary Deployment Kubernetes #1: Gitlab CI

Mēs redzam, ka mūsu testa lietotne atgriež tikai “v1”.

Canary izvietojuma izpilde

1. solis: izlaist jaunu versiju daļai lietotāju

Mēs esam noteikuši kopiju skaitu uz 1 failā deploy-canary.yaml un jaunas versijas attēlu:

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

Failā deploy.yaml mēs mainījām kopiju skaitu uz 9:

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

Mēs nospiežam šīs izmaiņas uz repozitoriju, no kura tiks palaista izvietošana (caur GitlabCI) un beigās redzam:

Canary Deployment Kubernetes #1: Gitlab CI

Mūsu pakalpojums norādīs uz abiem izvietojumiem, jo abiem ir selektors app. Tādēļ, ņemot vērā nejaušu izplatīšanu pēc noklusējuma Kubernetes, mums vajadzētu redzēt dažādus atbildes apmēram 10% pieprasījumu.

Canary Deployment Kubernetes #1: Gitlab CI

Pašreizējais mūsu lietotnes stāvoklis (GitOps, ņemts no Git kā vienots patiesības avots) ir divi izvietojumi ar aktīvajām kopijām, pa vienam katrai versijai.

~10% lietotāju iepazīstas ar jauno versiju un nejauši to pārbauda. Tagad ir pienācis laiks pārbaudīt kļūdu klātbūtni žurnālos un monitoringa datos, lai meklētu problēmas.

2. solis: izlaist jaunu versiju visiem lietotājiem

Mēs nolēmām, ka viss ir gājis labi un tagad mums ir jāizlaiž jaunā versija visiem lietotājiem. Tāpēc mēs vienkārši atjauninām deploy.yaml uzstādot jauno versiju un kopiju skaitu, kas ir vienāds ar 10. Tādējādi deploy-canary.yaml Mēs iestata replikāciju skaitu uz 0. Pēc izvietošanas rezultāts būs šāds:

Canary Deployment Kubernetes #1: Gitlab CI

Kopsavilkums

Man personīgi manuālā izvietošanas uzsākšana šādā veidā palīdz saprast, cik viegli to var konfigurēt, izmantojot k8s. Tā kā Kubernetes ļauj atjaunināt visu caur API, šos soļus var automatizēt ar skriptiem.

Vēl viena lieta, kas jāīsteno, ir testētāja ieejas punkts (LoadBalancer vai caur Ingress), caur kuru var piekļūt tikai jaunajai versijai. To var izmantot, lai to apskatītu manuāli.

Nākamajās rakstus mēs pārbaudīsim citas automatizētas risinājumus, kas īsteno lielāko daļu no tā, ko mēs izdarījām.

Izlasiet arī citus rakstus mūsu emuārā:

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster