Aller au contenu principal

Ecrire ses Premiers Manifests Kubernetes

logo kubernetes

Kubernetes, connu pour sa puissance et sa flexibilité dans la gestion des applications conteneurisées, repose sur des fichiers YAML ou JSON pour décrire l'état souhaité des ressources déployées dans un cluster. Ces fichiers, connus sous le nom de manifests, spécifient tout, des pods simples aux déploiements plus complexes, en passant par les services, les volumes et bien plus encore. Comprendre comment écrire ces manifests est essentiel pour tirer pleinement parti de l'infrastructure cloud native offerte par Kubernetes.

Je vais donc vous guider dans le monde passionnant des manifests Kubernetes. Si vous connaissez déjà les bases de Kubernetes, vous êtes probablement conscient de l'importance des manifests dans ce système. Les manifests ne sont pas seulement le cœur de Kubernetes, ils en sont l'âme, permettant aux développeurs et aux administrateurs système de définir et de gérer leurs ressources dans l'écosystème Kubernetes de manière efficace et organisée.

Prérequis et Environnement de Travail

Avant de plonger dans la création de nos premiers manifests Kubernetes, il est essentiel de s'assurer que nous avons un environnement de travail adapté et les connaissances de base requises. Voici ce dont vous avez besoin pour suivre efficacement ce guide :

