Les cours sont maintenus et donnés par : https://www.alterway.fr/cloud-consulting

The Foundation’s mission is to create and drive the adoption of a new computing paradigm that is optimized for modern distributed systems environments capable of scaling to tens of thousands of self healing multi-tenant nodes.
Standardisation : Le but principal de l'OCI est de créer des standards ouverts pour les formats de conteneurs et leurs runtimes. Cela permet d'assurer l'interopérabilité entre différentes plateformes et outils.Portabilité : En établissant des spécifications communes, l'OCI vise à rendre les conteneurs portables entre différents environnements d'exécution, clouds et systèmes d'exploitation.Compatibilité : L'initiative cherche à garantir que les conteneurs créés selon ses spécifications fonctionneront de manière cohérente, quel que soit l'outil utilisé pour les créer ou les exécuter.Innovation : Tout en maintenant des standards, l'OCI encourage l'innovation dans l'écosystème des conteneurs en fournissant une base commune sur laquelle les entreprises et les développeurs peuvent construire.Sécurité : L'OCI travaille également sur des spécifications liées à la sécurité des conteneurs, visant à améliorer la sécurité globale de l'écosystème.Collaboration industrielle : L'initiative favorise la collaboration entre de nombreuses entreprises et acteurs majeurs du secteur technologique pour définir ces standards.
De nombreuses sources d'informations et de contributions disponibles :
Docs : https://kubernetes.io/docs/
Slack : http://slack.k8s.io/
Discuss : https://discuss.kubernetes.io
Stack Overflow : https://stackoverflow.com/questions/tagged/kubernetes
Serverfault https://stackoverflow.com/questions/tagged/kubernetes
Hébergé sur Github : https://github.com/kubernetes/kubernetes :
Pull Requests https://github.com/kubernetes/kubernetes/pulls
Releases : https://github.com/kubernetes/kubernetes/releases
Projets en incubation :
Chaque release a son propre planning, pour exemple : https://github.com/kubernetes/sig-release/tree/master/releases/release-1.30#timeline
Décomposée en [Special Interest Groups] : https://github.com/kubernetes/community/blob/master/sig-list.md
Les SIG (Special Interest Groups) sont une partie essentielle de la structure organisationnelle de la communauté Kubernetes. Ils jouent un rôle crucial dans le développement et la maintenance de différents aspects de Kubernetes.
| SIG | Description |
|---|---|
| API Machinery | Frameworks extensibles pour les API |
| Architecture | Architecture globale et conception du projet |
| Autoscaling | Mise à l'échelle automatique des clusters et workloads |
| Auth | Authentification et autorisation |
| CLI | kubectl et outils en ligne de commande |
| Cloud Provider | Intégration avec les fournisseurs de cloud |
| Cluster Lifecycle | Outils pour la gestion du cycle de vie des clusters |
| Contributor Experience | Amélioration de l'expérience des contributeurs |
| Docs | Documentation et site web de Kubernetes |
| Instrumentation | Métriques, logging, et monitoring |
| SIG | Description |
|---|---|
| Multicluster | Gestion de multiples clusters |
| Network | Réseautage dans Kubernetes |
| Node | Composants au niveau du nœud |
| Release | Coordination des releases |
| Scalability | Performance et scalabilité |
| Scheduling | Planification des pods |
| Security | Sécurité du projet |
| Storage | Stockage et volumes |
| Testing | Tests et infrastructure de test |
| UI | Interface utilisateur et tableaux de bord |
| Windows | Support de Windows dans Kubernetes |
La CNCF organise 3 KubeCon par an :
Thèmes abordés :
Pour plus d'informations, Consulter le site officiel de la Cloud Native Computing Foundation (CNCF), l'organisation à l'origine de Kubernetes : https://www.cncf.io/
Kubernetes est écrit en Go, compilé statiquement.
Un ensemble de binaires sans dépendances
Faciles à conteneuriser et à packager
Peut se déployer uniquement avec des conteneurs sans dépendance d'OS
k3d, kind, minikube, docker...
Les noeuds qui exécutent les conteneurs embarquent :
Un "container Engine" (Docker, CRI-O, containerd...)
Une "kubelet" (node agent)
Un kube-proxy (un composant réseau nécessaire mais pas suffisant)
Ancien nom des noeuds : Minions

