Tutoriel | Installez facilement un cluster Kubernetes sous Debian ou Centos

Article publié le 20 Août 2018

Aujourd’hui un petit tutoriel sur l’installation d’un Cluster Kubernetes. La procédure ci-dessous vous indiquera la méthode la plus simple pour installer Kubernetes.

Pour exemple et également pour tester ce tutoriel, mon cluster sera composé d’un master et de deux workers.

 

1)  Installation sous Debian/Ubuntu

– Installez la version de Docker supporté par Kubernetes (sur chaque node):

apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add –
add-apt-repository « deb https://download.docker.com/linux/$(. /etc/os-release; echo « $ID ») $(lsb_release -cs) stable »
apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk ‘{print $3}’)

 

– Activez le démarrage automatique de Docker (sur chaque nodes) :

systemctl enable docker

– Paramétrez Docker afin qu’il utilise exclusivement systemd, pour cela éditez le fichier /etc/docker/daemon.json et ajoutez  le contenu suivant avant de redémarrer le service Docker (sur chaque nodes):

{

« exec-opts »: [« native.cgroupdriver=systemd »]

}

– Ajoutez les repo Kubernetes (sur chaque nodes):

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add –
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update

– Désactivez le swap (sur chaque nodes)

swapoff -a

 N’oubliez pas de commenter la ligne dans le fstab

– Installez les outils Kubernetes (sur chaque nodes)

apt-get install kubelet kubeadm kubectl

– Initialisez le cluster (sur le master  uniquement)

kubeadm init –pod-network-cidr=10.244.0.0/16

Faites ce qui est indiqué à l’écran et gardez dans un coin la commande « kubeadm join » qui nous permettra plus tard de rattacher des workers à notre Cluster.

– Installez les composants network Kubernetes (sur le master  uniquement)

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

– Vérifiez que l’installation se soit bien passé

kubectl get pods –all-namespaces

– Sur chaque worker lancez la commande « kubeadm join » que vous avez gardé dans un coin

– Depuis le master lancez la commande suivante afin de vérifier que vos nodes ont bien rejoins le cluster

kubectl get nodes

2) Installation sous Centos/RedHat

– Appliquez les dernière mises à jour de l’OS (sur chaque nodes):

yum update -y

– Désactiver SeLinux durant l’installation (sur chaque nodes):

setenforce 0

– Installez Docker

yum install -y docker

– Activez le démarrage automatique de Docker (sur chaque nodes) :

systemctl enable docker

– Ajoutez le repository Kubernetes (sur chaque nodes):

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

– Installez Kubernetes (sur chaque nodes):

yum install -y kubelet kubeadm kubectl –disableexcludes=kubernetes

– Ajoutez les paramètres sysctl suivant (sur chaque nodes):

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl –system

– Désactivez le swap (sur chaque nodes)

swapoff -a

 N’oubliez pas de commenter la ligne dans le fstab

– Initialisez le cluster Kubernetes(sur le master  uniquement) :

kubeadm init –pod-network-cidr=10.244.0.0/16

Faites ce qui est indiqué à l’écran et gardez dans un coin la commande « kubeadm join » qui nous permettra plus tard de rattacher des workers à notre Cluster.

– Installez les composants network Kubernetes (sur le master  uniquement)

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

– Vérifiez que l’installation se soit bien passé

kubectl get pods –all-namespaces

– Sur chaque worker lancez la commande « kubeadm join » que vous avez gardé dans un coin

– Depuis le master lancez la commande suivante afin de vérifier que vos nodes ont bien rejoins le cluster

kubectl get nodes

 

Enjoy! 😉




Tutoriel | Installer et utiliser DockerSwarm

Article publié le 15 Août 2018

Docker Swarm est un outil conçu par Docker permettant de gérer un cluster de Container très facilement. En plus d’être simple à implémenter, Docker Swarm est extrêmement performant. Il peut supporter mille noeuds et cinquante mille container sans aucune dégradation de performance.