Prérequis

  • Compréhension des Concepts de Base de Kubernetes : Vous devriez être familier avec les concepts fondamentaux de Kubernetes, tels que les Pods, les Services, les Déploiements et les Volumes. Une compréhension de base de l'architecture et du fonctionnement de Kubernetes facilitera grandement l'apprentissage de la rédaction de manifests.
  • Connaissance de Base de YAML : Les manifests Kubernetes sont écrits en YAML (YAML Ain't Markup Language). Une compréhension de base de la syntaxe YAML, telle que la structure des clés-valeurs, les listes et comment YAML gère les types de données, est important.

Configuration de l'Environnement

  • Installation de Kubernetes : Vous avez plusieurs options pour installer Kubernetes. Si vous débutez, minkiube, k3s ou Kind sont d'excellentes solutions pour créer un cluster Kubernetes local sur votre machine.
  • Outils de Ligne de Commande : Installez kubectl, l'outil en ligne de commande pour interagir avec votre cluster Kubernetes. kubectl sera votre principal outil pour appliquer les manifests, surveiller les ressources du cluster et déboguer si nécessaire.
  • Environnement de Développement : Un éditeur de texte fiable est indispensable pour écrire et modifier vos manifests. Des éditeurs comme Visual Studio Code offrent des extensions pour Kubernetes et YAML, facilitant la rédaction, la validation et l'autocomplétion des manifests.

Une fois que vous avez les connaissances de base et que votre environnement de développement est configuré, vous êtes prêt à commencer à écrire vos premiers manifests Kubernetes.

La Structure d'un Manifest Kubernetes

Maintenant que notre environnement de travail est prêt, plongeons dans le cœur du sujet : la structure de base d'un manifest Kubernetes. Comprendre cette structure est essentiel pour écrire des manifests efficaces et précis.

La précision est essentielle en YAML. Une indentation incorrecte ou une erreur de frappe peut entraîner des erreurs ou un comportement inattendu. Utilisez un éditeur de texte qui offre une validation YAML pour vous aider à éviter ces erreurs courantes.

Voici un exemple simple de manifest pour un Pod :

apiVersion: v1
kind: Pod
metadata:
name: mon-premier-pod
spec:
containers:
- name: conteneur-simple
image: nginx

Dans cet exemple, le manifest Kubernetes comprend :

  • apiVersion : Cette clé indique la version de l'API Kubernetes utilisée pour créer l'objet. Chaque ressource Kubernetes a une apiVersion spécifique, comme v1 pour un Pod ou apps/v1 pour un Déploiement.

  • kind : Cette clé définit le type de l'objet que vous souhaitez créer. Exemples : Pod, Service, Deployment.

  • metadata : Cette section contient des données qui aident à identifier sans équivoque l'objet, telles que name, labels et namespace.

  • spec : Le cœur du manifest. Cette section varie considérablement selon le type d'objet et contient les spécifications détaillées de l'objet, comme les conteneurs à exécuter dans un Pod ou les réplicas dans un Déploiement.

Dans cet exemple, nous définissons un Pod (kind: Pod) avec un seul conteneur, utilisant l'image nginx. La section metadata spécifie le nom du Pod et spec détaille les conteneurs à exécuter.

En comprenant bien la structure de base d'un manifest Kubernetes, vous posez les fondations pour créer des configurations complexes et adaptées à vos besoins. Le meilleur moyen de maîtriser la rédaction de ces manifests est de pratiquer. Commencez par des exemples simples, puis augmentez progressivement la complexité. Expérimentez avec différentes ressources Kubernetes et observez comment elles se comportent dans votre cluster.

Création des ressources simples

Créer un Namespace

Avant de créer nos premières ressources telles que des Pods ou des Déploiements, il est judicieux de commencer par définir un Namespace. Dans Kubernetes, les Namespaces permettent de segmenter les ressources du cluster en différents groupes logiques, facilitant leur gestion et leur isolation.

Créer un Namespace est une pratique courante, surtout dans des environnements partagés ou des projets complexes. Un Namespace vous permet d'organiser vos ressources, de définir des politiques de sécurité, des quotas et de faciliter la gestion des accès.

Voici comment créer un Namespace simple. Imaginons que vous travailliez sur un projet nommé "MonProjet". Le manifest pour un Namespace pourrait ressembler à cela :

apiVersion: v1
kind: Namespace
metadata:
name: monprojet

Dans cet exemple :

  • apiVersion: v1 est la version de l'API pour les Namespaces.
  • kind: Namespace spécifie que nous créons un Namespace.
  • metadata contient le nom du Namespace, ici monprojet.

Enregistrez ce manifest dans un fichier, par exemple monprojet-namespace.yaml. Pour créer le Namespace dans votre cluster Kubernetes, utilisez la commande suivante :

kubectl apply -f monprojet-namespace.yaml

Cette commande indique à Kubernetes de créer les ressources définies dans le fichier manifest.

Pour vérifier que votre Namespace a été correctement créé, utilisez :

kubectl get namespaces

Vous devriez voir monprojet listé parmi les Namespaces. Désormais, vous pouvez créer des ressources dans ce Namespace en ajoutant namespace: monprojet dans la section metadata de vos manifests Kubernetes.

Bonnes Pratiques

  • Utilisez des noms de Namespace descriptifs et cohérents avec les noms de vos projets ou environnements.

Création d'un Pod Simple

Après avoir créé notre Namespace, passons à la création d'une ressource de base dans Kubernetes : un Pod. Les Pods sont les éléments fondamentaux de Kubernetes, représentant une instance d'une application dans votre cluster.

Un Pod est une collection de conteneurs avec des ressources partagées et des options de déploiement spécifiques. Il sert de bloc de construction de base pour des constructions plus complexes comme les Déploiements ou les Services.

Voici un exemple de manifest pour un Pod qui exécute un simple serveur web Nginx, dans le Namespace monprojet que nous avons créé :

apiVersion: v1
kind: Pod
metadata:
name: pod-nginx
namespace: monprojet
spec:
containers:
- name: conteneur-nginx
image: nginx

Dans cet exemple :

  • apiVersion: v1 indique la version de l'API pour les Pods.
  • kind: Pod spécifie que nous créons un Pod.
  • metadata contient le nom du Pod et le Namespace dans lequel il sera créé.
  • spec définit les spécifications du Pod, notamment les conteneurs à exécuter. Ici, nous avons un conteneur nommé conteneur-nginx utilisant l'image nginx.

Pour déployer ce Pod dans le Namespace monprojet, enregistrez le manifest dans un fichier (par exemple, mon-pod-nginx.yaml) et exécutez :

kubectl apply -f mon-pod-nginx.yaml

Une fois le Pod déployé, vous pouvez vérifier son état et ses détails avec :

kubectl get pods -n monprojet
NAME READY STATUS RESTARTS AGE
pod-nginx 1/1 Running 0 39s

et

kubectl describe pod pod-nginx -n monprojet
Name: pod-nginx
Namespace: monprojet
Priority: 0
Service Account: default
Node: internal/172.31.198.204
Start Time: Wed, 17 Jan 2024 09:21:33 +0100
Labels: app=nginx
env=test
Annotations: <none>
Status: Running
IP: 10.42.0.111
IPs:
IP: 10.42.0.111
Containers:
conteneur-nginx:
Container ID: containerd://d54f5486057bfc752011b60d8a2cccdb692a2670f6b8eb112c73572446d0614e
Image: nginx
Image ID: docker.io/library/nginx@sha256:4c0fdaa8b6341bfdeca5f18f7837462c80cff90527ee35ef185571e1c327beac
Port: <none>
Host Port: <none>
State: Running
Started: Wed, 17 Jan 2024 09:21:37 +0100
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-clwb8 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-clwb8:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 44s default-scheduler Successfully assigned monprojet/pod-nginx to internal
Normal Pulling 45s kubelet Pulling image "nginx"
Normal Pulled 41s kubelet Successfully pulled image "nginx" in 3.911s (3.911s including waiting)
Normal Created 41s kubelet Created container conteneur-nginx
Normal Started 41s kubelet Started container conteneur-nginx

Ces commandes fournissent des informations sur l'état du Pod, les événements liés à son cycle de vie et d'autres détails utiles.

Bonnes Pratiques

  • Assurez-vous que le nom de chaque Pod est unique dans le Namespace.

Les Labels et Sélecteurs

Après avoir créé notre Namespace et déployé un Pod simple, nous allons nous concentrer sur un aspect crucial de Kubernetes : l'utilisation des labels et sélecteurs. Ils sont indispensables pour organiser et gérer les ressources Kubernetes de manière efficace.

Les Labels

Les labels sont des paires clé-valeur que vous attachez aux objets, comme les Pods, pour les identifier et les organiser. Par exemple, vous pourriez étiqueter des Pods en fonction de leur environnement (env: production), de leur application (app: nginx), ou de toute autre classification pertinente pour votre projet.

Ajouter des Labels à un Pod

Reprenons notre exemple de Pod Nginx et ajoutons-lui un label :

apiVersion: v1
kind: Pod
metadata:
name: pod-nginx
namespace: monprojet
labels:
app: nginx
env: test
spec:
containers:
- name: conteneur-nginx
image: nginx

Ici, nous avons ajouté deux labels sous metadata: app: nginx et env: test.

Appliquons-le :

kubectl apply -f mon-pod-nginx.yaml
pod/pod-nginx configured

Utiliser les Sélecteurs

Les sélecteurs sont utilisés pour sélectionner un ensemble de ressources en fonction de leurs labels. Ils sont essentiels dans de nombreuses opérations Kubernetes, notamment pour cibler des Pods avec des Services ou des Déploiements.

Exemple de Sélecteur

Imaginons que vous souhaitiez lister tous les Pods dans votre Namespace monprojet qui ont le label env: test. Utilisez cette commande :

kubectl get pods -n monprojet -l env=test

NAME READY STATUS RESTARTS AGE
pod-nginx 1/1 Running 0 15m

Avantages des Labels et Sélecteurs

  • Organisation : Les labels aident à structurer vos ressources de manière intuitive.
  • Flexibilité : Vous pouvez ajouter ou modifier des labels sans affecter la fonctionnalité de base de la ressource.
  • Sélection Dynamique : Les sélecteurs permettent de cibler des groupes de ressources rapidement et efficacement, facilitant des opérations telles que les déploiements et les mises à jour.

Bonnes Pratiques

  • Utilisez des labels clairs et cohérents pour faciliter la gestion et l'identification des ressources.
  • Évitez de surcharger les ressources avec trop de labels, ce qui peut rendre la gestion plus complexe.

Les Déploiements et RéplicaSets

Après avoir exploré les labels et sélecteurs, nous allons maintenant aborder deux concepts fondamentaux dans Kubernetes : les Déploiements et les RéplicaSets. Ces objets sont importants pour le déploiement et la gestion du cycle de vie des applications conteneurisées.

Un Déploiement est une ressource de haut niveau qui gère un ensemble de répliques d'un Pod (RéplicaSets) et assure leur mise à jour de manière déclarative. Il est idéal pour déployer des applications stateless et gérer leur mise à l'échelle.

Imaginons que nous voulons déployer notre application Nginx avec trois répliques. Voici à quoi ressemblerait le manifest :

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: monprojet
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx

Dans cet exemple :

  • apiVersion: apps/v1 est la version de l'API pour les Déploiements.
  • kind: Deployment spécifie que nous créons un Déploiement.
  • metadata contient le nom et les labels du Déploiement.
  • spec définit les spécifications, notamment le nombre de répliques (replicas) et le sélecteur (selector) pour identifier les Pods à gérer.
  • Le template définit le modèle de Pod à déployer.

Créez un fichier mon-deploiement.yaml et sauvegardez-le :

kubectl apply -f mon-deploiement.yaml
deployment.apps/nginx-deployment created

Pour vérifier que notre déploiement est opérationnel :

kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 8s

et :

kubectl describe deployments.apps nginx-deployment
Name: nginx-deployment
Namespace: monprojet
CreationTimestamp: Wed, 17 Jan 2024 09:23:24 +0100
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-7854ff8877 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 3m26s deployment-controller Scaled up replica set nginx-deployment-7854ff8877 to 2

On peut voir que lorsqu'on n'indique pas de propriété, par exemple la stratégie, Kubernetes en applique une par défaut. Ici, on retrouve la stratégie RollingUpdate qui permet de déployer automatiquement une nouvelle version d'une image tout en conservant les existantes pour qu'il n'y ait pas de coupure de service.

Pour gérer le nombre de replicas, à la volée il faut utiliser la commande scale de kubectl.

kubectl scale deployment nginx-deployment --replicas 1
deployment.apps/nginx-deployment scaled

kubectl get pods

NAME READY STATUS RESTARTS AGE
pod-nginx 1/1 Running 0 8m27s
nginx-deployment-7854ff8877-jfdst 1/1 Running 0 6m36s

Une autre méthode via l'utilisation de la commande kubectl edit qui permet de modifier un manifest stocké en base.

kubectl edit deployments.apps nginx-deployment

Rechercher replicas, elle est normalement à 1, passer le à 3 et sauvegarder (commande vi : r et :wq )

deployment.apps/nginx-deployment edited

kubectl get pods

NAME READY STATUS RESTARTS AGE
NAME READY STATUS RESTARTS AGE
pod-nginx 1/1 Running 0 10m
nginx-deployment-7854ff8877-jfdst 1/1 Running 0 8m43s
nginx-deployment-7854ff8877-7bz5t 1/1 Running 0 71s

Les RéplicaSets

Les Déploiements gèrent automatiquement les RéplicaSets, qui à leur tour, assurent qu'un nombre spécifié de répliques de Pod sont en cours d'exécution à tout moment. Si un Pod tombe en panne, le RéplicaSet crée automatiquement un nouveau Pod pour le remplacer.

Avantages des Déploiements

  • Mises à jour Automatisées : Les Déploiements facilitent la mise à jour des Pods et leur remplacement sans temps d'arrêt.
  • Gestion de la Disponibilité : Ils garantissent que votre application est toujours en cours d'exécution avec le nombre de répliques souhaité.
  • Rétrogradation Facile : En cas de problème avec une nouvelle version, les Déploiements permettent un retour en arrière facile.

Les Services

Après avoir abordé les deployments, explorons maintenant comment exposer nos applications Kubernetes à l'extérieur ou à d'autres services au sein du cluster. Pour cela, nous utilisons une ressource appelée Service.

Un Service dans Kubernetes est une abstraction qui définit un ensemble logique de Pods et une politique d'accès à ces Pods. Les Services permettent de communiquer avec un ou plusieurs Pods, souvent à travers un réseau.

Il existe plusieurs types de Services dans Kubernetes, mais les plus courants sont :

  • ClusterIP : Expose le service sur une adresse IP interne dans le cluster. C'est le type par défaut et permet aux services de communiquer entre eux dans le cluster.
  • NodePort : Expose le service sur le même port de chaque nœud sélectionné du cluster. Permet l'accès depuis l'extérieur du cluster en utilisant <NodeIP>:<NodePort>.
  • LoadBalancer : Utilisé avec les solutions de cloud externe. Expose le service à l'extérieur du cluster en assignant un équilibreur de charge externe.

Prenons l'exemple d'un Service de type NodePort pour exposer notre application Nginx :

apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: monprojet
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
nodePort: 30007

Dans cet exemple :

  • apiVersion: v1 est la version de l'API pour les Services.
  • kind: Service indique que nous créons un Service.
  • metadata contient le nom du Service.
  • spec définit les spécifications du Service, y compris le type, le sélecteur pour trouver les Pods à exposer, et les ports.

Vérifions si le service est correctement créé :

kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.43.187.240 <none> 80:30007/TCP 8s

Une fois le Service déployé, vous pouvez accéder à votre application Nginx en utilisant l'adresse IP de n'importe quel nœud du cluster suivi du nodePort spécifié. Par exemple, http://localhost:30007 dans notre cas. Vérifions :

curl http://localhost:30007
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Nickel !

Bonnes Pratiques

  • Choisissez le type de Service approprié en fonction de vos besoins d'exposition et de communication.
  • Assurez-vous que les ports et les sélecteurs sont correctement configurés pour diriger le trafic vers les bons Pods.

ConfigMaps et Secrets

Après avoir couvert les bases des déploiements et services, il est temps de s'intéresser à la gestion des configurations et des données sensibles dans Kubernetes. Pour cela, nous utilisons deux types de ressources : ConfigMaps et Secrets.

Les ConfigMaps

Les ConfigMaps sont utilisées pour stocker des informations de configuration non sensibles, telles que des fichiers de configuration, des variables d'environnement, des propriétés de configuration, etc.

Voici un exemple simple de ConfigMap contenant des paramètres de configuration :

apiVersion: v1
kind: ConfigMap
metadata:
name: exemple-configmap
namespace: monprojet
data:
config.json: |
{
"param1": "valeur1",
"param2": "valeur2"
}

Dans cet exemple, la ConfigMap exemple-configmap stocke des paramètres au format JSON.

Vous pouvez référencer cette ConfigMap dans vos Pods, par exemple pour définir des variables d'environnement :

apiVersion: v1
kind: Pod
metadata:
name: pod-configmap
namespace: monprojet
spec:
containers:
- name: mon-conteneur
image: nginx
envFrom:
- configMapRef:
name: exemple-configmap

Les Secrets

Les Secrets sont similaires aux ConfigMaps mais sont destinés à contenir des données sensibles, telles que des mots de passe, des jetons OAuth, des clés SSH, etc.

Voici comment créer un Secret :

apiVersion: v1
kind: Secret
metadata:
name: exemple-secret
namespace: monprojet
type: Opaque
data:
password: cGFzc3dvcmQ= # 'password' encodé en base64
kubectl apply -f mon-secret.yml
secret/exemple-secret created

Vous pouvez utiliser ce Secret dans un Pod, par exemple comme variable d'environnement :

apiVersion: v1
kind: Pod
metadata:
name: pod-secret
namespace: monprojet
spec:
containers:
- name: mon-conteneur
image: nginx
env:
- name: PASSWORD
valueFrom:
secretKeyRef:
name: exemple-secret
key: password

Appliquons le :

kubectl apply -f second-pod.yaml
pod/pod-secret created

Vérifions :

❯ kubectl describe pods pod-secret
Name: pod-secret
Namespace: monprojet
Priority: 0
Service Account: default
Node: internal/172.31.198.204
Start Time: Wed, 17 Jan 2024 09:49:10 +0100
Labels: <none>
Annotations: <none>
Status: Running
IP: 10.42.0.115
IPs:
IP: 10.42.0.115
Containers:
mon-conteneur:
Container ID: containerd://d7aff8e930a0e86eda750c7307a65240dc23114e8480e420f8379065fe3bffdd
Image: nginx
Image ID: docker.io/library/nginx@sha256:4c0fdaa8b6341bfdeca5f18f7837462c80cff90527ee35ef185571e1c327beac
Port: <none>
Host Port: <none>
State: Running
Started: Wed, 17 Jan 2024 09:49:11 +0100
Ready: True
Restart Count: 0
Environment:
PASSWORD: <set to the key 'password' in secret 'exemple-secret'> Optional: false
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-hm8l8 (ro)

Notre secret est bien gardé !

Bonnes Pratiques

  • Utilisez des ConfigMaps pour les configurations générales et des Secrets pour les informations sensibles.
  • Ne stockez pas de données sensibles en texte clair dans vos manifests ou ConfigMaps.
  • Utilisez des références aux ConfigMaps et Secrets dans vos Pods plutôt que de coder en dur des configurations ou des secrets.

Détruire une ressource Kubernetes

Pour détruire une ressource, on utilise la commande delete <type> <nom de leressource>.

kubectl delete pod busybox

Pour détruire un objet qui a été déclaré avec un manifest :

kubectl -n kube-system delete -f pod.yaml

Attention si on détruit un namespace tous les objets de ce NameSpace le seront également et cela prend du temps !

Conclusion

En parcourant les divers aspects de Kubernetes, de la création de votre premier Namespace à la gestion des configurations avec ConfigMaps et Secrets, en passant par les Déploiements et les Services, nous avons couvert quelqu'uns des objets clés de cet orchestrateur de conteneurs.

Kubernetes, avec son architecture robuste et ses concepts avancés, peut sembler intimidant au premier abord. Cependant, en décomposant son apprentissage en composants gérables et en pratiquant avec des exemples concrets, comme nous l'avons fait dans ce guide, vous pourrez progesser.

Rappelez-vous que la pratique régulière, la veille technologique et la participation à la communauté sont des pratiques clés pour rester compétent sur Kubernetes. N'oubliez pas non plus de toujours suivre les meilleures pratiques et d'éviter les erreurs courantes pour maintenir vos clusters Kubernetes performants, sécurisés et bien organisés.

Plus d'infos

Pour approfondir vos connaissances en Kubernetes et rester à jour avec les meilleures pratiques, il est crucial de disposer des bonnes ressources.

  • Site Officiel Kubernetes (kubernetes.io): La source la plus complète et à jour pour tout ce qui concerne Kubernetes.
  • Documentation Kubernetes (kubernetes.io/docs): Pour des guides détaillés, des tutoriels et la documentation de référence.
  • GitHub Kubernetes (github.com/kubernetes/kubernetes): Pour explorer le code source et suivre les développements récents.