etcd: magasin de données clé-valeur open source cohérent et distribué
kube-apiserver : L'API Server est un composant qui expose l'API Kubernetes, l'API server qui permet la configuration d'objets Kubernetes (Pod, Service, Deployment, etc.)
core services :
kube-scheduler : Implémente les fonctionnalités de schedulingkube-controller-manager : Responsable de l'état du cluster, boucle infinie qui régule l'état du cluster afin d'atteindre un état désirékube-cloud-controller-manager : Est un composant important du plan de contrôle (control plane) de Kubernetes, spécifiquement conçu pour interagir avec l'infrastructure cloud sous-jacentekube-proxy : Permet le forwarding TCP/UDP et le load balancing entre les services et les backends (Pods)Le control plane est aussi appelé "Master"
etcdkube-apiserverSans le kube-apiserver le cluster ne sert à rien. De plus, il est LE SEUL à interagir avec le cluster etcd, que ce soit en écriture ou en lecture.
etcd
kube-schedulerLe kube-scheduler est le composant responsable d'assigner les pods aux nœuds "worker" du cluster. Il choisit alors selon les contraintes qui lui sont imposées un nœud sur lequel les pods peuvent être démarrés et exécutés.
kube-controller-managerLe kube-controller-manager exécute et fait tourner les processus de contrôle du cluster.
namespaces Kuberneteskube-cloud-controller-managerFonction principale :
kube-proxyLe kube-proxy maintient les règles réseau sur les nœuds. Ces règles permettent la communication vers les pods depuis l'intérieur ou l'extérieur de votre cluster.
Responsable de la publication de services
Route les paquets à destination des PODs et réalise le load balancing TCP/UDP
3 modes de proxyfication :
Userspace mode
IPtables mode
IPVS (IP Virtual Server) mode
Remarque: Par défaut, Kube-proxy fonctionne sur le port 10249. Vous pouvez utiliser un ensemble d'endpoints exposés par Kube-proxy pour l'interroger et obtenir des informations.
Pour voir quel mode est utilisé :
Sur un des noeuds executer la commande :
curl -v localhost:10249/proxyMode;echo
# ex: retourne iptablesCertains plugins réseaux, tel que Cilium, permettent de ne plus utiliser kube-proxy et de le remplacer par un composant du CNI
kube-proxy Userspace modekube-proxy IPtables modekube-proxy IPVS modeIPVS mode équilibre la charge en utilisant la fonctionnalité IPVS du noyau Linux. Par rapport au mode IPtables, il offre une meilleure évolutivité et des performances améliorées.
IPVS est le mode recommandé pour les installations à grande échelle car il peut gérer de plus gros volumes de trafic avec efficacité. IPtable Non !
Elle, Il, iel ? 😉


