{
    "componentChunkName": "component---src-templates-docs-js",
    "path": "/deploy-scalable-software/week-5",
    "result": {"data":{"site":{"siteMetadata":{"title":"Linnaeus University","language":"en","courseCode":"2DV013"}},"mdx":{"fields":{"id":"ab4545e0-4b8a-5549-b5b3-d006c1d0b176","title":"Week 5: A real cluster","slug":"/deploy-scalable-software/week-5"},"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 5: A real cluster\",\n  \"metaTitle\": \"2DV013 | Deploy scalable software | Week 5: A real cluster\",\n  \"metaDescription\": \"The same app on a three-node k3s cluster in OpenStack, with storage and health checks.\",\n  \"order\": 6\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 5: A real cluster\"), mdx(\"p\", null, \"The manifests from last week meet a real cluster. Terraform and Ansible build a k3s cluster, first one node and then three, and you deploy by hand. Then you give the databases storage that outlives their pods and teach Kubernetes what a healthy pod is.\"), mdx(\"p\", null, \"Keep the 2 GB flavor you chose in week 1. k3s does not run well on 1 GB.\"), 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  }, \"k3s-one-node\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Replace the single server with a one-node k3s cluster and reach it with \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"kubectl\"), \".\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"deploy-manually\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Your manifests on the cluster, with the image from GitLab's registry and Traefik as Ingress.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"add-nodes\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Change one number in Terraform and the cluster has three nodes.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"persistent-storage\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"PersistentVolumeClaims for MongoDB and Redis.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"health-checks\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Readiness and liveness probes, tested against a bad update.\")))), mdx(\"p\", null, \"Write the week report in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"report/week-5.md\"), \" after the last issue.\"), 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/week5-0-intro/slides.html\"\n  }, \"Week 5 intro\"), \": what the week asks of you\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../slides/deploy-scalable-software/week5-1-cluster/slides.html\"\n  }, \"The cluster\"), \": k3s, server and agent nodes, and single points of failure\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../slides/deploy-scalable-software/week5-2-ingress/slides.html\"\n  }, \"Ingress\"), \": getting traffic from the internet to a Service\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../slides/deploy-scalable-software/week5-3-storage/slides.html\"\n  }, \"Storage\"), \": PersistentVolumes and what ties a database pod to a node\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../slides/deploy-scalable-software/week5-4-health-checks/slides.html\"\n  }, \"Health checks\"), \": readiness against liveness\")), mdx(\"h2\", null, \"Reading material\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"docs/K3S.md\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"docs/TERRAFORM.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://docs.k3s.io/\"\n  }, \"k3s documentation\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://kubernetes.io/docs/concepts/services-networking/ingress/\"\n  }, \"Ingress\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://kubernetes.io/docs/concepts/storage/persistent-volumes/\"\n  }, \"Persistent Volumes\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://kubernetes.io/docs/concepts/configuration/liveness-readiness-startup-probes/\"\n  }, \"Liveness, readiness and startup probes\"))));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#week-5-a-real-cluster","title":"Week 5: A real cluster"},{"url":"#issues","title":"Issues"},{"url":"#slide-decks","title":"Slide decks"},{"url":"#reading-material","title":"Reading material"}]},"parent":{"relativePath":"deploy-scalable-software/week-5.md"},"frontmatter":{"metaTitle":"2DV013 | Deploy scalable software | Week 5: A real cluster","metaDescription":"The same app on a three-node k3s cluster in OpenStack, with storage and health checks.","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":"ab4545e0-4b8a-5549-b5b3-d006c1d0b176"}},
    "staticQueryHashes": ["253607798","3706406642","710574383"]}