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

Šī cikla raksti:
- (šis raksts)
- Kanārijas izvietojums, izmantojot Istio
- Kanārijas izvietojums, izmantojot Jenkins-X Istio Flagger
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.

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:v1wuestkamp/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:80Jums jāizveido forka 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 .
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: LoadBalancerun 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: 100MiUn 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: 100MiPievē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:

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

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: 100MiFailā 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:

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.

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:

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
