Kubernetes 101 : Lancez votre premier template k8s

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é.

Logos AWS Google Cloud Azure


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 :

Pour continuer l'aventure, vous devez donc si ce n'est pas déjà fait créer un compte en suivant les liens suivants.

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.

Schéma global des outils

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. Nous utiliserons helloworldosones.

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.

Image console

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 !

La discussion continue !

Nous attendons vos questions, remarques & mots doux sur notre Twitter :