From ba376feb1091ee2ada0dc55a4b510e12df172449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Wed, 10 Dec 2025 19:46:10 -0600 Subject: [PATCH] =?UTF-8?q?=F0=9F=8F=AD=EF=B8=8F=20Big=20refactoring=20of?= =?UTF-8?q?=20December=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The structure of each deck should now be: - title slide - logistics (for live classes) - chat room info (for live classes) - shared/about-slides - */prereqs* (when relevant; mostly k8s classes) - shared/handson - */labs-live (for live classes) - shared/connecting (for live classes) - */labs-async - toc This is more uniform across the different courses (live and async; containers and K8S). --- slides/containers/Training_Environment.md | 171 -------------- slides/containers/intro.md | 39 --- slides/containers/labs-async.md | 19 ++ slides/containers/labs-live.md | 43 ++++ slides/intro-fullday.yml | 8 +- slides/intro-selfpaced.yml | 10 +- slides/intro-twodays.yml | 8 +- slides/k8s/intro.md | 37 --- slides/k8s/labs-async.md | 275 ++++++++++++++++++++++ slides/k8s/labs-live.md | 42 ++++ slides/k8s/prereqs-advanced.md | 14 +- slides/k8s/prereqs-basic.md | 17 ++ slides/kadm-fullday.yml | 10 +- slides/kadm-twodays.yml | 12 +- slides/kube-adv.yml | 12 +- slides/kube-fullday.yml | 13 +- slides/kube-halfday.yml | 19 +- slides/kube-selfpaced.yml | 13 +- slides/kube-twodays.yml | 13 +- slides/mlops.yml | 3 + slides/shared/about-slides.md | 26 ++ slides/shared/connecting.md | 157 ++++++------ slides/shared/handson.md | 160 ++----------- slides/shared/prereqs.md | 19 -- slides/swarm-fullday.yml | 72 ------ slides/swarm-halfday.yml | 71 ------ slides/swarm-video.yml | 75 ------ slides/{swarm-selfpaced.yml => swarm.yml} | 5 +- 28 files changed, 598 insertions(+), 765 deletions(-) delete mode 100644 slides/containers/Training_Environment.md delete mode 100644 slides/containers/intro.md create mode 100644 slides/containers/labs-async.md create mode 100644 slides/containers/labs-live.md delete mode 100644 slides/k8s/intro.md create mode 100644 slides/k8s/labs-async.md create mode 100644 slides/k8s/labs-live.md create mode 100644 slides/k8s/prereqs-basic.md delete mode 100644 slides/shared/prereqs.md delete mode 100644 slides/swarm-fullday.yml delete mode 100644 slides/swarm-halfday.yml delete mode 100644 slides/swarm-video.yml rename slides/{swarm-selfpaced.yml => swarm.yml} (95%) diff --git a/slides/containers/Training_Environment.md b/slides/containers/Training_Environment.md deleted file mode 100644 index d5f0e2da..00000000 --- a/slides/containers/Training_Environment.md +++ /dev/null @@ -1,171 +0,0 @@ - -class: title - -# Our training environment - -![SSH terminal](images/title-our-training-environment.jpg) - ---- - -## Our training environment - -- If you are attending a tutorial or workshop: - - - a VM has been provisioned for each student - -- If you are doing or re-doing this course on your own, you can: - - - install [Docker Desktop][docker-desktop] or [Podman Desktop][podman-desktop] -
(available for Linux, Mac, Windows; provides a nice GUI) - - - install [Docker CE][docker-ce] or [Podman][podman] -
(for intermediate/advanced users who prefer the CLI) - - - try platforms like [Play With Docker][pwd] or [KodeKloud] -
(if you can't/won't install anything locally) - -[docker-desktop]: https://docs.docker.com/desktop/ -[podman-desktop]: https://podman-desktop.io/downloads -[docker-ce]: https://docs.docker.com/engine/install/ -[podman]: https://podman.io/docs/installation#installing-on-linux -[pwd]: https://labs.play-with-docker.com/ -[KodeKloud]: https://kodekloud.com/free-labs/docker/ - ---- - -## Our Docker VM - -*This section assumes that you are following this course as part of -a tutorial, training or workshop, where each student is given an -individual Docker VM.* - -- The VM is created just before the training. - -- It will stay up during the whole training. - -- It will be destroyed shortly after the training. - -- It comes pre-loaded with Docker and some other useful tools. - ---- - -## What *is* Docker? - -- "Installing Docker" really means "Installing the Docker Engine and CLI". - -- The Docker Engine is a daemon (a service running in the background). - -- This daemon manages containers, the same way that a hypervisor manages VMs. - -- We interact with the Docker Engine by using the Docker CLI. - -- The Docker CLI and the Docker Engine communicate through an API. - -- There are many other programs and client libraries which use that API. - ---- - -class: pic - -![Docker Architecture](images/docker-engine-architecture.svg) - ---- - -## Can we run Docker locally? - -- If you already have Docker (or Podman) installed, you can use it! - -- The VMs can be convenient if: - - - you can't/won't install Docker or Podman on your machine, - - - your local internet connection is slow. - -- We're going to download many container images and distribution packages. - -- If the class takes place in a venue with slow WiFi, this can slow us down. - -- The remote VMs have good connectivity and downloads will be fast there. - -(Initially, we provided VMs to make sure that nobody would waste time -with installers, or because they didn't have the right permissions -on their machine, etc.) - ---- - -## Connecting to your Virtual Machine - -You need an SSH client. - -* On OS X, Linux, and other UNIX systems, just use `ssh`: - -```bash -$ ssh @ -``` - -* On Windows, if you don't have an SSH client, you can download: - - * Putty (www.putty.org) - - * Git BASH (https://git-for-windows.github.io/) - - * MobaXterm (https://mobaxterm.mobatek.net/) - ---- - -class: in-person - -## `tailhist` - -The shell history of the instructor is available online in real time. - -Note the IP address of the instructor's virtual machine (A.B.C.D). - -Open http://A.B.C.D:1088 in your browser and you should see the history. - -The history is updated in real time (using a WebSocket connection). - -It should be green when the WebSocket is connected. - -If it turns red, reloading the page should fix it. - ---- - -## Checking your Virtual Machine - -Once logged in, make sure that you can run a basic Docker command: - -.small[ -```bash -$ docker version -Client: - Version: 18.03.0-ce - API version: 1.37 - Go version: go1.9.4 - Git commit: 0520e24 - Built: Wed Mar 21 23:10:06 2018 - OS/Arch: linux/amd64 - Experimental: false - Orchestrator: swarm - -Server: - Engine: - Version: 18.03.0-ce - API version: 1.37 (minimum version 1.12) - Go version: go1.9.4 - Git commit: 0520e24 - Built: Wed Mar 21 23:08:35 2018 - OS/Arch: linux/amd64 - Experimental: false -``` -] - -If this doesn't work, raise your hand so that an instructor can assist you! - -??? - -:EN:Container concepts -:FR:Premier contact avec les conteneurs - -:EN:- What's a container engine? -:FR:- Qu'est-ce qu'un *container engine* ? diff --git a/slides/containers/intro.md b/slides/containers/intro.md deleted file mode 100644 index 6cc201ef..00000000 --- a/slides/containers/intro.md +++ /dev/null @@ -1,39 +0,0 @@ -## A brief introduction - -- This was initially written to support in-person, instructor-led workshops and tutorials - -- These materials are maintained by [Jérôme Petazzoni](https://twitter.com/jpetazzo) and [multiple contributors](https://@@GITREPO@@/graphs/contributors) - -- You can also follow along on your own, at your own pace - -- We included as much information as possible in these slides - -- We recommend having a mentor to help you ... - -- ... Or be comfortable spending some time reading the Docker - [documentation](https://docs.docker.com/) ... - -- ... And looking for answers in the [Docker forums](https://forums.docker.com), - [StackOverflow](http://stackoverflow.com/questions/tagged/docker), - and other outlets - ---- - -class: self-paced - -## Hands on, you shall practice - -- Nobody ever became a Jedi by spending their lives reading Wookiepedia - -- Likewise, it will take more than merely *reading* these slides - to make you an expert - -- These slides include *tons* of demos, exercises, and examples - -- They assume that you have access to a machine running Docker - -- If you are attending a workshop or tutorial: -
you will be given specific instructions to access a cloud VM - -- If you are doing this on your own: -
we will tell you how to install Docker or access a Docker environment diff --git a/slides/containers/labs-async.md b/slides/containers/labs-async.md new file mode 100644 index 00000000..374ab78e --- /dev/null +++ b/slides/containers/labs-async.md @@ -0,0 +1,19 @@ +## Running your own lab environments + +- If you are doing or re-doing this course on your own, you can: + + - install [Docker Desktop][docker-desktop] or [Podman Desktop][podman-desktop] +
(available for Linux, Mac, Windows; provides a nice GUI) + + - install [Docker CE][docker-ce] or [Podman][podman] +
(for intermediate/advanced users who prefer the CLI) + + - try platforms like [Play With Docker][pwd] or [KodeKloud] +
(if you can't/won't install anything locally) + +[docker-desktop]: https://docs.docker.com/desktop/ +[podman-desktop]: https://podman-desktop.io/downloads +[docker-ce]: https://docs.docker.com/engine/install/ +[podman]: https://podman.io/docs/installation#installing-on-linux +[pwd]: https://labs.play-with-docker.com/ +[KodeKloud]: https://kodekloud.com/free-labs/docker/ diff --git a/slides/containers/labs-live.md b/slides/containers/labs-live.md new file mode 100644 index 00000000..7210dde1 --- /dev/null +++ b/slides/containers/labs-live.md @@ -0,0 +1,43 @@ +class: title + +# Our training environment + +![SSH terminal](images/title-our-training-environment.jpg) + +--- + +## Our training environment + +- If you are attending a live class, a VM has been provisioned for you! + +- Each student gets an individual VM. + +- The VM is created just before the training. + +- It will stay up during the whole training. + +- It will be destroyed shortly after the training. + +- It comes pre-loaded with Docker and some other useful tools. + +--- + +## Can we run Docker locally? + +- If you already have Docker (or Podman) installed, you can use it! + +- The VMs can be convenient if: + + - you can't/won't install Docker or Podman on your machine, + + - your local internet connection is slow. + +- We're going to download many container images and distribution packages. + +- If the class takes place in a venue with slow WiFi, this can slow us down. + +- The remote VMs have good connectivity and downloads will be fast there. + +(Initially, we provided VMs to make sure that nobody would waste time +with installers, or because they didn't have the right permissions +on their machine, etc.) diff --git a/slides/intro-fullday.yml b/slides/intro-fullday.yml index 7b4dcd9d..7dc764fa 100644 --- a/slides/intro-fullday.yml +++ b/slides/intro-fullday.yml @@ -17,17 +17,19 @@ exclude: content: - shared/title.md - logistics.md -- containers/intro.md -- shared/about-slides.md - shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- shared/handson.md +- containers/labs-live.md +- shared/connecting.md +- containers/labs-async.md - shared/toc.md - #- containers/Docker_Overview.md #- containers/Docker_History.md - - containers/Training_Environment.md #- containers/Installing_Docker.md - containers/First_Containers.md - containers/Background_Containers.md diff --git a/slides/intro-selfpaced.yml b/slides/intro-selfpaced.yml index e806f7e6..c7b82087 100644 --- a/slides/intro-selfpaced.yml +++ b/slides/intro-selfpaced.yml @@ -16,17 +16,19 @@ exclude: content: - shared/title.md -# - shared/logistics.md -- containers/intro.md -- shared/about-slides.md +#- logistics.md #- shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- shared/handson.md +#- containers/labs-live.md +#- shared/connecting.md +- containers/labs-async.md - shared/toc.md - - containers/Docker_Overview.md - containers/Docker_History.md - - containers/Training_Environment.md - containers/Installing_Docker.md - containers/First_Containers.md - containers/Background_Containers.md diff --git a/slides/intro-twodays.yml b/slides/intro-twodays.yml index 2ef4bbac..374c6f19 100644 --- a/slides/intro-twodays.yml +++ b/slides/intro-twodays.yml @@ -17,17 +17,19 @@ exclude: content: - shared/title.md - logistics.md -- containers/intro.md -- shared/about-slides.md - shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- shared/handson.md +- containers/labs-live.md +- shared/connecting.md +- containers/labs-async.md - shared/toc.md - # DAY 1 - containers/Docker_Overview.md #- containers/Docker_History.md - - containers/Training_Environment.md - containers/First_Containers.md - containers/Background_Containers.md - containers/Initial_Images.md diff --git a/slides/k8s/intro.md b/slides/k8s/intro.md deleted file mode 100644 index ee9bfbaf..00000000 --- a/slides/k8s/intro.md +++ /dev/null @@ -1,37 +0,0 @@ -## A brief introduction - -- This was initially written by [Jérôme Petazzoni](https://twitter.com/jpetazzo) to support in-person, - instructor-led workshops and tutorials - -- Credit is also due to [multiple contributors](https://@@GITREPO@@/graphs/contributors) — thank you! - -- You can also follow along on your own, at your own pace - -- We included as much information as possible in these slides - -- We recommend having a mentor to help you ... - -- ... Or be comfortable spending some time reading the Kubernetes [documentation](https://kubernetes.io/docs/) ... - -- ... And looking for answers on [StackOverflow](http://stackoverflow.com/questions/tagged/kubernetes) and other outlets - ---- - -class: self-paced - -## Hands on, you shall practice - -- Nobody ever became a Jedi by spending their lives reading Wookiepedia - -- Likewise, it will take more than merely *reading* these slides - to make you an expert - -- These slides include *tons* of demos, exercises, and examples - -- They assume that you have access to a Kubernetes cluster - -- If you are attending a workshop or tutorial: -
you will be given specific instructions to access your cluster - -- If you are doing this on your own: -
the first chapter will give you various options to get your own cluster diff --git a/slides/k8s/labs-async.md b/slides/k8s/labs-async.md new file mode 100644 index 00000000..3ba92c72 --- /dev/null +++ b/slides/k8s/labs-async.md @@ -0,0 +1,275 @@ +## Running your own lab environments + +- To practice outside of live classes, you will need your own cluster + +- We'll give you 4 possibilities, depending on your goals: + + - level 0 (no installation required) + + - level 1 (local development cluster) + + - level 2 (cluster with multiple nodes) + + - level 3 ("real" cluster with all the bells and whistles) + +--- + +## Level 0 + +- Use a free, cloud-based, environment + +- Pros: free, and nothing to install locally + +- Cons: lots of limitations + + - requires online access + + - resources (CPU, RAM, disk) are limited + + - provides a single-node cluster + + - by default, only available through the online IDE +
(extra steps required to use local tools and IDE) + + - networking stack is different from a normal cluster + + - cluster might be automatically destroyed once in a while + +--- + +## When is it a good match? + +- Great for your first steps with Kubernetes + +- Convenient for "bite-sized" learning + + (a few minutes at a time without spending time on installs and setup) + +- Not-so-great beyond your first steps + +- We recommend to "level up" to a local cluster ASAP! + +--- + +## How to obtain it + +- We prepared a "Dev container configuration" + + (that you can use with GitHub Codespaces) + +- This requires a GitHub account + + (no credit card or personal information is needed, though) + +- Option 1: [follow that link][codespaces] + +- Option 2: go to [this repo][repo], click on `<> Code v` and `Create codespace on main` + +--- + +## Level 1 + +- Install a local Kubernetes dev cluster + +- Pros: free, can work with local tools + +- Cons: + + - usually, you get a one-node cluster +
(but some tools let you create multiple nodes) + + - resources can be limited +
(depends on how much CPU/RAM you have on your machine) + + - cluster is on a private network +
(not great for labs involving load balancers, ingress controllers...) + + - support for persistent volumes might be limited +
(or non-existent) + +--- + +## When is it a good match? + +- Ideal for most classes and labs + + (from basic to advanced) + +- Notable exceptions: + + - when you need multiple "real" nodes +
(e.g. resource scheduling, cluster autoscaling...) + + - when you want to expose things to the outside world +
(e.g. ingress, gateway API, cert-manager...) + +- Very easy to reset the environment to a clean slate + +- Great way to prepare a lab or demo before executing it on a "real" cluster + +--- + +## How to obtain it + +- There are many options available to run local Kubernetes clusters! + +- If you already have Docker up and running: + + *check [KinD] or [k3d]* + +- Otherwise: + + *check [Docker Desktop][docker-desktop] or [Rancher Desktop][rancher-desktop]* + +- There are also other options; this is just a shortlist! + +[KinD]: https://kind.sigs.k8s.io/ +[k3d]:https://k3d.io/ +[docker-desktop]: https://docs.docker.com/desktop/use-desktop/kubernetes/ +[rancher-desktop]: https://docs.rancherdesktop.io/ui/preferences/kubernetes/ + +--- + +## Level 2 + +- Install a Kubernetes cluster on a few machines + + (physical machines, virtual machines, cloud, on-premises...) + +- Pros: + + - very flexible; works almost anywhere (cloud VMs, home lab...) + + - can even run "real" applications (serving real traffic) + +- Cons: + + - typically costs some money (hardware investment or cloud costs) + + - still missing a few things compared to a "real" cluster +
(cloud controller manager, storage class, control plane high availability...) + +--- + +## When is it a good match? + +- If you already have a "home lab" or a lab at work + + (because the machines already exist) + +- If you want more visibility and/or control: + + - enable alpha/experimental options and features + + - start, stop, view logs... of individual components + +- If you want multiple nodes to experiment with scheduling, autoscaling... + +- To host applications that remain available when your laptop is offline :) + +--- + +## How to obtain it + +- Option 1: + + *provision a few machines; [install `kubeadm`][kubeadm]; use `kubeadm` to install cluster* + +- Option 2: + + *use [`labctl`][labctl] to automate the previous steps* + + *(labctl supports [10+ public and private cloud platforms][labctl-vms])* + +- Option 3: + + *use the Kubernetes distro of your choice!* + +--- + +## Level 3 + +- Use a managed Kubernetes cluster + +- Pros: + + - it's the real deal! + +- Cons: + + - recurring cloud costs + +--- + +## When is it a good match? + +- If you want a highly-available cluster and control plane + +- To have all the cloud features + + (`LoadBalancer` services, `StorageClass` for stateful apps, cluster autoscaling...) + +- To host your first production stacks + +--- + +## How to obtain it + +- Option 1: + + *use the CLI / Web UI / Terraform... for your cloud provider* + +- Option 2: + + *use [`labctl`][labctl] to provision a cluster with Terraform/OpenTofu* + +--- + +## What's `labctl`? + +- `labctl` is the tool that we use to provision virtual machines and clusters for live classes + +- It can create and configure hundreds of VMs and clusters in a few minutes + +- It supports 10+ cloud providers + +- It's very useful if you need to provision many clusters + + (e.g. to run your own workshop with your team!) + +- It can also be used to provision a single cluster quickly + + (for testing or educational purposes) + +- Its Terraform configurations can also be useful on their own + + (e.g. as a base when building your own infra-as-code) + +--- + +## Our Kubernetes toolbox + +- We're going to use a lot of different tools + + (kubectl, stern, helm, k9s, krew, and many more) + +- We suggest that you install them progressively + + (when we introduce them, if you think they'll be useful to you!) + +- We have also prepared a container image: [jpetazzo/shpod] + +- `shpod` contains 30+ Docker and Kubernetes tools + + (along with shell customizations like prompt, completion...) + +- You can use it to work with your Kubernetes clusters + +- It can also be used as an SSH server if needed + +[codespaces]: https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=37004081&skip_quickstart=true +[repo]: https://github.com/jpetazzo/container.training +[kubeadm]: https://kubernetes.io/docs/reference/setup-tools/kubeadm/ +[labctl]: https://github.com/jpetazzo/container.training/tree/main/prepare-labs +[labctl-vms]: https://github.com/jpetazzo/container.training/tree/main/prepare-labs/terraform/virtual-machines +[jpetazzo/shpod]: https://github.com/jpetazzo/shpod \ No newline at end of file diff --git a/slides/k8s/labs-live.md b/slides/k8s/labs-live.md new file mode 100644 index 00000000..05994471 --- /dev/null +++ b/slides/k8s/labs-live.md @@ -0,0 +1,42 @@ +## Where are we going to run our containers? + +--- + +class: pic + +![You get a cluster](images/you-get-a-cluster.jpg) + +--- + +## If you're attending a live class + +- Each person gets a private lab environment + + (depending on the scenario, this will be one VM, one cluster, multiple clusters...) + +- The instructor will tell you how to connect to your environment + +- Your lab environments will be available for the duration of the workshop + + (check with your instructor to know exactly when they'll be shutdown) + +--- + +## Why don't we run containers locally? + +- Setting up a local Kubernetes cluster can take time + + (and the procedure can differ from one system to another) + +- On some systems, it might be impossible + + (due to restrictive IT policies, lack of hardware support...) + +- Some labs require a "real" cluster + + (e.g. multiple nodes to demonstrate failover, placement policies...) + +- For on-site classes, it can stress the local network + + *"The whole team downloaded all these container images from the WiFi! +
... and it went great!"* (Literally no-one ever) diff --git a/slides/k8s/prereqs-advanced.md b/slides/k8s/prereqs-advanced.md index 18996679..6f97c47d 100644 --- a/slides/k8s/prereqs-advanced.md +++ b/slides/k8s/prereqs-advanced.md @@ -1,13 +1,17 @@ -# Pre-requirements +## Pre-requirements -- Kubernetes concepts +- Familiarity with the UNIX command-line - (pods, deployments, services, labels, selectors) + (navigating directories, editing files, using `kubectl`) - Hands-on experience working with containers (building images, running them; doesn't matter how exactly) -- Familiarity with the UNIX command-line +- Kubernetes concepts - (navigating directories, editing files, using `kubectl`) + (pods, deployments, services, labels, selectors) + +- Ideally, you already have access to a Kubernetes cluster + + (even if it's just a local one with KinD, minikube, etc.) \ No newline at end of file diff --git a/slides/k8s/prereqs-basic.md b/slides/k8s/prereqs-basic.md new file mode 100644 index 00000000..2bcc2c09 --- /dev/null +++ b/slides/k8s/prereqs-basic.md @@ -0,0 +1,17 @@ +## Pre-requirements + +- Be comfortable with the UNIX command line + + - navigating directories + + - editing files + + - a little bit of bash-fu (environment variables, loops) + +- Hands-on experience working with containers + + - building images, running them; doesn't matter how exactly + + - if you know `docker run`, `docker build`, `docker ps`, you're good to go! + +- It's totally OK if you are not a Docker expert! diff --git a/slides/kadm-fullday.yml b/slides/kadm-fullday.yml index b4f3c193..28af7390 100644 --- a/slides/kadm-fullday.yml +++ b/slides/kadm-fullday.yml @@ -19,16 +19,18 @@ exclude: content: - shared/title.md - logistics.md -- k8s/intro.md -- shared/about-slides.md - shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- k8s/prereqs-advanced.md +- shared/handson.md +- k8s/labs-live.md +- shared/connecting.md +- k8s/labs-async.md - shared/toc.md - - - k8s/prereqs-advanced.md - - shared/handson.md - k8s/architecture.md #- k8s/internal-apis.md - k8s/deploymentslideshow.md diff --git a/slides/kadm-twodays.yml b/slides/kadm-twodays.yml index 345407da..2161154e 100644 --- a/slides/kadm-twodays.yml +++ b/slides/kadm-twodays.yml @@ -19,17 +19,19 @@ exclude: content: - shared/title.md - logistics.md -- k8s/intro.md -- shared/about-slides.md - shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- k8s/prereqs-advanced.md +- shared/handson.md +- k8s/labs-live.md +- shared/connecting.md +- k8s/labs-async.md - shared/toc.md # DAY 1 -- - k8s/prereqs-advanced.md - - shared/handson.md - - k8s/architecture.md +- - k8s/architecture.md - k8s/internal-apis.md - k8s/deploymentslideshow.md - k8s/dmuc-easy.md diff --git a/slides/kube-adv.yml b/slides/kube-adv.yml index 95fe2751..feb0b40f 100644 --- a/slides/kube-adv.yml +++ b/slides/kube-adv.yml @@ -17,16 +17,18 @@ exclude: content: - shared/title.md - logistics.md -- k8s/intro.md -- shared/about-slides.md -#- shared/chat-room-im.md +- shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- k8s/prereqs-advanced.md +- shared/handson.md +- k8s/labs-live.md +- shared/connecting.md +- k8s/labs-async.md - shared/toc.md - #1 - - k8s/prereqs-advanced.md - - shared/handson.md - k8s/architecture.md - k8s/internal-apis.md - k8s/deploymentslideshow.md diff --git a/slides/kube-fullday.yml b/slides/kube-fullday.yml index 1e18893d..7b587911 100644 --- a/slides/kube-fullday.yml +++ b/slides/kube-fullday.yml @@ -18,19 +18,18 @@ exclude: content: - shared/title.md - logistics.md -- k8s/intro.md -- shared/about-slides.md - shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- k8s/prereqs-basic.md +- shared/handson.md +- k8s/labs-live.md +- shared/connecting.md +- k8s/labs-async.md - shared/toc.md - - - shared/prereqs.md - - shared/handson.md - #- shared/webssh.md - - shared/connecting.md - #- k8s/versions-k8s.md - shared/sampleapp.md #- shared/composescale.md #- shared/hastyconclusions.md diff --git a/slides/kube-halfday.yml b/slides/kube-halfday.yml index f69c57bd..4e741a0b 100644 --- a/slides/kube-halfday.yml +++ b/slides/kube-halfday.yml @@ -17,22 +17,19 @@ exclude: content: - shared/title.md -#- logistics.md -# Bridget-specific; others use logistics.md -- logistics-bridget.md -- k8s/intro.md -- shared/about-slides.md +- logistics.md - shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- k8s/prereqs-basic.md +- shared/handson.md +- k8s/labs-live.md +- shared/connecting.md +- k8s/labs-async.md - shared/toc.md -- - shared/prereqs.md - - shared/handson.md - #- shared/webssh.md - - shared/connecting.md - - k8s/versions-k8s.md - - shared/sampleapp.md +- - shared/sampleapp.md # Bridget doesn't go into as much depth with compose #- shared/composescale.md #- shared/hastyconclusions.md diff --git a/slides/kube-selfpaced.yml b/slides/kube-selfpaced.yml index 2643a75b..6f199ddc 100644 --- a/slides/kube-selfpaced.yml +++ b/slides/kube-selfpaced.yml @@ -18,19 +18,18 @@ exclude: content: - shared/title.md #- logistics.md -- k8s/intro.md -- shared/about-slides.md #- shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- k8s/prereqs-basic.md +- shared/handson.md +#- k8s/labs-live.md +#- shared/connecting.md +- k8s/labs-async.md - shared/toc.md - - - shared/prereqs.md - - shared/handson.md - #- shared/webssh.md - - shared/connecting.md - - k8s/versions-k8s.md - shared/sampleapp.md #- shared/composescale.md #- shared/hastyconclusions.md diff --git a/slides/kube-twodays.yml b/slides/kube-twodays.yml index 7c81abcd..ced725da 100644 --- a/slides/kube-twodays.yml +++ b/slides/kube-twodays.yml @@ -18,19 +18,18 @@ exclude: content: - shared/title.md - logistics.md -- k8s/intro.md -- shared/about-slides.md - shared/chat-room-im.md #- shared/chat-room-slack.md #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md +- shared/about-slides.md +- k8s/prereqs-basic.md +- shared/handson.md +- k8s/labs-live.md +- shared/connecting.md +- k8s/labs-async.md - shared/toc.md - - - shared/prereqs.md - - shared/handson.md - #- shared/webssh.md - - shared/connecting.md - #- k8s/versions-k8s.md - shared/sampleapp.md #- shared/composescale.md #- shared/hastyconclusions.md diff --git a/slides/mlops.yml b/slides/mlops.yml index 466bb76a..f2eeceb5 100644 --- a/slides/mlops.yml +++ b/slides/mlops.yml @@ -23,6 +23,9 @@ content: #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md - k8s/prereqs-advanced.md +# Note: if we work on this later, we should refactor it +# to follow the same pattern as the other classes +# (i.e. use the k8s/labs-*.md files) - k8s/handson-mlops.md - shared/connecting.md - k8s/mlops-headsup.md diff --git a/slides/shared/about-slides.md b/slides/shared/about-slides.md index 36e7ff4d..90a0a152 100644 --- a/slides/shared/about-slides.md +++ b/slides/shared/about-slides.md @@ -60,6 +60,8 @@ ## These slides are constantly updated +- They are maintained by [Jérôme Petazzoni](https://hachyderm.io/@jpetazzo/) and [multiple contributors](https://@@GITREPO@@/graphs/contributors) + - Feel free to check the GitHub repository for updates: https://@@GITREPO@@ @@ -89,3 +91,27 @@ class: extra-details - you want only the most essential information - You can review these slides another time if you want, they'll be waiting for you ☺ + +--- + +## Slides ≠ documentation + +- We tried to include a lot of information in these slides + +- But they don't replace or compete with the documentation! + +- Treat these slides as yet another pillar to support your learning experience + +- Don't hesitate to frequently read the documentations + + ([Docker documentation][docker-docs], [Kubernetes documentation][k8s-docs]) + +- And online communities + + (e.g.: [Docker forums][docker-forums], [Docker on StackOverflow][docker-so], [Kubernetes on StackOverflow][k8s-so]) + +[docker-docs]: https://docs.docker.com/ +[k8s-docs]: https://kubernetes.io/docs/ +[docker-forums]: https://forums.docker.com/ +[docker-so]: http://stackoverflow.com/questions/tagged/docker +[k8s-so]: http://stackoverflow.com/questions/tagged/kubernetes diff --git a/slides/shared/connecting.md b/slides/shared/connecting.md index 415c11f7..4983d4a7 100644 --- a/slides/shared/connecting.md +++ b/slides/shared/connecting.md @@ -1,6 +1,25 @@ -class: in-person +## Connecting to our lab environment -## Testing the connection to our lab environment +- We need an SSH client + +- On Linux, OS X, FreeBSD... you are probably all set; just use `ssh` + +- On Windows, get one of these: + + - [putty](https://putty.software/) + - Microsoft [Win32 OpenSSH](https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH) + - [Git BASH](https://git-for-windows.github.io/) + - [MobaXterm](http://mobaxterm.mobatek.net/) + +- On Android, [JuiceSSH](https://juicessh.com/) + ([Play Store](https://play.google.com/store/apps/details?id=com.sonelli.juicessh)) + works pretty well + +--- + +## Testing the connection + +- Your instructor will tell you where to find the IP address, login, and password .lab[ @@ -31,17 +50,69 @@ You should see a prompt looking like this: [A.B.C.D] (...) user@machine ~ $ ``` -If anything goes wrong — ask for help! --- -class: in-person +## Checking the lab environment + +In Docker classes, run `docker version`. + +The output should look like this: + +.small[ +```bash +Client: + Version: 29.1.1 + API version: 1.52 + Go version: go1.25.4 X:nodwarf5 + Git commit: 0aedba58c2 + Built: Fri Nov 28 14:28:26 2025 + OS/Arch: linux/amd64 + Context: default + +Server: + Engine: + Version: 29.1.1 + API version: 1.52 (minimum version 1.44) + Go version: go1.25.4 X:nodwarf5 + Git commit: 9a84135d52 + Built: Fri Nov 28 14:28:26 2025 + OS/Arch: linux/amd64 + Experimental: false + ... +``` +] + +--- + +## Checking the lab environment + +In Kubernetes classes, run `kubectl get nodes`. + +The output should look like this: + +```bash +$ k get nodes +NAME STATUS ROLES AGE VERSION +node1 Ready control-plane 7d6h v1.34.0 +node2 Ready 7d6h v1.34.0 +node3 Ready 7d6h v1.34.0 +node4 Ready 7d6h v1.34.0 +``` + +--- + +## If it doesn't work... + +Ask an instructor or assistant to help you! + +--- ## `tailhist` - The shell history of the instructor is available online in real time -- The instructor will provide you a "magic URL" +- The instructor will share a special URL with you (typically, the instructor's lab address on port 1088 or 30088) @@ -57,82 +128,6 @@ class: in-person --- -## Doing or re-doing the workshop on your own? - -- Use something like - [Play-With-Docker](https://labs.play-with-docker.com/) or - [Play-With-Kubernetes](https://training.play-with-kubernetes.com/) - - Zero setup effort; but environment are short-lived and - might have limited resources - -- Create your own cluster (local or cloud VMs) - - Small setup effort; small cost; flexible environments - -- Create a bunch of clusters for you and your friends - ([instructions](https://@@GITREPO@@/tree/main/prepare-labs)) - - Bigger setup effort; ideal for group training - ---- - -## For a consistent Kubernetes experience ... - -- If you are using your own Kubernetes cluster, you can use [jpetazzo/shpod](https://github.com/jpetazzo/shpod) - -- `shpod` provides a shell running in a pod on your own cluster - -- It comes with many tools pre-installed (helm, stern...) - -- These tools are used in many demos and exercises in these slides - -- `shpod` also gives you completion and a fancy prompt - -- It can also be used as an SSH server if needed - ---- - -class: self-paced - -## Get your own Docker nodes - -- If you already have some Docker nodes: great! - -- If not: let's get some thanks to Play-With-Docker - -.lab[ - -- Go to https://labs.play-with-docker.com/ - -- Log in - -- Create your first node - - - -] - -You will need a Docker ID to use Play-With-Docker. - -(Creating a Docker ID is free.) - ---- - -## We don't need to connect to ALL the nodes - -- If your cluster has multiple nodes (e.g. `node1`, `node2`, ...): - - unless instructed, **all commands must be run from the first node** - -- We don't need to check out/copy code or manifests on other nodes - -- During normal operations, we do not need access to the other nodes - - (but we could log into these nodes to troubleshoot or examine stuff) - ---- - ## Terminals Once in a while, the instructions will say: diff --git a/slides/shared/handson.md b/slides/shared/handson.md index 5ad4216d..6f30c623 100644 --- a/slides/shared/handson.md +++ b/slides/shared/handson.md @@ -12,17 +12,33 @@ Misattributed to Benjamin Franklin --- -## Hands-on sections +## Hands-on, you shall practice -- There will be *a lot* of examples and demos +- Nobody ever became a Jedi by spending their lives reading Wookiepedia -- We are going to build, ship, and run containers (and sometimes, clusters!) +- Someone can: -- If you want, you can run all the examples and demos in your environment + - read all the docs - (but you don't have to; it's up to you!) + - watch all the videos -- All hands-on sections are clearly identified, like the gray rectangle below + - attend all the workshops and live classes + +- ...This won't be enough to become an expert! + +- We think one needs to *put the concepts in practice* to truly memorize them + +- But, how? + +--- + +## Hands-on labs + +- These slides include *tons* of demos, examples, and exercises + +- Don't follow along passively; try to reproduce the demos and examples! + +- Each time you see a gray rectangle like this, it indicates a demo or example .lab[ @@ -33,134 +49,6 @@ Misattributed to Benjamin Franklin ] ---- +- Don't hesitate to try them in your environment -class: in-person - -## Where are we going to run our containers? - ---- - -class: in-person, pic - -![You get a cluster](images/you-get-a-cluster.jpg) - ---- - -## If you're attending a live training or workshop - -- Each person gets a private lab environment - - (depending on the scenario, this will be one VM, one cluster, multiple clusters...) - -- The instructor will tell you how to connect to your environment - -- Your lab environments will be available for the duration of the workshop - - (check with your instructor to know exactly when they'll be shutdown) - ---- - -## Running your own lab environments - -- If you are following a self-paced course... - -- Or watching a replay of a recorded course... - -- ...You will need to set up a local environment for the labs - -- If you want to deliver your own training or workshop: - - - deployment scripts are available in the [prepare-labs] directory - - - you can use them to automatically deploy many lab environments - - - they support many different infrastructure providers - -[prepare-labs]: https://github.com/jpetazzo/container.training/tree/main/prepare-labs - ---- - -class: in-person - -## Why don't we run containers locally? - -- Installing this stuff can be hard on some machines - - (32 bits CPU or OS... Laptops without administrator access... etc.) - -- *"The whole team downloaded all these container images from the WiFi! -
... and it went great!"* (Literally no-one ever) - -- All you need is a computer (or even a phone or tablet!), with: - - - an Internet connection - - - a web browser - - - an SSH client - ---- - -class: in-person - -## SSH clients - -- On Linux, OS X, FreeBSD... you are probably all set - -- On Windows, get one of these: - - - [putty](https://putty.software/) - - Microsoft [Win32 OpenSSH](https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH) - - [Git BASH](https://git-for-windows.github.io/) - - [MobaXterm](http://mobaxterm.mobatek.net/) - -- On Android, [JuiceSSH](https://juicessh.com/) - ([Play Store](https://play.google.com/store/apps/details?id=com.sonelli.juicessh)) - works pretty well - -- Nice-to-have: [Mosh](https://mosh.org/) instead of SSH, if your Internet connection tends to lose packets - ---- - -class: in-person, extra-details - -## What is this Mosh thing? - -*You don't have to use Mosh or even know about it to follow along. -
-We're just telling you about it because some of us think it's cool!* - -- Mosh is "the mobile shell" - -- It is essentially SSH over UDP, with roaming features - -- It retransmits packets quickly, so it works great even on lossy connections - - (Like hotel or conference WiFi) - -- It has intelligent local echo, so it works great even in high-latency connections - - (Like hotel or conference WiFi) - -- It supports transparent roaming when your client IP address changes - - (Like when you hop from hotel to conference WiFi) - ---- - -class: in-person, extra-details - -## Using Mosh - -- To install it: `(apt|yum|brew) install mosh` - -- It has been pre-installed on the VMs that we are using - -- To connect to a remote machine: `mosh user@host` - - (It is going to establish an SSH connection, then hand off to UDP) - -- It requires UDP ports to be open - - (By default, it uses a UDP port between 60000 and 61000) +- Don't hesitate to improvise, deviate from the script... And see what happens! diff --git a/slides/shared/prereqs.md b/slides/shared/prereqs.md deleted file mode 100644 index e04f29c3..00000000 --- a/slides/shared/prereqs.md +++ /dev/null @@ -1,19 +0,0 @@ -# Pre-requirements - -- Be comfortable with the UNIX command line - - - navigating directories - - - editing files - - - a little bit of bash-fu (environment variables, loops) - -- Some Docker knowledge - - - `docker run`, `docker ps`, `docker build` - - - ideally, you know how to write a Dockerfile and build it -
- (even if it's a `FROM` line and a couple of `RUN` commands) - -- It's totally OK if you are not a Docker expert! diff --git a/slides/swarm-fullday.yml b/slides/swarm-fullday.yml deleted file mode 100644 index 8477e36d..00000000 --- a/slides/swarm-fullday.yml +++ /dev/null @@ -1,72 +0,0 @@ -title: | - Container Orchestration - with Docker and Swarm - -chat: "[Slack](https://dockercommunity.slack.com/messages/C7GKACWDV)" -#chat: "[Gitter](https://gitter.im/jpetazzo/workshop-yyyymmdd-city)" - -gitrepo: github.com/jpetazzo/container.training - -slides: https://container.training/ - -#slidenumberprefix: "#SomeHashTag — " - -exclude: -- self-paced -- snap -- btp-auto -- benchmarking -- elk-manual -- prom-manual - -content: -- shared/title.md -- logistics.md -- swarm/intro.md -- shared/about-slides.md -- shared/chat-room-im.md -#- shared/chat-room-slack.md -#- shared/chat-room-zoom-meeting.md -#- shared/chat-room-zoom-webinar.md -- shared/toc.md -- - shared/prereqs.md - - shared/handson.md - - shared/connecting.md - - swarm/versions.md - - shared/sampleapp.md - - shared/composescale.md - - shared/hastyconclusions.md - - shared/composedown.md - - swarm/swarmkit.md - - shared/declarative.md - - swarm/swarmmode.md - - swarm/creatingswarm.md - #- swarm/machine.md - - swarm/morenodes.md -- - swarm/firstservice.md - - swarm/ourapponswarm.md - - swarm/hostingregistry.md - - swarm/testingregistry.md - - swarm/btp-manual.md - - swarm/swarmready.md - - swarm/stacks.md - - swarm/cicd.md - - swarm/updatingservices.md - - swarm/rollingupdates.md - - swarm/healthchecks.md -- - swarm/operatingswarm.md - - swarm/netshoot.md - - swarm/ipsec.md - - swarm/swarmtools.md - - swarm/security.md - - swarm/secrets.md - - swarm/encryptionatrest.md - - swarm/leastprivilege.md - - swarm/apiscope.md -- - swarm/logging.md - - swarm/metrics.md - - swarm/gui.md - - swarm/stateful.md - - swarm/extratips.md - - shared/thankyou.md - - swarm/links.md diff --git a/slides/swarm-halfday.yml b/slides/swarm-halfday.yml deleted file mode 100644 index 926d4867..00000000 --- a/slides/swarm-halfday.yml +++ /dev/null @@ -1,71 +0,0 @@ -title: | - Container Orchestration - with Docker and Swarm - -chat: "[Slack](https://dockercommunity.slack.com/messages/C7GKACWDV)" -#chat: "[Gitter](https://gitter.im/jpetazzo/workshop-yyyymmdd-city)" - -gitrepo: github.com/jpetazzo/container.training - -slides: https://container.training/ - -#slidenumberprefix: "#SomeHashTag — " - -exclude: -- self-paced -- snap -- btp-manual -- benchmarking -- elk-manual -- prom-manual - -content: -- shared/title.md -- logistics.md -- swarm/intro.md -- shared/about-slides.md -- shared/chat-room-im.md -#- shared/chat-room-slack.md -#- shared/chat-room-zoom-meeting.md -#- shared/chat-room-zoom-webinar.md -- shared/toc.md -- - shared/prereqs.md - - shared/handson.md - - shared/connecting.md - - swarm/versions.md - - shared/sampleapp.md - - shared/composescale.md - - shared/hastyconclusions.md - - shared/composedown.md - - swarm/swarmkit.md - - shared/declarative.md - - swarm/swarmmode.md - - swarm/creatingswarm.md - #- swarm/machine.md - - swarm/morenodes.md -- - swarm/firstservice.md - - swarm/ourapponswarm.md - #- swarm/hostingregistry.md - #- swarm/testingregistry.md - #- swarm/btp-manual.md - #- swarm/swarmready.md - - swarm/stacks.md - - swarm/cicd.md - - swarm/updatingservices.md - #- swarm/rollingupdates.md - #- swarm/healthchecks.md -- - swarm/operatingswarm.md - #- swarm/netshoot.md - #- swarm/ipsec.md - #- swarm/swarmtools.md - - swarm/security.md - #- swarm/secrets.md - #- swarm/encryptionatrest.md - - swarm/leastprivilege.md - - swarm/apiscope.md - - swarm/logging.md - - swarm/metrics.md - #- swarm/stateful.md - #- swarm/extratips.md - - shared/thankyou.md - - swarm/links.md diff --git a/slides/swarm-video.yml b/slides/swarm-video.yml deleted file mode 100644 index 9c34166a..00000000 --- a/slides/swarm-video.yml +++ /dev/null @@ -1,75 +0,0 @@ -title: | - Container Orchestration - with Docker and Swarm - -chat: "[Slack](https://dockercommunity.slack.com/messages/C7GKACWDV)" - -gitrepo: github.com/jpetazzo/container.training - -slides: https://container.training/ - -#slidenumberprefix: "#SomeHashTag — " - -exclude: -- in-person -- btp-auto - -content: -- shared/title.md -#- shared/logistics.md -- swarm/intro.md -- shared/about-slides.md -- shared/toc.md -- - shared/prereqs.md - - shared/handson.md - - shared/connecting.md - - swarm/versions.md - - | - name: part-1 - - class: title, self-paced - - Part 1 - - shared/sampleapp.md - - shared/composescale.md - - shared/hastyconclusions.md - - shared/composedown.md - - swarm/swarmkit.md - - shared/declarative.md - - swarm/swarmmode.md - - swarm/creatingswarm.md - #- swarm/machine.md - - swarm/morenodes.md -- - swarm/firstservice.md - - swarm/ourapponswarm.md - - swarm/hostingregistry.md - - swarm/testingregistry.md - - swarm/btp-manual.md - - swarm/swarmready.md - - swarm/stacks.md - - | - name: part-2 - - class: title, self-paced - - Part 2 -- - swarm/operatingswarm.md - #- swarm/netshoot.md - #- swarm/swarmnbt.md - - swarm/ipsec.md - - swarm/updatingservices.md - - swarm/rollingupdates.md - #- swarm/healthchecks.md - - swarm/nodeinfo.md - - swarm/swarmtools.md -- - swarm/security.md - - swarm/secrets.md - - swarm/encryptionatrest.md - - swarm/leastprivilege.md - - swarm/apiscope.md - #- swarm/logging.md - #- swarm/metrics.md - - swarm/stateful.md - - swarm/extratips.md - - shared/thankyou.md - - swarm/links.md diff --git a/slides/swarm-selfpaced.yml b/slides/swarm.yml similarity index 95% rename from slides/swarm-selfpaced.yml rename to slides/swarm.yml index 0bd815d9..efa273d7 100644 --- a/slides/swarm-selfpaced.yml +++ b/slides/swarm.yml @@ -24,9 +24,8 @@ content: #- shared/chat-room-zoom-meeting.md #- shared/chat-room-zoom-webinar.md - shared/toc.md -- - shared/prereqs.md - - shared/handson.md - - shared/connecting.md +- - shared/handson.md + #- shared/connecting.md - swarm/versions.md - | name: part-1