Ci-dessous un tutoriel complet sur comment installer et utiliser DockerSwarm.

 

1) Prérequis

Pour ce tutoriel, je vais utiliser 3 machines (la distribution importe peu)

Docker 1.13 ou supérieur doit-être installé sur chaque machine. Pour rappel, un tutoriel sur l’installation de Docker est disponible ici.

 

2) Schéma

Ci-dessous un petit schéma qui résume très simplement le concept de Swarm et de ce que l’on va mettre en place avec ce tuto:

3) Création du Cluster Swarm

Un cluster swarm est composé de Managers chargés de l’orchestration du cluster et des Workers qui exécutent vos containers.

– Initialisation du cluster Swarm (la machine ou le cluster swarm sera initialisé deviendra Manager):

docker swarm init –advertise-addr <ip du host>

La commande devrait vous renvoyer quelque chose comme ci-dessous:

– Suivez les instructions en faisant un copier-coller de la commande sur chaque node (host) qui servira de worker:

– Vous pouvez vérifier l’état de votre cluster Swarm grâce à cette commande (à exécuter depuis le manager):

docker node ls

4) Création d’un service

Avec swarm nous allons beaucoup parler de service. Un service est, pour ainsi dire, le point d’entré de votre application. Un service est composé de 1-N container et apporte une dimension de clustering, de fault tolérance et de haute disponibilité à votre environnement docker.

– Dans l’exemple ci-dessous, nous allons créer un service httpd (apache) nommé « monserveurweb »:

docker service create –name monserveurweb –publish 80:80 httpd

– Vérifiez ensuite l’état de votre service:

docker service ls

Au final, vous devriez avoir un truc comme ceci:

Vous pourrez constater que si vous tapez http://<ip de votre manager ou d’un node> depuis votre navigateur que le serveur apache hébergé dans le container répond bien!

 

4.2) Scalabilité

En faisant un docker service ls, vous pouvez voir que le nombre de replica est à 1. Cela signifie qu’un seul container a été provisionné et déployé dans votre cluster. Il est possible d’augmenter le nombre de replica via cette commande:

docker service update –replicas <nombre de replica> <nom de votre service>

ou

docker service scale <nom de votre service>=<nombre de replicas>        (l’avantage avec cette commande est que vous pouvez modifier plusieurs service d’un seul coup)

Si l’on refait un « docker service ls » on pourra voir que le nombre de replicas a augmenté:

Pour rappel, votre manager fera lui même le loadbalancing entre chacun de vos replicas.

Vous pouvez avoir une vue détaillé de l’endroit où sont hébergés chacun de vos replicas grâce à cette commande

docker service ps <id de votre service>

Exemple:

 

4.3) Ajouter un manager

Vous l’aurez compris, le manager est un élément critique de votre cluster Swarm. Il est très fortement conseillé d’en avoir plusieurs afin de limiter au maximum le risque d’incidents critiques.

Pour créer un nouveau manager (qui sera un manager en standby):

– Récupérez le token:

docker swarm join-token manager

– Copiez-collez la commande qui vous est indiquée sur le host qui vous servira de manager

– En faisant un « docker node ls » vous pouvez voir votre nouveau node avec le statut « reachable ». Ce qui voudra dire qu’il prendra le relais en cas de perte du manager.

 Attention toutefois: afin que l’algorithme raft fonctionne bien (ce qui permet l’élection d’un nouveau manager en cas de perte de celui-ci), il est préconisé que le nombre de manager désigné soit impair !

5) Autres fonctionnalités

Ci-dessous quelques fonctionnalités qui pourront vous être fort utile:

  • Exemple de commande pour fixer des quota de  ressources:

docker service update –limit-cpu=.5 –reserve-cpu=.75 –limit-memory=128m –reserve-memory=256 monserveurweb

  • Les labels:

Cette fonctionnalité vous permettra de « tagger » vos nodes et vos services. Cela vous sera très utile; par exemple, si vous voulez que certains services se déploient sur certain nodes:

– Affecter un label à un node

