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
Namespaces
Labels
Annotations
Pods
Deployments
DaemonSets
Jobs
Cronjobs
Services
NamespacesNamespaces : Pensez aux différents départements d'une entreprise (par exemple, les ressources humaines, l'ingénierie, le marketing). Chaque département a ses propres ressources (employés, budgets, projets) et fonctionne de manière assez indépendante, mais ils font tous partie de la même entreprise. Vous ne pouvez pas avoir deux projets avec le même nom dans le même département, mais vous le pouvez dans des départements différents.
Défaut: Le namespace default existe par défaut dans chaque cluster Kubernetes.
LabelsLabels : Imaginez des étiquettes sur des boîtes dans un entrepôt. Vous pouvez étiqueter les boîtes avec des mentions comme "fragile", "lourd", "électronique" ou par destination comme "Paris". Cela vous aide à trouver et à organiser rapidement toutes les boîtes ayant une caractéristique spécifique. Une boîte peut avoir plusieurs étiquettes.
~ . et alphanumMultiples: Un objet peut avoir plusieurs labels.
LabelsapiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
env: prod
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80LabelsLa commande kubectl get pods, par défaut, ne liste pas les labels.
Il est possible de les voir en utilisant --show-labels:
$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 31s app=nginx,env=prod
kubectl get po -A -l k8s-app=kube-dns
# ou
kubectl get pods --selector=k8s-app=dns
kubectl get po -A -l k8s-app=kube-dns -l pod-template-hash=6d4b75cb6d
# equivalent
kubectl get po -A -l k8s-app=kube-dns,pod-template-hash=6d4b75cb6d
# ou
kubectl get po -A --selector=8s-app=kube-dns,pod-template-hash=6d4b75cb6d
# Lister les valeurs d'un label
kubectl get pods -L k8s-app
# Lister to les labels d'un object
kubectl get deploy --show-labels
kubectl get deploy,po --show-labels
# Utiliser la forme négative
kubectl get po -A -l k8s-app!=kube-dnsAnnotationsAnnotations : C'est comme un commentaire ou une note sur un document. Il fournit des informations supplémentaires pour les humains ou d'autres outils (comme le nom de l'auteur, la date de la dernière révision ou un lien vers une documentation externe), mais il ne change pas la manière dont le document est traité par le système principal.
Multiples: Un objet peut avoir plusieurs annotations.
Annotations
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: theClusterIssuer
spec:
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:PodPods : Un Pod est comme un appartement dans un immeuble. L'appartement fournit l'environnement essentiel (murs, électricité, eau) pour ses habitants (les conteneurs). Tous les habitants de l'appartement partagent la même adresse (adresse IP) et peuvent facilement communiquer entre eux. Ils partagent des ressources comme la cuisine et la salle de bain (volumes, réseau).
C'est la plus petite et la plus simple unité dans Kubernetes
En savoir plus : https://kubernetes.io/fr/docs/concepts/workloads/pods/pod/
Pod
docker-compose :apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80PodDans les statuts du pod on trouve la notion de phase d'exécution
Pending: accepté par le cluster, les container ne sont pas initialiséRunning: Au moins un des containers est en cours de démarrage, d'exécution ou de redémarrageSucceeded: Tous les containers se sont arrêtés avec un "exit code" à 0 (zéro); Le pod ne sera pas redémarréFailed: Tous les containers se sont arrêtés et au moins un a un exit code différent de 0Unknown: L'état du pod ne peut pas être déterminé$ kubectl get pods -o wideen sortie :
NAME READY STATUS RESTARTS AGE IP NODE
xx-79c5968bdc-6lcfq 1/1 Running 0 84m 10.244.0.6 kind-cp
yy-ss7nk 1/1 Running 0 84m 10.244.0.5 kind-cpPodDans les statuts du pod on trouve la notion de Conditions d'état des pods
PodScheduled: Un nœud a été sélectionné avec succès pour "lancer" le pod, et la planification est terminée.ContainersReady: Tous les containers sont prêtsInitialized: Les "Init containers sont démarrés"Ready: Le pod est capable de répondre aux demandes ; par conséquent, il doit être inclus dans le service et les répartiteurs de charge.kubectl describe pods <POD_NAME>en sortie
...
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
...PodÉtats des containers (States)
Les containers peuvent avoir seulement 3 états
Waiting: Les processus requis sont en cours d'exécution pour un démarrage réussiRunning: Le container est en cours d'exécutionTerminated: L'exécution du conteneur s'est déroulée et s'est terminée par un succès ou un échec.$ kubectl get pods <POD_NAME> -o jsonpath='{.status}' | jqPod
DeploymentDeployments : C'est comme le gérant d'une chaîne de cafés identiques. Le travail du gérant est de s'assurer qu'un certain nombre de cafés (Pods/réplicas) sont toujours ouverts et fonctionnent de la même manière. Si un café ferme de manière inattendue, le gérant en ouvre un nouveau immédiatement. S'il veut changer le menu (mettre à jour l'application), le gérant déploie le changement dans tous les cafés, un par un, sans les fermer tous en même temps.
Souvent combiné avec un objet de type service
DeploymentapiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80Ou en ligne de commande
kubectl create deployment my-app --image=nginx:latest --replicas=3Deployment
DaemonSetDaemonSets : Pensez à avoir un agent de sécurité à chaque étage d'un immeuble. Vous ne spécifiez pas combien de gardes vous avez besoin au total ; vous déclarez simplement que chaque étage doit en avoir exactement un. Si un nouvel étage est ajouté, un nouveau garde lui est automatiquement assigné.
replicas.fluentd ou logstashnvidia-pluginDaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ssd-monitor
spec:
selector:
matchLabels:
app: ssd-monitor
template:
metadata:
labels:
app: ssd-monitor
spec:
nodeSelector:
disk: ssd
containers:
- name: main
image: luksa/ssd-monitorStatefulSetStatefulSets : C'est la différence entre le bétail (cattle) et les animaux de compagnie (pets). Un Deployment gère le bétail : si une vache tombe malade, vous la remplacez par une autre en bonne santé, et cela n'a pas d'importance. Un StatefulSet gère les animaux de compagnie : si votre chien Fido est malade, vous voulez que Fido soit soigné et revienne. Vous ne voulez pas un nouveau chien identique. Les StatefulSets donnent à chaque Pod une identité unique et stable (un nom comme db-0, db-1) et un stockage persistant qui lui est propre. C'est essentiel pour les applications comme les bases de données, où chaque instance a un rôle et des données spécifiques qui doivent être préservés.
Deployment mais les noms des composants sont prédictiblesPersistent Volume et un Storage Class.Supprimer un StatefulSet ne supprime pas le PV associé

StatefulSetapiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 0/1 ContainerCreating 0 3s
❯ kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 9s
web-1 0/1 ContainerCreating 0 1s
❯ kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 12s
web-1 1/1 Running 0 4s
web-2 0/1 ContainerCreating 0 2s
❯ kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 15s
web-1 1/1 Running 0 7s
web-2 1/1 Running 0 5sStatefulSet avancé
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql
labels:
app: mysql
app.kubernetes.io/name: mysql
data:
primary.cnf: |
[mysqld]
log-bin
replica.cnf: |
[mysqld]
super-read-only
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
app.kubernetes.io/name: mysql
serviceName: mysql
replicas: 3
template:
metadata:
labels:
app: mysql
app.kubernetes.io/name: mysql
spec:
initContainers:
- name: init-mysql
image: mysql:5.7
command:
- bash
- "-c"
- |
set -ex
[[ `hostname` =~ -([0-9]+)$ ]] || exit 1
ordinal=${BASH_REMATCH[1]}
echo [mysqld] > /mnt/conf.d/server-id.cnf
echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
if [[ $ordinal -eq 0 ]]; then
cp /mnt/config-map/primary.cnf /mnt/conf.d/
else
cp /mnt/config-map/replica.cnf /mnt/conf.d/
fi
....
- name: clone-mysql
image: gcr.io/google-samples/xtrabackup:1.0
command:
- bash
- "-c"
- |
set -ex
[[ -d /var/lib/mysql/mysql ]] && exit 0
# Skip the clone on primary (ordinal index 0).
[[ `hostname` =~ -([0-9]+)$ ]] || exit 1
ordinal=${BASH_REMATCH[1]}
[[ $ordinal -eq 0 ]] && exit 0
ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql
...
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
value: "1"
...JobJobs : C'est comme une tâche ponctuelle pour un entrepreneur, par exemple, "peindre cette pièce". L'entrepreneur (Job) vient, apporte ses outils (conteneur), effectue le travail (exécute le processus), et part une fois que le travail est terminé avec succès. S'il renverse la peinture et fait un gâchis (échec), il devra peut-être nettoyer et réessayer.
Si un noeud du cluster est en panne, les pods sont reschedulés vers un autre noeud.

JobapiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
parallelism: 1
completions: 1
template:
metadata:
name: pi
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: OnFailureEn ligne de commande :
kubectl create job exemple-job --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"CronJobCronJobs : Imaginez un service de nettoyage quotidien programmé pour un bureau. Le service (CronJob) est configuré pour venir chaque jour à 18h (l'horaire) pour effectuer la tâche de nettoyage (le Job). C'est une tâche récurrente et automatisée.
Cronle champ jobTemplate contient la définition de l'application à lancer comme Job.

