diff --git a/slides/ardan.html b/slides/ardan.html index 104dff2f..c93eb447 100644 --- a/slides/ardan.html +++ b/slides/ardan.html @@ -12,7 +12,7 @@
  • - Day 2: capacity management and Kubernetes operators + Day 2: capacity management and Kubernetes operators
  • @@ -29,3 +29,20 @@

    Docker Bootcamp

    + +

    + Kubernetes Bootcamp +

    + diff --git a/slides/containers/Background_Containers.md b/slides/containers/Background_Containers.md index 5d418606..cc4cfea8 100644 --- a/slides/containers/Background_Containers.md +++ b/slides/containers/Background_Containers.md @@ -280,3 +280,8 @@ CONTAINER ID IMAGE ... CREATED STATUS 5c1dfd4d81f1 jpetazzo/clock ... 40 min. ago Exited (0) 40 min. ago b13c164401fb ubuntu ... 55 min. ago Exited (130) 53 min. ago ``` + +??? + +:EN:- Foreground and background containers +:FR:- Exécution interactive ou en arrière-plan diff --git a/slides/containers/Building_Images_Interactively.md b/slides/containers/Building_Images_Interactively.md index 59a9f124..8b155138 100644 --- a/slides/containers/Building_Images_Interactively.md +++ b/slides/containers/Building_Images_Interactively.md @@ -167,3 +167,8 @@ Automated process = good. In the next chapter, we will learn how to automate the build process by writing a `Dockerfile`. + +??? + +:EN:- Building our first images interactively +:FR:- Fabriquer nos premières images à la main diff --git a/slides/containers/Building_Images_With_Dockerfiles.md b/slides/containers/Building_Images_With_Dockerfiles.md index 17dac8dc..1a8841c8 100644 --- a/slides/containers/Building_Images_With_Dockerfiles.md +++ b/slides/containers/Building_Images_With_Dockerfiles.md @@ -363,3 +363,10 @@ In this example, `sh -c` will still be used, but The shell gets replaced by `figlet` when `figlet` starts execution. This allows to run processes as PID 1 without using JSON. + +??? + +:EN:- Towards automated, reproducible builds +:EN:- Writing our first Dockerfile +:FR:- Rendre le processus automatique et reproductible +:FR:- Écrire son premier Dockerfile diff --git a/slides/containers/Cmd_And_Entrypoint.md b/slides/containers/Cmd_And_Entrypoint.md index 24598acf..4f668580 100644 --- a/slides/containers/Cmd_And_Entrypoint.md +++ b/slides/containers/Cmd_And_Entrypoint.md @@ -272,3 +272,7 @@ $ docker run -it --entrypoint bash myfiglet root@6027e44e2955:/# ``` +??? + +:EN:- CMD and ENTRYPOINT +:FR:- CMD et ENTRYPOINT diff --git a/slides/containers/Compose_For_Dev_Stacks.md b/slides/containers/Compose_For_Dev_Stacks.md index b6346055..4f660881 100644 --- a/slides/containers/Compose_For_Dev_Stacks.md +++ b/slides/containers/Compose_For_Dev_Stacks.md @@ -322,3 +322,11 @@ You can: Each copy will run in a different network, totally isolated from the other. This is ideal to debug regressions, do side-by-side comparisons, etc. + +??? + +:EN:- Using compose to describe an environment +:EN:- Connecting services together with a *Compose file* + +:FR:- Utiliser Compose pour décrire son environnement +:FR:- Écrire un *Compose file* pour connecter les services entre eux \ No newline at end of file diff --git a/slides/containers/Container_Networking_Basics.md b/slides/containers/Container_Networking_Basics.md index bb6fed53..4ce0fc49 100644 --- a/slides/containers/Container_Networking_Basics.md +++ b/slides/containers/Container_Networking_Basics.md @@ -226,3 +226,13 @@ We've learned how to: In the next chapter, we will see how to connect containers together without exposing their ports. + +??? + +:EN:Connecting containers +:EN:- Container networking basics +:EN:- Exposing a container + +:FR:Connecter les conteneurs +:FR:- Description du modèle réseau des conteneurs +:FR:- Exposer un conteneur diff --git a/slides/containers/Copying_Files_During_Build.md b/slides/containers/Copying_Files_During_Build.md index 486c87ef..2d58d287 100644 --- a/slides/containers/Copying_Files_During_Build.md +++ b/slides/containers/Copying_Files_During_Build.md @@ -98,3 +98,8 @@ Success! * Place it in a different directory, with the `WORKDIR` instruction. * Even better, use the `gcc` official image. + +??? + +:EN:- The build cache +:FR:- Tirer parti du cache afin d'optimiser la vitesse de *build* diff --git a/slides/containers/Dockerfile_Tips.md b/slides/containers/Dockerfile_Tips.md index fed55f49..82aeb9ba 100644 --- a/slides/containers/Dockerfile_Tips.md +++ b/slides/containers/Dockerfile_Tips.md @@ -431,3 +431,8 @@ services: - It's OK (and even encouraged) to start simple and evolve as needed. - Feel free to review this chapter later (after writing a few Dockerfiles) for inspiration! + +??? + +:EN:- Dockerfile tips, tricks, and best practices +:FR:- Bonnes pratiques pour la construction des images diff --git a/slides/containers/First_Containers.md b/slides/containers/First_Containers.md index 682cc9ab..e05c1302 100644 --- a/slides/containers/First_Containers.md +++ b/slides/containers/First_Containers.md @@ -290,3 +290,8 @@ bash: figlet: command not found * We have a clear definition of our environment, and can share it reliably with others. * Let's see in the next chapters how to bake a custom image with `figlet`! + +??? + +:EN:- Running our first container +:FR:- Lancer nos premiers conteneurs diff --git a/slides/containers/Getting_Inside.md b/slides/containers/Getting_Inside.md index 9167dfdc..15a887a9 100644 --- a/slides/containers/Getting_Inside.md +++ b/slides/containers/Getting_Inside.md @@ -226,3 +226,8 @@ docker export | tar tv ``` This will give a detailed listing of the content of the container. + +??? + +:EN:- Troubleshooting and getting inside a container +:FR:- Inspecter un conteneur en détail, en *live* ou *post-mortem* diff --git a/slides/containers/Initial_Images.md b/slides/containers/Initial_Images.md index 0e601e57..5a98d703 100644 --- a/slides/containers/Initial_Images.md +++ b/slides/containers/Initial_Images.md @@ -375,3 +375,13 @@ We've learned how to: * Understand Docker image namespacing. * Search and download images. +??? + +:EN:Building images +:EN:- Containers, images, and layers +:EN:- Image addresses and tags +:EN:- Finding and transferring images + +:FR:Construire des images +:FR:- La différence entre un conteneur et une image +:FR:- La notion de *layer* partagé entre images diff --git a/slides/containers/Labels.md b/slides/containers/Labels.md index 5d29faf9..3aef5320 100644 --- a/slides/containers/Labels.md +++ b/slides/containers/Labels.md @@ -80,3 +80,8 @@ $ docker ps --filter label=owner=alice (To determine internal cross-billing, or who to page in case of outage.) * etc. + +??? + +:EN:- Using labels to identify containers +:FR:- Étiqueter ses conteneurs avec des méta-données diff --git a/slides/containers/Local_Development_Workflow.md b/slides/containers/Local_Development_Workflow.md index 742f46e7..a696e56b 100644 --- a/slides/containers/Local_Development_Workflow.md +++ b/slides/containers/Local_Development_Workflow.md @@ -391,3 +391,10 @@ We've learned how to: * Use a simple local development workflow. +??? + +:EN:Developing with containers +:EN:- “Containerize” a development environment + +:FR:Développer au jour le jour +:FR:- « Containeriser » son environnement de développement \ No newline at end of file diff --git a/slides/containers/Multi_Stage_Builds.md b/slides/containers/Multi_Stage_Builds.md index 8f0f572b..d2bbd782 100644 --- a/slides/containers/Multi_Stage_Builds.md +++ b/slides/containers/Multi_Stage_Builds.md @@ -313,3 +313,11 @@ virtually "free." * Sometimes, we want to inspect a specific intermediary build stage. * Or, we want to describe multiple images using a single Dockerfile. + +??? + +:EN:Optimizing our images and their build process +:EN:- Leveraging multi-stage builds + +:FR:Optimiser les images et leur construction +:FR:- Utilisation d'un *multi-stage build* diff --git a/slides/containers/Naming_And_Inspecting.md b/slides/containers/Naming_And_Inspecting.md index 0003540d..b780bc2b 100644 --- a/slides/containers/Naming_And_Inspecting.md +++ b/slides/containers/Naming_And_Inspecting.md @@ -130,3 +130,12 @@ $ docker inspect --format '{{ json .Created }}' * The optional `json` keyword asks for valid JSON output.
    (e.g. here it adds the surrounding double-quotes.) + +??? + +:EN:Managing container lifecycle +:EN:- Naming and inspecting containers + +:FR:Suivre ses conteneurs à la loupe +:FR:- Obtenir des informations détaillées sur un conteneur +:FR:- Associer un identifiant unique à un conteneur diff --git a/slides/containers/Start_And_Attach.md b/slides/containers/Start_And_Attach.md index f4740975..1c398fae 100644 --- a/slides/containers/Start_And_Attach.md +++ b/slides/containers/Start_And_Attach.md @@ -175,3 +175,10 @@ class: extra-details * This will cause some CLI and TUI programs to redraw the screen. * But not all of them. + +??? + +:EN:- Restarting old containers +:EN:- Detaching and reattaching to container +:FR:- Redémarrer des anciens conteneurs +:FR:- Se détacher et rattacher à des conteneurs diff --git a/slides/containers/Training_Environment.md b/slides/containers/Training_Environment.md index 008f577f..02839fa7 100644 --- a/slides/containers/Training_Environment.md +++ b/slides/containers/Training_Environment.md @@ -125,3 +125,11 @@ Server: ] 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/count-slides.py b/slides/count-slides.py index bef11b36..768ed1dd 100755 --- a/slides/count-slides.py +++ b/slides/count-slides.py @@ -11,10 +11,10 @@ class State(object): self.section_title = None self.section_start = 0 self.section_slides = 0 - self.chapters = {} + self.modules = {} self.sections = {} def show(self): - if self.section_title.startswith("chapter-"): + if self.section_title.startswith("module-"): return print("{0.section_title}\t{0.section_start}\t{0.section_slides}".format(self)) self.sections[self.section_title] = self.section_slides @@ -38,10 +38,10 @@ for line in open(sys.argv[1]): if line == "--": state.current_slide += 1 toc_links = re.findall("\(#toc-(.*)\)", line) - if toc_links and state.section_title.startswith("chapter-"): - if state.section_title not in state.chapters: - state.chapters[state.section_title] = [] - state.chapters[state.section_title].append(toc_links[0]) + if toc_links and state.section_title.startswith("module-"): + if state.section_title not in state.modules: + state.modules[state.section_title] = [] + state.modules[state.section_title].append(toc_links[0]) # This is really hackish if line.startswith("class:"): for klass in EXCLUDED: @@ -51,7 +51,7 @@ for line in open(sys.argv[1]): state.show() -for chapter in sorted(state.chapters, key=lambda f: int(f.split("-")[1])): - chapter_size = sum(state.sections[s] for s in state.chapters[chapter]) - print("{}\t{}\t{}".format("total size for", chapter, chapter_size)) +for module in sorted(state.modules, key=lambda f: int(f.split("-")[1])): + module_size = sum(state.sections[s] for s in state.modules[module]) + print("{}\t{}\t{}".format("total size for", module, module_size)) diff --git a/slides/ctr-bootcamp.yml b/slides/ctr-bootcamp.yml index f4acd716..f602591c 100644 --- a/slides/ctr-bootcamp.yml +++ b/slides/ctr-bootcamp.yml @@ -14,7 +14,7 @@ slides: http://container.training/ exclude: - self-paced -chapters: +content: - shared/title.md - logistics.md - containers/intro.md diff --git a/slides/index.py b/slides/index.py index c13b5747..2a5ad0ff 100755 --- a/slides/index.py +++ b/slides/index.py @@ -7,6 +7,7 @@ FLAGS=dict( fr=u"🇫🇷", uk=u"🇬🇧", us=u"🇺🇸", + www=u"🌐", ) TEMPLATE=""" @@ -19,7 +20,7 @@ TEMPLATE="""
    - + @@ -35,7 +36,7 @@ TEMPLATE=""" - + {% if coming_soon %} diff --git a/slides/index.yaml b/slides/index.yaml index 65a09687..f73be801 100644 --- a/slides/index.yaml +++ b/slides/index.yaml @@ -1,3 +1,36 @@ +- date: [2020-06-16, 2020-06-18] + country: www + city: streaming + event: Ardan Live + speaker: jpetazzo + title: Intensive Kubernetes Bootcamp + attend: https://www.eventbrite.com/e/livestream-intensive-kubernetes-bootcamp-tickets-103262336428 + +- date: [2020-05-19, 2020-05-21] + country: www + city: streaming + event: Ardan Live + speaker: jpetazzo + title: Intensive Docker Bootcamp + attend: https://www.eventbrite.com/e/livestream-intensive-docker-bootcamp-tickets-103258886108 + +- date: [2020-05-04, 2020-05-08] + country: www + city: streaming + event: Ardan Live + speaker: jpetazzo + title: Intensive Kubernetes - Advanced Concepts + attend: https://www.eventbrite.com/e/livestream-intensive-kubernetes-advanced-concepts-tickets-102358725704 + +- date: [2020-03-30, 2020-04-02] + country: www + city: streaming + event: Ardan Live + speaker: jpetazzo + title: Intensive Docker and Kubernetes + attend: https://www.eventbrite.com/e/ardan-labs-live-worldwide-march-30-april-2-2020-tickets-100331129108# + slides: https://https://2020-03-ardan.container.training/ + - date: 2020-03-06 country: uk city: London diff --git a/slides/k8s-adv-1.yml b/slides/k8s-adv-1.yml index a146f115..bcbdc51b 100644 --- a/slides/k8s-adv-1.yml +++ b/slides/k8s-adv-1.yml @@ -16,7 +16,7 @@ slides: https://2020-04-ardan.container.training/ exclude: - self-paced -chapters: +content: - shared/title.md - logistics.md - k8s/intro.md diff --git a/slides/k8s-adv-2.yml b/slides/k8s-adv-2.yml index 09c84321..db3f7686 100644 --- a/slides/k8s-adv-2.yml +++ b/slides/k8s-adv-2.yml @@ -16,7 +16,7 @@ slides: https://2020-04-ardan.container.training/ exclude: - self-paced -chapters: +content: - shared/title.md - logistics.md - k8s/intro.md diff --git a/slides/k8s-adv-3.yml b/slides/k8s-adv-3.yml index 8c167d8e..147dc665 100644 --- a/slides/k8s-adv-3.yml +++ b/slides/k8s-adv-3.yml @@ -15,7 +15,7 @@ slides: https://2020-04-ardan.container.training/ exclude: - self-paced -chapters: +content: - shared/title.md - logistics.md - k8s/intro.md diff --git a/slides/k8s-adv-4.yml b/slides/k8s-adv-4.yml index 3111e22a..9c268ed1 100644 --- a/slides/k8s-adv-4.yml +++ b/slides/k8s-adv-4.yml @@ -16,7 +16,7 @@ slides: https://2020-04-ardan.container.training/ exclude: - self-paced -chapters: +content: - shared/title.md - logistics.md - k8s/intro.md diff --git a/slides/k8s-bootcamp.yml b/slides/k8s-bootcamp.yml index c16cfc9f..5624eed4 100644 --- a/slides/k8s-bootcamp.yml +++ b/slides/k8s-bootcamp.yml @@ -15,7 +15,7 @@ slides: http://container.training/ exclude: - self-paced -chapters: +content: - shared/title.md - logistics.md - k8s/intro.md diff --git a/slides/k8s/accessinternal.md b/slides/k8s/accessinternal.md index 6767f44f..a647c38a 100644 --- a/slides/k8s/accessinternal.md +++ b/slides/k8s/accessinternal.md @@ -129,3 +129,8 @@ installed and set up `kubectl` to communicate with your cluster. ``` ] + +??? + +:EN:- Securely accessing internal services +:FR:- Accès sécurisé aux services internes diff --git a/slides/k8s/apilb.md b/slides/k8s/apilb.md index 2de80383..499a27b3 100644 --- a/slides/k8s/apilb.md +++ b/slides/k8s/apilb.md @@ -87,3 +87,8 @@ - Tunnels are also fine (e.g. [k3s](https://k3s.io/) uses a tunnel to allow each node to contact the API server) + +??? + +:EN:- Ensuring API server availability +:FR:- Assurer la disponibilité du serveur API diff --git a/slides/k8s/architecture.md b/slides/k8s/architecture.md index ea0b7ee4..0002d53b 100644 --- a/slides/k8s/architecture.md +++ b/slides/k8s/architecture.md @@ -381,3 +381,8 @@ We demonstrated *update* and *watch* semantics. - if the pod has special constraints that can't be met - if the scheduler is not running (!) + +??? + +:EN:- Kubernetes architecture review +:FR:- Passage en revue de l'architecture de Kubernetes diff --git a/slides/k8s/authn-authz.md b/slides/k8s/authn-authz.md index a27b8424..2df6404a 100644 --- a/slides/k8s/authn-authz.md +++ b/slides/k8s/authn-authz.md @@ -676,3 +676,13 @@ class: extra-details - Both are available as standalone programs, or as plugins for `kubectl` (`kubectl` plugins can be installed and managed with `krew`) + +??? + +:EN:- Authentication and authorization in Kubernetes +:EN:- Role-Based Access Control (RBAC) +:EN:- Restricting permissions with Service Accounts + +:FR:- Identification et droits d'accès dans Kubernetes +:FR:- Le modèle RBAC *(Role-Based Access Control)* +:FR:- Restreindre les permissions grâce aux *Service Accounts* diff --git a/slides/k8s/batch-jobs.md b/slides/k8s/batch-jobs.md index 30e51f3c..c8b765ed 100644 --- a/slides/k8s/batch-jobs.md +++ b/slides/k8s/batch-jobs.md @@ -187,3 +187,8 @@ class: extra-details - If we write these manifests ourselves, we can use all features and options - We'll see later how to do that! + +??? + +:EN:- Running batch and cron jobs +:FR:- Tâches périodiques *(cron)* et traitement par lots *(batch)* diff --git a/slides/k8s/bootstrap.md b/slides/k8s/bootstrap.md index b8531dc3..25feeb95 100644 --- a/slides/k8s/bootstrap.md +++ b/slides/k8s/bootstrap.md @@ -257,3 +257,8 @@ This is the TLS bootstrap mechanism, step by step. - [kubeadm token](https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-token/) command - [kubeadm join](https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/) command (has details about [the join workflow](https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/#join-workflow)) + +??? + +:EN:- Leveraging TLS bootstrap to join nodes +:FR:- Ajout de nœuds grâce au *TLS bootstrap* diff --git a/slides/k8s/cloud-controller-manager.md b/slides/k8s/cloud-controller-manager.md index 0e6dd06f..7dd7b19b 100644 --- a/slides/k8s/cloud-controller-manager.md +++ b/slides/k8s/cloud-controller-manager.md @@ -142,3 +142,8 @@ The list includes the following providers: - [configuration](https://kubernetes.io/docs/concepts/cluster-administration/cloud-providers/) (mainly for OpenStack) - [deployment](https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/) + +??? + +:EN:- The Cloud Controller Manager +:FR:- Le *Cloud Controller Manager* diff --git a/slides/k8s/cluster-backup.md b/slides/k8s/cluster-backup.md index 1ae7f22b..73a34739 100644 --- a/slides/k8s/cluster-backup.md +++ b/slides/k8s/cluster-backup.md @@ -364,3 +364,8 @@ docker run --rm --net host -v $PWD:/vol \ - [bivac](https://github.com/camptocamp/bivac) Backup Interface for Volumes Attached to Containers + +??? + +:EN:- Backing up clusters +:FR:- Politiques de sauvegarde diff --git a/slides/k8s/cluster-sizing.md b/slides/k8s/cluster-sizing.md index 3cb9d02b..e0233e70 100644 --- a/slides/k8s/cluster-sizing.md +++ b/slides/k8s/cluster-sizing.md @@ -165,3 +165,11 @@ class: extra-details - Security advantage (stronger isolation between pods) Check [this blog post](http://jpetazzo.github.io/2019/02/13/running-kubernetes-without-nodes-with-kiyot/) for more details. + +??? + +:EN:- Capacity planning +:EN:- Cluster sizing and scaling + +:FR:- Dimensionnement des clusters +:FR:- Comportement en cas de famine diff --git a/slides/k8s/cluster-upgrade.md b/slides/k8s/cluster-upgrade.md index bfae7535..5d897f2d 100644 --- a/slides/k8s/cluster-upgrade.md +++ b/slides/k8s/cluster-upgrade.md @@ -501,3 +501,11 @@ class: extra-details - Then upgrading kubeadm to 1.16.X, etc. - **Make sure to read the release notes before upgrading!** + +??? + +:EN:- Best practices for cluster upgrades +:EN:- Example: upgrading a kubeadm cluster + +:FR:- Bonnes pratiques pour la mise à jour des clusters +:FR:- Exemple : mettre à jour un cluster kubeadm diff --git a/slides/k8s/cni.md b/slides/k8s/cni.md index 7f0141e2..1f955630 100644 --- a/slides/k8s/cni.md +++ b/slides/k8s/cni.md @@ -574,3 +574,8 @@ done - This could be useful for embedded platforms with very limited resources (or lab environments for learning purposes) + +??? + +:EN:- Configuring CNI plugins +:FR:- Configurer des plugins CNI diff --git a/slides/k8s/concepts-k8s.md b/slides/k8s/concepts-k8s.md index cdc95e1b..f8d3a0db 100644 --- a/slides/k8s/concepts-k8s.md +++ b/slides/k8s/concepts-k8s.md @@ -401,3 +401,8 @@ class: pic - IP addresses are associated with *pods*, not with individual containers Both diagrams used with permission. + +??? + +:EN:- Kubernetes concepts +:FR:- Kubernetes en théorie diff --git a/slides/k8s/configuration.md b/slides/k8s/configuration.md index 0283e888..19a47c95 100644 --- a/slides/k8s/configuration.md +++ b/slides/k8s/configuration.md @@ -547,3 +547,13 @@ spec: - With RBAC, we can authorize a user to access configmaps, but not secrets (since they are two different kinds of resources) + +??? + +:EN:- Managing application configuration +:EN:- The downward API +:EN:- Config Maps and Secrets + +:FR:- Gérer la configuration des applications +:FR:- La *downward API* +:FR:- Utiliser les *Config Maps* et *Secrets* diff --git a/slides/k8s/control-plane-auth.md b/slides/k8s/control-plane-auth.md index e188430f..1d19277c 100644 --- a/slides/k8s/control-plane-auth.md +++ b/slides/k8s/control-plane-auth.md @@ -263,3 +263,8 @@ spec: #name: web-xyz1234567-pqr89 EOF ``` + +??? + +:EN:- Control plane authentication +:FR:- Sécurisation du plan de contrôle diff --git a/slides/k8s/csr-api.md b/slides/k8s/csr-api.md index f5bc4976..47c83cac 100644 --- a/slides/k8s/csr-api.md +++ b/slides/k8s/csr-api.md @@ -424,3 +424,8 @@ To be usable in real environments, we would need to add: - we get strong security *and* convenience - Systems like Vault also have certificate issuance mechanisms + +??? + +:EN:- Generating user certificates with the CSR API +:FR:- Génération de certificats utilisateur avec la CSR API diff --git a/slides/k8s/daemonset.md b/slides/k8s/daemonset.md index cbba5028..6c664294 100644 --- a/slides/k8s/daemonset.md +++ b/slides/k8s/daemonset.md @@ -688,3 +688,8 @@ class: extra-details (by setting their label accordingly) - This gives us building blocks for canary and blue/green deployments + +??? + +:EN:- Scaling with Daemon Sets +:FR:- Utilisation de Daemon Sets diff --git a/slides/k8s/dashboard.md b/slides/k8s/dashboard.md index 8d284f90..0a325960 100644 --- a/slides/k8s/dashboard.md +++ b/slides/k8s/dashboard.md @@ -172,3 +172,8 @@ The dashboard will then ask you which authentication you want to use. - It introduces new failure modes (for instance, if you try to apply YAML from a link that's no longer valid) + +??? + +:EN:- The Kubernetes dashboard +:FR:- Le *dashboard* Kubernetes diff --git a/slides/k8s/declarative.md b/slides/k8s/declarative.md index fc4e1fb0..f1ffc5ae 100644 --- a/slides/k8s/declarative.md +++ b/slides/k8s/declarative.md @@ -26,3 +26,8 @@ - When we want to change some resource, we update the *spec* - Kubernetes will then *converge* that resource + +??? + +:EN:- Declarative vs imperative models +:FR:- Modèles déclaratifs et impératifs diff --git a/slides/k8s/dmuc.md b/slides/k8s/dmuc.md index 6424a149..5081e73d 100644 --- a/slides/k8s/dmuc.md +++ b/slides/k8s/dmuc.md @@ -823,3 +823,8 @@ class: extra-details (it could be as a bare process, or in a container/pod using the host network) - ... And it expects to be listening on port 6443 with TLS + +??? + +:EN:- Building our own cluster from scratch +:FR:- Construire son cluster à la main diff --git a/slides/k8s/extending-api.md b/slides/k8s/extending-api.md index 93abe36f..0e080513 100644 --- a/slides/k8s/extending-api.md +++ b/slides/k8s/extending-api.md @@ -344,3 +344,14 @@ class: extra-details - [Dynamic Admission Controllers](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/) - [Aggregation Layer](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) + +??? + +:EN:- Extending the Kubernetes API +:EN:- Custom Resource Definitions (CRDs) +:EN:- The aggregation layer +:EN:- Admission control and webhooks + +:FR:- Comment étendre l'API Kubernetes +:FR:- Les CRDs *(Custom Resource Definitions)* +:FR:- Extension via *aggregation layer*, *admission control*, *webhooks* diff --git a/slides/k8s/gitworkflows.md b/slides/k8s/gitworkflows.md index c1ebdf6e..74e7a624 100644 --- a/slides/k8s/gitworkflows.md +++ b/slides/k8s/gitworkflows.md @@ -237,3 +237,8 @@ - Gitkube can also deploy Helm charts (instead of raw YAML files) + +??? + +:EN:- GitOps +:FR:- GitOps diff --git a/slides/k8s/healthchecks-more.md b/slides/k8s/healthchecks-more.md index a812966c..8e6b51b2 100644 --- a/slides/k8s/healthchecks-more.md +++ b/slides/k8s/healthchecks-more.md @@ -333,3 +333,8 @@ class: extra-details (and have gcr.io/pause take care of the reaping) - Discussion of this in [Video - 10 Ways to Shoot Yourself in the Foot with Kubernetes, #9 Will Surprise You](https://www.youtube.com/watch?v=QKI-JRs2RIE) + +??? + +:EN:- Adding healthchecks to an app +:FR:- Ajouter des *healthchecks* à une application diff --git a/slides/k8s/healthchecks.md b/slides/k8s/healthchecks.md index 8055bfd8..ad31ab77 100644 --- a/slides/k8s/healthchecks.md +++ b/slides/k8s/healthchecks.md @@ -282,3 +282,8 @@ If the Redis process becomes unresponsive, it will be killed. - check the timestamp of that file from an exec probe - Writing logs (and checking them from the probe) also works + +??? + +:EN:- Using healthchecks to improve availability +:FR:- Utiliser des *healthchecks* pour amémliorer la disponibilité diff --git a/slides/k8s/helm-chart-format.md b/slides/k8s/helm-chart-format.md index e62c853b..c0a5ada0 100644 --- a/slides/k8s/helm-chart-format.md +++ b/slides/k8s/helm-chart-format.md @@ -237,3 +237,8 @@ We see the components mentioned above: `Chart.yaml`, `templates/`, `values.yaml` - This can be use for database migrations, backups, notifications, smoke tests ... - Hooks named `test` are executed only when running `helm test RELEASE-NAME` + +??? + +:EN:- Helm charts format +:FR:- Le format des *Helm charts* diff --git a/slides/k8s/helm-create-basic-chart.md b/slides/k8s/helm-create-basic-chart.md index bdd0ef47..4ca908c1 100644 --- a/slides/k8s/helm-create-basic-chart.md +++ b/slides/k8s/helm-create-basic-chart.md @@ -218,3 +218,8 @@ have details about recommended annotations and labels. ``` ] + +??? + +:EN:- Creating basic Helm charts +:FR:- Création de *Helm charts* basiques diff --git a/slides/k8s/helm-create-better-chart.md b/slides/k8s/helm-create-better-chart.md index 3aba5fab..d7c06a28 100644 --- a/slides/k8s/helm-create-better-chart.md +++ b/slides/k8s/helm-create-better-chart.md @@ -577,3 +577,8 @@ We can look at the definition, but it's fairly complex ... - We can change the number of workers with `replicaCount` - And much more! + +??? + +:EN:- Creating better Helm charts +:FR:- Création de *Helm charts* avancés diff --git a/slides/k8s/helm-intro.md b/slides/k8s/helm-intro.md index 6b6d9eab..bb36d96a 100644 --- a/slides/k8s/helm-intro.md +++ b/slides/k8s/helm-intro.md @@ -417,3 +417,13 @@ All unspecified values will take the default values defined in the chart. ``` ] + +??? + +:EN:- Helm concepts +:EN:- Installing software with Helm + +:FR:- Fonctionnement général de Helm +:FR:- Installer des composants via Helm + +:FR:- Comment \ No newline at end of file diff --git a/slides/k8s/helm-secrets.md b/slides/k8s/helm-secrets.md index b47321cb..032ad0e4 100644 --- a/slides/k8s/helm-secrets.md +++ b/slides/k8s/helm-secrets.md @@ -232,3 +232,8 @@ The chart is in a structured format, but it's entirely captured in this JSON. (including the full source of the chart, and the values used) - This allows arbitrary rollbacks, as well as tweaking values even without having access to the source of the chart (or the chart repo) used for deployment + +??? + +:EN:- Deep dive into Helm internals +:FR:- Fonctionnement interne de Helm diff --git a/slides/k8s/horizontal-pod-autoscaler.md b/slides/k8s/horizontal-pod-autoscaler.md index 04ead202..8c8ad1bf 100644 --- a/slides/k8s/horizontal-pod-autoscaler.md +++ b/slides/k8s/horizontal-pod-autoscaler.md @@ -306,3 +306,8 @@ This can also be set with `--cpu-percent=`. --> ] + +??? + +:EN:- Auto-scaling resources +:FR:- *Auto-scaling* (dimensionnement automatique) des ressources diff --git a/slides/k8s/ingress.md b/slides/k8s/ingress.md index 8f7843f5..43c6c810 100644 --- a/slides/k8s/ingress.md +++ b/slides/k8s/ingress.md @@ -718,3 +718,8 @@ We also need: (create them, promote them, delete them ...) For inspiration, check [flagger by Weave](https://github.com/weaveworks/flagger). + +??? + +:EN:- The Ingress resource +:FR:- La ressource *ingress* diff --git a/slides/k8s/interco.md b/slides/k8s/interco.md index 5907b3e7..557ac0c2 100644 --- a/slides/k8s/interco.md +++ b/slides/k8s/interco.md @@ -155,3 +155,8 @@ For critical services, we might want to precisely control the update process. - Even better if it's combined with DNS integration (to facilitate name → ClusterIP resolution) + +??? + +:EN:- Interconnecting clusters +:FR:- Interconnexion de clusters diff --git a/slides/k8s/kubectl-run.md b/slides/k8s/kubectl-run.md index d4aeaf06..e67b2bcf 100644 --- a/slides/k8s/kubectl-run.md +++ b/slides/k8s/kubectl-run.md @@ -516,3 +516,8 @@ We'll see later how to address that shortcoming. - Until 30 seconds later, when the grace period expires - The pod is then killed, and `kubectl logs` exits + +??? + +:EN:- Running pods and deployments +:FR:- Créer un pod et un déploiement diff --git a/slides/k8s/kubectlexpose.md b/slides/k8s/kubectlexpose.md index d1347da1..0d3bec75 100644 --- a/slides/k8s/kubectlexpose.md +++ b/slides/k8s/kubectlexpose.md @@ -438,3 +438,13 @@ class: extra-details - They can also handle TLS certificates, URL rewriting ... - They require an *Ingress Controller* to function + +??? + +:EN:- Service discovery and load balancing +:EN:- Accessing pods through services +:EN:- Service types: ClusterIP, NodePort, LoadBalancer + +:FR:- Exposer un service +:FR:- Différents types de services : ClusterIP, NodePort, LoadBalancer +:FR:- Utiliser CoreDNS pour la *service discovery* diff --git a/slides/k8s/kubectlget.md b/slides/k8s/kubectlget.md index 7cfbb119..c5ba158f 100644 --- a/slides/k8s/kubectlget.md +++ b/slides/k8s/kubectlget.md @@ -578,3 +578,8 @@ $ curl -k https://10.96.0.1 - Code running in pods can connect to services using their name (e.g. https://kubernetes/...) + +??? + +:EN:- Getting started with kubectl +:FR:- Se familiariser avec kubectl diff --git a/slides/k8s/kubenet.md b/slides/k8s/kubenet.md index bc470475..73c6af0f 100644 --- a/slides/k8s/kubenet.md +++ b/slides/k8s/kubenet.md @@ -145,3 +145,8 @@ class: extra-details - Some solutions can fill multiple roles (e.g. kube-router can be set up to provide the pod network and/or network policies and/or replace kube-proxy) + +??? + +:EN:- The Kubernetes network model +:FR:- Le modèle réseau de Kubernetes diff --git a/slides/k8s/kubercoins.md b/slides/k8s/kubercoins.md index 3220f5fa..2028200c 100644 --- a/slides/k8s/kubercoins.md +++ b/slides/k8s/kubercoins.md @@ -242,3 +242,8 @@ https://@@GITREPO@@/blob/8279a3bce9398f7c1a53bdd95187c53eda4e6435/dockercoins/wo A drawing area should show up, and after a few seconds, a blue graph will appear. + +??? + +:EN:- Running a sample app +:FR:- Lancer une application de démo diff --git a/slides/k8s/kustomize.md b/slides/k8s/kustomize.md index 0554fadf..84fa9d19 100644 --- a/slides/k8s/kustomize.md +++ b/slides/k8s/kustomize.md @@ -199,3 +199,8 @@ ] Note: it might take a minute or two for the worker to start. + +??? + +:EN:- Packaging and running apps with Kustomize +:FR:- *Packaging* d'applications avec Kustomize diff --git a/slides/k8s/labels-annotations.md b/slides/k8s/labels-annotations.md index 59ebd454..790841ba 100644 --- a/slides/k8s/labels-annotations.md +++ b/slides/k8s/labels-annotations.md @@ -195,3 +195,8 @@ class: extra-details - Maximum length isn't defined (dozens of kilobytes is fine, hundreds maybe not so much) + +??? + +:EN:- Labels and annotations +:FR:- *Labels* et annotations diff --git a/slides/k8s/local-persistent-volumes.md b/slides/k8s/local-persistent-volumes.md index 075cb619..b0c381cd 100644 --- a/slides/k8s/local-persistent-volumes.md +++ b/slides/k8s/local-persistent-volumes.md @@ -246,3 +246,8 @@ (when we can't or won't dedicate a whole disk to a volume) - It's possible to mix both (using distinct Storage Classes) + +??? + +:EN:- Local persistent volumes +:FR:- Volumes locaux persistents diff --git a/slides/k8s/localkubeconfig.md b/slides/k8s/localkubeconfig.md index efcae788..6d96fd4b 100644 --- a/slides/k8s/localkubeconfig.md +++ b/slides/k8s/localkubeconfig.md @@ -193,3 +193,8 @@ class: extra-details ] We can now utilize the cluster exactly as if we're logged into a node, except that it's remote. + +??? + +:EN:- Working with remote Kubernetes clusters +:FR:- Travailler avec des *clusters* distants diff --git a/slides/k8s/logs-centralized.md b/slides/k8s/logs-centralized.md index 07af0ce3..2d0644fe 100644 --- a/slides/k8s/logs-centralized.md +++ b/slides/k8s/logs-centralized.md @@ -145,3 +145,8 @@ But this is outside of the scope of this chapter. The YAML file that we used creates all the resources in the `default` namespace, for simplicity. In a real scenario, you will create the resources in the `kube-system` namespace or in a dedicated namespace. + +??? + +:EN:- Centralizing logs +:FR:- Centraliser les logs diff --git a/slides/k8s/logs-cli.md b/slides/k8s/logs-cli.md index f02dc358..288d929a 100644 --- a/slides/k8s/logs-cli.md +++ b/slides/k8s/logs-cli.md @@ -149,3 +149,8 @@ Exactly what we need! --> ] + +??? + +:EN:- Viewing pod logs from the CLI +:FR:- Consulter les logs des pods depuis la CLI diff --git a/slides/k8s/metrics-server.md b/slides/k8s/metrics-server.md index cbd9bb15..fba78e22 100644 --- a/slides/k8s/metrics-server.md +++ b/slides/k8s/metrics-server.md @@ -80,3 +80,8 @@ If it shows our nodes and their CPU and memory load, we're good! - kube-resource-report can generate HTML reports (https://github.com/hjacobs/kube-resource-report) + +??? + +:EN:- The *core metrics pipeline* +:FR:- Le *core metrics pipeline* diff --git a/slides/k8s/multinode.md b/slides/k8s/multinode.md index 829208db..9f78ab72 100644 --- a/slides/k8s/multinode.md +++ b/slides/k8s/multinode.md @@ -532,3 +532,8 @@ Sometimes it works, sometimes it doesn't. Why? - We want to automate all these steps - We want something that works on all networks + +??? + +:EN:- Connecting nodes ands pods +:FR:- Interconnecter les nœuds et les pods diff --git a/slides/k8s/namespaces.md b/slides/k8s/namespaces.md index 45a6962f..9eba8428 100644 --- a/slides/k8s/namespaces.md +++ b/slides/k8s/namespaces.md @@ -365,3 +365,7 @@ Note: we could have used `--namespace=default` for the same result. - Pro-tip: install it on your machine during the next break! +??? + +:EN:- Organizing resources with Namespaces +:FR:- Organiser les ressources avec des *namespaces* diff --git a/slides/k8s/netpol.md b/slides/k8s/netpol.md index 5ec070d9..90a1d31f 100644 --- a/slides/k8s/netpol.md +++ b/slides/k8s/netpol.md @@ -446,3 +446,8 @@ troubleshoot easily, without having to poke holes in our firewall. - a [very good talk about network policies](https://www.youtube.com/watch?list=PLj6h78yzYM2P-3-xqvmWaZbbI1sW-ulZb&v=3gGpMmYeEO8) at KubeCon North America 2017 - a repository of [ready-to-use recipes](https://github.com/ahmetb/kubernetes-network-policy-recipes) for network policies + +??? + +:EN:- Network isolation with Network Policies +:FR:- Protection réseau avec les *network policies* diff --git a/slides/k8s/openid-connect.md b/slides/k8s/openid-connect.md index 8b23fd64..4c781079 100644 --- a/slides/k8s/openid-connect.md +++ b/slides/k8s/openid-connect.md @@ -377,3 +377,8 @@ class: extra-details - It should now say "Signature Verified" ] + +??? + +:EN:- Authenticating with OIDC +:FR:- S'identifier avec OIDC diff --git a/slides/k8s/operators-design.md b/slides/k8s/operators-design.md index b181c3db..d64eb22b 100644 --- a/slides/k8s/operators-design.md +++ b/slides/k8s/operators-design.md @@ -356,3 +356,8 @@ class: extra-details (this is used e.g. by the metrics server) - [This documentation page](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#choosing-a-method-for-adding-custom-resources) compares the features of CRDs and API aggregation + +??? + +:EN:- Guidelines to design our own operators +:FR:- Comment concevoir nos propres opérateurs diff --git a/slides/k8s/operators.md b/slides/k8s/operators.md index 6748321f..46b471b8 100644 --- a/slides/k8s/operators.md +++ b/slides/k8s/operators.md @@ -615,3 +615,11 @@ After the Kibana UI loads, we need to click around a bit *Operators can be very powerful.
    But we need to know exactly the scenarios that they can handle.* + +??? + +:EN:- Kubernetes operators +:EN:- Deploying ElasticSearch with ECK + +:FR:- Les opérateurs +:FR:- Déployer ElasticSearch avec ECK diff --git a/slides/k8s/ourapponkube.md b/slides/k8s/ourapponkube.md index 992a38b3..f7cfefd4 100644 --- a/slides/k8s/ourapponkube.md +++ b/slides/k8s/ourapponkube.md @@ -162,3 +162,8 @@ Yes, this may take a little while to update. *(Narrator: it was DNS.)* -- *Alright, we're back to where we started, when we were running on a single node!* + +??? + +:EN:- Running our demo app on Kubernetes +:FR:- Faire tourner l'application de démo sur Kubernetes diff --git a/slides/k8s/owners-and-dependents.md b/slides/k8s/owners-and-dependents.md index bce4d2f9..2d7e27f9 100644 --- a/slides/k8s/owners-and-dependents.md +++ b/slides/k8s/owners-and-dependents.md @@ -180,3 +180,8 @@ class: extra-details ] As always, the [documentation](https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/) has useful extra information and pointers. + +??? + +:EN:- Owners and dependents +:FR:- Liens de parenté entre les ressources diff --git a/slides/k8s/podsecuritypolicy.md b/slides/k8s/podsecuritypolicy.md index 0deb8284..a94d4e0a 100644 --- a/slides/k8s/podsecuritypolicy.md +++ b/slides/k8s/podsecuritypolicy.md @@ -531,3 +531,8 @@ class: extra-details ``` ] + +??? + +:EN:- Pod Security Policies +:FR:- Les *Pod Security Policies* diff --git a/slides/k8s/portworx.md b/slides/k8s/portworx.md index 46887b73..3f0e9152 100644 --- a/slides/k8s/portworx.md +++ b/slides/k8s/portworx.md @@ -678,3 +678,10 @@ were inspired by [Portworx examples on Katacoda](https://katacoda.com/portworx/s - [HA PostgreSQL on Kubernetes with Portworx](https://www.katacoda.com/portworx/scenarios/px-k8s-postgres-all-in-one) (with adaptations to use a Stateful Set and simplify PostgreSQL's setup) + +??? + +:EN:- Highly available persistent volumes +:EN:- Use-case: deploying Postgres with high availability + +:FR:- Cas d'usage : déployer un serveur SQL haute disponibilité diff --git a/slides/k8s/prometheus.md b/slides/k8s/prometheus.md index 3052c61e..37532837 100644 --- a/slides/k8s/prometheus.md +++ b/slides/k8s/prometheus.md @@ -562,3 +562,8 @@ class: extra-details Don't panic if you don't know these tools! ...But make sure at least one person in your team is on it 💯 + +??? + +:EN:- Collecting metrics with Prometheus +:FR:- Collecter des métriques avec Prometheus diff --git a/slides/k8s/resource-limits.md b/slides/k8s/resource-limits.md index 25e86406..8e3e5372 100644 --- a/slides/k8s/resource-limits.md +++ b/slides/k8s/resource-limits.md @@ -536,3 +536,15 @@ services.nodeports 0 0 - [static demo](https://hjacobs.github.io/kube-resource-report/sample-report/output/index.html) | [live demo](https://kube-resource-report.demo.j-serv.de/applications.html) + +??? + +:EN:- Allocate and limit container resources +:EN:- Define default resource limits +:EN:- Enforce resource quotas +:EN:- Resource management in practice + +:FR:- Allouer et limiter les ressources des conteneurs +:FR:- Définition de ressources par défaut +:FR:- Quotas de ressources +:FR:- Conseils pratiques \ No newline at end of file diff --git a/slides/k8s/rollout.md b/slides/k8s/rollout.md index 5e8c1a9f..e231e868 100644 --- a/slides/k8s/rollout.md +++ b/slides/k8s/rollout.md @@ -437,3 +437,12 @@ class: extra-details ] ] + +??? + +:EN:- Rolling updates +:EN:- Rolling back a bad deployment + +:FR:- Mettre à jour un déploiement +:FR:- Concept de *rolling update* et *rollback* +:FR:- Paramétrer la vitesse de déploiement diff --git a/slides/k8s/scalingdockercoins.md b/slides/k8s/scalingdockercoins.md index 36ce2674..404db95c 100644 --- a/slides/k8s/scalingdockercoins.md +++ b/slides/k8s/scalingdockercoins.md @@ -200,3 +200,8 @@ Now we can access the IP addresses of our services through `$HASHER` and `$RNG`. - `rng` is not (it should take about 700 milliseconds if there are 10 workers) - Something is wrong with `rng`, but ... what? + +??? + +:EN:- Scaling up our demo app +:FR:- *Scale up* de l'application de démo diff --git a/slides/k8s/setup-k8s.md b/slides/k8s/setup-k8s.md index 91740afa..994b8c11 100644 --- a/slides/k8s/setup-k8s.md +++ b/slides/k8s/setup-k8s.md @@ -92,3 +92,8 @@ - For a longer list, check the Kubernetes documentation:
    it has a great guide to [pick the right solution](https://kubernetes.io/docs/setup/#production-environment) to set up Kubernetes. + +??? + +:EN:- Overview of the kubeadm installer +:FR:- Survol de kubeadm diff --git a/slides/k8s/setup-managed.md b/slides/k8s/setup-managed.md index e13fd18a..05dedb66 100644 --- a/slides/k8s/setup-managed.md +++ b/slides/k8s/setup-managed.md @@ -250,6 +250,11 @@ with a cloud provider - OVH -- Scaleway (private beta) +- Scaleway - ... + +??? + +:EN:- Installing a managed cluster +:FR:- Installer un cluster infogéré diff --git a/slides/k8s/setup-selfhosted.md b/slides/k8s/setup-selfhosted.md index 43fd904b..f3c245fe 100644 --- a/slides/k8s/setup-selfhosted.md +++ b/slides/k8s/setup-selfhosted.md @@ -108,3 +108,8 @@
    (do they need training?) - etc. + +??? + +:EN:- Various ways to set up Kubernetes +:FR:- Différentes méthodes pour installer Kubernetes diff --git a/slides/k8s/shippingimages.md b/slides/k8s/shippingimages.md index 6618501f..37abef9d 100644 --- a/slides/k8s/shippingimages.md +++ b/slides/k8s/shippingimages.md @@ -115,4 +115,9 @@ There might be a long pause before the first layer is pulled, because the API behind `docker pull` doesn't allow to stream build logs, and there is no feedback during the build. -It is possible to view the build logs by setting up an account on [ctr.run](https://ctr.run/). \ No newline at end of file +It is possible to view the build logs by setting up an account on [ctr.run](https://ctr.run/). + +??? + +:EN:- Shipping images to Kubernetes +:FR:- Déployer des images sur notre cluster diff --git a/slides/k8s/statefulsets.md b/slides/k8s/statefulsets.md index a41ef707..fa1340ba 100644 --- a/slides/k8s/statefulsets.md +++ b/slides/k8s/statefulsets.md @@ -600,3 +600,10 @@ This will trigger the following actions. 5. The PersistentVolumeClaimBinder associates the PVs and the PVCs together. 6. PVCs are now bound, the Pods can start. + +??? + +:EN:- Deploying stateful applications +:EN:- Use-case: running Consul with a Stateful Set +:FR:- Déployer des applications persistante +:FR:- Example: lancer Consul avec un Sateful Set diff --git a/slides/k8s/staticpods.md b/slides/k8s/staticpods.md index 63974122..d501d31e 100644 --- a/slides/k8s/staticpods.md +++ b/slides/k8s/staticpods.md @@ -239,3 +239,8 @@ The `-node1` suffix was added automatically by kubelet. If we delete the pod (with `kubectl delete`), it will be recreated immediately. To delete the pod, we need to delete (or move) the manifest file. + +??? + +:EN:- Static pods +:FR:- Les *static pods* diff --git a/slides/k8s/versions-k8s.md b/slides/k8s/versions-k8s.md index 6cfb6c97..424140af 100644 --- a/slides/k8s/versions-k8s.md +++ b/slides/k8s/versions-k8s.md @@ -88,3 +88,8 @@ class: extra-details ``` - Check [the documentation](https://kubernetes.io/docs/setup/release/version-skew-policy/#kubectl) for the whole story about compatibility + +??? + +:EN:- Kubernetes versioning and compatibility +:FR:- Les versions de Kubernetes et leur compatibilité diff --git a/slides/k8s/volumes.md b/slides/k8s/volumes.md index 571b9382..0e644bad 100644 --- a/slides/k8s/volumes.md +++ b/slides/k8s/volumes.md @@ -467,3 +467,11 @@ spec: - A volume survives across container restarts - A volume is destroyed (or, for remote storage, detached) when the pod is destroyed + +??? + +:EN:- Sharing data between containers with volumes +:EN:- When and how to use Init Containers + +:FR:- Partager des données grâce aux volumes +:FR:- Quand et comment utilise un *Init Container* diff --git a/slides/k8s/yamldeploy.md b/slides/k8s/yamldeploy.md index 82798d33..4650e0cb 100644 --- a/slides/k8s/yamldeploy.md +++ b/slides/k8s/yamldeploy.md @@ -164,3 +164,8 @@ class: extra-details - this is typical for things that may be deployed multiple times - example: applications (production, staging, feature branches ...) + +??? + +:EN:- Deploying with YAML manifests +:FR:- Déployer avec des *manifests* YAML diff --git a/slides/logistics-online.md b/slides/logistics-online.md new file mode 100644 index 00000000..301abd39 --- /dev/null +++ b/slides/logistics-online.md @@ -0,0 +1,21 @@ +## Intros + +- Hello! We are: + + - .emoji[👷🏻‍♀️] AJ ([@s0ulshake], [EphemeraSearch]) + + - .emoji[🐳] Jérôme ([@jpetazzo], Enix SAS) + +- The training will run for 4 hours, with a 10 minutes break every hour + + (the middle break will be a bit longer) + +- Feel free to ask questions at any time + +- *Especially when you see full screen container pictures!* + +- Live feedback, questions, help: @@CHAT@@ + +[EphemeraSearch]: https://ephemerasearch.com/ +[@s0ulshake]: https://twitter.com/s0ulshake +[@jpetazzo]: https://twitter.com/jpetazzo \ No newline at end of file diff --git a/slides/logistics-template.md b/slides/logistics-template.md new file mode 100644 index 00000000..33388a06 --- /dev/null +++ b/slides/logistics-template.md @@ -0,0 +1,35 @@ +## Intros + +- This slide should be customized by the tutorial instructor(s). + +- Hello! We are: + + - .emoji[👩🏻‍🏫] Ann O'Nymous ([@...](https://twitter.com/...), Megacorp Inc) + + - .emoji[👨🏾‍🎓] Stu Dent ([@...](https://twitter.com/...), University of Wakanda) + + + +- The workshop will run from ... + +- There will be a lunch break at ... + + (And coffee breaks!) + +- Feel free to interrupt for questions at any time + +- *Especially when you see full screen container pictures!* + +- Live feedback, questions, help: @@CHAT@@ diff --git a/slides/logistics.md b/slides/logistics.md deleted file mode 100644 index 33388a06..00000000 --- a/slides/logistics.md +++ /dev/null @@ -1,35 +0,0 @@ -## Intros - -- This slide should be customized by the tutorial instructor(s). - -- Hello! We are: - - - .emoji[👩🏻‍🏫] Ann O'Nymous ([@...](https://twitter.com/...), Megacorp Inc) - - - .emoji[👨🏾‍🎓] Stu Dent ([@...](https://twitter.com/...), University of Wakanda) - - - -- The workshop will run from ... - -- There will be a lunch break at ... - - (And coffee breaks!) - -- Feel free to interrupt for questions at any time - -- *Especially when you see full screen container pictures!* - -- Live feedback, questions, help: @@CHAT@@ diff --git a/slides/logistics.md b/slides/logistics.md new file mode 120000 index 00000000..2780e3c0 --- /dev/null +++ b/slides/logistics.md @@ -0,0 +1 @@ +logistics-template.md \ No newline at end of file diff --git a/slides/markmaker.py b/slides/markmaker.py index 07e78062..5e2b20ca 100755 --- a/slides/markmaker.py +++ b/slides/markmaker.py @@ -42,7 +42,7 @@ def insertslide(markdown, title): before = markdown[:slide_position] - toclink = "toc-chapter-{}".format(title2path[title][0]) + toclink = "toc-module-{}".format(title2path[title][0]) _titles_ = [""] + all_titles + [""] currentindex = _titles_.index(title) previouslink = anchor(_titles_[currentindex-1]) @@ -54,7 +54,7 @@ def insertslide(markdown, title): class: pic -.interstitial[![Image separating from the next chapter]({interstitial})] +.interstitial[![Image separating from the next module]({interstitial})] --- @@ -98,7 +98,7 @@ def generatefromyaml(manifest, filename): if "html" not in manifest: manifest["html"] = filename + ".html" - markdown, titles = processchapter(manifest["chapters"], filename) + markdown, titles = processcontent(manifest["content"], filename) logging.debug("Found {} titles.".format(len(titles))) toc = gentoc(titles) markdown = markdown.replace("@@TOC@@", toc) @@ -134,9 +134,8 @@ def generatefromyaml(manifest, filename): # Maps a section title (the string just after "^# ") to its position -# in the table of content (as a (chapter,part,subpart,...) tuple). +# in the table of content (as a (module,part,subpart,...) tuple). title2path = {} -path2title = {} all_titles = [] # "tree" is a list of titles, potentially nested. @@ -144,50 +143,60 @@ def gentoc(tree, path=()): if not tree: return "" if isinstance(tree, str): + logging.debug("Path {} Title {}".format(path, tree)) title = tree title2path[title] = path - path2title[path] = title all_titles.append(title) - logging.debug("Path {} Title {}".format(path, title)) return "- [{}](#{})".format(title, anchor(title)) if isinstance(tree, list): + # If there is only one sub-element, give it index zero. + # Otherwise, elements will have indices 1-to-N. + offset = 0 if len(tree) == 1 else 1 + logging.debug( + "Path {} Tree [...({} sub-elements)]" + .format(path, len(tree))) if len(path) == 0: - return "\n---\n".join(gentoc(subtree, path+(i+1,)) for (i,subtree) in enumerate(tree)) + return "\n---\n".join(gentoc(subtree, path+(i+offset,)) for (i,subtree) in enumerate(tree)) elif len(path) == 1: - chapterslide = "name: toc-chapter-{n}\n\n## Chapter {n}\n\n".format(n=path[0]) + # If there is only one module, don't show "Module 1" but just "TOC" + if path[0] == 0: + label = "Table of contents" + else: + label = "Module {}".format(path[0]) + moduleslide = "name: toc-module-{n}\n\n## {label}\n\n".format(n=path[0], label=label) for (i,subtree) in enumerate(tree): - chapterslide += gentoc(subtree, path+(i+1,)) + "\n\n" - chapterslide += ".debug[(auto-generated TOC)]" - return chapterslide + moduleslide += gentoc(subtree, path+(i+offset,)) + "\n\n" + moduleslide += ".debug[(auto-generated TOC)]" + return moduleslide else: - return "\n\n".join(gentoc(subtree, path+(i+1,)) for (i,subtree) in enumerate(tree)) + return "\n\n".join(gentoc(subtree, path+(i+offset,)) for (i,subtree) in enumerate(tree)) # Arguments: -# - `chapter` is a string; if it has multiple lines, it will be used as +# - `content` is a string; if it has multiple lines, it will be used as # a markdown fragment; otherwise it will be considered as a file name # to be recursively loaded and parsed # - `filename` is the name of the file that we're currently processing # (to generate inline comments to facilitate edition) # Returns: (epxandedmarkdown,[list of titles]) # The list of titles can be nested. -def processchapter(chapter, filename): - if isinstance(chapter, str): - if "\n" in chapter: - titles = re.findall("^# (.*)", chapter, re.MULTILINE) +def processcontent(content, filename): + if isinstance(content, str): + if "\n" in content: + titles = re.findall("^# (.*)", content, re.MULTILINE) slidefooter = ".debug[{}]".format(makelink(filename)) - chapter = chapter.replace("\n---\n", "\n{}\n---\n".format(slidefooter)) - chapter += "\n" + slidefooter - return (chapter, titles) - if os.path.isfile(chapter): - return processchapter(open(chapter).read(), chapter) - if isinstance(chapter, list): - chapters = [processchapter(c, filename) for c in chapter] - markdown = "\n---\n".join(c[0] for c in chapters) - titles = [t for (m,t) in chapters if t] + content = content.replace("\n---\n", "\n{}\n---\n".format(slidefooter)) + content += "\n" + slidefooter + return (content, titles) + if os.path.isfile(content): + return processcontent(open(content).read(), content) + if isinstance(content, list): + subparts = [processcontent(c, filename) for c in content] + markdown = "\n---\n".join(c[0] for c in subparts) + titles = [t for (m,t) in subparts if t] return (markdown, titles) - logging.warning("Invalid chapter: {}".format(chapter)) - return "```\nInvalid chapter: {}\n```\n".format(chapter), [] + logging.warning("Invalid content: {}".format(content)) + return "```\nInvalid content: {}\n```\n".format(content), [] # Try to figure out the URL of the repo on GitHub. # This is used to generate "edit me on GitHub"-style links.
    {{ title }}
    Note: while some workshops are delivered in French, slides are always in English.
    Note: while some workshops are delivered in other languages, slides are always in English.
    Free video of our latest workshop
    If you're interested, we can deliver that workshop (or longer courses) to your team or organization.
    Contact Jérôme Petazzoni to make that happen!Contact Jérôme Petazzoni to make that happen!