Kubernetes n'implémente pas de solution réseau par défaut, mais s'appuie sur des solutions tierces qui implémentent les fonctionnalités suivantes:
Les versions de Kubernetes sont exprimées sous la forme x.y.z, où x est la version majeure, y est la version mineure et z est la version du correctif, conformément à la terminologie du Semantic Versioning.
1.33
Latest Release:1.33.4 (released: 2025-08-12)
End of Life:2026-06-28
Complete 1.33 Schedule and Changelog
| Solution | Description | Avantages | Inconvénients |
|---|---|---|---|
| Minikube | Outil officiel pour installer un cluster Kubernetes local sur une machine. | - Facile à installer et à configurer - Compatible avec la majorité des environnements - Supporte divers hyperviseurs et conteneurs |
- Peut être lourd en ressources - Nécessite une VM pour fonctionner |
| Kind | Kubernetes IN Docker (KinD) utilise Docker pour exécuter des clusters. | - Léger et rapide - Simple à configurer - Idéal pour les tests CI/CD |
- Moins de fonctionnalités avancées - Dépend de Docker |
| MicroK8s | Distribution légère de Kubernetes par Canonical. | - Facile à installer - Léger et optimisé - Idéal pour les environnements de développement |
- Moins de flexibilité dans la configuration - Utilise des snaps (peut ne pas plaire à tout le monde) |
| K3s | Distribution allégée de Kubernetes par Rancher. | - Très léger et rapide - Idéal pour les environnements IoT et edge - Moins de ressources requises |
- Moins de fonctionnalités intégrées - Moins documenté que Minikube |
| Docker Desktop | Inclut une option pour exécuter Kubernetes directement. | - Facile à utiliser pour les développeurs habitués à Docker - Intégration transparente avec Docker |
- Peut être lourd en ressources - Moins flexible que Minikube ou Kind |
| Rancher Desktop | - Open Source, - Choix des version de k8s - Choix du CRI |
- Facile à utiliser | - Moins d'extensions que Minikube |
Installation : https://minikube.sigs.k8s.io/docs/start
Les cluster sont supprimés automatiquement au fichier ~/.kube/config avec la commande minikube delete [--all]
minikube addons listPré-requis : - Linux - Raspberry
ou plus simplement : curl -sfL https://get.k3s.io | sh -
kind create clusterInstallation : https://www.docker.com/products/docker-desktop/
Licence obligatoire si autre utilisation que personnelle (https://www.docker.com/pricing/)


Kubeadm est un outil qui facilite le déploiement de Kubernetes en automatisant les tâches d'initialisation et de configuration d'un cluster.
swap (Support alpha depuis la 1.22)kubeadm init sur le noeud master(control plane)kubeadm join sur les autres noeuds (worker) (avec le token fournit par la commande kubeadm init)kubeadm initEn plus de l'installation de Kubernetes, kubeadm peut :
Génération des fichiers de configuration: Crée les fichiers de configuration nécessaires pour les composants du cluster.
Gestion des certificats: Génère et distribue les certificats nécessaires pour sécuriser les communications entre les composants du cluster.
Gestion des tokens: Crée des tokens d'authentification pour les nœuds qui rejoignent le cluster.
Vérification de la configuration: Valide que le système et les configurations sont compatibles avec Kubernetes.
Mises à jour et modifications: Facilite les mises à jour des versions de Kubernetes et les modifications de la configuration du cluster.
Via Ansible : kubespray https://github.com/kubernetes-sigs/kubespray
Via Terraform : https://github.com/poseidon/typhoon
Voici quelques outils permettant de certifier les déploiements des cluster kubernetes en terme de sécurité et de respects des standards
--recordreplicaSet (annotation)replicatset
$ kubectl create -f nginx.yaml --record
deployment.apps/nginx created
# Voir les informations
kubectl rollout history--record# déployer l'image worker:v0.2
kubectl create deployment worker --image=dockercoins/worker:v0.2
# Roll back `worker` vers l'image version 0.1:
kubectl set image deployment worker worker=dockercoins/worker:v0.1 --record
# Le remettre sur la version 0.2:
kubectl set image deployment worker worker=dockercoins/worker:v0.2 --record
# Voir l'historique des changement:
kubectl rollout history deployment workerkubectl scale :kubectl scale --replicas=5 deployment nginxkubectl set image deployment nginx nginx=nginx:1.15kubectl run nginx --image=nginx --dry-run=client
kubectl run nginx --image=nginx --dry-run=serverkubectl run nginx --image=nginx \
--command -- <cmd> <arg1> ... <argN>kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure \
-- perl -Mbignum=bpi -wle 'print bpi(2000)'kubectl run -it busybox --image=busybox -- shkubectl attach my-pod -ikubectl port-forward my-svc 6000kubectl autoscale deployment my-Deployments --min=2 --max=10 --cpu-percent=70 kubectl pour diagnostiquer les applications et le cluster kubernetes :kubectl cluster-info
kubectl get events --sort-by='.lastTimestamp'
kubectl describe node <NODE_NAME>
kubectl describe node <node-name> | grep Taints
kubectl logs (-f) <POD_NAME>kubectl logs# exemple :
kubectl logs deploy/nginxCTRL-Cpour arrêter la sortiekubectl logs supporte les options suivantes : - -f/--follow pour suivre les affichage des logs en temps réel (comme pour tail -f) - --tail pour n'afficher que les n lignes à partir de la fin de la sortie - --since pour n'afficher que les logs à partir d'une certaine date - --timestampsaffichera le timestamp du message
# exemple :
kubectl logs deploy/pingpong --tail 100 --follow --since=5s
# Affichera toutes les logs depuis 5 secondes et commencera au 100eme messages et continuera l'affichage des nouveaux messagesLorsque on spécifie un nom de déploiement, seuls les logs d'un seul pod sont affichés
Pour afficher les logs de plusieurs pod il faudra utiliser un selecteur (label)
kubectl logs -l app=my-app --tail 100 # -f 
kubectl get nodes
kubectl describe nodeskubectl cordon <NODE_NAME>
kubectl drain <NDOE_NAME>
kubectl uncordon <NODE_NAME>
# lister les contextes
kubectl config get-contexts
# Se déplacer dans un contexte
kubectl config use-context <nom-du-contexte>
# ou
alias kubectx='kubectl config use-context '
# ex: kubectx <nom-du-cluster>Évite de toujours préciser le flag -n
kubectl get ns
kubectl config set-context --current --namespace <nom-du-namespace>
# ou
alias kubens='kubectl config set-context --current --namespace '
# ex: kubens kube-system krew est un manager de plugins pour kubectl
installation de krew (https://krew.sigs.k8s.io/docs/user-guide/setup/install/)
kubectl krew install example
kubectl example deployListe des plugins : https://krew.sigs.k8s.io/plugins/ très utiles :
neat : permet de d'avoir un ouput "propre" d'une resource kubernetes - très utile pour créer des manifestes à partir de resources existantesctx : permet de changer de contexte facilementns : permet de changet de namespace facilementnode-shell : Créer un shell racine sur un nœud via kubectl, très pratique sur les CSPdf-pv : Afficher l'utilisation du disque (comme la commande df) pour les volumes persistantspopeye : Analyse vos clusters pour détecter d'éventuels problèmes de ressourcesUn nœud avec un taint empêche l'exécution sur lui-même des pods qui ne tolèrent pas ce taint
key=value:Effect
Ce champ peut avoir 3 valeurs : NoSchedule, PreferNoSchedule, NoExecute
Equal (key=value:Effect)Exist (keyExist:Effect)En ligne de commande
kubectl taint nodes THENODE special=true:NoExecutekubectl taint node worker-0 node-role.kubernetes.io/master="":NoSchedulekubectl taint node worker-2 test:NoSchedulekubectl taint nodes THENODE special=true:NoExecute-kubectl taint node worker-0 node-role.kubernetes.io/master-kubectl taint node worker-2 test:NoSchedule-kubectl get nodes THENODE -o jsonpath="{.spec.taints}"[{"effect":"NoSchedule","key":"node-role.kubernetes.io/master"}]Les tolerations peuvent être décrites au niveau des pods ou au niveau des templates de pods dans les replicaset, daemonset, statefulset et deployment.
Ces tolerations permettront aux pods de s'exécuter sur les nœuds qui ont le taint correspondant.
apiVersion: v1
kind: Pod
metadata:
...
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoScheduleapiVersion: v1
kind: Pod
metadata:
...
spec:
tolerations:
- key: special
value: "true"
effect: NoExecute
Operator: EqualUne clé vide avec un opérateur Exist fera en sorte que le pod s'exécutera sur tous les nœuds quelque soit leurs taints
exemple :
tolerations:
- operator: "Exists"
Exemples
kubectl label nodes <node-name> <label-key>=<label-value>kubectl label nodes worker-0 disktype=ssd
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssdCe système permet de gérer très finement les règles de placement des pods en regard de la simplicité du nodeSelector
soft (pod déployé malgré tout) ou hard (pod déployé uniquement si les règles sont respectées)
preferredDuringSchedulingIgnoredDuringExecutionrequiredDuringSchedulingIgnoredDuringExecutionapiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In # (NotIn, Exists, DoesNotExist, Gt, Lt)
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In # (NotIn, Exists, DoesNotExist, Gt, Lt)
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: topology.kubernetes.io/zone
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: k8s.gcr.io/pause:2.0Authentication (Qui êtes-vous ?):
Méthodes principales :
Résultat : identité confirmée ou requête rejetée
Authorization (Que pouvez-vous faire ?):
Composants clés :
3 entités sont utilisées :
Users ou les ServiceAccountsDeployments, Pods, Services, etc...create, list, get, delete, watch, patchServiceAccount par namespaceServiceAccount est formatté ainsi : system:serviceaccount:<namespace>:<service_account_name>apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: defaultRole est un ensemble de règles permettant de définir quelle opération (ou verbe) peut être effectuée et sur quelle ressourceRole ne s'applique qu'à un seul namespace et les ressources liées à ce namespacekind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]RoleBinding va allouer à un User, ServiceAccount ou un groupe les permissions dans l'objet Role associéRoleBinding doit référencer un Role dans le même namespace.roleRef spécifié dans le RoleBinding est celui qui crée le liaisonkind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.ioClusterRole est similaire au Role à la différence qu'il n'est pas limité à un seul namespacenamespace comme les nodeskind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"] kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: salme-reads-all-pods
subjects:
- kind: User
name: jsalmeron
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.iokubectl auth can-i get pods /
--namespace=default /
--as=spesnova@example.com
La ressource NetworkPolicy est une spécification permettant de définir comment un ensemble de pods communiquent entre eux ou avec d'autres endpoints
Le NetworkPolicy utilisent les labels pour sélectionner les pods sur lesquels s'appliquent les règles qui définissent le trafic alloué sur les pods sélectionnés
Le NetworkPolicy est générique et fait partie de l'API Kubernetes. Il est nécessaire que le plugin réseau déployé supporte cette spécification
NetworkPolicy permettant de bloquer le trafic entrant :kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-deny-all
spec:
podSelector:
matchLabels:
app: web
ingress: []Cilium Network Policy Editor : https://editor.networkpolicy.io/?id=xJYCeLwGmAGxTqjm

Tufin Network Policy Viewer : https://orca.tufin.io/netpol/

Kubernetes NetworkPolicy viewer : https://artturik.github.io/network-policy-viewer/

Alpha en 1.22, GA depuis la 1.25
Plus simple que les PSP.
Trois labels optionnels peuvent être ajoutés aux namespaces :
pod-security.kubernetes.io/warn
audit = autorise la création mais génère un événement d'audit de l'API (sera visible si l'audit de l'API a été activé et configuré)
Les valeurs possibles sont :
(définir la valeur à privileged n'a pas vraiment d'effet)
apiVersion: v1
kind: Namespace
metadata:
labels:
kubernetes.io/metadata.name: formation-k8s
pod-security.kubernetes.io/enforce: baseline
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
name: formation-k8sLes trois lignes suivantes définissent les labels:
pod-security.kubernetes.io/enforce=baseline :
- Applique la politique de sécurité "baseline" en mode "enforce".
- Cela empêchera la création de pods qui ne respectent pas les critères de sécurité de base.
pod-security.kubernetes.io/audit=restricted :
- Configure l'audit en mode "restricted".
- Cela générera des événements d'audit pour les pods qui ne respectent pas les critères de sécurité restrictifs.
pod-security.kubernetes.io/warn=restricted :
- Active les avertissements en mode "restricted".
- Cela produira des avertissements lors de la création de pods qui ne respectent pas les critères de sécurité restrictifs.
apiVersion: v1
kind: Namespace
metadata:
labels:
kubernetes.io/metadata.name: formation-k8s
pod-security.kubernetes.io/enforce: privileged
pod-security.kubernetes.io/audit: privileged
pod-security.kubernetes.io/warn: privileged
name: formation-k8skubectl drain permet de vider un noeud des pods qu'il héberge vers un autre noeud, puis de marquer le noeud "not schedulable". Ainsi au cours de l'opération de maintenance, aucun pod ne peut lui être affecté.kubectl uncordon, le noeud est remis dans le cluster et peut à nouveau héberger des pods.kubectl cordon marque uniquement le noeud "not schedulable" tout en conservant les pods qu'il héberge. Il s'assure simplement que de nouveaux pods ne lui soient pas affectés.kubeadm upgrade plan fournit les informations sur la version actuelle de kubeadm installée, la version du cluster et la dernière version stable de Kubernetes disponible kubectl drain worker-0
apt-get upgrade -y kubeadm=1.21.0-00
apt-get upgrade -y kubelet=1.21.0-00
apt-get upgrade node config --kubelet-version v1.21.0
systemctl restart kubelet
kubectl uncordon worker-0etcdctl est un client en ligne de commande du service ETCDetcdctl snapshot save -h = sauvegarder la base de données.etcdctl snapshot restore -h = restaurer la base de données.Certified Kubernetes Security Specialist (CKS)
Les programmes CKAD, CKA et CKS ont été développés par la Cloud Native Computing Foundation (CNCF), en collaboration avec la Linux Foundation, pour faciliter l'extension de l'écosystème Kubernetes grâce à des certifications standardisées.
https://www.cncf.io/certification/ckad/ https://www.cncf.io/certification/cka/ https://www.cncf.io/certification/cks/