User Tools

Site Tools


labs:coreos-lab-1-cluster

CoreOS: Lab 1 Configuration d'un cluster

Objet Création d'un cluster CoreOS
Niveau requis débutant, avisé
Débutant, à savoir
Suivi :DRAFT:

Ce lab explique comment amorcer un nouveau cluster de système d'exploitation Production Core en tant que service haute disponibilité avec etcd2, Fleet, Flannel, Confd, Nginx Balancer et Docker.

Les principaux composants de CoreOS - etc, Docker et systemd.

  • etcd: magasin de valeurs-clés pour l'enregistrement et la découverte de services
  • fleet: planification et basculement des conteneurs Docker sur un cluster CoreOS
  • flannel: attribue à chaque conteneur docker une adresse IP unique vous permettant d’accéder au port interne (c’est-à-dire le port 80 et non le 32679)
  • confd: surveille etcd pour les noeuds arrivant / partant et met à jour (avec rechargement) la configuration de nginx en utilisant le modèle spécifié

Configuration de base

Générer un nouveau jeton pour le cluster: https://discovery.etcd.io/new?size=X, où X correspond au nombre de serveurs

Etape1 : Editer le fichier Cloud Config

sudo vi /var/lib/coreos-install/user_data

coreos:
  etcd2:
# Génére un nouveau jeton pour chaque cluster unique à partir de https://discovery.etcd.io/new
# discovery: https://discovery.etcd.io/<jeton>
discovery: https://discovery.etcd.io/9c19239271bcd6be78d4e8acfb393551
   
# Les déploiements multi-régions et multi-cloud doivent utiliser $ public_ipv4
advertise-client-urls: http://$private_ipv4:2379,http://$private_ipv4:4001
initial-advertise-peer-urls: http://$private_ipv4:2380
   
# Ecoute à la fois sur les ports officiels et les ports existants
# Les ports hérités peuvent être omis si votre application n'en dépend pas
listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0::4001
listen-peer-urls: http: // $ private_ipv4: 2380
 
  fleet:
public-ip: $private_ipv4
metadata: region=europe,public_ip=$public_ipv4
 
  flannel:
interface: $private_ipv4
 
  units:
- name: etcd2.service
  command: start
  # See issue: https://github.com/coreos/etcd/issues/3600#issuecomment-165266437
  drop-ins:
    - name: "timeout.conf"
      content: |
        [Service]
        TimeoutStartSec=0
       
- name: fleet.service
  command: start
 
# Network configuration should be here, e.g:
# - name: 00-eno1.network
#   content: "[Match]\nName=eno1\n\n[Network]\nDHCP=yes\n\n[DHCP]\nUseMTU=9000\n"
# - name: 00-eno2.network
#   runtime: true
#   content: "[Match]\nName=eno2\n\n[Network]\nDHCP=yes\n\n[DHCP]\nUseMTU=9000\n"
   
- name: flanneld.service
  command: start
  drop-ins:
  - name: 50-network-config.conf
    content: |
      [Service]
      ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "10.1.0.0/16" }'
     
- name: docker.service
  command: start
  drop-ins:
  - name: 60-docker-wait-for-flannel-config.conf
    content: |
      [Unit]
      After=flanneld.service
      Requires=flanneld.service

      [Service]
      Restart=always
     
- name: docker-tcp.socket
  command: start
  enable: true
  content: |
    [Unit]
    Description=Docker Socket for the API

    [Socket]
    ListenStream=2375
    Service=docker.service
    BindIPv6Only=both

    [Install]
    WantedBy=sockets.target

Ajouter ces lignes à Cloud Config pour que le réseau privé fonctionne:

units:
  # ...
  - name: 00-eno2.network
runtime: true
content: "[Match]\nName=eno2\n\n[Network]\nDHCP=yes\n\n[DHCP]\nUseMTU=9000\n"

Etape 2: Valider les modifications

sudo coreos-cloudinit -validate --from-file /var/lib/coreos-install/user_data

Etape 3: Redémarrer le système

sudo reboot

Etape 4: Vérifier l'état de etcd2

sudo systemctl status -r etcd2

La sortie doit contenir une ligne suivante:

 Active: active (running)

Parfois cela prend du temps, Attendre quelques minutes.

Répéter les étapes 1 à 4 pour chaque serveur du cluster.

Etape 5: Vérifier la santé du cluster et statut de fleet

# devrait être en bonne santé
sudo etcdctl cluster-health
# devrait afficher tous les serveurs
sudo fleetctl list-machines

Tester le cluster

Création d'unités dans fleet

Dans le répertoire personnel:

cd ~

Créer une nouvelle unité de modèle d'application. Par exemple, vi test-app@.service et ajouter les lignes suivantes:

[Unit]
Description=test-app%i
After=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill test-app%i
ExecStartPre=-/usr/bin/docker rm test-app%i
ExecStartPre=/usr/bin/docker pull willrstern/node-sample
ExecStart=/usr/bin/docker run -e APPNAME=test-app%i --name test-app%i -P willrstern/node-sample
ExecStop=/usr/bin/docker stop test-app%i

Soumettre une unité de modèle de demande à fleet

fleetctl submit test-app@.service

Démarrer de nouvelles instances

A partir de l'unité de modèle d'application:

fleetctl start test-app@1
fleetctl start test-app@2
fleetctl start test-app@3

Vérifier que tout fonctionne bien