CronJobapiVersion: batch/v1
kind: CronJob
metadata:
name: batch-job-every-fifteen-minutes
spec:
schedule: '0,15,30,45 * * * *'
jobTemplate:
spec:
template:
metadata:
labels:
app: periodic-batch-job
spec:
restartPolicy: OnFailure
containers:
- name: pi
image: perl
command:
- perl
- '-Mbignum=bpi'
- '-wle'
- print bpi(2000)En ligne de commande :
kubectl create cronjob exemple-cronjob --image=busybox --schedule="*/5 * * * *" -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"Susprendre un cronjob :
kubectl patch cronjob <cronjob-name> -p '{"spec" : {"suspend" : true }}'Reprendre l'exécution :
kubectl patch cronjob <cronjob-name> -p '{"spec" : {"suspend" : false }}'Serviceapp=ventes), et il vous mettra en relation avec une personne disponible dans ce département. Le réceptionniste fournit un point de contact stable.Un Service est un objet Kubernetes qui fournit une abstraction pour accéder à un ensemble de Pods. Il agit comme un point d'entrée unique et stable pour les applications, même si les Pods derrière lui sont créés, détruits ou déplacés.
Voici ses principales caractéristiques :
ClusterIP) et un nom DNS stables qui ne changent pas pendant son cycle de vie. Les applications clientes se connectent au Service plutôt qu'aux Pods directement, dont les adresses IP sont éphémères.labels et des sélecteurs pour identifier dynamiquement l'ensemble des Pods auxquels il doit acheminer le trafic. Cela permet de découpler les applications qui consomment le service des Pods qui le fournissent.Cet objet est fondamental pour la communication inter-applicative au sein du cluster. Nous aborderons en détail les différents types de Services (comme ClusterIP, NodePort, et LoadBalancer) et leurs cas d'usage dans un chapitre dédié au réseau dans Kubernetes.
Init Containersexemple :
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app.kubernetes.io/name: MyApp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]Init ContainersrestartPolicy du Pod. Cependant, si la restartPolicy du Pod est définie sur Always, les conteneurs d'initialisation utilisent la restartPolicy OnFailure.Ready tant que tous les conteneurs d'initialisation n'ont pas réussi. Les ports d'un conteneur d'initialisation ne sont pas agrégés sous un Service.Pending mais doit avoir une condition Initialized définie à false.Si le Pod redémarre, ou est redémarré, tous les conteneurs d'initialisation doivent s'exécuter à nouveau.
Plugin: Un CNI est implémenté sous forme de plugin, ce qui permet de choisir le plugin adapté aux environnements et besoins.


