Lancez-vous !
C'est décidé, vous allez lancer votre premier "HelloWorld" sur Kubernetes. Cela fait trop longtemps que vous entendez parler de cette nouvelle technologie. Sur les blogs, les réseaux sociaux, les salons, nous sommes submergés de logos et d'articles. C'est le moment de passer à la pratique.
Faites vous un café, fermez la porte du bureau, dans 1h montre en main vous aurez lancé votre première stack k8s sur les 3 clouds leaders du marché.
Ce tutoriel comporte 6 étapes, dont 2 optionnelles si vous êtes déjà à l'aise avec les conteneurs Docker. Cet article est bien sur Kubernetes, un orchestrateur de conteneur, et dans notre cas nous allons orchestrer des conteneurs Docker.
- Création des comptes cloud : si ce n'est pas déjà fait, vous devrez créer les différents comptes sur les clouds publics. Sortez votre CB !
- Installation des "Command Line Interface" (CLI) : plutôt que d'utiliser les interfaces graphiques, nous utiliserons les interfaces en ligne de commande. C'est plus simple, et vous pourrez plus facilement reproduire les actions.
- (Optionnel) Création d'une image "HelloWorld" : nous allons construire localement l'image Docker qui affiche "HelloWorld" en HTTP.
- (Optionnel) Upload des images sur les registry : pour mettre à disposition le conteneur local crée dans l'étape précédente, nous le transférerons dans la registry des différents clouds.
- Création du cluster Kubernetes : les CLI étant installés, nous lancerons des clusters Kubernetes en quelques commandes.
- Lancement de la stack Kubernetes : nous lancerons un template unique sur les différents clouds avec la CLI Kubernetes.
Vous êtes prêt ? C'est parti.
Création des comptes Cloud
La première étape consiste à se créer des comptes sur différents clouds publics. Vous aurez besoin de votre carte bancaire pour vous créer ces comptes. Pas d'inquiétude, nous ferons le ménage à la fin de l'article pour que votre facture ne s'élève qu'à quelques dizaines de centimes pour cet exercice.
Nous allons utiliser les services managés Kubernetes des différents clouds publics leader :
- Google Cloud avec Google Kubernetes Engine (GKE),
- Amazon Web Services avec Amazon Elastic Container Service for Kubernetes (EKS),
- Microsoft avec Azure Container Service (AKS)
Pour continuer l'aventure, vous devez donc si ce n'est pas déjà fait créer un compte en suivant les liens suivants.
- Google cloud : cloud.google.com
- AWS : aws.amazon.com
- Microsoft Azure : azure.microsoft.com
Une fois que vos comptes seront créées, nous pouvons passer à l'étape suivante.
Attention, veillez bien à supprimer tout ce que vous créez sur ces comptes, surtout si vous arrêtez ce tutoriel en plein milieu.
Dans les étapes suivantes, nous allons installer les CLI pour piloter la création des ressources (registry et clusters k8s) sur les clouds, faire notre propre image, et la lancer dans un template k8s sur les différents clouds. C'est parti !
Pour Amazon EKS, à l'heure de l'écriture de cet article, le service Kubernetes est encore en preview, nous indiquerons [PREVIEW] dans les commandes.
Installation des "Command Line Interface" (CLI)
Avant de lancer nos clusters, nous avons besoin d'installer les "Command Line Interface" (CLI) pour chaque cloud.
Je vous conseille d'avoir ces outils en local sur votre machine plutôt que sur une machine distance. Ces outils sont indispensables lorsque l'on est utilisateur régulier du cloud. Vous ne perdrez pas de temps à tous les installer.
Amazon Web Services : awscli
L'installation de la CLI AWS est assez simple. Voici les commandes pour installer awscli via pip. Libre à vous de l'installer par d'autres moyens, comme votre gestionnaire préferé de package. N'hésitez pas à vous reporter à la documentation officielle d'Amazon en cas de problème.
# Installation de PIP
sudo apt-get install python-pip
# Install d'awscli
pip install awscli
# Ou via le package ubuntu
sudo apt-get install awscli
Vous pouvez ensuite configurer le client, en lui indiquant l'ACCESS_KEY et SECRET_KEY de votre compte.
# Initialisation du client
aws configure
# [PREVIEW] Vous pouvez maintenant lister les clusters EKS
aws eks list-clusters
Google Cloud : gcloud
Comme pour AWS, la CLI de Google s'installe rapidement via un package. Ces commandes évoluant rapidement, reportez vous à la documentation officielle si elles venaient à être modifiées.
# Configuration du dépôt
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
# Import de la clé
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# Installation de la CLI
sudo apt-get update && sudo apt-get install google-cloud-sdk
La CLI installé, nous pouvons initialiser l'outil.
# Initialisation du client
gcloud init
L'outil va vous demander de vous connecter sur une URL (ou l'ouvre directement sur votre navigateur si vous êtes en local). Une fois logué, créez un nouveau projet : helloworld (uniquement des minuscules)
Attention, le billing doit être activé sur votre projet pour lancer un cluster k8s. Pensez à l'activer.
Microsoft Azure : Azure CLI
Enfin, nous allons installer la CLI d'Azure, d'une manière quasi identique aux autres cloud. Et encore une fois, si ca ne fonctionne pas, veuillez vous référer à la documentation officielle.
# Ajout du dépôt
echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ wheezy main" | \
sudo tee /etc/apt/sources.list.d/azure-cli.list
# Ajout de la clé
sudo apt-key adv --keyserver packages.microsoft.com --recv-keys 52E16F86FEE04B979B07E28DB02C46DF417A0893
# Installation des dépendances
sudo apt-get install apt-transport-https
# Installation de la CLI
sudo apt-get update && sudo apt-get install azure-cli
La commande az --version
doit vous retourner les informations relatives au client Azure.
La CLI doit maintenant se connecter à votre Azure. Pour cela tapez la commande az login
. L'interface vous demande de vous connecter à une URL pour insérer un code (ou lance directement votre navigateur si vous êtes en local).
az login
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code DKK2***** to authenticate.
C'est bon ! On est prêt pour lancer des clusters, mais avant, nous allons créer l'image "HelloWorld" que nous lancerons sur notre cluster Kubernetes.
Création d'une image local "HelloWorld"
Installation de Docker CE
Si vous êtes déjà à l'aise avec Docker et que vous manipulez déjà vos propres conteneurs, vous pouvez directement passer à la section suivante.
Pour cette première étape nous allons travailler sur un poste client. Celui-ci peut être votre laptop ou n'importe quelle instance. Nous utiliserons Ubuntu 17.10, libre à vous de traduire les commandes avec votre OS préferé.
Tout d'abord installons Docker en suivant le guide d'installation pour Docker CE.
# Mise à jour du système
sudo apt-get update && sudo apt-get upgrade
# Installation des dépendances
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
# Ajout de la clé GPG
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Ajout du repository
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# Installation du package Docker CE
sudo apt-get update && sudo apt-get install docker-ce
Si tout s'est bien déroulé, vous devriez pouvoir executer la commande sudo docker ps
qui liste les conteneurs démarrés sur la machine. Si toutefois vous n'avez pas ce résultat, n'hésitez pas à suivre la documentation officielle de Docker pour votre OS.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Construction de l'image
Pour construire notre image, nous allons une nouvelle fois nous baser sur la documentation officielle.
Nous avons besoin de 3 fichiers :
- Le Dockerfile, qui contient la recette pour créer l'image,
- Le fichier index.php, notre page php qui affichera Hello World.
- Notre magnifique logo Osones qui sera affiché sur la page.
Créez un dossier sur votre système et copiez ces 3 fichiers.
mkdir helloworld && cd helloworld
wget https://raw.githubusercontent.com/Osones/docker-images/master/helloworld/Dockerfile
wget https://raw.githubusercontent.com/Osones/docker-images/master/helloworld/index.php
wget https://raw.githubusercontent.com/Osones/docker-images/master/helloworld/logo_osones.png
Nous sommes prêts pour lancer notre construire notre image en local !
sudo docker build -t helloworld .
Après quelques secondes, nous pouvons lister nos images et voir notre image correctement buildée :
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest 1a690a7cbe56 7 seconds ago 30.9MB
Vous pouvez le lancer en local pour vérifier que tout fonctionne correctement :
sudo docker run -it -p 80:80 helloworld
En vous connectant avec un navigateur sur le port 80, vous devez avoir un message Hello World.
Parfait, terminons notre conteneur avec Ctrl+c dans la console et passons à la suite. Yeeeaahhh !
(Optionnel) Upload de notre image sur les Registry
Nous allons utiliser les registry d'images managés respectifs aux 3 clouds pour uploader notre image HelloWorld. Notez que pour simplifier nous aurions pu lancer une stack Kubernetes avec des images téléchargées depuis une registry publique comme Docker Hub.
Google Container Registry (GCR)
Si vous n'avez pas de projet par défaut sur votre compte Google Cloud, vous devez au préalable en créer un. Nous l'appelerons osoneskub.
# Nous créons un project
gcloud projects create osoneskub
# On indique le projet dans lequel on travaille et la zone
gcloud config set project osoneskub
gcloud config set compute/zone europe-west1-b
Pour uploader notre image helloworld depuis notre registry local, nous devons tout d'abord taguer l'image. Nous suivrons la documentation officielle. Nous devons respecter cette syntaxe :
docker tag [SOURCE_IMAGE] [HOSTNAME]/[PROJECT-ID]/[IMAGE][:TAG]
- Source image : helloworld
- Hostname : eu.gcr.io pour être en Europe
- Project-id : Vous pouvez trouver cette info avec la commande
gcloud projects list
. Sur mon compte, c'est osoneskub. - Image : nom de l'image sur GCR, nous garderons helloworld
# Remplacez bien osoneskub (le nom de mon projet par défaut sur mon compte GCE) avec votre propre Project-id
sudo docker tag helloworld eu.gcr.io/osoneskub/helloworld
Nous pouvons ensuite pousser l'image en indiquant le tag.
sudo gcloud docker -- push eu.gcr.io/osoneskub/helloworld
On peut vérifier que l'image est bien uploadée avec la commande :
gcloud container images list-tags eu.gcr.io/osoneskub/helloworld
C'est bon pour le moment ! Notre image est dans la registry de Google. Passons à celui d'Amazon.
Amazon Elastic Container Registry (ECR)
Tout d'abord, nous allons vérifier que la CLI est bien configurée.
# Vérifier que le CLI se connecte bien
aws ecr describe-repositories
{
"repositories": []
}
La commande nous confirme que nous n'avons pour le moment pas de registry. Nous allons donc créer un dépôt nommé : helloworld
# Création du repository
aws ecr create-repository --repository-name helloworld
Vous aurez dans l'output le registryId que nous utiliserons dans la commande suivante. Conservez le bien. Nous allons ensuite taguer notre image, nous loguer puis "pusher" notre image sur la registry.
Modifiez bien le nom de votre registry dans ces commandes.
# On tag l'image
sudo docker tag helloworld 355865212965.dkr.ecr.eu-west-1.amazonaws.com/helloworld
# On se logue à ECR avec la CLI
aws ecr get-login --no-include-email
Copiez le résultat de la commande précédente, en ajoutant sudo avant la commande.
# Identification docker
sudo docker login -u AWS -p [...] https://355865212965.dkr.ecr.eu-west-1.amazonaws.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
# On pousse l'image
sudo docker push 355865212965.dkr.ecr.eu-west-1.amazonaws.com/helloworld
C'est bon ! Votre image est dans la registry d'Amazon. Passons à celui de Microsoft.
Azure Container Registry (ACR)
Si vous n'avez pas de projet par défaut (ou resource group) sur votre compte Azure, vous devez au préalable en créer un. Nous l'appelerons osoneskub.
az group create --name osoneskub --location westeurope
Nous pouvons ensuite créer la registry sur ACR. Attention à bien mettre votre ressource-group si vous en avez déjà un. Créez votre propre nom de registry, en y ajoutant votre prénom par exemple : helloworld
az acr create --resource-group osoneskub --name helloworldosones --sku Standard
Une fois la registry crée, nous allons encore une fois taguer et "push" notre image, comme pour Google et Amazon.
# On tague l'image
sudo docker tag helloworld helloworldosones.azurecr.io/helloworld
# Login sur la registry
sudo az acr login --name helloworldosones
# Push de l'image
sudo docker push helloworldosones.azurecr.io/helloworld
Bravo ! Les CLI sont installés, les images sont uploadées dans les registry des différents cloud. 3, 2, 1, on lance les clusters Kubernetes.
Création du cluster Kubernetes
Dans cette partie du tutoriel, les commandes seront différentes d'un cloud à l'autre. Une fois les clusters crées, nous utiliserons bien le même client unifié : kubectl pour lancer les stacks de manière uniforme d'un cloud à l'autre.
Ce client unifié est une dépendance des CLI des différents cloud. Vous devez donc l'installer avec votre gestionnaire de package préferé. En cas de difficulté, vous pouvez vous reporter à la documentation officielle.
# Installation du client Kubectl
sudo apt-get install kubectl
Sur les différents clouds, nous utiliserons pour les cluster le nom osoneskub, nous vous conseillons de mettre votre propre nom bien sûr. Nous considérons aussi que vous avez crée les projets dans l'étape sur les registry d'image, ou que vous avez déjà un projet utilisable sur votre compte.
Google Kubernetes Engine (GKE)
Nous pouvons ensuite créer avec la ligne de commande notre premier cluster GKS.
# Démarrage d'un cluster nommé osoneskub
gcloud container clusters create osoneskub
Après quelques minutes, nous pouvons vérifier que notre cluster est bien présent avec cette commande :
gcloud container clusters list
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
osoneskub europe-west1-b 1.8.7-gke.1 35.205.144.187 n1-standard-1 1.8.7-gke.1 3 RUNNING
Le cluster est également visible sur la console GKE.
C'est tout pour le moment ! Côté Google Cloud, nous avons un cluster prêt à être utilisé, avec 3 serveurs sur différentes zones de disponibilité. Il propose en tout 3 vCPU et 15 Go de Ram. De quoi lancer beaucoup de conteneur Hello World !
[PREVIEW] Amazon Elastic Container Service for Kubernetes (EKS)
Ces commandes ne sont accessibles que par les utilisateurs ayant l'accès anticipé à AWS EKS. Les commandes ne sont données qu'à titre d'information, et pourrons évoluer à la sortie officielle du service.
Dans cette preview, la première étape consiste à déployer une stack CloudFormation pour démarrer un VPC et un rôle. Une fois cette stack démarrée, vous pouvez récupérer l'id du VPC et du rôle, et créer le cluster.
# Lancement du cluster EKS
aws eks create-cluster --cluster-name osoneskub --vpc-id <vpc-[...]> --role-arn <arn:aws:iam::[...]>
# Récupération du endpoint
aws eks describe-cluster --cluster-name osoneskub --query cluster.masterEndpoint
Nous avons maintenant un cluster, uniquement constitué du "Control Plane". C'est à dire que nous avons la partie "API et administration" de Kubernetes, mais pas encore de workers.
Le déploiement des workers se fait via le lancement d'une seconde stack CloudFormation. C'est à ce moment que vous donnerez le nombre désiré de workers, dans quel subnet, et la clé.
C'est tout pour EKS !
Azure Container Service (AKS)
Nous pouvons maintenant lancer un cluster Kubernetes sur Azure.
Comme pour google, nous considérons que vous avez crée un groupe de ressource dans l'étape sur les registry, ou que vous avez déjà un groupe de ressource utilisable. Dans notre exemple, notre resource group s'appelle osoneskub.
# Création d'un cluster Kubernetes
az aks create --resource-group osoneskub --name osoneskub --generate-ssh-keys --node-count 2
On y est presque ! Comme pour GKS, nous avons sur ACS un cluster Kubernetes prêt à être piloté par Kubectl. Le reste de l'article est une formalité.
Lancement des stack Kubernetes
Configurer Kubectl
La première étape est de configurer votre CLI Kubernetes avec les identifiants de connexion des différents cloud. Voici les différentes commandes qui configurent kubectl. Exécutez la commande du cloud que vous souhaitez piloter :
- Pour GKE :
gcloud container clusters get-credentials osoneskub
- Pour AKS :
az acs kubernetes get-credentials --resource-group osoneskub --name osoneskub
- Pour EKS : En preview, la tâche est un peu plus compliquée sur AWS. Il faut télécharger un fichier yaml, l'éditer et appliquer la configuration. Espérons que tout ceci soit automatisé lors du lancement officiel.
Votre client est prêt à lancer votre première stack Kubernetes. Le template utilisé sera quasiment identique sur les 3 fournisseurs, seul le nom de votre image variera d'un cluster à l'autre.
Ce template contient la description du service que nous voulons lancer. En l'occurence, c'est un simple service web qui expose via un loadbalancer le port 80 de nos 3 conteneurs.
Téléchargez le template k8s, modifiez le champ image avec le nom de votre image uploadée sur la registry, puis lancer la stack avec kubectl.
# Téléchargement du template Kubernetes
wget https://blog.osones.com/images/kubernetes101/template.yml
# Modifiez l'URL de votre image avec celle de votre propre image
vi template.yml
# Lancement de la stack.
kubectl create -f template.yml
Vous devriez voir que les différentes ressources décrites dans le template ont été créés :
deployment "helloworlddeployment" created
service "helloworldservice" created
Si vous avez bien suivi le tutoriel, vous devriez pouvoir accéder à votre service HelloWorld ! Pour connaitre l'IP publique, vous pouvez lister les services disponibles sur votre cluster. C'est la même commande pour tous les clouds :
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
helloworldservice LoadBalancer 10.23.249.131 35.195.136.97 80:32750/TCP 1m
En vous connectant sur l'external-ip de votre service, vous devriez voir afficher votre page. En actualisant, vous verrez le hostname changer, car vous êtes sur un cluster à 3 noeuds, vous changerez donc régulièrement de conteneur et donc d'host.
C'est aussi simple que cela ! La majorité de cet article porte sur les créations des clusters, mais l'utilisation de Kubernetes une fois ces clusters lancés est complètement unifiée. Un seul outil à maîtriser, kubectl, sur tous les clouds. Enorme non ?
Faire le ménage
Félicitations, vous avez lancé vos premières stacks. Il est temps de supprimer les clusters pour ne pas voir sa facture s'envoler.
Google Cloud
# Suppression du projet
gcloud projects delete osoneskub
Amazon Web Services
Sur AWS, il faut supprimer le cluster EKS et une registry.
# Suppression du registry
aws ecr batch-delete-image --repository-name helloworld --image-ids imageTag=latest
aws ecr delete-repository --repository-name helloworld
# Suppression du cluster EKS
aws eks delete-cluster --cluster-name osoneskub
Microsoft Azure
# Suppression du groupe de ressource
az group delete --name osoneskub
Conclusion
Ce n'est pas avec Kubernetes que nos conjoins vont enfin comprendre notre métier, mais au moins maintenant, lorsque le boss en réunion demandera "Qui a déjà testé Kubernetes ici ?", il fera ca :
Puis ca :
Et vos collègues feront :
A bientôt pour le prochain article Kubernetes 101 sur la création de template !
Découvrez les derniers articles d'alter way
- Big Data & AI Paris 2024 : L'IA au cœur de toutes les transformations.
- Un retour vers l'open-source ? Vos outils DevOps préférés et leurs equivalents open-source.
- Prowler : L'outil de sécurité multi-cloud indispensable pour renforcer votre infrastructure
- Kubernetes : plateforme "star" de l'IT et levier d'innovation des entreprises
- AI_dev2024
- : DirectPV : Avoir du stockage bloc distribué facilement dans kubernetes