Kasutame Gitlab CI ja kÀsitsi GitOps'i, et rakendada ja kasutada Canary-deployd Kubernetesis.

Selle artikli seeria:
- (see artikkel)
- Canary Deployment Istio abil
- Canary Deployment Jenkins-X Istio Flagger abil
Canary-deployd teeme kÀsitsi lÀbi GitOps'i ja Kubernetes'i peamiste ressursside loomise/muutmise. See artikkel on suunatud peamiselt selle tutvustamiseks, kuidas Kuberneteses Canary-deploy toimib, kuna on olemas tÔhusamad automaatimise viisid, mida kÀsitleme jÀrgmistes artiklites.

Canary juurutamine
Canary-strateegia puhul rakendatakse uuendused esmalt ainult osa kasutajatele. JÀlgimise, logiandmete, kÀsitsi testimise vÔi teiste tagasiside kanalite kaudu testitakse vÀljaanne enne selle rakendamist kÔigile kasutajatele.
Kubernetes Deployment (rolling update)
Kubernetes Deployment'i vaikestrateegia on rolling-update, kus kÀivitatakse kindel arv pod'e uute piltide versioonidega. Kui need loodi probleemideta, lÔpetatakse vanade piltide pod'id ja uued pod'id luuakse paralleelselt.
GitOps
Kasutame GitOps'i selles nÀites, kuna me:
- kasutame Git'i kui ainsat tÔe allikat.
- kasutame Git Operations'i ehitamiseks ja juurutamiseks (vÀlja arvatud git tag/merge, pole muid kÀske vajalik)
NĂ€ide
LĂ€hme head praktikat â omame ĂŒhte hoidlat rakenduste koodi jaoks ja ĂŒhte infrastruktuuri jaoks.
Rakenduste hoidla
See on vÀga lihtne API Python+Flask'il, mis tagastab vastuse JSON-vormingus. Me ehitame paketi lÀbi GitlabCI ja viime tulemuse Gitlabi registrisse. Registris on meil kaks erinevat versiooni vÀljalaskest:
wuestkamp/k8s-deployment-example-app:v1wuestkamp/k8s-deployment-example-app:v2
Ainus erinevus nende vahel on muutus tagastatud JSON-failis. Kasutame seda rakendust maksimaalselt lihtsa visualiseerimise jaoks, et nÀha, millega versiooniga me suhtleme.
Infrastruktuuri register
Selles hoidlas viime juurutamise lÀbi GitlabCI Kubernetesesse, .gitlab-ci.yml see nÀeb vÀlja jÀrgmine:
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
Selle kÀivitamiseks iseseisvalt vajate klastrit, vÔite kasutada Gcloudi:
gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80Te peate tegema forki ja looma muutuja KUBECONFIG GitlabCI-s, mis sisaldab konfiguraatiot juurdepÀÀsu jaoks kubectl teie klastrile.
Kuidas saada klastrile (Gcloud) autentimist saate lugeda .
Infrastruktuuri Yaml
Meie infrastruktuuri hoidlas on meil teenus:
apiVersion: v1
kind: Service
metadata:
labels:
id: app
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancerJa juurutamine failis 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: 100MiJa teine deployment on 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: 100MiPange tÀhele, et app-deploy'il ei ole praegu mÀÀratud replikate arvu.
Algse deploy kÀitamine
Algse deployment'i kÀivitamiseks saate kÀsitsi kÀivitada GitlabCI toru peaharus. PÀrast seda kubectl see peaks vÀljundama jÀrgmist:

NÀeme app deployment't 10 replikaga ja app-canary't 0. Samuti on olemas LoadBalancer, mille kaudu saame pöörduda curl External IP kaudu:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

NĂ€eme, et meie testrakendus tagastab ainult "v1".
Canary deployment'i teostamine
Samm 1: vabasta uus versioon osale kasutajatele
Oleme mÀÀranud replikate arvu 1 failis deploy-canary.yaml ja uus versioonipilt:
tĂŒĂŒp: Deployment
metainfo:
nimi: app-canary
spetsifikatsioon:
replikad: 1
valija:
vasteSildid:
id: app
tĂŒĂŒp: canary
mall:
metainfo:
sildid:
id: app
tĂŒĂŒp: canary
spetsifikatsioon:
konteinerid:
- pilt: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
nimi: app
ressursid:
piirangud:
cpu: 100m
mÀlu: 100MiFailis deploy.yaml me oleme muutnud replikate arvu 9-ks:
tĂŒĂŒp: Deployment
metainfo:
nimi: app
spetsifikatsioon:
replikad: 9
valija:
vasteSildid:
id: app
...Me viime need muudatused hoidlasse, kust kÀivitatakse deploy (GitlabCI kaudu) ja nÀeme lÔpuks:

Meie teenus osutab mĂ”lemale deploy-le, kuna mĂ”lemal on id-aplikaator. Kuberneetilises sĂŒsteemis toimiva juhusliku jaotuse tĂ”ttu peaksime nĂ€gema erinevaid vastuseid umbes 10% pĂ€ringutest:

Meie rakenduse praegune olek (GitOps, mis on saadud Gitist kui ainus tĂ”eallikas) on kahe aktiivse replikaga deployment - iga versiooni jaoks ĂŒks.
~10% kasutajatest tutvuvad uue versiooniga ja testivad seda tahtmatult. On aeg kontrollida logides ja monitooringu andmetes vigu probleemide leidmiseks.
Samm 2: vabastada uus versioon kÔigile kasutajatele
Oleme otsustanud, et kĂ”ik lĂ€ks hĂ€sti ja nĂŒĂŒd peame uue versiooni kĂ”igile kasutajatele installima. Selleks uuendame lihtsalt deploy.yaml seadmise uus versioon ja replikate arv on 10. V deploy-canary.yaml seame replikate arvu tagasi 0. PĂ€rast juurutamist on tulemus jĂ€rgmine:

KokkuvÔtteks
Minu jaoks aitab kÀsitsi juurutamine mÔista, kui lihtsalt seda saab k8si abil seadistada. Kuna Kubernetes vÔimaldab kÔike uuendada API kaudu, saab neid samme automatiseerida skriptide abil.
Veel ĂŒks asi, mida tuleb ellu viia â on testija sisenemispunkt (LoadBalancer vĂ”i Ingressi kaudu), mille kaudu saab juurde pÀÀseda ainult uuele versioonile. Seda vĂ”ib kasutada kĂ€sitsi vaatamiseks.
JĂ€rgmistes artiklites uurime muid automatiseeritud lahendusi, mis rakendavad enamikku meie tehtust.
Vaata ka teisi artikleid meie blogis:
Allikas: habr.com
