From cd3f38b429a512c76c152db33ea7d5cd219538d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?=
- This QR code will give you my contact info as well as a link to a feedback form. + If you'd like me to send you a copy of the recording of the workshop + and of the training materials, + please scan that QR code to leave me your + contact information. Thank you!
-- If you liked this workshop, I can train your team, in person or online, with custom - courses of any length and any level, on Docker, Kubernetes, and MLops. -
-qrcode: https://2024-11-qconsf.container.training/#contact +qrcode: https://2024-11-qconsf.container.training/q thing: Kubernetes cluster -image: logo-kubernetes.png +image: logo-bento.svg diff --git a/slides/_redirects b/slides/_redirects index 68a7c0ca..b22472e6 100644 --- a/slides/_redirects +++ b/slides/_redirects @@ -2,6 +2,7 @@ #/ /kube-halfday.yml.html 200! #/ /kube-fullday.yml.html 200! #/ /kube-twodays.yml.html 200! +/ /mlops.yml.html 200! # And this allows to do "git clone https://container.training". /info/refs service=git-upload-pack https://github.com/jpetazzo/container.training/info/refs?service=git-upload-pack @@ -12,7 +13,7 @@ #/kubernetesmastery https://www.udemy.com/course/kubernetesmastery/?couponCode=DOCKERALLDAY # Shortlink for the QRCode -/q /qrcode.html 200 +/q https://docs.google.com/forms/d/e/1FAIpQLScYloWur4uVhKgVNIdUrfHZ8pk_mBmPcQwmbhjK2FlR9KWDCA/viewform # Shortlinks for next training in English and French #/next https://www.eventbrite.com/e/livestream-intensive-kubernetes-bootcamp-tickets-103262336428 @@ -21,5 +22,3 @@ /us https://www.ardanlabs.com/live-training-events/deploying-microservices-and-traditional-applications-with-kubernetes-march-28-2022.html /uk https://skillsmatter.com/workshops/827-deploying-microservices-and-traditional-applications-with-kubernetes-with-jerome-petazzoni -# Survey form -/please https://docs.google.com/forms/d/e/1FAIpQLSfIYSgrV7tpfBNm1hOaprjnBHgWKn5n-k5vtNXYJkOX1sRxng/viewform diff --git a/slides/k8s/prereqs-advanced.md b/slides/k8s/prereqs-advanced.md index 18996679..df785093 100644 --- a/slides/k8s/prereqs-advanced.md +++ b/slides/k8s/prereqs-advanced.md @@ -1,4 +1,4 @@ -# Pre-requirements +## Pre-requirements - Kubernetes concepts diff --git a/slides/k8s/resource-limits.md b/slides/k8s/resource-limits.md index efdf8976..5721ff36 100644 --- a/slides/k8s/resource-limits.md +++ b/slides/k8s/resource-limits.md @@ -606,246 +606,6 @@ per Pod, but it's not [officially documented yet](https://github.com/kubernetes/ --- -# Namespace quotas - -- We can also set quotas per namespace - -- Quotas apply to the total usage in a namespace - - (e.g. total CPU limits of all pods in a given namespace) - -- Quotas can apply to resource limits and/or requests - - (like the CPU and memory limits that we saw earlier) - -- Quotas can also apply to other resources: - - - "extended" resources (like GPUs) - - - storage size - - - number of objects (number of pods, services...) - ---- - -## Creating a quota for a namespace - -- Quotas are enforced by creating a ResourceQuota object - -- ResourceQuota objects are namespaced, and apply to their namespace only - -- We can have multiple ResourceQuota objects in the same namespace - -- The most restrictive values are used - ---- - -## Limiting total CPU/memory usage - -- The following YAML specifies an upper bound for *limits* and *requests*: - ```yaml - apiVersion: v1 - kind: ResourceQuota - metadata: - name: a-little-bit-of-compute - spec: - hard: - requests.cpu: "10" - requests.memory: 10Gi - limits.cpu: "20" - limits.memory: 20Gi - ``` - -These quotas will apply to the namespace where the ResourceQuota is created. - ---- - -## Limiting number of objects - -- The following YAML specifies how many objects of specific types can be created: - ```yaml - apiVersion: v1 - kind: ResourceQuota - metadata: - name: quota-for-objects - spec: - hard: - pods: 100 - services: 10 - secrets: 10 - configmaps: 10 - persistentvolumeclaims: 20 - services.nodeports: 0 - services.loadbalancers: 0 - count/roles.rbac.authorization.k8s.io: 10 - ``` - -(The `count/` syntax allows limiting arbitrary objects, including CRDs.) - ---- - -## YAML vs CLI - -- Quotas can be created with a YAML definition - -- ...Or with the `kubectl create quota` command - -- Example: - ```bash - kubectl create quota my-resource-quota --hard=pods=300,limits.memory=300Gi - ``` - -- With both YAML and CLI form, the values are always under the `hard` section - - (there is no `soft` quota) - ---- - -## Viewing current usage - -When a ResourceQuota is created, we can see how much of it is used: - -``` -kubectl describe resourcequota my-resource-quota - -Name: my-resource-quota -Namespace: default -Resource Used Hard --------- ---- ---- -pods 12 100 -services 1 5 -services.loadbalancers 0 0 -services.nodeports 0 0 -``` - ---- - -## Advanced quotas and PriorityClass - -- Pods can have a *priority* - -- The priority is a number from 0 to 1000000000 - - (or even higher for system-defined priorities) - -- High number = high priority = "more important" Pod - -- Pods with a higher priority can *preempt* Pods with lower priority - - (= low priority pods will be *evicted* if needed) - -- Useful when mixing workloads in resource-constrained environments - ---- - -## Setting the priority of a Pod - -- Create a PriorityClass - - (or use an existing one) - -- When creating the Pod, set the field `spec.priorityClassName` - -- If the field is not set: - - - if there is a PriorityClass with `globalDefault`, it is used - - - otherwise, the default priority will be zero - ---- - -class: extra-details - -## PriorityClass and ResourceQuotas - -- A ResourceQuota can include a list of *scopes* or a *scope selector* - -- In that case, the quota will only apply to the scoped resources - -- Example: limit the resources allocated to "high priority" Pods - -- In that case, make sure that the quota is created in every Namespace - - (or use *admission configuration* to enforce it) - -- See the [resource quotas documentation][quotadocs] for details - -[quotadocs]: https://kubernetes.io/docs/concepts/policy/resource-quotas/#resource-quota-per-priorityclass - ---- - -# Limiting resources in practice - -- We have at least three mechanisms: - - - requests and limits per Pod - - - LimitRange per namespace - - - ResourceQuota per namespace - -- Let's see one possible strategy to get started with resource limits - ---- - -## Set a LimitRange - -- In each namespace, create a LimitRange object - -- Set a small default CPU request and CPU limit - - (e.g. "100m") - -- Set a default memory request and limit depending on your most common workload - - - for Java, Ruby: start with "1G" - - - for Go, Python, PHP, Node: start with "250M" - -- Set upper bounds slightly below your expected node size - - (80-90% of your node size, with at least a 500M memory buffer) - ---- - -## Set a ResourceQuota - -- In each namespace, create a ResourceQuota object - -- Set generous CPU and memory limits - - (e.g. half the cluster size if the cluster hosts multiple apps) - -- Set generous objects limits - - - these limits should not be here to constrain your users - - - they should catch a runaway process creating many resources - - - example: a custom controller creating many pods - ---- - -## Observe, refine, iterate - -- Observe the resource usage of your pods - - (we will see how in the next chapter) - -- Adjust individual pod limits - -- If you see trends: adjust the LimitRange - - (rather than adjusting every individual set of pod limits) - -- Observe the resource usage of your namespaces - - (with `kubectl describe resourcequota ...`) - -- Rinse and repeat regularly - ---- - ## Underutilization - Remember: when assigning a pod to a node, the scheduler looks at *requests* diff --git a/slides/logistics-template.md b/slides/logistics-template.md index fe7d8986..7fc342aa 100644 --- a/slides/logistics-template.md +++ b/slides/logistics-template.md @@ -1,82 +1,68 @@ ## Introductions -⚠️ This slide should be customized by the tutorial instructor(s). +Hello! We are: - - - - - - - - - - - - -[@alexbuisine]: https://twitter.com/alexbuisine [EphemeraSearch]: https://ephemerasearch.com/ [@jpetazzo]: https://twitter.com/jpetazzo +[aj-github]: https://github.com/soulshake +[aj-linkedin]: https://linkedin.com/in/ajbowen +[jp-linkedin]: https://linkedin.com/in/jpetazzo [@jpetazzo@hachyderm.io]: https://hachyderm.io/@jpetazzo -[@s0ulshake]: https://twitter.com/s0ulshake -[Quantgene]: https://www.quantgene.com/ --- -## Exercises +## Schedule -- At the end of each day, there is a series of exercises +| | | +|-------------|--------------| +| 9:00-10:30 | Workshop | +| 10:30-10:45 | Coffee break | +| 10:45-12:00 | Workshop | +| 12:00-13:00 | Lunch | +| 13:00-14:30 | Workshop | +| 14:30-14:45 | Coffee break | +| 14:45-16:00 | Workshop | -- To make the most out of the training, please try the exercises! +--- - (it will help to practice and memorize the content of the day) +## Emojis -- We recommend to take at least one hour to work on the exercises +Here are some emojis that we'll run across today: - (if you understood the content of the day, it will be much faster) +⚠️ Warning! Pay attention to this. + +💡 This sounds like a good idea! + +🙋 Choose your adventure! Pick a side. + +🏗️ Let's build something! Lab time. + +--- + +## Recording + +- I'm going to try and record the workshop + + (on a best effort basis, using whatever equipment I could fit in my carry-on!😅) + +- If you would like to receive a copy of the recording: + + *leave your contact info in the feedback form (address on the last slide)!* + +- The camera will only record me (not the audience) + +- If you want to ask a question "off the record": tell me and I'll pause the recording -- Each day will start with a quick review of the exercises of the previous day diff --git a/slides/mlops.yml b/slides/mlops.yml index 466bb76a..8d972a2b 100644 --- a/slides/mlops.yml +++ b/slides/mlops.yml @@ -7,7 +7,7 @@ chat: "In person!" gitrepo: github.com/jpetazzo/container.training -slides: https://FIXME.container.training/ +slides: https://2024-11-qconsf.container.training/ #slidenumberprefix: "#SomeHashTag — " @@ -16,6 +16,7 @@ exclude: content: - shared/title.md +- shared/contact.md - logistics.md - shared/about-slides.md #- shared/chat-room-im.md