- | 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 |
@@ -35,7 +36,7 @@ TEMPLATE="""
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! |
{% 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[]
+.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.