Mēs izmantosim k8s dzimtā Argo Rollouts izvietošanas kontroli un GitlabCI, lai uzsāktu Canary izvietošanu Kubernetes.

Šī cikla raksti
- (Šis raksts)
- Canary izvietošana, izmantojot Istio
- Canary izvietošana, izmantojot Jenkins-X Istio Flagger
Kanāru izvietošana
Ceram, ka esat lasījuši , kur mēs īsi izskaidrojām, kas ir Canary izvietojumi. Mēs arī parādījām, kā to īstenot, izmantojot standarta Kubernetes resursus.
Argo Rollouts
Argo Rollouts ir Kubernetes dzimtā izvietošanas kontrole. Tā piedāvā CRD (pielāgota resursa definīcija) Kubernetes. Pateicoties tam, mēs varam izmantot jaunu objektu: Rollout, kas pārvalda blue-green un canary izvietojumus ar dažādām konfigurācijas iespējām.
Argo Rollouts kontrolieris, kas izmanto pielāgoto resursu
Rollout,ļauj izmantot papildu izvietošanas stratēģijas, piemēram, blue-green un canary Kubernetes. ResurssRolloutpiedāvā funkcionalitāti, kas tillīdzīgaDeployment, tikai ar papildu izvietošanas stratēģijām.
ResursaIzvietojumiir divas stratēģijas izvietošanai:RollingUpdateunRecreate. Lai gan šīs stratēģijas der lielākajai daļai gadījumu, lielu mērogu serveru izvietošanai tiek izmantotas papildu stratēģijas, piemēram, blue-green vai canary, kuras nav pieejamas Izvietojumu kontrolierī. Lai izmantotu šīs stratēģijas Kubernetes, lietotājiem bija jāraksta skripti virs saviem Izvietojumiem. Argo Rollouts kontrolieris piedāvā šīs stratēģijas kā vienkāršas deklaratīvas konfigurācijas opcijas.
Pastāv arī Argo CI, kas nodrošina ērtu tīmekļa saskarni, ko var izmantot kopā ar Rollouts; mēs aplūkosim to nākamajā rakstā.
Argo Rollouts uzstādīšana
Servera pusē
kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
Mūsu infrastruktūras repozitorijā (skatīt zemāk) mēs jau esam pievienojuši install.yaml kā i/k8s/argo-rollouts/install.yaml. Tādējādi GitlabCI to uzstādīs klasterī.
Klienta pusē (kubectl paplašinājums)
Parauga lietotne
Laba prakse ir izveidot atsevišķus repozitorijus lietotnes kodam un infrastruktūrai.
Lietotnes repozitorijs
Šī ir ļoti vienkārša API, kas izveidota Python+Flask, atgriežot atbildi JSON formātā. Mēs izveidosim pakotni, izmantojot GitlabCI, un nosūtīsim rezultātu Gitlab reģistrā. Reģistrā mums ir divas dažādas relīzes versijas:
- wuestkamp/k8s-deployment-example-app:v1
- wuestkamp/k8s-deployment-example-app:v2
Vienīgā atšķirība starp tiem ir atgrieztā JSON failā. Mēs izmantojam šo lietotni, lai maksimāli vienkārši vizualizētu, ar kuru versiju mēs sazināmies.
Infrastruktūru repozitorijs
Šajā repozitorijā mēs izmantosim GitlabCI izvietošanai Kubernetes, .gitlab-ci.yml izskatās šādi:
image: traherom/kustomize-dockerbefore_script:
- printenv
- kubectl versionstages:
- deploydeploy test:
stage: deploy
before_script:
- echo $KUBECONFIG
script:
- kubectl get all
- kubectl apply -f i/k8s only:
- masterLai 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.
varat lasīt par to, kā iegūt piekļuves datus klasterim (Gcloud).
Infrastruktūras Yaml
Iekš infrastruktūras repozitorija mums ir service:
apiVersion: v1
kind: Service
metadata:
labels:
id: rollout-canary
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancerun rollout.yaml :
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-canary
spec:
replicas: 10
revisionHistoryLimit: 2
selector:
matchLabels:
id: rollout-canary
template:
metadata:
labels:
id: rollout-canary
spec:
containers:
- name: rollouts-demo
image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
imagePullPolicy: Always
strategy:
canary:
steps:
- setWeight: 10
# Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
- pause: {}
- setWeight: 50
- pause: { duration: 120 } # divas minūtesRollout darbojas tāpat kā Deployment. Ja mēs nenosakām atjaunināšanas stratēģiju (kā canary šeit), tas uzvedīsies kā noklusējuma rolling-update Deployment.
Mēs definējam divus soļus yaml canary izvietošanai:
- 10% satiksmes uz canary (gaidīt manuālu apstiprinājumu)
- 50% satiksmes uz canary (gaidīt 2 minūtes, pēc tam turpināt uz 100%)
Sākotnējā izvietošanas izpilde
Pēc sākotnējās izvietošanas mūsu resursi izskatīsies šādi:

Un mēs iegūstam atbildi tikai no pirmās versijas lietotnes:

Izpildām Canary Deployment
1. solis: 10% satiksmes
Lai uzsāktu canary izvietošanu, mums vienkārši jāmaina attēla versija, kā mēs parasti darām ar izvietojumiem:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-canary
spec:
...
template:
metadata:
labels:
id: rollout-canary
spec:
containers:
- name: rollouts-demo
image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...Un mēs nospiežam izmaiņas, tāpēc Gitlab CI veic izvietošanu un mēs redzam izmaiņas:

Tagad, ja mēs vēršamies pie pakalpojuma:

Lieliski! Mēs esam vidū mūsu canary izvietošanā. Mēs varam redzēt progresu, palaidot:
kubectl argo rollouts get rollout rollout-canary

2. solis: 50% satiksmes:
Tagad pārejam pie nākamā soļa: 50% satiksmes novirzīšana. Mēs esam to iestatījuši, lai šis solis tiktu uzsākts manuāli:
kubectl argo rollouts promote rollout-canary # turpinām pie 2. soļa

Un mūsu lietotne atgrieza 50% atbilžu no jaunajām versijām:

Un rollout apskats:

Izcili.
3. solis: 100% satiksmes:
Mēs to esam iestatījuši tā, ka pēc 2 minūtēm solis ar 50% automātiski pabeidzas un sākas solis ar 100%:

Un lietotnes izvadīšana:

Un rollout apskats:

Canary izvietojums pabeigts.
Vēl piemēri ar Argo Rollouts
Šeit ir vēl piemēri, piemēram, kā iestatīt priekšskatījumu vidi un salīdzinājumus, pamatojoties uz canary:
Video par Argo Rollouts un Argo CI
Es patiešām iesaku šo video, kurā parādīts, kā Argo Rollouts un Argo CI strādā kopā:

Rezultāts
Man ļoti patīk ideja izmantot CRDs, kas pārvalda papildu veidu deployments vai replicasets izveidi, novirzot satiksmi utt. Darbs ar tiem norit plūstoši. Tālāk es gribētu izmēģināt integrāciju ar Argo CI.
Tomēr, šķiet, tuvojas liels Argo CI un Flux CI saplūšanas brīdis, tāpēc es varētu pagaidīt, kamēr iznāk jaunā versija: .
Vai jums ir pieredze ar Argo Rollouts vai Argo CI?
Izlasiet arī citus rakstus mūsu emuārā:
Avots: habr.com
