{
    "componentChunkName": "component---src-templates-docs-js",
    "path": "/deploy-scalable-software/week-6",
    "result": {"data":{"site":{"siteMetadata":{"title":"Linnaeus University","language":"en","courseCode":"2DV013"}},"mdx":{"fields":{"id":"ebcd4388-948b-54ca-95e2-a223e2e87f68","title":"Week 6: Release and wrap up","slug":"/deploy-scalable-software/week-6"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Week 6: Release and wrap up\",\n  \"metaTitle\": \"2DV013 | Deploy scalable software | Week 6: Release and wrap up\",\n  \"metaDescription\": \"A tag deploys to the cluster without downtime, and you finish by tearing it down.\",\n  \"order\": 7\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", null, \"Week 6: Release and wrap up\"), mdx(\"p\", null, \"The last week makes releasing routine. The pipeline deploys to the cluster, a release replaces pods one at a time so visitors do not notice, and a bad release can be taken back. HTTPS on the cluster is optional. You finish by looking critically at your setup, completing your reports and destroying the cluster.\"), mdx(\"p\", null, \"Destroying the cluster cannot be undone. Do it only when everything is pushed and the reports are written.\"), mdx(\"h2\", null, \"Issues\"), mdx(\"p\", null, \"Work through the issues in order, in your own repository. Each one builds on the one before.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Issue\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"What you do\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"deploy-from-ci\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The pipeline applies your manifests to the cluster when you push a tag.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"rolling-updates\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A release without downtime, and two ways to take a bad one back.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"https-traefik\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Optional: HTTPS from the cluster with a Campus CA certificate.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"wrap-up\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A last look at the cluster, the six weekly reports (with a reflection on the shortcuts in your setup), and \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"terraform destroy\"), \".\")))), mdx(\"p\", null, \"Write the week report in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"report/week-6.md\"), \" after the last issue.\"), mdx(\"p\", null, \"When everything is done, hand in with a merge request, see \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"./assignment-2\"\n  }, \"Assignment 2\"), \".\"), mdx(\"h2\", null, \"Slide decks\"), mdx(\"p\", null, \"Each deck is a self-study lecture of about 15\\u201320 minutes, except the intro, which takes about five.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../slides/deploy-scalable-software/week6-0-intro/slides.html\"\n  }, \"Week 6 intro\"), \": what the week asks of you\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../slides/deploy-scalable-software/week6-1-cd-to-cluster/slides.html\"\n  }, \"CD to the cluster\"), \": deploying over ssh, and least privilege\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../slides/deploy-scalable-software/week6-2-rolling-updates/slides.html\"\n  }, \"Rolling updates\"), \": zero-downtime releases and rollback\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../slides/deploy-scalable-software/week6-3-https-traefik/slides.html\"\n  }, \"HTTPS with Traefik\"), \": TLS termination on the cluster (optional)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../slides/deploy-scalable-software/week6-4-production-gaps/slides.html\"\n  }, \"Production gaps\"), \": what this setup is not, and tearing it down\")), mdx(\"h2\", null, \"Reading material\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"docs/CI.md\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"docs/K3S.md\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"docs/KUBERNETES.md\"), \" in your repo\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#rolling-update-deployment\"\n  }, \"Deployments: rolling update\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://kubernetes.io/docs/reference/kubectl/generated/kubectl_rollout/\"\n  }, \"kubectl rollout\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://doc.traefik.io/traefik/https/acme/\"\n  }, \"Traefik: ACME\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://docs.k3s.io/datastore/ha-embedded\"\n  }, \"k3s: high availability\"))));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#week-6-release-and-wrap-up","title":"Week 6: Release and wrap up"},{"url":"#issues","title":"Issues"},{"url":"#slide-decks","title":"Slide decks"},{"url":"#reading-material","title":"Reading material"}]},"parent":{"relativePath":"deploy-scalable-software/week-6.md"},"frontmatter":{"metaTitle":"2DV013 | Deploy scalable software | Week 6: Release and wrap up","metaDescription":"A tag deploys to the cluster without downtime, and you finish by tearing it down.","fullWidth":null}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/deploy-scalable-software","title":"02 - Deploy scalable software"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/assignment-2","title":"Assignment 2"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-1","title":"Week 1: Provision and deploy a server"}}},{"node":{"fields":{"slug":"/","title":"Cloud Native Applications (2DV013)"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-2","title":"Week 2: A server app in a container"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-3","title":"Week 3: Databases and Compose"}}},{"node":{"fields":{"slug":"/group-project/assignment-3","title":"Assignment 3"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-4","title":"Week 4: Kubernetes locally"}}},{"node":{"fields":{"slug":"/group-project/kravspec-egen","title":"Kravspec (egen)"}}},{"node":{"fields":{"slug":"/group-project/kravspec-standard","title":"Kravspec (standard)"}}},{"node":{"fields":{"slug":"/group-project/letter-to-customer","title":"Brev till företagskontakt"}}},{"node":{"fields":{"slug":"/group-project/week-12","title":"Course week 12: Project kick-off"}}},{"node":{"fields":{"slug":"/group-project/week-20","title":"Course week 20: Delivery and presentation"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-5","title":"Week 5: A real cluster"}}},{"node":{"fields":{"slug":"/group-project","title":"03 - Group Project"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-6","title":"Week 6: Release and wrap up"}}},{"node":{"fields":{"slug":"/infrastructure/assignment","title":"Assignment 1"}}},{"node":{"fields":{"slug":"/infrastructure/cloud","title":"University Cloud"}}},{"node":{"fields":{"slug":"/infrastructure","title":"01 - Infrastructure"}}},{"node":{"fields":{"slug":"/infrastructure/wsl","title":"WSL"}}},{"node":{"fields":{"slug":"/study-guide/communication","title":"Communication"}}},{"node":{"fields":{"slug":"/study-guide/exams","title":"Exams"}}},{"node":{"fields":{"slug":"/infrastructure/overview","title":"Overview"}}},{"node":{"fields":{"slug":"/study-guide/expectations","title":"Expectations"}}},{"node":{"fields":{"slug":"/study-guide","title":"Study Guide"}}},{"node":{"fields":{"slug":"/study-guide/instructors","title":"Instructors"}}},{"node":{"fields":{"slug":"/study-guide/readings","title":"Readings"}}},{"node":{"fields":{"slug":"/what-is-cloud-native","title":"0 - What is cloud native?"}}},{"node":{"fields":{"slug":"/what-is-cloud-native/overview","title":"Overview"}}},{"node":{"fields":{"slug":"/study-guide/registration","title":"Registration"}}}]}},"pageContext":{"id":"ebcd4388-948b-54ca-95e2-a223e2e87f68"}},
    "staticQueryHashes": ["253607798","3706406642","710574383"]}