Við munum nota k8s-innfædda Argo Rollouts dreifingarstýringu og GitlabCI til að keyra Canary dreifingu á Kubernetes

Greinar í þessari röð
- (Þessi grein)
- Canary Deployment með Istio
- Canary Deployment með Jenkins-X Istio Flagger
Kanaríútsetning
Við vonum að þú lesir , þar sem við útskýrðum stuttlega hvað Canary Deployments eru. Við sýndum líka hvernig á að innleiða það með því að nota staðlaða Kubernetes auðlindir.
Argo útgáfur
Argo Rollouts er innfæddur Kubernetes dreifingarstýring. Það veitir CRD (Custom Resource Definition) fyrir Kubernetes. Þökk sé því getum við notað nýja einingu: Rollout, sem stjórnar blágrænum og kanarí-uppfærslum með ýmsum stillingarvalkostum.
Argo Rollouts stjórnandi notaður af sérsniðnu tilfangi
Rollout,Gerir ráð fyrir frekari dreifingaraðferðum eins og blágrænum og kanarí fyrir Kubernetes. AuðlindRolloutveitir samsvarandi virkniDeployment, aðeins með frekari dreifingaraðferðum.
úrræðiDeploymentshefur tvær aðferðir fyrir dreifingu:RollingUpdateиRecreate. Þó að þessar aðferðir henti í flestum tilfellum, til dreifingar á netþjóna í mjög stórum stíl, eru viðbótaraðferðir notaðar, eins og blágrænn eða kanarífugl, sem eru ekki tiltækar í dreifingarstýringunni. Til að nota þessar aðferðir í Kubernetes þurftu notendur að skrifa forskriftir ofan á dreifinguna sína. Argo Rollouts Controller afhjúpar þessar aðferðir sem einfaldar, lýsandi, stillanlegar færibreytur.
Það er líka Argo CI, sem veitir þægilegt vefviðmót til notkunar með Rollouts, við munum skoða það í næstu grein.
Að setja upp Argo Rollouts
Server hlið
kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
Í innviðarófu okkar (sjá hér að neðan) höfum við þegar bætt install.yaml við sem i/k8s/argo-rollouts/install.yaml. Þannig mun GitlabCI setja það upp í þyrpinguna.
Viðskiptavinahlið (kubectl tappi)
Dæmi Umsókn
Það er góð venja að hafa aðskildar geymslur fyrir forritakóða og innviði.
Geymsla fyrir forritið
Þetta er mjög einfalt Python+Flask API sem skilar svari sem JSON. Við munum byggja pakkann með því að nota GitlabCI og ýta niðurstöðunni í Gitlab Registry. Í skránni höfum við tvær mismunandi útgáfur:
- wuestkamp/k8s-deployment-example-app:v1
- wuestkamp/k8s-deployment-example-app:v2
Eini munurinn á milli þeirra er JSON skráin sem skilað er. Við notum þetta forrit til að sjá eins auðveldlega og mögulegt er hvaða útgáfu við erum í samskiptum við.
Innviðageymsla
Í þessari geymslu munum við nota GitlabCI fyrir dreifingu á Kubernetes, .gitlab-ci.yml lítur svona út:
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:
- masterTil að keyra það sjálfur þarftu klasa, þú getur notað Gcloud:
gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80Þú þarft að punga og búa til breytu KUBECONFIG í GitlabCI, sem mun innihalda stillingar fyrir aðgang kubectl til þyrpingarinnar þinnar.
Þú getur lesið um hvernig á að fá skilríki fyrir klasa (Gcloud).
Innviðir Yaml
Inni í innviðageymslunni höfum við þjónustu:
apiVersion: v1
kind: Service
metadata:
labels:
id: rollout-canary
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancerog 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 } # two minutesRollout virkar á sama hátt og Deployment. Ef við setjum ekki uppfærslustefnu (eins og Canary hér) mun hún hegða sér eins og sjálfgefna uppfærsluuppfærslu.
Við skilgreinum tvö skref í yaml fyrir dreifingu kanarífugla:
- 10% af umferð til Kanarí (bíddu eftir handvirkt OK)
- 50% umferð til Kanarí (bíddu í 2 mínútur og haltu síðan áfram í 100%)
Framkvæmir fyrstu dreifingu
Eftir fyrstu dreifingu munu auðlindir okkar líta svona út:

Og við fáum aðeins svar frá fyrstu útgáfu forritsins:

Framkvæmir Canary Deployment
Skref 1: 10% umferð
Til að hefja dreifingu kanarífugla þurfum við bara að breyta myndútgáfunni eins og við gerum venjulega með dreifingu:
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
...Og við ýtum á breytingar, svo Gitlab CI dreifist og við sjáum breytingarnar:

Nú ef við fáum aðgang að þjónustunni:

Frábært! Við erum í miðri kanaríútsetningu okkar. Við getum séð framfarirnar með því að keyra:
kubectl argo rollouts get rollout rollout-canary

Skref 2: 50% umferð:
Nú skulum við halda áfram í næsta skref: að beina 50% af umferðinni áfram. Við stilltum þetta skref til að keyra handvirkt:
kubectl argo rollouts promote rollout-canary # continue to step 2

Og umsókn okkar skilaði 50% af svörum frá nýjum útgáfum:

Og endurskoðun útsetningar:

Dásamlegt.
Skref 3: 100% umferð:
Við settum það upp þannig að eftir 2 mínútur lýkur 50% skrefinu sjálfkrafa og 100% skrefið byrjar:

Og úttak forritsins:

Og endurskoðun útsetningar:

Dreifingu Kanarífugla er lokið.
Fleiri dæmi með Argo Rollouts
Það eru fleiri dæmi hér, eins og hvernig á að setja upp forsýningar umhverfisins og samanburð á grundvelli kanarífugla:
Myndband um Argo Rollouts og Argo CI
Ég mæli virkilega með þessu myndbandi, það sýnir hvernig Argo Rollouts og Argo CI vinna saman:

Samtals
Mér líkar mjög við hugmyndina um að nota CRD sem stjórna stofnun viðbótartegunda dreifingar eða afrita, endurbeina umferð osfrv. Vinna með þeim gengur snurðulaust fyrir sig. Næst langar mig að prófa samþættinguna við Argo CI.
Hins vegar virðist vera stór samruni Argo CI og Flux CI að koma, svo ég gæti beðið þar til nýja útgáfan kemur út: .
Hefur þú reynslu af Argo Rollouts eða Argo CI?
Lestu einnig aðrar greinar á blogginu okkar:
Heimild: www.habr.com
