| 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.
Générer un nouveau jeton pour le cluster: https://discovery.etcd.io/new?size=X, où X correspond au nombre de serveurs
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"
sudo coreos-cloudinit -validate --from-file /var/lib/coreos-install/user_data
sudo reboot
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.
# devrait être en bonne santé sudo etcdctl cluster-health # devrait afficher tous les serveurs sudo fleetctl list-machines
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
fleetctl submit test-app@.service
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 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
Créer les fichiers someapp@.service, someapp-discovery@.service et someapp-lb@.service avec les contenus suivants.
[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
[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
[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.
fleetctl submit someapp@.service fleetctl submit someapp-discovery@.service fleetctl submit someapp-lb@.service
fleetctl start someapp@{1..6}
fleetctl start someapp-discovery@{1..6}
fleetctl start someapp-lb@{1..2}
fleetctl list-units
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
fleet list-unit affiche l'état d'échec pour toutes les unités
sudo fleetctl journal someapp@1
fleetctl journal someapp@1
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.
ssh -A.SSH_AUTH_SOCK.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
Il faut:
user_data. Sur chaque serveur.eval `ssh-agent -s` ssh-add ~/.ssh/id_rsa ssh -A <your-host>