Panyebaran Kanaria di Kubernetes # 1: Gitlab CI

Kami bakal nganggo Gitlab CI sareng GitOps manual pikeun nerapkeun sareng nganggo panyebaran Canary di Kubernetes

Panyebaran Kanaria di Kubernetes # 1: Gitlab CI

Artikel tina séri ieu:

Kami bakal ngalaksanakeun panyebaran Canary sacara manual via GitOps sareng nyiptakeun / ngarobih sumber daya Kubernetes utama. Artikel ieu dimaksudkeun utamana pikeun bubuka kalawan kumaha deployment jalan dina Kubernetes Canary, saprak aya métode leuwih éféktif automation, nu urang bakal mertimbangkeun dina artikel di handap ieu.


Panyebaran Kanaria di Kubernetes # 1: Gitlab CI

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

Panyebaran Kanaria

Kalayan strategi Canary, apdet munggaran diterapkeun ngan ukur sawaréh pangguna. Ngaliwatan monitoring, data log, uji manual, atanapi saluran eupan balik anu sanés, sékrési diuji sateuacan dileupaskeun ka sadaya pangguna.

Deployment Kubernetes (update bergulir)

Strategi standar pikeun Kubernetes Deployment nyaéta rolling-update, dimana sajumlah pods diluncurkeun nganggo vérsi gambar anyar. Upami aranjeunna diciptakeun tanpa masalah, pods sareng vérsi gambar anu lami ditungtungan, sareng pods énggal didamel paralel.

GitOps

Kami nganggo GitOps dina conto ieu kusabab kami:

  • ngagunakeun Git salaku sumber tunggal bebeneran
  • kami nganggo Git Operations pikeun ngawangun sareng panyebaran (henteu aya paréntah lian ti tag git / merge anu diperyogikeun)

conto

Hayu urang nyandak prakték anu saé - gaduh hiji gudang pikeun kode aplikasi sareng hiji pikeun infrastruktur.

Repository aplikasi

Ieu mangrupikeun Python + Flask API anu saderhana pisan anu ngabalikeun réspon salaku JSON. Urang bakal ngawangun pakét via GitlabCI sareng nyorong hasilna ka Gitlab Registry. Dina pendaptaran kami gaduh dua versi pelepasan anu béda:

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

Hiji-hijina bédana antara aranjeunna nyaéta parobahan dina file JSON anu dipulangkeun. Kami nganggo aplikasi ieu pikeun ngabayangkeun sabisa-bisa versi anu kami komunikasikeun.

Infrastruktur gudang

Dina turnip ieu kami bakal nyebarkeun via GitlabCI ka Kubernetes, .gitlab-ci.yml Ieu saperti kieu:

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

Pikeun ngajalankeun éta sorangan anjeun peryogi klaster, anjeun tiasa nganggo Gcloud:

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

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

Anjeun kedah garpu https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure jeung nyieun variabel KUBECONFIG di GitlabCI, anu bakal ngandung config pikeun aksés kubectl ka klaster Anjeun.

Anjeun tiasa maca ngeunaan kumaha carana kéngingkeun kredensial pikeun klaster (Gcloud) di dieu.

Infrastruktur Yaml

Dina gudang infrastruktur kami ngagaduhan jasa:

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

Jeung deployment di 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

Jeung deployment sejen di 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

Catet yén aplikasi-deployment teu acan gaduh réplika anu didefinisikeun.

Ngalaksanakeun deployment awal

Pikeun ngamimitian panyebaran awal, anjeun tiasa ngamimitian pipa GitlabCI sacara manual dina cabang master. Saatos éta kubectl kedah kaluaran di handap ieu:

Panyebaran Kanaria di Kubernetes # 1: Gitlab CI

Urang nempo app deployment kalawan 10 réplika jeung app-kanari kalawan 0. Aya ogé LoadBalancer ti mana urang bisa ngakses ngaliwatan curl via IP éksternal:

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

Panyebaran Kanaria di Kubernetes # 1: Gitlab CI

Kami ningali yén aplikasi uji kami ngan ukur mulangkeun "v1".

Ngalaksanakeun penyebaran Kanaria

Lengkah 1: ngaleupaskeun versi anyar pikeun sababaraha pamaké

Urang nyetel jumlah réplika ka 1 dina file deploy-canary.yaml jeung gambar versi anyar:

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

Dina file deploy.yaml urang ngarobah jumlah réplika jadi 9:

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

Kami nyorong parobihan ieu kana gudang tempat panyebaran bakal ngamimitian (via GitlabCI) sareng ningali hasilna:

Panyebaran Kanaria di Kubernetes # 1: Gitlab CI

Layanan kami bakal nunjuk ka duanana panyebaran, sabab duanana gaduh pamilih aplikasi. Kusabab randomisasi standar Kubernetes, urang kedah ningali réspon anu béda pikeun ~ 10% pamundut:

Panyebaran Kanaria di Kubernetes # 1: Gitlab CI

Kaayaan aplikasi urang ayeuna (GitOps, dicandak tina Git salaku Sumber Tunggal Kaleresan) nyaéta ayana dua panyebaran sareng réplika aktip, hiji pikeun unggal versi.

~ 10% pamaké jadi akrab jeung versi anyar jeung teu ngahaja nguji éta. Ayeuna waktuna pikeun mariksa kasalahan dina log sareng ngawaskeun data pikeun mendakan masalah.

Lengkah 2: Leupaskeun versi anyar ka sadaya pamaké

Kami mutuskeun yén sadayana lancar sareng ayeuna urang kedah ngagulung versi énggal ka sadaya pangguna. Jang ngalampahkeun ieu kami ngan ngamutahirkeun deploy.yaml masang versi anyar tina gambar jeung jumlah réplika sarua 10. Di deploy-canary.yaml urang nyetel jumlah réplika deui 0. Saatos deployment, hasilna bakal kieu:

Panyebaran Kanaria di Kubernetes # 1: Gitlab CI

summing up

Pikeun kuring, ngajalankeun panyebaran sacara manual ku cara ieu ngabantosan ngartos kumaha gampangna tiasa dikonpigurasi nganggo k8s. Kusabab Kubernetes ngidinan Anjeun pikeun ngamutahirkeun sagalana ngaliwatan hiji API, léngkah ieu bisa otomatis ngaliwatan skrip.

Hal séjén anu kedah dilaksanakeun nyaéta titik éntri panguji (LoadBalancer atanapi via Ingress) anu ngan ukur tiasa diaksés versi énggal. Éta tiasa dianggo pikeun browsing manual.

Dina artikel kahareup, urang bakal pariksa kaluar solusi otomatis lianna nu nerapkeun lolobana naon urang geus dipigawé.

Baca ogé artikel séjén dina blog urang:

sumber: www.habr.com

Tambahkeun komentar