docker node update –label-add nodelabel=<nom du label> <id de votre node>

– Créer un service qui sera déployé sur un node en fonction de son label:

docker service create –name <nom du service> –constraints ‘node.labels.nodelabel=='<nom du label>’  <nom de l’image>

  • Supprimer un node:

– Sur votre node tapez la commande suivante:

docker swarm leave

– Depuis le manager tapez la commande suivante:

docker node rm <id de votre node>

  • Swarm et docker-compose

– Il est possible de créer un service depuis un yaml docker-compose grâce à cette commande:

docker stack deploy –compose-file <fichiercompose.yml> <nom service>

 




Tutoriel | Installation, configuration et utilisation d’un Docker Registry

Article publié le 13 Août 2018

Ce tutoriel complet expliquera comment installer, configurer, et utiliser un Docker Registry.

Pour suivre ce tutoriel, Docker doit-être installé sur votre machine. Un tutoriel vous expliquant comment installer Docker est disponible ici.

Nous allons travailler dans le répertoire /srv/myrepo.com et pour servir d’exemple l’adresse de notre repository sera myrepo.com. Le fichier host sera renseigné de tel manière à ce que l’IP de ma machine soit associé au nom myrepo.com.

– Dans notre répertoire de travail, nous allons créer deux répertoires:

mkdir -p /srv/myrepo.com/certs

mkdir -p /srv/myrepo.com/auth

– Nous allons ensuite généré dans le répertoire /srv/myrepo.com/certs un certificat TLS:

cd /srv/myrepo.com/certs && openssl req -x509 -newkey rsa:4096 -nodes -keyout myrepo.com.key -out myrepo.com.crt -days 365 -subj /CN=myrepo.com

– En faisans un « ls » vous devriez voir la clé privée plus le certificat:

– Copiez ensuite le crt dans le répertoire /etc/docker/certs.d/myrepo.com (pour rappel myrepo.com correspond au nom de votre repo)

sudo mkdir -p /etc/docker/certs.d/myrepo.com:5000 && cp /srv/myrepo.com/certs/myrepo.com.crt /etc/docker/certs.d/myrepo.com\:5000/

– Faites un pull de l’image Docker registry:

docker pull registry:2

– Générez ensuite un fichier htpasswd contenant le login et le mot de passe qui permettra de vous authentifier:

docker run –entrypoint htpasswd registry:2 -Bbn votrelogin votrepassword > /srv/myrepo.com/auth/htpasswd

– Lancez le container Docker Registry:

docker run -d -p 5000:5000 -v /srv/myrepo.com/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myrepo.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/myrepo.com.key -v /srv/myrepo.com/auth:/auth -e REGISTRY_AUTH_HTPASSWD_REALM= »Registry Realm » -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry:2

– Authentifiez-vous sur votre registry

docker login

Si l’authentification se déroule bien vous devriez avoir quelque chose comme ceci:

– Testez que votre repository fonctionne correctement.

  • Pour cela, on va faire un pull d’une image (busybox):

docker pull busybox

  • Taggez ensuite l’image pour la faire pointer vers votre registry

docker tag busybox myrepo.com:5000/testimage

  • Pushez l’image vers votre registry

docker push busybox myrepo.com:5000/testimage

 

 Dans ce tuto, le certificat utilisé est un certificat auto-signé. Si vous voulez utiliser votre registry depuis un autre serveur (ce qui, je pense, sera forcément le cas) il sera nécessaire de copier le répertoire /etc/docker/certs.d/myrepo.com\:5000/ sur chaque machine qui devra se connecter à votre registry et redémarrer le service Docker. Si vous ne faites pas cela,  vous risquez d’avoir un vilain message d’erreur vous indiquant que votre certificat TLS n’est pas bon…

Lister les images de votre repository:

Pour lister et connaître le contenu de votre repository, utiliser la commande curl suivante:

curl –insecure -u « login password » <URL de votre repository>

–insecure à utiliser si vous utilisez un certificat auto-signé