Deployer un cluster Kubernetes avec CoreOS
ro:Implementaţi un cluster Kubernetes cu CoreOS ru:Развертывание кластера Kubernetes с CoreOS pl:Wdróż klaster Kubernetes z CoreOS ja:クラスター コア Os と Kubernetes を展開します。 ar:نشر مجموعة كوبيرنيتيس مع CoreOS zh:部署群集与 CoreOS Kubernetes de:Bereitstellen eines Clusters Kubernetes mit CoreOS nl:Implementeer een cluster Kubernetes met CoreOS it:Distribuire un cluster Kubernetes con CoreOS pt:Implantar um cluster Kubernetes com CoreOS es:Implementar un clúster Kubernetes con CoreOS en:Deploy a cluster Kubernetes with CoreOS
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
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
Déroulé
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 :
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" :
Cliquez sur "Nodes" :
La liste de vos nodes Kubernetes minion apparait :
Cliquez sur l'un d'eux pour afficher les informations relatives à ce node (version de Docker, système, KubeProxy et Kubelet,etc.) :
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" :
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 :
En cliquant dessus on obtient des informations plus détaillées sur notre Pod :
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
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" :
Activer l'actualisation automatique des commentaires