Déploiement de Canary avec Jenkins-X, Istio et Flagger

Bonne journée, lecteur!



Nous arrivons ici à la dernière partie d'une série d'articles sur les versions de Canary dans Kubernetes et les méthodes de leur implémentation. Bonne lecture et j'espère que vous avez trouvé ce cycle utile.






Utilisation de la solution Jenkins X pour effectuer un déploiement Canary sur un cluster Kubernetes








Dans cette boucle:



  1. Canary Deployment GitlabCI + GitOps/Manual Approach
  2. Canary Deployment Argo Rollouts
  3. Canary Deployment Istio
  4. ( )


?



Jenkins X k8s Python . , , JenkinsX+Flagger+Istio anary deployment , .



Canary Deployment



, , anary deployment Kubernetes.



Jenkins X



, , , Jenkins X. , .



Istio



, , Istio. , . 3, Canary deployment Istio, .



Flagger



Flagger Kubernetes, anary deployments Istio, Linkerd, App Mesh, NGINX, Contour Gloo routing Prometheus canary-. Canary- - , . ()




Jenkins X jx Kubernetes, Github , .



Jenkins X k8s



Jenkins X , Gcloud:



jx create cluster gke -n jenkinsx --machine-type n1-standard-4


“Serverless Jenkins X Pipelines with Tekton” Github . Github stage production .



(addons):



jx create addon istio
jx create addon flagger
jx create addon prometheus


Istio ( istio_requests_total Prometheus), Istio :



istioctl manifest generate --set values.kiali.enabled=true --set values.tracing.enabled=true --set values.grafana.enabled=true --set values.prometheus.enabled=true > istio.yaml
kubectl -f istio.yaml install


Flagger jx Istio sidecar namespace jx-production. :



kubectl get ns -L istio-injection


label istio-injection: enabled namespace, Istio sidecar .



Test App / Quickstart



jxing-nginx-ingress-controller namespace kube-system External IP. python-:



jx create quickstart --project-name python-test


python-http. , canary deployment . - HTTP endpoints .



Jenkins X Github .



do_GET app.py, , :



def do_GET(self):
 self.send_response(200)
 self.send_header('Content-type','text/html')
 self.end_headers()
 # Send the html message
 output = 'v1'
 self.wfile.write(output.encode('utf-8'))
 return




Jenkins X (jx get env):








Git-, GitOps. Helm Charts + , , require.yaml.



Deployment



quickstart , (jx import), 0.0.1 stage . , PROMOTE Auto stage . Pull Request stage , Jenkins X . Pipeline :



 jx get activities -w


pipelines , :



jx get applications




                        Jenkins X     Semver


, 0.0.1 stage, prod . :



kubectl -n jx-staging get all       # shows the app
kubectl -n jx-production get all    # shows nothing


stage , URL:








production



( production , 0.0.2)



(promote) production “”. jx get env , production , :



jx promote --version 0.0.2 --env production


Pull Request Jenkins X production Github . jx get applications 0.0.2 stage production:








production requirements.yaml prod .



Canary prod



prod stage canary, rolling-rollouts Kubernetes.



Python, Jenkins X -. charts/APP_NAME/values.yaml, Flagger Canary:



# Canary deployments
# If enabled, Istio and Flagger need to be installed in the cluster
canary:
 enabled: false
 progressDeadlineSeconds: 60
 canaryAnalysis:
   interval: "1m"
   threshold: 5
   maxWeight: 60
   stepWeight: 20
   # WARNING: Canary deployments will fail and rollback if there is no traffic that will generate the below specified metrics.
   metrics:
     requestSuccessRate:
       threshold: 99
       interval: "1m"
     requestDuration:
       threshold: 1000
       interval: "1m"
 # The host is using Istio Gateway and is currently not auto-generated
 # Please overwrite the `canary.host` in `values.yaml` in each environment repository (e.g., staging, production)
 host: acme.com


canary deployment 3 , 1 : 20%, 40%, 60%.



anary canary: enabled: false.



Jenkins X , production environment-jenkinsx-production. Python, Helm charts requirements.yaml. env/values.yaml environment-jenkinsx-production:



...
jenkinsx-istio-canary-python-test:
 canary:
   enabled: true
   host: jenkinsx-istio-canary-python-test.35.204.67.7.nip.io


  • xxx.IP_ADDRESS.nip.io IP_ADDRESS. .
  • host: Istio, . IP- Istio : kubectl -n istio-system get svc. , , host:, External IP Istio.


production Jenkins X, :



 jx get activity


activities successful. Istio VirtualService Gateway:



kubectl -n jx-production get virtualservices.networking.istio.io,gateways.networking.istio.io


, , , anary, , . ()

production Istio :



jenkinsx-istio-canary-python-test.35.204.67.7.nip.io:







Flagger Grafana Dashboard



Flagger Grafana namespace istio-system, , :



kubectl port-forward -n istio-system service/flagger-grafana 3000:80
# admin:admin







Grafana Istio Dashboard :



  • namespace: jx-production
  • primary: jx-jenkinsx-istio-canary-python-test-primary
  • canary: jx-jenkinsx-istio-canary-python-test-canary


Primary canary services. , Canary .



istio_requests_total, , Istio , , , jx.



Flagger Canary Workflow



Helm Chart Python , ( ):



canary:
 enabled: false # false, but we set to true in prod env git repo
 progressDeadlineSeconds: 60
 canaryAnalysis:
   interval: "1m"
   threshold: 5
   maxWeight: 60
   stepWeight: 20
   # WARNING: Canary deployments will fail and rollback if there is no traffic that will generate the below specified metrics.
   metrics:
     requestSuccessRate:
       threshold: 99
       interval: "1m"
     requestDuration:
       threshold: 1000
       interval: "1m"


. Flagger .

Canary, Flagger:



kubectl -n jx-production get canaries.flagger.app


Canary Deployment



Deploy



app.py , GET . Pull Request master- merge. Jenkins X deploy stage.



prod, , stage. 0.0.6 , :



jx promote --version 0.0.6 --env production


Canary:



kubectl -n jx-production get events --field-selector involvedObject.kind=Canary --sort-by='{.lastTimestamp}'


Canary 20%



2m39s       Normal    Synced   Canary   Advance jx-jenkinsx-istio-canary-python-test.jx-production canary weight 20


curl production Istio endpoint, , 20% :








Canary ( )



, endpoint, Canary Flagger :








Canary , .



Canary 40%



, , Flagger 40%:










Canary 60%



, , Flagger 60%:



60s         Normal    Synced   Canary   Advance jx-jenkinsx-istio-canary-python-test.jx-production canary weight 60







Canary



25s         Normal    Synced   Canary   Routing all traffic to primary


:










Jenkins X Istio Flagger Canary Deployments. , Istio jx create addon istio, .



Flagger, , , . , Jenkins X , .



Jenkins X, , Flagger Istio Canary Deployments , , .



/



https://jenkins-x.io/docs/managing-jx/tutorials/progressive-delivery/



https://docs.flagger.app/usage/progressive-delivery





(. . — CKAD — https://killer.sh/ )




All Articles