ClusterIP :
apiVersion: v1
kind: Service
metadata:
name: the-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web# déploiement
kubectl create deployment web --image=nginx
# service
# par défaut type= ClusterIP
kubectl expose deploy web --port=80 --target-port=8080Headless ClusterIP :
apiVersion: v1
kind: Service
metadata:
name: my-headless-service
spec:
clusterIP: None # <--
selector:
app: test-app
ports:
- protocol: TCP
port: 80
targetPort: 3000# déploiement
kubectl create deployment web --image=nginx
# service
kubectl expose deploy web --port=80 --target-port=8080 --cluster-ip noneNodePort :
apiVersion: v1
kind: Service
metadata:
name: my-nginx
spec:
type: NodePort
ports:
- port: 8080
targetPort: 80
protocol: TCP
name: http
selector:
app: my-nginx# déploiement
kubectl create deployment web --image=nginx
# service
kubectl expose deploy web --type NodePort --protocol TCP --port 80 --target-port 8080LoadBalancer : expose le service à l'externe en utilisant le loadbalancer d'un cloud provider (AWS, Google, Azure)
Service de type Spécial
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
ports:
- port: 9000
targetPort: 1234
selector:
app: myapp
type: LoadBalancer# déploiement
kubectl create deployment web --image=myapp
# service
kubectl expose deploy web --type LoadBalancer --protocol TCP --port 9000 --target-port 1234ExternalName
Exemples d'utilisation concrets :
Il est aussi possible de mapper un service avec un nom de domaine en spécifiant le paramètre spec.externalName.
kind: Service
apiVersion: v1
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.comEn ligne de commande :
kubectl create service externalname my-service --external-name my.database.example.comOn peut définir une IP externe permettant d'accèder à un service interne
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
externalIPs:
- 1.2.3.4
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginxEn ligne de commande :
kubectl expose deploy nginx --port=80 --external-ip=1.2.3.4ClusterIP : C'est le type de service par défaut. Il fournit une IP virtuelle stable accessible uniquement à l'intérieur du cluster, parfait pour la communication entre microservices.
NodePort : Il étend ClusterIP en exposant le service sur un port spécifique de chaque nœud du cluster. C'est utile pour le développement ou les environnements de test.
LoadBalancer : Idéal pour la production, il étend NodePort en provisionnant automatiquement un load balancer externe (souvent fourni par le cloud provider).
ExternalName : Un cas particulier qui permet de créer un alias CNAME vers un service externe au cluster.
Headless Service : A Utiliser quand vous avez besoin d'une découverte de service fine, sans Load Balancing. Très utile pour les bases de données distribuées.
ExternalIPs : Permet d'exposer un service Kubernetes sur une adresse IP spécifique qui existe déjà sur l'un des nœuds du cluster, offrant ainsi un accès direct depuis l'extérieur sans passer par un LoadBalancer.
Choisir le bon type de service dans Kubernetes est essentiel pour l'architecture de votre application. Voici un guide pour vous aider à décider :
ClusterIP
NodePort
http://<IP_DU_NOEUD>:<NODE_PORT>.LoadBalancer
ExternalName
ExternalName (database.local) qui pointe vers l'endpoint externe (xxxx.rds.amazonaws.com).Headless Service
ExternalIPs
<Cluster IP Address><Service Port>kubectl get svc
web ClusterIP 10.96.163.5 <none> 80/TCP 3m56s
kubectl exec web-96d5df5c8-lfmhs -- env | sort
WEB_SERVICE_HOST=10.96.163.5
WEB_SERVICE_PORT=80my-app comme nom d'hôte dans le même namespacemy-app.default comme nom d'hôte dans d'autres namespace<svc name>.<ns>.svc.cluster.localex: my-app.default.svc.cluster.local
Ingress permet d'exposer un service à l'extérieur d'un cluster Kubernetes
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: le
meta.helm.sh/release-name: argocd
meta.helm.sh/release-namespace: argocd
labels:
app.kubernetes.io/component: server
app.kubernetes.io/instance: argocd
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: argocd-server
app.kubernetes.io/part-of: argocd
app.kubernetes.io/version: v2.10.1
helm.sh/chart: argo-cd-6.0.14
name: argocd-server
namespace: argocd
spec:
ingressClassName: nginx
rules:
- host: argocd.caas.fr
http:
paths:
- backend:
service:
name: argocd-server
port:
number: 443
path: /
pathType: Prefix
tls:
- hosts:
- argocd.caas.fr
secretName: argocd-server-tlsPour utiliser un Ingress, il faut un Ingress Controller
Il existe plusieurs solutions OSS ou non :
⚠︎ Note : Il est possible d'avoir plusieurs Ingress Controller sur un cluster il suffira dans les objets ingress de préciser sur quelle classe d'ingress on souhaite le créer.
Ca se fait par l'attribut ingressClassName.
Ces classes sont créees au moment de l'installation du contrôleur.
Les Ingress vont bientôt être dépréciés en faveur des Gateway API qui sont la nouvelle génération de Kubernetes Ingress, Load Balancing, et Service Mesh APIs.
Plus d'informations ici : https://gateway-api.sigs.k8s.io/
Les Gateway APIs sont une évolution des Ingress Controllers, offrant une approche plus moderne et flexible pour gérer le trafic entrant dans un cluster Kubernetes. Voici les points essentiels :
Architecture en layers:
Avantages principaux:
- Configuration plus fine et granulaire
- Support natif de plusieurs protocoles
- Meilleure séparation des responsabilités
- API plus extensible et cohérente
Cas d'utilisation:
- Multi-tenancy avec isolation du trafic
- Gestion avancée du routage
- Configuration du TLS
- Gestion du trafic nord-sud et est-ouest
Différence avec les Ingress:
Les Gateway APIs offrent plus de fonctionnalités que les Ingress traditionnels :
- Support multi-protocole natif
- Meilleure extensibilité
- Configuration plus détaillée
- Meilleure séparation des rôles
EmptyDir ~= volumes dockerHostPath ~= volumes hôteapiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-persistent-storage
mountPath: /data/redis
volumes:
- name: redis-persistent-storage
emptyDir: {}apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-persistent-storage-host
mountPath: /data/redis
volumes:
- name: redis-persistent-storage-host
hostPath:
path: /mnt/data/redisPersistent Volume (PV) : Représentation de bas niveau d'un volume de stockage.Persistent Volume Claim (PVC) : binding entre un Pod et un Persistent Volume (PV).Storage Class : Permet de provionner dynamiquement d'un Persistent Volumes (PV).
Persistent Volumes pour solliciter un espace de stockage au travers des Persistent Volume Claimskind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
type: io1
zones: us-east-1d, us-east-1c
iopsPerGB: "10"Autre exemple
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-premium
labels:
addonmanager.kubernetes.io/mode: EnsureExists
kubernetes.io/cluster-service: "true"
parameters:
cachingmode: ReadOnly
kind: Managed
storageaccounttype: Premium_LRS
provisioner: kubernetes.io/azure-disk
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: trueAutre exemple
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
storageclass.kubernetes.io/is-default-class: "true"
name: local-path
provisioner: rancher.io/local-path
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumerStorageClass
apiVersion: v1
kind: PersistentVolume
metadata:
name: persistent-volume-1
spec:
storageClassName: slow
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/tmp/data"StorageClass auront la politique de récupération spécifiée dans le champ reclaimPolicy de la classe, qui peut être Delete ou Retain.Si aucun reclaimPolicy n'est spécifié lors de la création d'un objet StorageClass, il sera par défaut delete.
Les PV qui sont créés manuellement et gérés via une StorageClass auront la politique de récupération qui leur a été attribuée lors de la création.
La stratégie de récupération s'applique aux volumes persistants et non à la classe de stockage elle-même. Les PV et les PVC créés à l'aide de cette StorageClass hériteront de la stratégie de récupération définie dans StorageClass.
pod et un PV. Le pod demande le volume via le PVC.StatefulSets pour solliciter du stockage (Utilisation du champ volumeClaimTemplates)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: storage-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: "slowl"
selector:
matchLabels:
release: "stable"
matchExpressions:
- {key: capacity, operator: In, values: [10Gi, 20Gi]}Utilisation d'un PVC dans un pod
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: mywebsite
volumes:
- name: mywebsite
persistentVolumeClaim:
claimName: myclaim
ConfigMap peut être sollicité (utilisé) par plusieurs podsapiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis-config: |
maxmemory 2mb
maxmemory-policy allkeys-lruapiVersion: v1
kind: ConfigMap
metadata:
name: redis-env
data:
redis_host: "redis_svc"
redis_port: "6349"apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: REDIS_HOST
valueFrom:
configMapKeyRef:
name: redis-env
key: redis_host
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: env-config
key: log_level
restartPolicy: NeverapiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "ls /etc/config/" ]
volumeMounts:
- name: redis-conf-volume
mountPath: /etc/config
volumes:
- name: redis-conf-volume
configMap:
# Provide the name of the ConfigMap containing the files you want
# to add to the container
name: redis-config
restartPolicy: Neverkubectl create configmap my-config --from-file=./my/dir/path/kubectl create configmap my-config --from-file=./my/dir/path/myfile.txtkubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2secret utilisé pour stocker des informations sensibles comme les mots de passe, les tokens, les clés SSH...ConfigMap, à la seule différence que le contenu des entrées présentes dans le champ data sont encodés en base64.Secret spécifique à l'authentification sur un registre Docker privé.Secret à partir d'un compte utilisateur et d'un mot de passe.Generic: valeurs arbitraire comme dans une ConfigMaptls: certificat et clé pour utilisation avec un serveur webdocker-registry: utilisé en tant que imagePullSecret par un pod pour pouvoir pull les images d'une registry privée$ kubectl create secret docker-registry mydockerhubsecret \
--docker-username="employeeusername" --docker-password="employeepassword" \
--docker-email="employee.email@organization.com"kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb'apiVersion: v1
kind: Secret
metadata:
creationTimestamp: 2016-01-22T18:41:56Z
name: mysecret
namespace: default
resourceVersion: "164619"
uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2RmSe base sur le CPU et la RAM
Exemple concret :
Un nœud Kubernetes avec 4 cœurs CPU.
- Pod BestEffort: Il peut utiliser 0, 1, 2, 3 ou 4 cœurs, selon la disponibilité.
- Pod Burstable (requests: 2 cœurs, pas de limits): Il est garanti d'avoir au moins 2 cœurs, mais il peut en utiliser jusqu'à 4 s'ils sont disponibles. Si un pod Guaranteed a besoin de 2 cœurs, le pod Burstable peut en perdre 2.
- Pod Guaranteed (requests: 2 cœurs, limits: 2 cœurs): Il a toujours 2 cœurs garantis et ne peut pas en utiliser plus.
1 : 1 vCPU entier100m : 0.1 vCPU0.5 : 1/2 vCPUM : en base 10Mi : en base 2apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: db
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: wp
image: wordpress
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"LimitRange permet de définir les valeurs minimales et maximales des ressources utilisées par les containers et les pods pour les requests et limits de CPU, de mémoire et de stockageLimitRange s'applique au niveau du namespacenamespaceLimitRange ne limite pas le nombre total de ressources disponibles dans le namespaceapiVersion: v1
kind: LimitRange
metadata:
name: limit-example
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256 Mi
type: ContainerResourceQuota limite le total des ressources de calcul consommées par les pods ainsi que le total de l'espace de stockage consommé par les PersistentVolumeClaims dans un namespacepods, PVC, réplicas, services et autres objets qui peuvent être créés dans un namespaceapiVersion: v1
kind: ResourceQuota
metadata:
name: cpu-and-ram
spec:
hard:
requests.cpu: 400m
requests.memory: 200Mi
limits.cpu: 600m
limits.memory: 500MiapiVersion: v1
kind: ResourceQuota
metadata:
name: quota-for-objects
spec:
hard:
pods: 200
services: 10
secrets: 20
configmaps: 40
persistentvolumeclaims: 40
services.nodeports: 0
services.loadbalancers: 0
count/roles.rbac.authorization.k8s.io: 10
initialDelaySeconds des Readiness et LivenesshttpGetpath et httpHeaders supplémentaires peuvent être spécifiés de manière optionnelleexectcpSocketgrpcapiVersion: v1
kind: Pod
metadata:
name: test-grpc
spec:
containers:
- name: agnhost
image: registry.k8s.io/e2e-test-images/agnhost:2.35
command: ["/agnhost", "grpc-health-checking"]
ports:
- containerPort: 5000
- containerPort: 8080
readinessProbe:
grpc:
port: 5000Plus d'informations : https://kubernetes.io/blog/2022/05/13/grpc-probes-now-in-beta/
aapiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app-container
image: my-image
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Authorization
value: Bearer my-token
initialDelaySeconds: 15
periodSeconds: 5
timeoutSeconds: 1
failureThreshold: 3
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 5
startupProbe:
exec:
command:
- cat /etc/nginx/nginx.conf
initialDelaySeconds: 10
timeoutSeconds: 5initialDelaySeconds
initialDelaySeconds (défaut : 0).temps et seuils
Si une startupProbe échoue, Kubernetes redémarre le conteneur correspondant.
En d'autres termes : avec les paramètres par défaut, le conteneur doit démarrer en 30 secondes. (failureThreshold × periodSeconds)
C'est pourquoi il faut presque toujours ajuster les paramètres d'une startupProbe. (spécifiquement, son failureThreshold)
Parfois, il est plus facile d'utiliser une readinessProbe à la place.(voir la prochaine diapositive pour plus de détails)
N'utilisez pas de probes de liveness pour des problèmes qui ne peuvent pas être résolus par un redémarrage. Sinon, les pods redémarrent sans raison, créant une charge inutile.
Ne dépendez pas d'autres services au sein d'une probe de liveness. Sinon, Possibilités d'échecs en cascade.(exemple : probe de liveness d'un serveur web qui effectue des requêtes vers une base de données)Assurez-vous que les probes de liveness répondent rapidement.
Le délai d'expiration par défaut des probes est de 1 seconde (cela peut être ajusté).
Si la probe prend plus de temps que cela, il finira par provoquer un redémarrage.
Une startupProbe nécessite généralement de modifier le failureThreshold.
Une startupProbe nécessite généralement également une readinessProbe.
Une seule readinessProbe peut remplir les deux rôles.
L'API Kubernetes inclut également des points de terminaison de contrôle d'état : healthz (obsolète), readyz, livez.
kubectl get --raw='/readyz?verbose'Point de terminaison readyz
[+]ping ok
[+]log ok
[+]etcd ok
[+]informer-sync ok
[+]poststarthook/start-kube-apiserver-admission-initializer ok
[+]poststarthook/generic-apiserver-start-informers ok
[+]poststarthook/priority-and-fairness-config-consumer ok
[+]poststarthook/priority-and-fairness-filter ok
[+]poststarthook/start-apiextensions-informers ok
[+]poststarthook/start-apiextensions-controllers ok
[+]poststarthook/crd-informer-synced ok
[+]poststarthook/bootstrap-controller ok
[+]poststarthook/rbac/bootstrap-roles ok
[+]poststarthook/scheduling/bootstrap-system-priority-classes ok
[+]poststarthook/priority-and-fairness-config-producer ok
[+]poststarthook/start-cluster-authentication-info-controller ok
[+]poststarthook/aggregator-reload-proxy-client-cert ok
[+]poststarthook/start-kube-aggregator-informers ok
[+]poststarthook/apiservice-registration-controller ok
[+]poststarthook/apiservice-status-available-controller ok
[+]poststarthook/kube-apiserver-autoregistration ok
[+]autoregister-completion ok
[+]poststarthook/apiservice-openapi-controller ok
[+]shutdown ok
readyz check passedPoint de terminaison livez
kubectl get --raw='/livez?verbose'
+]ping ok
[+]log ok
[+]etcd ok
[+]poststarthook/start-kube-apiserver-admission-initializer ok
[+]poststarthook/generic-apiserver-start-informers ok
[+]poststarthook/priority-and-fairness-config-consumer ok
[+]poststarthook/priority-and-fairness-filter ok
[+]poststarthook/start-apiextensions-informers ok
[+]poststarthook/start-apiextensions-controllers ok
[+]poststarthook/crd-informer-synced ok
[+]poststarthook/bootstrap-controller ok
[+]poststarthook/rbac/bootstrap-roles ok
[+]poststarthook/scheduling/bootstrap-system-priority-classes ok
[+]poststarthook/priority-and-fairness-config-producer ok
[+]poststarthook/start-cluster-authentication-info-controller ok
[+]poststarthook/aggregator-reload-proxy-client-cert ok
[+]poststarthook/start-kube-aggregator-informers ok
[+]poststarthook/apiservice-registration-controller ok
[+]poststarthook/apiservice-status-available-controller ok
[+]poststarthook/kube-apiserver-autoregistration ok
[+]autoregister-completion ok
[+]poststarthook/apiservice-openapi-controller ok
livez check passedkubectlLe(s) fichier(s) se trouve(nt) par défaut dans le répertoire ~/.kube/config
kubeconfig peut être passé en paramètre de kubectl avec le flag --kubeconfig
kubectl --kubeconfig=/opt/k8s/config get pokubeconfig peut être passé en paramètre de kubectl avec la variable d'nvironnement KUBECONFIG
KUBECONFIG=/opt/k8s/config kubectl get podsUn seul fichier pour gérer tous les clusters avec trois informations :

apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FU..
server: https://akshlprod001-e419e3f0.hcp.northeurope.azmk8s.io:443
name: aks-hl-prod-001
contexts:
- context:
cluster: aks-hl-prod-001
namespace: velero
user: clusterUser_rg-hl-prod-001_aks-hl-prod-001
name: aks-hl-prod-001
current-context: aks-hl-prod-001
kind: Config
preferences: {}
users:
- name: clusterUser_rg-hl-prod-001_aks-hl-prod-001
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0t..
client-key-data: LS0tLS1CRUdJTiBSU0Eg..
token: 0ad033b165e2f7a4f705ca6defef8555ff501345e2324cf337b68820d85dc65bae39c47bb58ad913b0385a0d7eb5df6e872dbd1fe62fd34ca6e4ed58b2e8a733Lorsque vous accédez à plusieurs clusters Kubernetes, vous aurez de nombreux fichiers kubeconfig.
Par défaut, kubectl recherche uniquement un fichier nommé config dans le répertoire $HOME/.kube.
Alors, comment pouvons-nous fusionner plusieurs fichiers kubeconfig en un seul ?
cp ~/.kube/config ~/.kube/config-backup La variable d'environnement KUBECONFIG est une liste de chemins vers des fichiers de configuration, par exemple :
export KUBECONFIG=~/.kube/config:/path/cluster1/config:/path/cluster2/config:/path/cluster3/configkubectl config view --flatten > all-in-one-kubeconfig.yamlmv all-in-one-kubeconfig.yaml ~/.kube/configkubectl config get-contexts
api-resources$ kubectl api-resources
NAME SHORTNAMES APIGROUP NAMESPACED KIND
configmaps cm true ConfigMap
limitranges limits true LimitRange
namespaces ns false Namespace
nodes no false Node
persistentvolumeclaims pvc true PersistentVolumeClaim
persistentvolumes pv false PersistentVolume
pods po true Pod
secrets true Secret
services svc true Service
daemonsets ds apps true DaemonSet
deployments deploy apps true Deployment
replicasets rs apps true ReplicaSet
statefulsets sts apps true StatefulSet
horizontalpodautoscalers hpa autoscaling true HorizontalPodAutoscaler
cronjobs cj batch true CronJob
jobs batch true Job
ingresses ing extensions true Ingresskubectl api-resources ?
kubectl explainkubectl explain typekubectl explain node.speckubectl explain node --recursiveKindLes noms de ressources les plus courants ont 3 formes:
Certaines ressources n'ont pas de nom court (clusterroles, clusterrolebindings, roles ...)
Les points de terminaison (endpoints) ont uniquement une forme plurielle ou courte (ep)
kubectl getNous allons explorer en détail les différents types de ressources Kubernetes plus tard dans ce cours.
Pour l'instant, concentrons-nous sur l'utilisation de kubectl pour récupérer des informations sur notre cluster.
Voiçi quelques exemples d'utilisation de cette commande très puissante
kubectl get nodeskubectl get no
kubectl get nodeskubectl getkubectl get nodes -o widekubectl get nodes -o yaml
kubectl get nodes -o jsonUtiliser JSONPath
kubectl get pods -o=jsonpath='{@}'
kubectl get pods -o=jsonpath='{.items[0]}'
kubectl get pods \
--output=jsonpath='{.items[0].metadata.name}'kubectl getjqkubectl get nodes -o json |
jq ".items[] | {name:.metadata.name} + .status.capacity"⚠ : Il faut utiliser jq quand on a besoin de regexp car JSONPath ne les supporte pas.
ex:
# KO :
kubectl get pods -o jsonpath='{.items[?(@.metadata.name=~/^test$/)].metadata.name}'
# OK :
kubectl get pods -o json | jq -r '.items[] | select(.metadata.name | test("test-")).spec.containers[].image'kubectl getkubectl get ns
kubectl get namespacesdefault-n ou --namespacekubectl -n kube-system get podskubectl getkubectl get pods
kubectl get podkubectl getdefault):kubectl get services
kubectl get svckubectl getnamespace particulierkubectlkubectl get pods --namespace=kube-system
kubectl get pods -n kube-system
# Mais aussi sur d'autres commandes
kubectl create -n NNN ...
kubectl run -n NNN ...
kubectl delete -n NNN ...
# ...kubectl get--all-namespaces-A en raccourcikubectl get pods --all-namespaces
# ou
kubectl get pods -A
# autres actions
kubectl delete -A ...
kubectl label -A ...cd)É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 kube-publickube-public est créé par kubeadm
kubectl get all -n kube-publickubectl cluster-infokubectl -n kube-public get configmaps
# voir le contenu du configmap (cm)
kubectl -n kube-public get configmap cluster-info -o yaml
# Ce configmap est lisible par tout le monde sans authentification
curl -k https://{NodeIP}/api/v1/namespaces/kube-public/configmaps/cluster-info
# Contient le kubeconfigCe configmap contient l'url de l'API du serveur, et la clé publique de l'AC
Ce fichier ne contient pas de clés client ni de tokens
Il ne s'agit pas d'informations sensibles
cluster-infocurl -sk https://<IP PRIV>/api/v1/namespaces/kube-public/configmaps/cluster-info \
| jq -r .data.kubeconfigkube-node-leaseQu'est-ce qu'un Lease dans Kubernetes ? Un Lease est un objet qui expire après un certain temps s'il n'est pas renouvelé. Dans le contexte de kube-node-lease, chaque nœud du cluster a un Lease associé. La kubelet (l'agent Kubernetes s'exécutant sur chaque nœud) envoie régulièrement des mises à jour à ce Lease pour indiquer qu'il est toujours en fonctionnement.
leasepar noeudleases permettent d'implémenter une nouvelle méthode pour vérifier l'état de santé des noeudskubectl describekubectl describe a besoin d'un type de ressource et optionnellement un nom de ressourceIl est possible de fournir un préfixe de nom de ressource
ex:
kubectl describe node/worker-0
kubectl describe node worker-0Pourquoi utiliser kubectl describe ? :
Les objets Kubernetes sont créés sous la forme de fichiers JSON ou YAML et envoyés à l'APIServer
Possible d'utiliser la commande kubectl run, mais limitée aux deployments et aux jobs
L'utilisation de fichiers YAML permet de les stocker dans un système de contrôle de version comme git, mercurial, etc...
La documentation de référence pour l'API Kubernetes https://kubernetes.io/docs/reference/#api-reference
deploymentpod# Création d'un pod en tâche de fond
kubectl run pingu --image=alpine -- ping 127.1# Création d'un pod en intératif
kubectl run -i --tty my-pod --image=debian -- /bin/bash⚠ : Notez le --entre le nom de l'image et la commande à lancer
kubectl create deployment ...createkubectl create deployment pingu --image=alpine -- ping 127.1⚠ : Notez le --entre le nom de l'image et la commande à lancer
YAML, utilisez la commande kubectl create :kubectl create -f object.yamlkubectl create -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook/frontend-deployment.yamlkubectl delete -f object.yamlkubectl replace -f object.yaml
kubectl apply -f object.yaml⚠ : Il est possible d'utiliser apply pour créer des resources.
Étape 1: Déployer le Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yamlÉtape 2: Créer un compte de service et un rôle d'administration
# dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboardkubectl apply -f dashboard-adminuser.yaml# admin-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f admin-role-binding.yamlÉtape 3: Récupérer le token d'accès
kubectl -n kubernetes-dashboard create token admin-userCopiez le token affiché et sauvegardez le.
Étape 4: Accéder au Dashboard
Si vous êtes sur votre PC (installation locale de kubernetes)
Démarrer un proxy pour accéder au Dashboard:
kubectl proxy
Si vos machines sont déployées sur un Cloud Provider (AWS, Azure, GCP, etc)
masterkubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard 8443:443 --address=0.0.0.0Dans votre navigateur utilisez l'url suivante en l'adaptant avec l'adresse IP publique du master
https://[IP-PUBLIQUE-MASTER]:8443/
Acceptez l'alerte de sécurité concernant le certificate
kubectlkubectl get
Exemples :
# Lister les pods dans le namespace actuel
kubectl get pods
# Lister les nœuds avec plus d'informations
kubectl get nodes -o wide
# Lister les services dans tous les namespaces
kubectl get services -Akubectl describe
Exemple :
# Voir les détails d'un pod spécifique
kubectl describe pod <nom-du-pod>kubectl apply
Exemple :
kubectl apply -f mon-deploiement.yamlkubectl delete
Exemple :
kubectl delete -f mon-deploiement.yamlkubectl api-resources
pods, deployments, ingresses...).Exemple :
kubectl api-resourceskubectl explain
Exemple :
# Comprendre ce qu'on peut mettre dans la section 'spec' d'un pod
kubectl explain pod.spec--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 ressourcesCertified 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/