Différences entre versions de « Deployer un cluster Kubernetes avec CoreOS »

De Ikoula Wiki
Jump to navigation Jump to search
(2 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 +
<span data-link_translate_en_title="TranslateApiExceptionMethod: Translate()Message: The Azure Market Place Translator Subscription associated with the request credentials has zero balance.message id=3444.V2_Rest.Translate.3C268BBB"  data-link_translate_en_url="TranslateApiExceptionMethod%3A+Translate%28%29Message%3A+The+Azure+Market+Place+Translator+Subscription+associated+with+the+request+credentials+has+zero+balance.message+id%3D3444.V2_Rest.Translate.3C268BBB"></span>[[:en:TranslateApiExceptionMethod: Translate()Message: The Azure Market Place Translator Subscription associated with the request credentials has zero balance.message id=3444.V2_Rest.Translate.3C268BBB]][[en:TranslateApiExceptionMethod: Translate()Message: The Azure Market Place Translator Subscription associated with the request credentials has zero balance.message id=3444.V2_Rest.Translate.3C268BBB]]
 +
 +
 +
<!--T:1-->
 
Cette procédure décrit comment déployer rapidement et simplement un cluster [http://kubernetes.io/ Kubernetes] multi-nodes avec 3 instances CoreOS. Kubernetes fonctionnent en mode client - serveur, le client Kubernetes est nommé "Kubernetes minion" et le serveur "Kubernetes master". L'instance Kubernetes Master est l'instance qui va orchestrer de manière centralisée les instances Kubernetes Minions. Dans notre exemple, une instance CoreOS jouera la rôle de master Kubernetes et les deux autres instances joueront le rôle de node Kubernetes (minion).
 
Cette procédure décrit comment déployer rapidement et simplement un cluster [http://kubernetes.io/ Kubernetes] multi-nodes avec 3 instances CoreOS. Kubernetes fonctionnent en mode client - serveur, le client Kubernetes est nommé "Kubernetes minion" et le serveur "Kubernetes master". L'instance Kubernetes Master est l'instance qui va orchestrer de manière centralisée les instances Kubernetes Minions. Dans notre exemple, une instance CoreOS jouera la rôle de master Kubernetes et les deux autres instances joueront le rôle de node Kubernetes (minion).
  
  
 +
<!--T:2-->
 
Kubernetes est un système d'orchestration open source crée par Google permettant la gestion d'application conteneurisées avec Docker sur un cluster de plusieurs hôtes (3 VM CoreOS dans notre exemple). Il permet notamment le déploiement, la maintenance et la scalabilité d'applications. Pour en savoir plus vous pouvez vous rendre sur [https://github.com/GoogleCloudPlatform/kubernetes/ le github Kubernetes]
 
Kubernetes est un système d'orchestration open source crée par Google permettant la gestion d'application conteneurisées avec Docker sur un cluster de plusieurs hôtes (3 VM CoreOS dans notre exemple). Il permet notamment le déploiement, la maintenance et la scalabilité d'applications. Pour en savoir plus vous pouvez vous rendre sur [https://github.com/GoogleCloudPlatform/kubernetes/ le github Kubernetes]
  
  
 +
<!--T:3-->
 
Nous partons du principe que vos 3 instances CoreOS sont déjà déployées, qu''''elles peuvent communiquer entre elles''' et que vous y êtes connectés en ssh avec l'utilisateur core.
 
Nous partons du principe que vos 3 instances CoreOS sont déjà déployées, qu''''elles peuvent communiquer entre elles''' et que vous y êtes connectés en ssh avec l'utilisateur core.
  
  
 +
<!--T:4-->
 
Si cela n'est pas déjà fait, mettez à jour vos instances CoreOS afin qu'elles soient à minima en version CoreOS 653.0.0 et incluent Etcd2 (voir notre FAQ  [https://ikoula.wiki/help/Mettre_a_jour_CoreOS_manuellement Mettre à jour CoreOS manuellement]). Dans notre cas toutes nos instances sont en CoreOS stable 681.2.0.
 
Si cela n'est pas déjà fait, mettez à jour vos instances CoreOS afin qu'elles soient à minima en version CoreOS 653.0.0 et incluent Etcd2 (voir notre FAQ  [https://ikoula.wiki/help/Mettre_a_jour_CoreOS_manuellement Mettre à jour CoreOS manuellement]). Dans notre cas toutes nos instances sont en CoreOS stable 681.2.0.
  
  
 +
<!--T:5-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
$ cat /etc/lsb-release
 
$ cat /etc/lsb-release
Ligne 20 : Ligne 28 :
  
  
 +
<!--T:6-->
 
Nous devons également faire en sorte que toutes nos instances CoreOS ont un ID de machine différent pour le bon fonctionnement en context cluster. Pour se faire il suffit de supprimer le fichier /etc/machine-id et de redémarrer chacune de vos instances CoreOS  soit :  
 
Nous devons également faire en sorte que toutes nos instances CoreOS ont un ID de machine différent pour le bon fonctionnement en context cluster. Pour se faire il suffit de supprimer le fichier /etc/machine-id et de redémarrer chacune de vos instances CoreOS  soit :  
  
  
 +
<!--T:7-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
$ sudo rm -f /etc/machine-id && sudo reboot
 
$ sudo rm -f /etc/machine-id && sudo reboot
Ligne 28 : Ligne 38 :
  
  
== '''Configuration de l'instance Kubernetes Master  :''' ==
+
== '''Configuration de l'instance Kubernetes Master  :''' == <!--T:8-->
  
  
 +
<!--T:9-->
 
Ecraser le fichier cloud-config.yml par défaut par celui de notre configuration Kubernetes Master en effectuant les commandes suivantes ('''uniquement sur l'instance qui jouera le rôle master et dans le même ordre d'exécution que celui ci-dessous''') :
 
Ecraser le fichier cloud-config.yml par défaut par celui de notre configuration Kubernetes Master en effectuant les commandes suivantes ('''uniquement sur l'instance qui jouera le rôle master et dans le même ordre d'exécution que celui ci-dessous''') :
  
  
 +
<!--T:10-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ sudo wget -O /usr/share/oem/cloud-config.yml http://mirror02.ikoula.com/priv/coreos/kubernetes-master.yaml
 
core@Kube-MASTER ~ $ sudo wget -O /usr/share/oem/cloud-config.yml http://mirror02.ikoula.com/priv/coreos/kubernetes-master.yaml
Ligne 43 : Ligne 55 :
 
Saving to: '/usr/share/oem/cloud-config.yml'
 
Saving to: '/usr/share/oem/cloud-config.yml'
  
 +
<!--T:11-->
 
/usr/share/oem/cloud-config.yml              100%[===================================================================================================>]  8.70K  --.-KB/s  in 0s
 
/usr/share/oem/cloud-config.yml              100%[===================================================================================================>]  8.70K  --.-KB/s  in 0s
  
 +
<!--T:12-->
 
2015-06-22 15:55:48 (148 MB/s) - '/usr/share/oem/cloud-config.yml' saved [8913/8913]
 
2015-06-22 15:55:48 (148 MB/s) - '/usr/share/oem/cloud-config.yml' saved [8913/8913]
 
</syntaxhighlight>
 
</syntaxhighlight>
  
  
 +
<!--T:13-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ export `cat /etc/environment`
 
core@Kube-MASTER ~ $ export `cat /etc/environment`
Ligne 54 : Ligne 69 :
  
  
 +
<!--T:14-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ sudo sed -i 's#PRIVATE_IP#'$COREOS_PRIVATE_IPV4'#g' /usr/share/oem/cloud-config.yml
 
core@Kube-MASTER ~ $ sudo sed -i 's#PRIVATE_IP#'$COREOS_PRIVATE_IPV4'#g' /usr/share/oem/cloud-config.yml
Ligne 59 : Ligne 75 :
  
  
 +
<!--T:15-->
 
On redémarre notre instance afin que sa configuration soit effective :
 
On redémarre notre instance afin que sa configuration soit effective :
  
  
 +
<!--T:16-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ sudo reboot
 
core@Kube-MASTER ~ $ sudo reboot
Ligne 67 : Ligne 85 :
  
  
 +
<!--T:17-->
 
On vérifie que notre instance s'est bien initialisée :
 
On vérifie que notre instance s'est bien initialisée :
  
  
 +
<!--T:18-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ sudo fleetctl list-machines
 
core@Kube-MASTER ~ $ sudo fleetctl list-machines
Ligne 77 : Ligne 97 :
  
  
 +
<!--T:19-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ sudo etcdctl ls --recursive
 
core@Kube-MASTER ~ $ sudo etcdctl ls --recursive
Ligne 108 : Ligne 129 :
  
  
 +
<!--T:20-->
 
On peut également voir les services/ports en écoute (on y retrouve les composants serveur/master Kubernetes):
 
On peut également voir les services/ports en écoute (on y retrouve les composants serveur/master Kubernetes):
  
  
 +
<!--T:21-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ sudo netstat -taupen | grep LISTEN
 
core@Kube-MASTER ~ $ sudo netstat -taupen | grep LISTEN
Ligne 129 : Ligne 152 :
  
  
== '''Configuration des instances Kubernetes Minions :''' ==
+
== '''Configuration des instances Kubernetes Minions :''' == <!--T:22-->
  
  
 +
<!--T:23-->
 
Ecraser le fichier cloud-config.yml par défaut par celui de notre configuration Kubernetes Minion en effectuant les commandes suivantes sur l'ensemble de vos instance qui joueront le rôle de Kubernetes Minion ('''uniquement sur les instances qui joueront le rôle node/minion et dans le même ordre d'exécution que celui ci-dessous''') :
 
Ecraser le fichier cloud-config.yml par défaut par celui de notre configuration Kubernetes Minion en effectuant les commandes suivantes sur l'ensemble de vos instance qui joueront le rôle de Kubernetes Minion ('''uniquement sur les instances qui joueront le rôle node/minion et dans le même ordre d'exécution que celui ci-dessous''') :
  
  
 +
<!--T:24-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MINION1 ~ $ sudo wget -O /usr/share/oem/cloud-config.yml http://mirror02.ikoula.com/priv/coreos/kubernetes-minion.yaml
 
core@Kube-MINION1 ~ $ sudo wget -O /usr/share/oem/cloud-config.yml http://mirror02.ikoula.com/priv/coreos/kubernetes-minion.yaml
Ligne 144 : Ligne 169 :
 
Saving to: '/usr/share/oem/cloud-config.yml'
 
Saving to: '/usr/share/oem/cloud-config.yml'
  
 +
<!--T:25-->
 
/usr/share/oem/cloud-config.yml              100%[===================================================================================================>]  5.09K  --.-KB/s  in 0s
 
/usr/share/oem/cloud-config.yml              100%[===================================================================================================>]  5.09K  --.-KB/s  in 0s
  
 +
<!--T:26-->
 
2015-06-22 16:39:26 (428 MB/s) - '/usr/share/oem/cloud-config.yml' saved [5210/5210]
 
2015-06-22 16:39:26 (428 MB/s) - '/usr/share/oem/cloud-config.yml' saved [5210/5210]
 
</syntaxhighlight>
 
</syntaxhighlight>
  
  
 +
<!--T:27-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MINION1 ~ $ export `cat /etc/environment`
 
core@Kube-MINION1 ~ $ export `cat /etc/environment`
Ligne 155 : Ligne 183 :
  
  
 +
<!--T:28-->
 
Attention il faut adapter l'adresse ip privée de votre instance kubernetes master dans la commande ci-dessous ('''remplacez 10.1.1.138 par l'ip privée de votre instance kubernetes master''') la commande ci-dessous :
 
Attention il faut adapter l'adresse ip privée de votre instance kubernetes master dans la commande ci-dessous ('''remplacez 10.1.1.138 par l'ip privée de votre instance kubernetes master''') la commande ci-dessous :
  
  
 +
<!--T:29-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MINION1 ~ $ sudo sed -i 's#MASTER_PRIVATE_IP#10.1.1.138#g' /usr/share/oem/cloud-config.yml
 
core@Kube-MINION1 ~ $ sudo sed -i 's#MASTER_PRIVATE_IP#10.1.1.138#g' /usr/share/oem/cloud-config.yml
Ligne 163 : Ligne 193 :
  
  
 +
<!--T:30-->
 
Enfin une fois que vous avez effectuez ces commandes à l'identique sur chacune de vos instances/nodes kubernetes minion, redémarrez celles-ci afin que leur configuration soient effectives et quelles joignent le cluster.
 
Enfin une fois que vous avez effectuez ces commandes à l'identique sur chacune de vos instances/nodes kubernetes minion, redémarrez celles-ci afin que leur configuration soient effectives et quelles joignent le cluster.
  
  
 +
<!--T:31-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MINION1 ~ $ sudo reboot
 
core@Kube-MINION1 ~ $ sudo reboot
Ligne 171 : Ligne 203 :
  
  
 +
<!--T:32-->
 
Nous vérifions que nos 2 instances kubernetes minion ont bien rejoint notre cluster (la commande ci-dessous peut être exécuté sur n'importe laquelle de vos instances membre de votre cluster) :
 
Nous vérifions que nos 2 instances kubernetes minion ont bien rejoint notre cluster (la commande ci-dessous peut être exécuté sur n'importe laquelle de vos instances membre de votre cluster) :
  
  
 +
<!--T:33-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ sudo fleetctl list-machines
 
core@Kube-MASTER ~ $ sudo fleetctl list-machines
Ligne 183 : Ligne 217 :
  
  
 +
<!--T:34-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MINION1 ~ $ sudo etcdctl ls --recursive
 
core@Kube-MINION1 ~ $ sudo etcdctl ls --recursive
Ligne 225 : Ligne 260 :
  
  
 +
<!--T:35-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MINION2 ~ $ sudo etcdctl ls --recursive
 
core@Kube-MINION2 ~ $ sudo etcdctl ls --recursive
Ligne 267 : Ligne 303 :
  
  
 +
<!--T:36-->
 
Sur nos instances Kubernetes Minion voici les services/ports en écoute (dont le service Kubelet par lequel l'échange d'informations se fait avec le Kubernetes master) :
 
Sur nos instances Kubernetes Minion voici les services/ports en écoute (dont le service Kubelet par lequel l'échange d'informations se fait avec le Kubernetes master) :
  
  
 +
<!--T:37-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MINION1 ~ $ sudo netstat -taupen | grep LISTEN
 
core@Kube-MINION1 ~ $ sudo netstat -taupen | grep LISTEN
Ligne 287 : Ligne 325 :
  
  
== '''Vérification de la communication avec l'API du Kubernetes Master  :''' ==
+
== '''Vérification de la communication avec l'API du Kubernetes Master  :''' == <!--T:38-->
  
  
 +
<!--T:39-->
 
'''La Kubernetes UI :'''
 
'''La Kubernetes UI :'''
  
 +
<!--T:40-->
 
Pour accéder au dashboard Kubernetes, il vous faut autoriser les connexions au port 8080 (Kubernetes master API server) et effectué une redirection de port si besoin (zone avancée) vers le port 8080 de votre instance Kubernetes master. Ensuite, il vous suffit d'accéder à l'url http://''adresse_ip_publique_instance_kubernetes_master'':8080/static/app/#/dashboard/ dans votre navigateur :
 
Pour accéder au dashboard Kubernetes, il vous faut autoriser les connexions au port 8080 (Kubernetes master API server) et effectué une redirection de port si besoin (zone avancée) vers le port 8080 de votre instance Kubernetes master. Ensuite, il vous suffit d'accéder à l'url http://''adresse_ip_publique_instance_kubernetes_master'':8080/static/app/#/dashboard/ dans votre navigateur :
  
  
 +
<!--T:41-->
 
[[File:Kubernetes-UI.png]]
 
[[File:Kubernetes-UI.png]]
  
  
 +
<!--T:42-->
 
Depuis ce dashboard, il vous est entre autre possible d'afficher des informations sur vos nodes (Kubernetes Minion). Pour cela, vous pouvez cliquez sur "Views" :
 
Depuis ce dashboard, il vous est entre autre possible d'afficher des informations sur vos nodes (Kubernetes Minion). Pour cela, vous pouvez cliquez sur "Views" :
  
  
 +
<!--T:43-->
 
[[File:Kubernetes-UI-2.png]]
 
[[File:Kubernetes-UI-2.png]]
  
  
 +
<!--T:44-->
 
Cliquez sur "Nodes" :
 
Cliquez sur "Nodes" :
  
  
 +
<!--T:45-->
 
[[File:Kubernetes-UI-3.png]]
 
[[File:Kubernetes-UI-3.png]]
  
  
 +
<!--T:46-->
 
La liste de vos nodes Kubernetes minion apparait :
 
La liste de vos nodes Kubernetes minion apparait :
  
  
 +
<!--T:47-->
 
[[File:Kubernetes-UI-4.png]]
 
[[File:Kubernetes-UI-4.png]]
  
  
 +
<!--T:48-->
 
Cliquez sur l'un d'eux pour afficher les informations relatives à ce node (version de Docker, système, KubeProxy et Kubelet,etc.) :
 
Cliquez sur l'un d'eux pour afficher les informations relatives à ce node (version de Docker, système, KubeProxy et Kubelet,etc.) :
  
  
 +
<!--T:49-->
 
[[File:Kubernetes-UI-5.png]]
 
[[File:Kubernetes-UI-5.png]]
  
  
 +
<!--T:50-->
 
'''Kubernetes CLI :'''
 
'''Kubernetes CLI :'''
  
  
 +
<!--T:51-->
 
Vous pouvez également utiliser l'outils [https://cloud.google.com/container-engine/docs/kubectl/ Kubectl] depuis votre instance Kubernetes master. Pour se faire, vous devez installer cette utilitaire comme suit :
 
Vous pouvez également utiliser l'outils [https://cloud.google.com/container-engine/docs/kubectl/ Kubectl] depuis votre instance Kubernetes master. Pour se faire, vous devez installer cette utilitaire comme suit :
  
  
 +
<!--T:52-->
 
Une fois connecté en ssh sur votre instance Kubernetes master saisissez les commandes suivantes :
 
Une fois connecté en ssh sur votre instance Kubernetes master saisissez les commandes suivantes :
  
  
 +
<!--T:53-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ sudo wget -O /opt/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/v0.17.0/bin/linux/amd64/kubectl
 
core@Kube-MASTER ~ $ sudo wget -O /opt/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/v0.17.0/bin/linux/amd64/kubectl
Ligne 340 : Ligne 393 :
 
Saving to: '/opt/bin/kubectl'
 
Saving to: '/opt/bin/kubectl'
  
 +
<!--T:54-->
 
/opt/bin/kubectl                              100%[===================================================================================================>]  19.15M  1.18MB/s  in 16s
 
/opt/bin/kubectl                              100%[===================================================================================================>]  19.15M  1.18MB/s  in 16s
  
 +
<!--T:55-->
 
2015-06-23 11:39:26 (1.18 MB/s) - '/opt/bin/kubectl' saved [20077224/20077224]
 
2015-06-23 11:39:26 (1.18 MB/s) - '/opt/bin/kubectl' saved [20077224/20077224]
 
</syntaxhighlight>
 
</syntaxhighlight>
  
  
 +
<!--T:56-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ sudo chmod 755 /opt/bin/kubectl
 
core@Kube-MASTER ~ $ sudo chmod 755 /opt/bin/kubectl
Ligne 351 : Ligne 407 :
  
  
 +
<!--T:57-->
 
Test de la bonne communication avec votre API Kubernetes :
 
Test de la bonne communication avec votre API Kubernetes :
  
  
 +
<!--T:58-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ kubectl get node
 
core@Kube-MASTER ~ $ kubectl get node
Ligne 362 : Ligne 420 :
  
  
 +
<!--T:59-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ kubectl cluster-info
 
core@Kube-MASTER ~ $ kubectl cluster-info
Ligne 368 : Ligne 427 :
  
  
 +
<!--T:60-->
 
Nous pouvons ainsi déployer un premier container Nginx dans notre cluster :
 
Nous pouvons ainsi déployer un premier container Nginx dans notre cluster :
  
  
 +
<!--T:61-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ kubectl run-container nginx --image=nginx
 
core@Kube-MASTER ~ $ kubectl run-container nginx --image=nginx
Ligne 379 : Ligne 440 :
  
  
 +
<!--T:62-->
 
On peut ensuite voire sur lequel de nos hosts ce container s'est déployé, le nom du pod et l'ip qui lui a était affecté :
 
On peut ensuite voire sur lequel de nos hosts ce container s'est déployé, le nom du pod et l'ip qui lui a était affecté :
  
  
 +
<!--T:63-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ kubectl get pods
 
core@Kube-MASTER ~ $ kubectl get pods
Ligne 390 : Ligne 453 :
  
  
 +
<!--T:64-->
 
Nous retrouvons ces mêmes informations via le dashboard de la Kubernete UI en allant dans "Views" puis "Pods" :
 
Nous retrouvons ces mêmes informations via le dashboard de la Kubernete UI en allant dans "Views" puis "Pods" :
  
  
 +
<!--T:65-->
 
[[File:Kubernetes-UI-6.png]]
 
[[File:Kubernetes-UI-6.png]]
  
  
 +
<!--T:66-->
 
Nous pouvons voir l'ip de l'host sur lequel, ce container s'est déployé, avec le nom du Pod et son adresse ip :  
 
Nous pouvons voir l'ip de l'host sur lequel, ce container s'est déployé, avec le nom du Pod et son adresse ip :  
  
  
 +
<!--T:67-->
 
[[File:Kubernetes-UI-7.png]]
 
[[File:Kubernetes-UI-7.png]]
  
  
 +
<!--T:68-->
 
En cliquant dessus on obtient des informations plus détaillées sur notre Pod :
 
En cliquant dessus on obtient des informations plus détaillées sur notre Pod :
  
  
 +
<!--T:69-->
 
[[File:Kubernetes-UI-8.png]]
 
[[File:Kubernetes-UI-8.png]]
  
  
 +
<!--T:70-->
 
Nous pouvons stopper notre container simplement :
 
Nous pouvons stopper notre container simplement :
  
  
 +
<!--T:71-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ kubectl stop rc nginx
 
core@Kube-MASTER ~ $ kubectl stop rc nginx
Ligne 417 : Ligne 488 :
  
  
 +
<!--T:72-->
 
Nous pouvons également déployer notre container avec 2 replicas :
 
Nous pouvons également déployer notre container avec 2 replicas :
  
  
 +
<!--T:73-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ kubectl run-container nginx --image=nginx --replicas=2
 
core@Kube-MASTER ~ $ kubectl run-container nginx --image=nginx --replicas=2
Ligne 427 : Ligne 500 :
  
  
 +
<!--T:74-->
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
core@Kube-MASTER ~ $ kubectl get pods
 
core@Kube-MASTER ~ $ kubectl get pods
Ligne 437 : Ligne 511 :
  
  
 +
<!--T:75-->
 
[[File:Kubernetes-UI-9.png]]
 
[[File:Kubernetes-UI-9.png]]
  
  
  
 +
<!--T:76-->
 
Pour plus d'informations sur l'architecture, les différents composants et le fonctionnement d'un cluster Kubernetes, nous vous invitons à prendre connaissance de la documentation officielle [https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/design/architecture.md "Kubernetes architecture"] :
 
Pour plus d'informations sur l'architecture, les différents composants et le fonctionnement d'un cluster Kubernetes, nous vous invitons à prendre connaissance de la documentation officielle [https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/design/architecture.md "Kubernetes architecture"] :
  
  
 +
<!--T:77-->
 
[[category:cloudstack]]
 
[[category:cloudstack]]
 
[[category:cloud public]]
 
[[category:cloud public]]
 
[[category:cloud privé]]
 
[[category:cloud privé]]

Version du 23 septembre 2015 à 16:41

en:TranslateApiExceptionMethod: Translate()Message: The Azure Market Place Translator Subscription associated with the request credentials has zero balance.message id=3444.V2_Rest.Translate.3C268BBB


Cette procédure décrit comment déployer rapidement et simplement un cluster Kubernetes multi-nodes avec 3 instances CoreOS. Kubernetes fonctionnent en mode client - serveur, le client Kubernetes est nommé "Kubernetes minion" et le serveur "Kubernetes master". L'instance Kubernetes Master est l'instance qui va orchestrer de manière centralisée les instances Kubernetes Minions. Dans notre exemple, une instance CoreOS jouera la rôle de master Kubernetes et les deux autres instances joueront le rôle de node Kubernetes (minion).


Kubernetes est un système d'orchestration open source crée par Google permettant la gestion d'application conteneurisées avec Docker sur un cluster de plusieurs hôtes (3 VM CoreOS dans notre exemple). Il permet notamment le déploiement, la maintenance et la scalabilité d'applications. Pour en savoir plus vous pouvez vous rendre sur le github Kubernetes


Nous partons du principe que vos 3 instances CoreOS sont déjà déployées, qu'elles peuvent communiquer entre elles et que vous y êtes connectés en ssh avec l'utilisateur core.


Si cela n'est pas déjà fait, mettez à jour vos instances CoreOS afin qu'elles soient à minima en version CoreOS 653.0.0 et incluent Etcd2 (voir notre FAQ Mettre à jour CoreOS manuellement). Dans notre cas toutes nos instances sont en CoreOS stable 681.2.0.


$ cat /etc/lsb-release
DISTRIB_ID=CoreOS
DISTRIB_RELEASE=681.2.0
DISTRIB_CODENAME="Red Dog"
DISTRIB_DESCRIPTION="CoreOS 681.2.0"


Nous devons également faire en sorte que toutes nos instances CoreOS ont un ID de machine différent pour le bon fonctionnement en context cluster. Pour se faire il suffit de supprimer le fichier /etc/machine-id et de redémarrer chacune de vos instances CoreOS soit :


$ sudo rm -f /etc/machine-id && sudo reboot


Configuration de l'instance Kubernetes Master :

Ecraser le fichier cloud-config.yml par défaut par celui de notre configuration Kubernetes Master en effectuant les commandes suivantes (uniquement sur l'instance qui jouera le rôle master et dans le même ordre d'exécution que celui ci-dessous) :


core@Kube-MASTER ~ $ sudo wget -O /usr/share/oem/cloud-config.yml http://mirror02.ikoula.com/priv/coreos/kubernetes-master.yaml
--2015-06-22 15:55:48--  http://mirror02.ikoula.com/priv/coreos/kubernetes-master.yaml
Resolving mirror02.ikoula.com... 80.93.X.X, 2a00:c70:1:80:93:81:178:1
Connecting to mirror02.ikoula.com|80.93.X.X|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8913 (8.7K) [text/plain]
Saving to: '/usr/share/oem/cloud-config.yml'

<!--T:11-->
/usr/share/oem/cloud-config.yml               100%[===================================================================================================>]   8.70K  --.-KB/s   in 0s

<!--T:12-->
2015-06-22 15:55:48 (148 MB/s) - '/usr/share/oem/cloud-config.yml' saved [8913/8913]


core@Kube-MASTER ~ $ export `cat /etc/environment`


core@Kube-MASTER ~ $ sudo sed -i 's#PRIVATE_IP#'$COREOS_PRIVATE_IPV4'#g' /usr/share/oem/cloud-config.yml


On redémarre notre instance afin que sa configuration soit effective :


core@Kube-MASTER ~ $ sudo reboot


On vérifie que notre instance s'est bien initialisée :


core@Kube-MASTER ~ $ sudo fleetctl list-machines
MACHINE         IP              METADATA
aee19a88...     10.1.1.138      role=master


core@Kube-MASTER ~ $ sudo etcdctl ls --recursive
/coreos.com
/coreos.com/updateengine
/coreos.com/updateengine/rebootlock
/coreos.com/updateengine/rebootlock/semaphore
/coreos.com/network
/coreos.com/network/config
/coreos.com/network/subnets
/coreos.com/network/subnets/10.244.69.0-24
/registry
/registry/ranges
/registry/ranges/serviceips
/registry/ranges/servicenodeports
/registry/namespaces
/registry/namespaces/default
/registry/services
/registry/services/endpoints
/registry/services/endpoints/default
/registry/services/endpoints/default/kubernetes
/registry/services/endpoints/default/kubernetes-ro
/registry/services/specs
/registry/services/specs/default
/registry/services/specs/default/kubernetes
/registry/services/specs/default/kubernetes-ro
/registry/serviceaccounts
/registry/serviceaccounts/default
/registry/serviceaccounts/default/default


On peut également voir les services/ports en écoute (on y retrouve les composants serveur/master Kubernetes):


core@Kube-MASTER ~ $ sudo netstat -taupen | grep LISTEN
tcp        0      0 10.1.1.138:7001         0.0.0.0:*               LISTEN      232        16319      634/etcd2
tcp        0      0 10.1.1.138:7080         0.0.0.0:*               LISTEN      0          19392      1047/kube-apiserver
tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN      0          19142      973/python
tcp        0      0 127.0.0.1:10251         0.0.0.0:*               LISTEN      0          20047      1075/kube-scheduler
tcp        0      0 10.1.1.138:6443         0.0.0.0:*               LISTEN      0          19406      1047/kube-apiserver
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      245        14794      502/systemd-resolve
tcp        0      0 127.0.0.1:10252         0.0.0.0:*               LISTEN      0          19653      1058/kube-controlle
tcp        0      0 10.1.1.138:2380         0.0.0.0:*               LISTEN      232        16313      634/etcd2
tcp6       0      0 :::8080                 :::*                    LISTEN      0          19390      1047/kube-apiserver
tcp6       0      0 :::22                   :::*                    LISTEN      0          13647      1/systemd
tcp6       0      0 :::4001                 :::*                    LISTEN      232        16321      634/etcd2
tcp6       0      0 :::2379                 :::*                    LISTEN      232        16320      634/etcd2
tcp6       0      0 :::5355                 :::*                    LISTEN      245        14796      502/systemd-resolve


Configuration des instances Kubernetes Minions :

Ecraser le fichier cloud-config.yml par défaut par celui de notre configuration Kubernetes Minion en effectuant les commandes suivantes sur l'ensemble de vos instance qui joueront le rôle de Kubernetes Minion (uniquement sur les instances qui joueront le rôle node/minion et dans le même ordre d'exécution que celui ci-dessous) :


core@Kube-MINION1 ~ $ sudo wget -O /usr/share/oem/cloud-config.yml http://mirror02.ikoula.com/priv/coreos/kubernetes-minion.yaml
--2015-06-22 16:39:26--  http://mirror02.ikoula.com/priv/coreos/kubernetes-minion.yaml
Resolving mirror02.ikoula.com... 80.93.X.X, 2a00:c70:1:80:93:81:178:1
Connecting to mirror02.ikoula.com|80.93.X.X|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5210 (5.1K) [text/plain]
Saving to: '/usr/share/oem/cloud-config.yml'

<!--T:25-->
/usr/share/oem/cloud-config.yml               100%[===================================================================================================>]   5.09K  --.-KB/s   in 0s

<!--T:26-->
2015-06-22 16:39:26 (428 MB/s) - '/usr/share/oem/cloud-config.yml' saved [5210/5210]


core@Kube-MINION1 ~ $ export `cat /etc/environment`


Attention il faut adapter l'adresse ip privée de votre instance kubernetes master dans la commande ci-dessous (remplacez 10.1.1.138 par l'ip privée de votre instance kubernetes master) la commande ci-dessous :


core@Kube-MINION1 ~ $ sudo sed -i 's#MASTER_PRIVATE_IP#10.1.1.138#g' /usr/share/oem/cloud-config.yml


Enfin une fois que vous avez effectuez ces commandes à l'identique sur chacune de vos instances/nodes kubernetes minion, redémarrez celles-ci afin que leur configuration soient effectives et quelles joignent le cluster.


core@Kube-MINION1 ~ $ sudo reboot


Nous vérifions que nos 2 instances kubernetes minion ont bien rejoint notre cluster (la commande ci-dessous peut être exécuté sur n'importe laquelle de vos instances membre de votre cluster) :


core@Kube-MASTER ~ $ sudo fleetctl list-machines
MACHINE         IP              METADATA
5097f972...     10.1.1.215      role=node
aee19a88...     10.1.1.138      role=master
fe86214c...     10.1.1.83       role=node


core@Kube-MINION1 ~ $ sudo etcdctl ls --recursive
/coreos.com
/coreos.com/updateengine
/coreos.com/updateengine/rebootlock
/coreos.com/updateengine/rebootlock/semaphore
/coreos.com/network
/coreos.com/network/config
/coreos.com/network/subnets
/coreos.com/network/subnets/10.244.69.0-24
/coreos.com/network/subnets/10.244.38.0-24
/coreos.com/network/subnets/10.244.23.0-24
/registry
/registry/ranges
/registry/ranges/serviceips
/registry/ranges/servicenodeports
/registry/namespaces
/registry/namespaces/default
/registry/services
/registry/services/specs
/registry/services/specs/default
/registry/services/specs/default/kubernetes
/registry/services/specs/default/kubernetes-ro
/registry/services/endpoints
/registry/services/endpoints/default
/registry/services/endpoints/default/kubernetes
/registry/services/endpoints/default/kubernetes-ro
/registry/serviceaccounts
/registry/serviceaccounts/default
/registry/serviceaccounts/default/default
/registry/events
/registry/events/default
/registry/events/default/10.1.1.215.13ea16c9c70924f4
/registry/events/default/10.1.1.83.13ea16f74bd4de1c
/registry/events/default/10.1.1.83.13ea16f77a4e7ab2
/registry/events/default/10.1.1.215.13ea16c991a4ee57
/registry/minions
/registry/minions/10.1.1.215
/registry/minions/10.1.1.83


core@Kube-MINION2 ~ $ sudo etcdctl ls --recursive
/coreos.com
/coreos.com/updateengine
/coreos.com/updateengine/rebootlock
/coreos.com/updateengine/rebootlock/semaphore
/coreos.com/network
/coreos.com/network/config
/coreos.com/network/subnets
/coreos.com/network/subnets/10.244.69.0-24
/coreos.com/network/subnets/10.244.38.0-24
/coreos.com/network/subnets/10.244.23.0-24
/registry
/registry/ranges
/registry/ranges/serviceips
/registry/ranges/servicenodeports
/registry/namespaces
/registry/namespaces/default
/registry/services
/registry/services/specs
/registry/services/specs/default
/registry/services/specs/default/kubernetes
/registry/services/specs/default/kubernetes-ro
/registry/services/endpoints
/registry/services/endpoints/default
/registry/services/endpoints/default/kubernetes
/registry/services/endpoints/default/kubernetes-ro
/registry/serviceaccounts
/registry/serviceaccounts/default
/registry/serviceaccounts/default/default
/registry/events
/registry/events/default
/registry/events/default/10.1.1.83.13ea16f77a4e7ab2
/registry/events/default/10.1.1.215.13ea16c991a4ee57
/registry/events/default/10.1.1.215.13ea16c9c70924f4
/registry/events/default/10.1.1.83.13ea16f74bd4de1c
/registry/minions
/registry/minions/10.1.1.215
/registry/minions/10.1.1.83


Sur nos instances Kubernetes Minion voici les services/ports en écoute (dont le service Kubelet par lequel l'échange d'informations se fait avec le Kubernetes master) :


core@Kube-MINION1 ~ $ sudo netstat -taupen | grep LISTEN
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      0          18280      849/kube-proxy
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      245        14843      500/systemd-resolve
tcp6       0      0 :::49005                :::*                    LISTEN      0          18284      849/kube-proxy
tcp6       0      0 :::10255                :::*                    LISTEN      0          19213      1025/kubelet
tcp6       0      0 :::47666                :::*                    LISTEN      0          18309      849/kube-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      0          13669      1/systemd
tcp6       0      0 :::4001                 :::*                    LISTEN      232        16106      617/etcd2
tcp6       0      0 :::4194                 :::*                    LISTEN      0          19096      1025/kubelet
tcp6       0      0 :::10248                :::*                    LISTEN      0          19210      1025/kubelet
tcp6       0      0 :::10250                :::*                    LISTEN      0          19305      1025/kubelet
tcp6       0      0 :::2379                 :::*                    LISTEN      232        16105      617/etcd2
tcp6       0      0 :::5355                 :::*                    LISTEN      245        14845      500/systemd-resolve


Vérification de la communication avec l'API du Kubernetes Master :

La Kubernetes UI :

Pour accéder au dashboard Kubernetes, il vous faut autoriser les connexions au port 8080 (Kubernetes master API server) et effectué une redirection de port si besoin (zone avancée) vers le port 8080 de votre instance Kubernetes master. Ensuite, il vous suffit d'accéder à l'url http://adresse_ip_publique_instance_kubernetes_master:8080/static/app/#/dashboard/ dans votre navigateur :


Kubernetes-UI.png


Depuis ce dashboard, il vous est entre autre possible d'afficher des informations sur vos nodes (Kubernetes Minion). Pour cela, vous pouvez cliquez sur "Views" :


Kubernetes-UI-2.png


Cliquez sur "Nodes" :


Kubernetes-UI-3.png


La liste de vos nodes Kubernetes minion apparait :


Kubernetes-UI-4.png


Cliquez sur l'un d'eux pour afficher les informations relatives à ce node (version de Docker, système, KubeProxy et Kubelet,etc.) :


Kubernetes-UI-5.png


Kubernetes CLI :


Vous pouvez également utiliser l'outils Kubectl depuis votre instance Kubernetes master. Pour se faire, vous devez installer cette utilitaire comme suit :


Une fois connecté en ssh sur votre instance Kubernetes master saisissez les commandes suivantes :


core@Kube-MASTER ~ $ sudo wget -O /opt/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/v0.17.0/bin/linux/amd64/kubectl
--2015-06-23 11:39:09--  https://storage.googleapis.com/kubernetes-release/release/v0.17.0/bin/linux/amd64/kubectl
Resolving storage.googleapis.com... 64.233.166.128, 2a00:1450:400c:c09::80
Connecting to storage.googleapis.com|64.233.166.128|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20077224 (19M) [application/octet-stream]
Saving to: '/opt/bin/kubectl'

<!--T:54-->
/opt/bin/kubectl                              100%[===================================================================================================>]  19.15M  1.18MB/s   in 16s

<!--T:55-->
2015-06-23 11:39:26 (1.18 MB/s) - '/opt/bin/kubectl' saved [20077224/20077224]


core@Kube-MASTER ~ $ sudo chmod 755 /opt/bin/kubectl


Test de la bonne communication avec votre API Kubernetes :


core@Kube-MASTER ~ $ kubectl get node
NAME         LABELS                              STATUS
10.1.1.215   kubernetes.io/hostname=10.1.1.215   Ready
10.1.1.83    kubernetes.io/hostname=10.1.1.83    Ready


core@Kube-MASTER ~ $ kubectl cluster-info
Kubernetes master is running at http://localhost:8080


Nous pouvons ainsi déployer un premier container Nginx dans notre cluster :


core@Kube-MASTER ~ $ kubectl run-container nginx --image=nginx
CONTROLLER   CONTAINER(S)   IMAGE(S)   SELECTOR              REPLICAS
nginx        nginx          nginx      run-container=nginx   1


On peut ensuite voire sur lequel de nos hosts ce container s'est déployé, le nom du pod et l'ip qui lui a était affecté :


core@Kube-MASTER ~ $ kubectl get pods
POD           IP            CONTAINER(S)   IMAGE(S)   HOST                    LABELS                STATUS    CREATED     MESSAGE
nginx-zia71   10.244.38.2                             10.1.1.215/10.1.1.215   run-container=nginx   Running   3 minutes
                            nginx          nginx                                                    Running   1 minutes


Nous retrouvons ces mêmes informations via le dashboard de la Kubernete UI en allant dans "Views" puis "Pods" :


Kubernetes-UI-6.png


Nous pouvons voir l'ip de l'host sur lequel, ce container s'est déployé, avec le nom du Pod et son adresse ip :


Kubernetes-UI-7.png


En cliquant dessus on obtient des informations plus détaillées sur notre Pod :


Kubernetes-UI-8.png


Nous pouvons stopper notre container simplement :


core@Kube-MASTER ~ $ kubectl stop rc nginx
replicationcontrollers/nginx


Nous pouvons également déployer notre container avec 2 replicas :


core@Kube-MASTER ~ $ kubectl run-container nginx --image=nginx --replicas=2
CONTROLLER   CONTAINER(S)   IMAGE(S)   SELECTOR              REPLICAS
nginx        nginx          nginx      run-container=nginx   2


core@Kube-MASTER ~ $ kubectl get pods
POD           IP            CONTAINER(S)   IMAGE(S)   HOST                    LABELS                STATUS    CREATED          MESSAGE
nginx-7gen5   10.244.38.3                             10.1.1.215/10.1.1.215   run-container=nginx   Running   About a minute
                            nginx          nginx                                                    Running   39 seconds
nginx-w4xue   10.244.23.3                             10.1.1.83/10.1.1.83     run-container=nginx   Running   About a minute
                            nginx          nginx                                                    Running   About a minute


Kubernetes-UI-9.png


Pour plus d'informations sur l'architecture, les différents composants et le fonctionnement d'un cluster Kubernetes, nous vous invitons à prendre connaissance de la documentation officielle "Kubernetes architecture" :