MÄs izmantosim Gitlab CI un manuÄlo GitOps, lai ieviestu un izmantotu Canary izvietoÅ”anu Kubernetes.

Raksti no Ŕīs sÄrijas:
- (Å is raksts)
- KanÄriju izvietoÅ”ana, izmantojot Istio
- KanÄriju izvietoÅ”ana, izmantojot Jenkins-X Istio Flagger
MÄs veiksim Canary izvietoÅ”anu manuÄli, izmantojot GitOps un izveidojot/pÄrveidojot galvenos Kubernetes resursus. Å is raksts galvenokÄrt ir paredzÄts ievadam ar to, kÄ izvietoÅ”ana darbojas Kubernetes Canary, jo ir efektÄ«vÄkas automatizÄcijas metodes, kuras mÄs apsvÄrsim turpmÄkajos rakstos.

KanÄriju izvietoÅ”ana
Izmantojot Canary stratÄÄ£iju, atjauninÄjumi vispirms tiek lietoti tikai lietotÄju apakÅ”kopai. Izmantojot pÄrraudzÄ«bu, žurnÄla datus, manuÄlu testÄÅ”anu vai citus atgriezeniskÄs saites kanÄlus, laidiens tiek pÄrbaudÄ«ts, pirms tas tiek izlaists visiem lietotÄjiem.
Kubernetes izvietoÅ”ana (pastÄvÄ«gs atjauninÄjums)
Kubernetes izvietoÅ”anas noklusÄjuma stratÄÄ£ija ir nepÄrtraukta atjauninÄÅ”ana, kurÄ tiek palaists noteikts skaits aplikumu ar jaunÄm attÄlu versijÄm. Ja tie tika izveidoti bez problÄmÄm, pÄksti ar vecÄm attÄlu versijÄm tiek pÄrtraukti un paralÄli tiek izveidoti jauni podi.
GitOps
Å ajÄ piemÄrÄ mÄs izmantojam GitOps, jo mÄs:
- izmantojot Git kÄ vienotu patiesÄ«bas avotu
- mÄs izmantojam Git Operations izveidei un izvietoÅ”anai (nav vajadzÄ«gas citas komandas, izÅemot git tagu/merge)
PiemÄrs
PieÅemsim labu praksi ā lai bÅ«tu viens repozitorijs lietojumprogrammas kodam un viens infrastruktÅ«rai.
Lietojumprogrammu repozitorijs
Å Ä« ir ļoti vienkÄrÅ”a Python+Flask API, kas atgriež atbildi kÄ JSON. MÄs izveidosim pakotni, izmantojot GitlabCI, un nosÅ«tÄ«sim rezultÄtu Gitlab reÄ£istram. ReÄ£istrÄ mums ir divas dažÄdas laidiena versijas:
wuestkamp/k8s-deployment-example-app:v1wuestkamp/k8s-deployment-example-app:v2
VienÄ«gÄ atŔķirÄ«ba starp tÄm ir izmaiÅas atgrieztajÄ JSON failÄ. MÄs izmantojam Å”o lietojumprogrammu, lai pÄc iespÄjas vienkÄrÅ”Äk vizualizÄtu, ar kuru versiju mÄs sazinÄmies.
Infrastruktūras repozitorijs
Å ajÄ rÄceÅÄ mÄs caur GitlabCI izvietosim Kubernetes, .gitlab-ci.yml ir Å”Äds:
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 vajag dakÅ”iÅu un izveidojiet mainÄ«go KUBECONFIG GitlabCI, kurÄ bÅ«s piekļuves konfigurÄcija kubectl uz jÅ«su kopu.
Varat lasÄ«t par to, kÄ iegÅ«t akreditÄcijas datus klasterim (Gcloud) .
Infrastruktūra Yaml
InfrastruktÅ«ras repozitorijÄ mums ir pakalpojums:
apiVersion: v1
kind: Service
metadata:
labels:
id: app
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancerUn izvietoÅ”ana iekÅ”Ä 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 vÄl viena izvietoÅ”ana 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Å emiet vÄrÄ, ka lietotÅu izvietoÅ”anai vÄl nav definÄta neviena kopija.
Veicot sÄkotnÄjo izvietoÅ”anu
Lai sÄktu sÄkotnÄjo izvietoÅ”anu, varat manuÄli palaist GitlabCI konveijeru galvenajÄ atzarÄ. PÄc tam kubectl jÄizvada sekojoÅ”ais:

MÄs redzam app izvietoÅ”ana ar 10 replikÄm un app-canary ar 0. Ir arÄ« LoadBalancer, no kura mÄs varam piekļūt, izmantojot curl caur Ä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 lietojumprogramma atgriež tikai āv1ā.
KanÄriju izvietoÅ”anas izpilde
1. darbÄ«ba: izlaidiet jaunu versiju dažiem lietotÄjiem
MÄs iestatÄ«jÄm kopiju skaitu uz 1 failÄ deploy-canary.yaml un jaunÄs versijas attÄlÄ:
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 virzÄm Ŕīs izmaiÅas repozitorijÄ, no kuras sÄksies izvietoÅ”ana (izmantojot GitlabCI), un rezultÄtÄ redzam:

MÅ«su pakalpojums norÄdÄ«s uz abiem izvietojumiem, jo āāabiem ir lietotÅu atlasÄ«tÄjs. Kubernetes noklusÄjuma randomizÄcijas dÄļ mums vajadzÄtu redzÄt dažÄdas atbildes uz ~ 10% pieprasÄ«jumu:

PaÅ”reizÄjais mÅ«su lietojumprogrammas stÄvoklis (GitOps, kas Åemts no Git kÄ vienots patiesÄ«bas avots) ir divu izvietojumu klÄtbÅ«tne ar aktÄ«vÄm replikÄm, viena katrai versijai.
~10% lietotÄju iepazÄ«st jaunu versiju un netīŔi to testÄ. Tagad ir pienÄcis laiks pÄrbaudÄ«t, vai žurnÄlos un pÄrraudzÄ«bas datos nav kļūdu, lai atrastu problÄmas.
2. darbÄ«ba: izlaidiet jauno versiju visiem lietotÄjiem
MÄs nolÄmÄm, ka viss noritÄja labi, un tagad mums ir jÄizlaiž jaunÄ versija visiem lietotÄjiem. Lai to izdarÄ«tu, mÄs vienkÄrÅ”i atjauninÄm deploy.yaml instalÄjot jaunu attÄla versiju un reprodukciju skaitu, kas vienÄds ar 10. In deploy-canary.yaml mÄs iestatÄm repliku skaitu atpakaļ uz 0. PÄc izvietoÅ”anas rezultÄts bÅ«s Å”Äds:

SummÄjot
ManuÄla izvietoÅ”anas palaiÅ”ana Å”ÄdÄ veidÄ palÄ«dz saprast, cik viegli to var konfigurÄt, izmantojot k8s. TÄ kÄ Kubernetes ļauj atjauninÄt visu, izmantojot API, Ŕīs darbÄ«bas var automatizÄt, izmantojot skriptus.
VÄl viena lieta, kas jÄievieÅ”, ir testÄtÄja ieejas punkts (LoadBalancer vai caur Ingress), caur kuru var piekļūt tikai jaunajai versijai. To var izmantot manuÄlai pÄrlÅ«koÅ”anai.
NÄkamajos rakstos mÄs apskatÄ«sim citus automatizÄtus risinÄjumus, kas ievieÅ” lielÄko daļu mÅ«su paveiktÄ.
Lasiet arÄ« citus rakstus mÅ«su emuÄrÄ:
Avots: www.habr.com