Vérifier que toutes les instances ont été démarrées et actives. Cela pourrait prendre quelques minutes.

$ fleetctl list-units
UNIT            MACHINE                ACTIVE    SUB
test-app@1.service    e1512f34.../10.1.9.17    active    running
test-app@2.service    a78a3229.../10.1.9.18    active    running
test-app@3.service    081c8a1e.../10.1.9.19    active    running
Configurer les règles du pare-feu

Equilibreurs de charge et découverte de service

Créer les fichiers someapp

Créer les fichiers someapp@.service, someapp-discovery@.service et someapp-lb@.service avec les contenus suivants.

someapp@.service

[Unit]
Description=someapp%i
Requires=docker.service
After=docker.service

[Service]
# Let the process take awhile to start up (for first run Docker containers)
TimeoutStartSec=0

# Directives with "=-" are allowed to fail without consequence
ExecStartPre=-/usr/bin/docker kill someapp%i
ExecStartPre=-/usr/bin/docker rm someapp%i
ExecStartPre=/usr/bin/docker pull denisizmaylov/node-sample
ExecStart=/usr/bin/docker run -e APPNAME=someapp%i --name someapp%i -P denisizmaylov/node-sample
ExecStop=/usr/bin/docker stop someapp%i

someapp-discovery@.service

[Unit]
Description=Announce Someapp%i

# Requirements
BindsTo=someapp@%i.service
Requires=etcd2.service
Requires=docker.service

# Dependency ordering
After=someapp@%i.service
After=etcd2.service
After=docker.service

[Service]
ExecStart=/bin/sh -c "while true; do etcdctl set /services/someapp/upstream/someapp%i \"$(sleep 5 && docker inspect -f '{{.NetworkSettings.IPAddress}}' someapp%i):3000\" --ttl 60;sleep 45;done"
ExecStop=/usr/bin/etcdctl rm /services/someapp/upstream/someapp%i

[X-Fleet]
MachineOf=someapp@%i.service

someapp-lb@.service

[Unit]
Description=someapp-lb%i

# Requirements
Requires=docker.service
Requires=etcd2.service

# Dependency ordering
After=docker.service
After=etcd2.service

[Service]
# Let the process take awhile to start up (for first run Docker containers)
TimeoutStartSec=0

# Change killmode from "control-group" to "none" to let Docker remove
# work correctly.
KillMode=none

# Get CoreOS environmental variables
EnvironmentFile=/etc/environment

# Directives with "=-" are allowed to fail without consequence
ExecStartPre=-/usr/bin/docker kill someapp-lb%i
ExecStartPre=-/usr/bin/docker rm someapp-lb%i
ExecStartPre=/usr/bin/docker pull denisizmaylov/nginx-lb
ExecStart=/usr/bin/sh -c "/usr/bin/docker run --name someapp-lb%i --rm -p 80:80 -e SERVICE_NAME=someapp -e ETCD=\"$(ifconfig docker0 | awk '/\\<inet\\>/ { print $2 }'):2379\" denisizmaylov/nginx-lb"
ExecStop=/usr/bin/docker stop someapp-lb%i

[X-Fleet]
Conflicts=someapp-lb@*
MachineMetadata=loadbalancer=true

Modifier ces modèles d'unités en fonction de la configuration.

Soumettre ces fichiers à fleet

fleetctl submit someapp@.service
fleetctl submit someapp-discovery@.service
fleetctl submit someapp-lb@.service

Démarrer des instances d'unités

fleetctl start someapp@{1..6}
fleetctl start someapp-discovery@{1..6}
fleetctl start someapp-lb@{1..2}

Vérifier que tout fonctionne bien

fleetctl list-units

Dépannage

Un service ne fonctionne pas

Utiliser ces commandes pour déboguer:

# aussi pour fleet, etcd, flanneld
sudo systemctl start etcd2
sudo systemctl status etcd2
sudo journalctl -xe
sudo journalctl -xep3
sudo journalctl -ru etcd2

Afficher l'état des unités

fleet list-unit affiche l'état d'échec pour toutes les unités

  • Pour les unités locales:
sudo fleetctl journal someapp@1
  • Pour les unités distantes:
fleetctl journal someapp@1

SSH_AUTH_SOCK n'est pas définie

Lorsque fleetctl reponds avec:

Erreur lors de l'exécution de la commande à distance: la variable d'environnement SSH_AUTH_SOCK n'est pas définie. Vérifiez que ssh-agent est en cours d'exécution.
  • Vérifier la connection avec ssh -A.
  • n'utiliser pas sudo pour des machines distantes. Car un processus sous sudo ne peut pas accéder à SSH_AUTH_SOCK.

Nom déjà utilisé

Lorsque le démon réponsd:

Conflict. Le nom "someapp1" est déjà utilisé par le conteneur c4acbb70c654.

il faut supprimer (ou renommer) ce conteneur pour pouvoir réutiliser ce nom.

fleetctl stop someapp@1
docker rm someapp1
fleetctl start someapp@1

La commande ssh de fleet ne fonctionne pas

Il faut:

  • s'assurer que la clé publique a été ajoutée partout dans user_data. Sur chaque serveur.
  • se connecter au serveur avec l'agent SSH:
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh -A <your-host>
labs/coreos-lab-1-cluster.txt · Last modified: 2025/02/19 10:59 by 127.0.0.1