{"id":49926,"date":"2025-07-02T17:52:27","date_gmt":"2025-07-02T17:52:27","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49926"},"modified":"2025-07-02T17:52:27","modified_gmt":"2025-07-02T17:52:27","slug":"canary-releases-a-complete-beginner-to-advanced-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/canary-releases-a-complete-beginner-to-advanced-tutorial\/","title":{"rendered":"Canary Releases: A Complete Beginner-to-Advanced Tutorial"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"1-introduction-to-canary-releases\">1. Introduction to Canary Releases<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">What Are Canary Releases?<\/h2>\n\n\n\n<p>A <strong>Canary Release<\/strong> is a progressive deployment strategy where a new version of software is rolled out to a small subset of users or servers before being gradually released to the entire user base. This approach allows teams to monitor the new version\u2019s performance and catch issues early, minimizing the risk of widespread outages.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Are They Important in Progressive Delivery?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Risk Mitigation:<\/strong> Issues are caught early with minimal user impact.<\/li>\n\n\n\n<li><strong>Faster Feedback:<\/strong> Real-world usage provides immediate validation.<\/li>\n\n\n\n<li><strong>Continuous Delivery:<\/strong> Enables frequent, safe deployments.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">History and Origin<\/h2>\n\n\n\n<p>The term &#8220;canary release&#8221; comes from the phrase <strong>&#8220;canary in a coal mine&#8221;<\/strong>. Miners used to bring canaries underground; if the canary showed signs of distress, it signaled the presence of dangerous gases, warning miners to evacuate. Similarly, in software, a canary deployment exposes a small portion of users to new code to detect problems before full rollout.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Real-World Analogy<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Analogy:<\/strong><br>Deploying a new version to 5% of users first is like sending a canary into the coal mine. If the canary (your early users) is healthy, the rest of the miners (your full user base) can safely enter.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Canary vs. Blue-Green, Rolling, and A\/B Testing<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Strategy<\/th><th>Rollout Pattern<\/th><th>Rollback<\/th><th>Use Case<\/th><\/tr><\/thead><tbody><tr><td><strong>Canary<\/strong><\/td><td>Gradual, % based<\/td><td>Easy<\/td><td>Risky changes, monitoring<\/td><\/tr><tr><td><strong>Blue-Green<\/strong><\/td><td>All-or-nothing<\/td><td>Instant<\/td><td>Zero downtime, rollback<\/td><\/tr><tr><td><strong>Rolling<\/strong><\/td><td>Batch by batch<\/td><td>Gradual<\/td><td>Stateless, large clusters<\/td><\/tr><tr><td><strong>A\/B Testing<\/strong><\/td><td>Split by feature<\/td><td>N\/A<\/td><td>Feature validation<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Quiz: Section 1<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>What is the primary purpose of a canary release?<br>a) Reduce infrastructure cost<br>b) Test new code on a small subset of users<br>c) Increase deployment speed<br>d) None of the above<\/li>\n<\/ol>\n\n\n\n<p>&lt;details&gt; &lt;summary&gt;Answer&lt;\/summary&gt; b) Test new code on a small subset of users &lt;\/details&gt;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"2-core-concepts\">2. Core Concepts<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Gradual Rollout and Controlled Exposure<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Start Small:<\/strong> Deploy to a small % (e.g., 1-5%) of users or servers.<\/li>\n\n\n\n<li><strong>Monitor:<\/strong> Observe metrics and logs for errors or regressions.<\/li>\n\n\n\n<li><strong>Expand:<\/strong> If healthy, increase traffic to the new version in stages.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Traffic Segmentation<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>By user group:<\/strong> e.g., internal users, beta testers.<\/li>\n\n\n\n<li><strong>By region:<\/strong> e.g., only US-East.<\/li>\n\n\n\n<li><strong>By request type:<\/strong> e.g., mobile vs. web.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Metrics-Based Validation<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SLOs (Service Level Objectives):<\/strong> e.g., 99.9% successful requests.<\/li>\n\n\n\n<li><strong>Error Budgets:<\/strong> Allowed error rate before rollback.<\/li>\n\n\n\n<li><strong>Latency Thresholds:<\/strong> e.g., p95 latency &lt; 200ms.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Automated Rollback Triggers<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Health Checks:<\/strong> Automated checks for error rates, latency spikes.<\/li>\n\n\n\n<li><strong>Rollback:<\/strong> Revert if metrics breach thresholds.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Tip:<\/strong> Automate rollback to minimize human error and speed recovery.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Quiz: Section 2<\/strong><\/h2>\n\n\n\n<p>What metric is commonly used to determine if a canary deployment should proceed?<br>a) Number of servers<br>b) Error rate and latency<br>c) Deployment time<br>d) Number of users &lt;details&gt; &lt;summary&gt;Answer&lt;\/summary&gt; b) Error rate and latency &lt;\/details&gt;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"3-use-cases-for-canary-releases\">3. Use Cases for Canary Releases<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Feature Testing in Production:<\/strong> Validate new features with real users.<\/li>\n\n\n\n<li><strong>Version Upgrades:<\/strong> Safely roll out new versions of APIs or services.<\/li>\n\n\n\n<li><strong>Multi-Tenant Deployments:<\/strong> Test changes on specific customers or tenants.<\/li>\n\n\n\n<li><strong>Hypothesis-Driven Development:<\/strong> Experiment with new ideas and measure impact.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Quiz: Section 3<\/strong><\/h2>\n\n\n\n<p>Which scenario is NOT a good use case for canary releases?<br>a) Testing a new payment gateway<br>b) Changing static website content<br>c) Upgrading a critical backend API<br>d) Running a new feature experiment &lt;details&gt; &lt;summary&gt;Answer&lt;\/summary&gt; b) Changing static website content &lt;\/details&gt;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"4-step-by-step-implementation-guides\">4. Step-by-Step Implementation Guides<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Kubernetes (Istio, Linkerd, Flagger, Argo Rollouts)<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Using Istio for Weighted Routing<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Deploy both old and new versions as Kubernetes Deployments.<\/strong><\/li>\n\n\n\n<li><strong>Create Istio VirtualService to split traffic.<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>apiVersion: networking.istio.io\/v1alpha3\nkind: VirtualService\nmetadata:\n  name: myapp\nspec:\n  hosts:\n    - myapp.example.com\n  http:\n    - route:\n        - destination:\n            host: myapp\n            subset: v1\n          weight: 90\n        - destination:\n            host: myapp\n            subset: v2\n          weight: 10\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Using Flagger for Automated Canary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Flagger automates canary analysis and promotion\/rollback.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>apiVersion: flagger.app\/v1beta1\nkind: Canary\nmetadata:\n  name: myapp\nspec:\n  targetRef:\n    apiVersion: apps\/v1\n    kind: Deployment\n    name: myapp\n  service:\n    port: 80\n  analysis:\n    interval: 1m\n    threshold: 5\n    metrics:\n      - name: request-success-rate\n        threshold: 99\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Using Argo Rollouts<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>apiVersion: argoproj.io\/v1alpha1\nkind: Rollout\nmetadata:\n  name: myapp\nspec:\n  replicas: 5\n  strategy:\n    canary:\n      steps:\n        - setWeight: 20\n        - pause: {duration: 5m}\n        - setWeight: 50\n        - pause: {duration: 10m}\n  selector:\n    matchLabels:\n      app: myapp\n  template:\n    metadata:\n      labels:\n        app: myapp\n    spec:\n      containers:\n        - name: myapp\n          image: myapp:v2\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">AWS (ALB Weighted Target Groups, Lambda Aliases)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ALB:<\/strong> Use weighted target groups to direct a percentage of traffic to the new version.<\/li>\n\n\n\n<li><strong>Lambda:<\/strong> Use alias weights to split invocations between versions.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">json<code>{\n  \"RoutingConfig\": {\n    \"AdditionalVersionWeights\": {\n      \"2\": 0.1\n    }\n  }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Azure Traffic Manager or App Gateway<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use Traffic Manager&#8217;s weighted routing to send a percentage of requests to the canary deployment.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Spinnaker, Jenkins X, ArgoCD (GitOps)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use pipelines to automate canary deployment, monitoring, and rollback.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Terraform, Helm, Ansible<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use Terraform\/Helm to define infrastructure and rollout policies.<\/li>\n\n\n\n<li>Use Ansible for orchestrating deployment steps.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Quiz: Section 4<\/strong><\/h2>\n\n\n\n<p>Which tool is NOT typically used for canary deployments in Kubernetes?<br>a) Istio<br>b) Flagger<br>c) Argo Rollouts<br>d) AWS CloudFormation &lt;details&gt; &lt;summary&gt;Answer&lt;\/summary&gt; d) AWS CloudFormation &lt;\/details&gt;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"5-code-snippets-and-yamls\">5. Code Snippets and YAMLs<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Kubernetes Canary Annotation (Simple Example)<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: myapp-canary\n  labels:\n    canary: \"true\"\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: myapp\n        version: canary\n    spec:\n      containers:\n        - name: myapp\n          image: myapp:v2\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">NGINX Ingress Weighted Routing<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: myapp\n  annotations:\n    nginx.ingress.kubernetes.io\/canary: \"true\"\n    nginx.ingress.kubernetes.io\/canary-weight: \"10\"\nspec:\n  rules:\n    - host: myapp.example.com\n      http:\n        paths:\n          - path: \/\n            backend:\n              service:\n                name: myapp\n                port:\n                  number: 80\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Jenkins Pipeline Example<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">groovy<code>pipeline {\n  stages {\n    stage('Deploy Canary') {\n      steps {\n        sh 'kubectl apply -f myapp-canary.yaml'\n      }\n    }\n    stage('Monitor Canary') {\n      steps {\n        <em>\/\/ Add monitoring and validation logic here<\/em>\n      }\n    }\n    stage('Promote to Production') {\n      when { expression { isCanaryHealthy() } }\n      steps {\n        sh 'kubectl apply -f myapp-prod.yaml'\n      }\n    }\n  }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"6-architecture-diagrams\">6. Architecture Diagrams<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Canary Deployment Flow<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>flowchart LR\n    User --&gt; LB[Load Balancer]\n    LB --&gt;|90%| Old[Old Version]\n    LB --&gt;|10%| Canary[Canary Version]\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Traffic Control Using Service Mesh<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>graph TD\n    User --&gt; Ingress\n    Ingress --&gt; Istio[Istio Gateway]\n    Istio --&gt;|Weighted Routing| v1[Service v1]\n    Istio --&gt;|Weighted Routing| v2[Service v2 (Canary)]\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Automated Rollback Decision Tree<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>graph TD\n    A[Deploy Canary] --&gt; B[Monitor Metrics]\n    B --&gt;|Healthy| C[Increase Traffic]\n    B --&gt;|Unhealthy| D[Rollback Canary]\n    C --&gt;|Repeat| B\n    C --&gt;|100%| E[Full Release]\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"7-monitoring-observability--alerting\">7. Monitoring, Observability &amp; Alerting<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prometheus:<\/strong> Scrape metrics from canary and prod.<\/li>\n\n\n\n<li><strong>Datadog\/New Relic:<\/strong> Monitor error rates, latency, and custom business metrics.<\/li>\n\n\n\n<li><strong>AWS CloudWatch:<\/strong> Set alarms on Lambda, ECS, or ALB metrics.<\/li>\n\n\n\n<li><strong>Dashboards:<\/strong> Visualize canary and baseline side-by-side.<\/li>\n\n\n\n<li><strong>Error Budgets:<\/strong> Track allowed error rates during rollout.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code># Prometheus alert for error rate\n- alert: HighErrorRate\n  expr: sum(rate(http_errors_total{app=\"myapp\",version=\"canary\"}[5m])) &gt; 0.05\n  for: 5m\n  labels:\n    severity: critical\n  annotations:\n    summary: \"High error rate detected on canary\"\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"8-risks-limitations-and-mitigation-strategies\">8. Risks, Limitations, and Mitigation Strategies<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Risk<\/th><th>Description<\/th><th>Mitigation<\/th><\/tr><\/thead><tbody><tr><td>Canary Pollution<\/td><td>Canary affects shared resources (e.g., DB)<\/td><td>Isolate canary, use feature flags<\/td><\/tr><tr><td>Manual Override Errors<\/td><td>Human error in traffic shifting<\/td><td>Automate rollbacks, approvals<\/td><\/tr><tr><td>Config Drift<\/td><td>Canary and prod configs diverge<\/td><td>Use GitOps, IaC<\/td><\/tr><tr><td>Observability Overload<\/td><td>Too many metrics, high cardinality<\/td><td>Aggregate, sample, alert wisely<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Warning:<\/strong> Always test rollback procedures and monitor shared dependencies.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"9-best-practices-and-patterns\">9. Best Practices and Patterns<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Progressive Exposure:<\/strong> Increase traffic in steps (5% \u2192 20% \u2192 50% \u2192 100%).<\/li>\n\n\n\n<li><strong>Bake Times:<\/strong> Wait and observe after each increment.<\/li>\n\n\n\n<li><strong>Automated Rollback:<\/strong> Trigger rollback on SLO breach.<\/li>\n\n\n\n<li><strong>Feature Toggles:<\/strong> Combine with canary for safer releases.<\/li>\n\n\n\n<li><strong>Real User Monitoring (RUM):<\/strong> Measure actual user experience.<\/li>\n\n\n\n<li><strong>Synthetic Tests:<\/strong> Run automated checks during rollout.<\/li>\n\n\n\n<li><strong>Canary Analysis:<\/strong> Use ML or scoring tools for advanced validation.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Tip:<\/strong> Use tools like Flagger or Argo Rollouts for automated canary analysis and promotion.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"10-real-world-examples-and-use-cases\">10. Real-world Examples and Use Cases<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Web App Deployments:<\/strong> Safely roll out UI changes.<\/li>\n\n\n\n<li><strong>Mobile Backend APIs:<\/strong> Test new API versions with a subset of clients.<\/li>\n\n\n\n<li><strong>E-commerce:<\/strong> Experiment with price or promotion logic for a small segment.<\/li>\n\n\n\n<li><strong>SaaS:<\/strong> Gradually migrate tenants to a new microservice.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"11-sample-github-projects-or-templates\">11. Sample GitHub Projects or Templates<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/weaveworks\/flagger\" target=\"_blank\" rel=\"noreferrer noopener\">Flagger Canary Deployment Example<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/argoproj\/argo-rollouts\/tree\/master\/examples\" target=\"_blank\" rel=\"noreferrer noopener\">Argo Rollouts Examples<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/aws-samples\/lambda-canary-deployments\" target=\"_blank\" rel=\"noreferrer noopener\">AWS Lambda Canary Deployments<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/nginxinc\/kubernetes-ingress\/tree\/main\/examples\/canary\" target=\"_blank\" rel=\"noreferrer noopener\">Kubernetes Canary Ingress Demo<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"12-glossary\">12. Glossary<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Term<\/th><th>Definition<\/th><\/tr><\/thead><tbody><tr><td>Canary Release<\/td><td>Gradual rollout to a subset of users\/servers<\/td><\/tr><tr><td>SLO<\/td><td>Service Level Objective (performance\/availability goal)<\/td><\/tr><tr><td>Error Budget<\/td><td>Allowed error rate before rollback<\/td><\/tr><tr><td>Bake Time<\/td><td>Wait period after deploying canary<\/td><\/tr><tr><td>Weighted Routing<\/td><td>Directing % of traffic to different versions<\/td><\/tr><tr><td>Rollback<\/td><td>Reverting to previous stable version<\/td><\/tr><tr><td>Canary Analysis<\/td><td>Automated validation of canary health<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"13-faqs\">13. FAQs<\/h2>\n\n\n\n<p><strong>Q: How much traffic should my canary receive initially?<\/strong><br>A: Start small (1-5%), then progressively increase if healthy.<\/p>\n\n\n\n<p><strong>Q: Can I use canary releases for database schema changes?<\/strong><br>A: Only if schema is backward-compatible and canary is isolated.<\/p>\n\n\n\n<p><strong>Q: What\u2019s the difference between canary and A\/B testing?<\/strong><br>A: Canary tests stability; A\/B tests features or user experience.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"14-quiz\">14. Quiz<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>What is the main goal of a canary release?<br>a) Reduce deployment time<br>b) Test new code with minimal risk<br>c) Increase traffic<br>d) None of the above<\/li>\n\n\n\n<li>Which tool automates canary analysis in Kubernetes?<br>a) Flagger<br>b) Jenkins<br>c) Terraform<br>d) NGINX only<\/li>\n\n\n\n<li>What is a \u201cbake time\u201d in canary deployments?<br>a) Time to build Docker images<br>b) Wait period to observe canary health<br>c) Time to rollback<br>d) None of the above<\/li>\n\n\n\n<li>What is a common risk in canary deployments?<br>a) Canary pollution<br>b) Reduced observability<br>c) Increased deployment speed<br>d) All of the above<\/li>\n<\/ol>\n\n\n\n<p><strong>Answers:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>b<\/li>\n\n\n\n<li>a<\/li>\n\n\n\n<li>b<\/li>\n\n\n\n<li>a<\/li>\n<\/ol>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Congratulations!<\/strong><br>You now have a solid understanding of canary releases, from core concepts to advanced implementation. Try out the sample repos and start practicing canary deployments in your own projects!<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction to Canary Releases What Are Canary Releases? A Canary Release is a progressive deployment strategy where a new version of software is rolled out to a small subset&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49926","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49926"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49926\/revisions"}],"predecessor-version":[{"id":49927,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49926\/revisions\/49927"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}