Openstack Management TTNN » Historique » Version 137
Version 136 (Mehdi Abaakouk, 17/01/2020 12:39) → Version 137/140 (Fabien ADAM, 28/03/2020 08:40)
{{>toc}}
h1. Openstack Management TTNN
h2. Liens
* [[HOWTO add a VM]]
* [[Management_Cluster_Ceph]]
* [[Openstack Setup VM pas dans openstack]]
* [[Openstack Installation nouvelle node du cluster]]
* [[Openstack Installation TTNN]]
* "Openstack tools for ttnn":/projects/git-tetaneutral-net/repository/openstack-tools
h2. Avant toute operation Openstack
*Tres important* avant toute operation Openstack lancer sur g1 :
<pre>
root@g1:~# tools/os-overview.sh
</pre>
Si une ligne n'est pas OK relancer le composant et relancer os-overview.
h2. Création VMs
Cf. [[HOWTO add a VM]]
Example d'un VM sur ssd avec 2 disques (hard) additionels de 500G
<pre>
$ openstack ttnn create --ip <ipv4> --ssd --disk-size 20 --flavor 1vcpu-1024ram --image debian-stretch-scsi <name>.tetaneutral.net
$ openstack volume create --type ceph --size 500 <name>.tetaneutral.net-disk-1
$ openstack volume create --type ceph --size 500 <name>.tetaneutral.net-disk-2
$ openstack server add volume <name>.tetaneutral.net <name>.tetaneutral.net-disk-1
$ openstack server add volume <name>.tetaneutral.net <name>.tetaneutral.net-disk-2
</pre>
Ensuite dans la VM:
<pre>
mkfs.ext4 -E nodiscard /dev/sdb
mkfs.ext4 -E nodiscard /dev/sdc
tune2fs -c 0 -i 0 -m 0 /dev/sdb
tune2fs -c 0 -i 0 -m 0 /dev/sdc
</pre>
/!\ Ne pas mettre nodiscard pour les SSDs /!\
h2. Opération sur les VMs (des membres)
h3. Console série
Dans la VM, pour systemd:
<pre>
$ systemctl enable serial-getty@ttyS0.service
$ systemctl start serial-getty@ttyS0.service
</pre>
Dans la VM, pour sysv
<pre>
$ cat >> /etc/inittab <<EOF
T2:2345:respawn:/sbin/getty ttyS0 115200 vt102
EOF
$ init q
</pre>
Sur g1:
<pre>
$ openstack ttnn log ns2.tetaneutral.net
Debian GNU/Linux 8 ns2 ttyS0
ns2 login:
</pre>
h3. Voir la console graphique sans spice-html5:
Copier le script suivant 'gvnc' sur sa machine:
<pre>
#!/bin/bash
vm=$1
info=($(ssh openstack.tetaneutral.net -p 2222 -l root -- "mysql nova --skip-column-names --batch -e 'select host, uuid from instances where display_name=\"$vm\";'"))
if [ "${info[0]}" == "mysql" ]; then
echo "Error in mysql request"
exit 1
fi
hypervisor=${info[0]}.tetaneutral.net
uuid=${info[1]}
spice_port=$(ssh ${hypervisor} -p 2222 -l root virsh domdisplay ${uuid} | awk -F: '{print $3}')
echo "$vm on $hypervisor port $spice_port"
ssh -N $hypervisor -p 2222 -l root -L 5910:localhost:${spice_port} &
pid=$!
cleanup(){
kill $pid
}
trap cleanup EXIT
sleep 2
remote-viewer spice://localhost:5910/
</pre>
Puis
<pre>
sudo apt-get install virt-viewer
./gvnc puppet.openstack.net
</pre>
h3. Reboot VM en error
<pre>
openstack server set --state active xxx.tetaneutral.net
openstack server reboot --hard --wait xxx.tetaneutral.net
</pre>
h3. Shutdown une VM
<pre>
openstack server stop xxx.tetaneutral.net
</pre>
A noter que suspend fait une sauvegarde de la RAM comme sur un laptop. shelve est bugué ne pas utiliser.
h3. Effacer une VM
<pre>
openstack ttnn delete xxx.tetaneutral.net
</pre>
Cette commande lance la suppression de la VM et des ces interfaces réseaux.
"--with-disk" peut être ajouter pour supprimer TOUT les disques de cette VM.
h3. Changer CPU RAM
<pre>
openstack server resize --flavor 2vcpu-2048ram VMNAME.tetaneutral.net # will stop VMNAME then start VMNAME on a new KVM
openstack server resize --confirm VMNAME.tetaneutral.net # get rid of freezed KVM
# openstack flavor list
</pre>
h3. Disques de VM
Pour renommer (et permettre a boot-disk de recreer) ou effacer :
<pre>
openstack volume list
openstack volume set xxx.tetaneutral.net-bootdisk-old --name xxx.tetaneutral.net-bootdisk-new
openstack volume delete <ID_or_Name>
</pre>
h3. Offline fsck
Récuperer l'id et l'hyperviseur de la VM
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net | grep -e 'host ' -e ' id '
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Aller sur l'hyperviseur en question, puis:
<pre>
# guestfish -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
><fs> run
><fs> list-filesystems
/dev/sda: iso9660
/dev/sdb1: ext4
><fs> e2fsck-f /dev/sdb1
# ou
e2fsck /dev/sdb1 forceall:true
</pre>
Ou bien sur la machine qui host la VM :
<pre>
# virt-rescue 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
><rescue> fsck -a /dev/sdb1
</pre>
Si le fsck returns une erreur, c'est donc un probleme un peu plus grave on peut faire:
<pre>
><fs> e2fsck -y /dev/sdb1
</pre>
h3. Ajout d'un disque
Note: Si la VM vient juste d'être créé bien attendre qu'elle est fini son premier boot avant ! Sinon sda et sdb sont inversé (Oui oui, merci nova...).
<pre>
openstack volume create --type ceph --size 1000 --image debian-jessie-scsi zorun.tetaneutral.net-disk-1
openstack server add volume zorun.tetaneutral.net zorun.tetaneutral.net-disk-1
</pre>
Puis dans la VM
<pre>
mkfs.ext4 /dev/sdb
tune2fs -m 0 -i 0 -c 0 /dev/sdb
</pre>
h3. Agrandissement d'un disque
_Valable depuis Openstack Ocata and ceph jewel_. Validé également sur Openstack Queen fin 2019.
<pre>
/root/tools/os-grow-fs.sh bacasable.sileht.net-bootdisk 11
</pre>
Puis sur la VM, plusieur cas de figure:
+Disque sans partition:+
<pre>
# Note: dans un screen car plutot pas rapide
resize2fs -p /dev/sdb
</pre>
+Disque avec partition avec parted récent (>= 3.1, ie: jessie, ubuntu 13.10):+
<pre>
root@test4:~# parted /dev/sda print | grep sda
Disk /dev/sda: 64.4GB
root@test4# parted /dev/sda resizepart 1
Warning: Partition /dev/sda1 is being used. Are you sure you want to continue?
Yes/No? Yes
End? [42.9GB]? 64.4GB # METTRE ICI LA TAILLE VU AU DESSUS
Information: You may need to update /etc/fstab.
root@test4:~# resize2fs /dev/sda1
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/sda1 is now 15722400 blocks long.
root@test4:~# df -h | grep sda
/dev/vda1 60G 797M 56G 2% /
</pre>
+Disque avec partition avec vieux parted (< 3.1, ie: wheezy, vielle ubuntu):+
Pour debian wheezy, utilisation des packages ubuntu de 14.04 devrait permettre d'utiliser la méthod précendente sinon:
(pas encore testé, à voir si le kernel veut bien reload la table des partitions après)
<pre>
sfdisk -d /dev/vda > vda.mbr
cp vda.mbr vda.mbr.ori
vi vda.mbr
# mettre un tres grand nombre pour la fin de la partition
sfdisk -L -n --no-reread /dev/vda < vda.mbr
# cela va faire une erreur avec le max a mettre pour la fin de la partition
# changer la fin de la partition avec ce chiffre
sfdisk -L --no-reread /dev/vda < vda.mbr
reboot
resize2fs -p /dev/vda1
</pre>
h3. Ajout/Suppression IP/Subnet d'une VM existante (mode simple)
<pre>
openstack ttnn add-ip VM_NAME 89.234.156.212
openstack ttnn remove-ip VM_NAME 89.234.156.212
</pre>
h3. Ajout/Suppression IP/Subnet d'une VM existante (mode avancé)
Le mode avancé permet d'ajouté les ipv6 et ipv4 que l'on veut pour la VM. Contrairement au mode simple qui ajoute l'ipv4, le fe80 et le subnet ipv6 à partir de l'ipv4
Voir les IPs actutelles de la VM:
<pre>
# openstack port show backup.tetaneutral.net-eth0 -c allowed_address_pairs -c fixed_ips
| allowed_address_pairs | {"ip_address": "2a01:6600:8083:d400::/56", "mac_address": "fa:16:3e:5f:07:45"} |
| fixed_ips | {"subnet_id": "d431cacd-3b60-4ca9-af24-eacc8e5d8671", "ip_address": "89.234.156.212"} |
</pre>
fixed_ips sont la liste des ip directement router dans le tap de la VM (on ne peut pas mettre de masque):
* en ipv4, c'est le /32 de l'ipv4
* en ipv6, c'est le /64 de l'ipv6
allowed_address_pairs sont des subnets à router:
* en ipv4, via la premier ipv4 de fixed_ips (setup inutile et qui ne fonctionne pas, car bird ne re-export pas ce genre de route)
* en ipv6, via la link local correspondant si elle existe dans fixed_ips, sinon directement dans le tap
Ajout/Suppression d'une ip dans fixed_ips (noter que les ip ici non pas de masque):
<pre>
openstack ttnn add-ip --manual VM_NAME 89.234.156.212
openstack ttnn add-ip --manual VM_NAME fe80::80:12
openstack ttnn remove-ip --manual VM_NAME 89.234.156.212
openstack ttnn remove-ip --manual VM_NAME fe80::80:12
</pre>
Ajout/Suppression d'une ip dans allowed_address_pairs (noter que les ip ici on a un masque):
<pre>
openstack ttnn add-ip --manual VM_NAME 2a01:6600:8083:d400::/56
openstack ttnn remove-ip --manual VM_NAME 2a01:6600:8083:d400::/56
</pre>
h3. Ajout d'une interface réseau à une VM:
<pre>
$ openstack ttnn tap add --ip 91.224.149.19 --port-name eth1 gizmo.sileht.net-eth1
Port gizmo.sileht.net-eth1 created:
+-------------------------------+-----------------------+----------------------------+--------------------------+-------------------+
| id | name | fixed_ips | allowed_address_pairs | mac_address |
+-------------------------------+-----------------------+----------------------------+--------------------------+-------------------+
| 39c262d6-df91-4c96-96bc- | gizmo.sileht.net-eth1 | 91.224.149.19, fe80::81:13 | 2a03:7220:8081:1300::/56 | fa:16:3e:20:de:ba |
| f3573a37130a | | | | |
+-------------------------------+-----------------------+----------------------------+--------------------------+-------------------+
+--------------------------------------+------------------+------+---------------+--------+-----------------------------------------+
| id | name | host | flavor | status | addresses |
+--------------------------------------+------------------+------+---------------+--------+-----------------------------------------+
| 0346263f-77f6-4009-bdb3-d8720ec583e9 | gizmo.sileht.net | g9 | 2vcpu-4096ram | ACTIVE | vlan-routed=91.224.148.3, |
| | | | | | 91.224.149.214, fe80::80:03, |
| | | | | | fe80::81:d6, 91.224.149.19, fe80::81:13 |
+--------------------------------------+------------------+------+---------------+--------+-----------------------------------------+
</pre>
Dans la VM:
<pre>
$ dmesg | tail
[ 1315.826088] virtio-pci 0000:00:06.0: using default PCI settings
[ 1315.826102] virtio-pci 0000:00:07.0: no hotplug settings from platform
[ 1315.826102] virtio-pci 0000:00:07.0: using default PCI settings
[ 1315.826116] pci 0000:00:08.0: no hotplug settings from platform
[ 1315.826117] pci 0000:00:08.0: using default PCI settings
[ 1315.826382] virtio-pci 0000:00:08.0: enabling device (0000 -> 0003)
[ 1315.829281] virtio-pci 0000:00:08.0: setting latency timer to 64
[ 1315.829535] virtio-pci 0000:00:08.0: irq 50 for MSI/MSI-X
[ 1315.829555] virtio-pci 0000:00:08.0: irq 51 for MSI/MSI-X
[ 1315.829563] virtio-pci 0000:00:08.0: irq 52 for MSI/MSI-X
$ ip l show dev eth1
4: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether fa:16:3e:6b:32:07 brd ff:ff:ff:ff:ff:ff
$ tail -15 /etc/network/interfaces
auto eth1
iface eth1 inet6 static
pre-up /sbin/sysctl -w net.ipv6.conf.eth1.accept_ra=0
pre-up /sbin/sysctl -w net.ipv6.conf.eth1.autoconf=0
address 2a03:7220:8081:1300::1
netmask 56
gateway fe80::31
up ip addr add fe80::81:13/64 dev eth0
iface eth1 inet manual
pre-up /sbin/sysctl -w net.ipv6.conf.eth1.accept_ra=0
pre-up /sbin/sysctl -w net.ipv6.conf.eth1.autoconf=0
up ip link set eth1 up
up ip addr add 91.224.149.19/32 dev eth1
up ip route add default via 91.224.148.0 dev eth1 onlink
$ ifup eth1
</pre>
h3. Réinstallation/Réparation grub d'un VM
Récuperer l'id et l'hyperviseur de la VM
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net | grep -e 'host ' -e ' id '
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Bien attendre que la VM soir éteinte, aller sur l'hyperviseur en question, et taper
<pre>
virt-customize -v -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 --run-command 'update-grub ; grub-install /dev/sda;'
</pre>
Enfin, restart la VM
<pre>
# openstack server start VMNAME.tetaneutral.net
</pre>
h3. Monter le disque d'un vm sur une machine hote pour dépannage.
L’exemple montre la modification du fichier /etc/ssh/sshd_config
Récuperer l'id et l'hyperviseur de la VM
<pre>
root@g1# openstack server stop VMNAME.tetaneutral.net
root@gg1# openstack server show -c OS-EXT-SRV-ATTR:host -c id VMNAME.tetaneutral.net
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Aller sur l'hyperviseur en question, puis:
<pre>
root@<hyperviseur># virt-edit -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 /etc/ssh/sshd_config
</pre>
Fermer le fichier puis sur g1 restart la VM
<pre>
root@g1# openstack server start VMNAME.tetaneutral.net
</pre>
h3. Convert du fs root en ext4 et passage en scsi (tester avec ceph jewel and openstack ocata)
/!\ à retester à chaque update openstack vu que ca fait du sql /!\
Dans la VM, préparation de grub et du fstab:
<pre>
$ vi /etc/fstab
# Viré /proc
# Pour / (voir les autres) mettre:
LABEL=cloudimg-rootfs / ext4 defaults,discard,noatime 0 0
$ e2label /dev/vda1 cloudimg-rootfs
$ apt-get install grub-pc
$ apt-get purge extlinux
$ rm -f /extlinux.conf
$ grub-install /dev/vda
$ vi /etc/default/grub
# Ajouter: GRUB_CMDLINE_LINUX="elevator=noop console=tty0 console=ttyS0,115200n8"
$ update-grub
$ shutdown -h now
</pre>
Récuperer l'id et l'hyperviseur de la VM
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show -c OS-EXT-SRV-ATTR:host -c id VMNAME.tetaneutral.net
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Aller sur l'hyperviseur en question, puis:
<pre>
$ virt-rescue --suggest 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
...
# /dev/sdb1 is the root of a linux operating system
# type: linux, distro: debian, version: 8.0
# 8.0
mount /dev/sdb1 /sysroot/
mount --bind /dev /sysroot/dev
mount --bind /dev/pts /sysroot/dev/pts
mount --bind /proc /sysroot/proc
mount --bind /sys /sysroot/sys
</pre>
# Utiliser le device proposé pour la convertion en ext4:
<pre>
$ virt-rescue 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
> tune2fs -O extents,uninit_bg,dir_index /dev/sdb1
> e2fsck -fDC0 /dev/sdb1
> <CTRL+D>
</pre>
Ajout des attributs scsi
<pre>
openstack volume show VMNAME.tetaneutral.net-bootdisk
openstack volume set --image-property hw_scsi_model=virtio-scsi --image-property hw_disk_bus=scsi VMNAME.tetaneutral.net-bootdisk
</pre>
Puis supprimer et recréer la VM
<pre>
openstack server show -c name -c flavor -c addresses VMNAME.tetaneutral.net
openstack ttnn delete VMNAME.tetaneutral.net
openstack ttnn create --ip <ip> --flavor <flavor> VMNAME.tetaneutral.net # --volume disk-1 # pour les disques additionels
</pre>
h3. Transformer un volume Ceph "manuel" (type <pseudo-adherent>-vol) en volume Ceph "Openstack" (volume-<id-openstack>)
On crée d'abord in volume cinder vide de la meme taille.
<pre>
# rbd info -p disks XXXXXXXX-vol | grep size
size 1024 GB in 262144 objects
/!\ la taille ici doit être identique dans cinder et dans ceph /!\
# openstack volume create --type ceph --size 1024 vmXXXXXXXX.tetaneutral.net-disk-1
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| consistencygroup_id | None |
| created_at | 2018-08-28T06:11:57.669300 |
| description | None |
| encrypted | False |
| id | dcc26207-ef60-48e6-983e-94c1c945dXbX |
| migration_status | None |
| multiattach | False |
| name | vmXXXXXXXX.tetaneutral.net-disk-1 |
| properties | |
| replication_status | None |
| size | 1024 |
| snapshot_id | None |
| source_volid | None |
| status | creating |
| type | ceph |
| updated_at | None |
| user_id | f18b121edda04346b86610fa23983a0e |
+---------------------+--------------------------------------+
# rbd info -p disks volume-dcc26207-ef60-48e6-983e-94c1c945dXbX | grep size
size 1024 GB in 262144 objects
/!\ doit être identique à l'image d'origine /!\
</pre>
En suite on s'assure que les features de l'image sont celle attendu par Openstack:
<pre>
# rbd info -p disks volume-dcc26207-ef60-48e6-983e-94c1c945dXbX | grep features
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
# rbd info -p disks XXXXXXXX-vol | grep features
features: layering
# # NOTE, deep-flatten ne peut pas être ajouté, mais c'est pas grave.
# for i in exclusive-lock object-map fast-diff; do rbd feature enable disks/XXXXXXXX-vol $i ; done
# # Rebuild metadata file on the volume
# rbd object-map rebuild disks/XXXXXXXX-vol
Object Map Rebuild: 2% complete...
</pre>
Et pour finir on swap les deux volumes
<pre>
# rbd rm -p disks volume-dcc26207-ef60-48e6-983e-94c1c945dXbX
Removing image: 100% complete...done.
# rbd mv disks/XXXXXXXX-vol disks/volume-dcc26207-ef60-48e6-983e-94c1c945dXbX
</pre>
Voila on peut maintenant mettre le disque dans une VM:
<pre>
openstack server add volume XXXXXXXX.tetaneutral.net XXXXXXXX.tetaneutral.net-disk-1
</pre>
h3. Déplacer une VM de pool ceph (dernier test avec ceph jewel / openstack ocata)
<pre>
# openstack server show test246.tetaneutral.net -c id -c flavor -c addresses -c status
+-----------+------------------------------------------------------+
| Field | Value |
+-----------+------------------------------------------------------+
| addresses | vlan-routed=91.224.149.115, fe80::80:fe |
| flavor | 1vcpu-2048ram (7880cafc-bd0b-4045-9777-ef2e9201bd6c) |
| id | 485f270a-eb2e-452e-8733-fc4c741cbe8f |
| status | ACTIVE |
+-----------+------------------------------------------------------+
# openstack server delete test246.tetaneutral.net
Request to delete server test246.tetaneutral.net has been accepted.
# openstack volume set --type ceph-ssd --retype-policy on-demand test246.tetaneutral.net-bootdisk
# watch -n1 -- 'openstack volume list --long | grep test246.tetaneutral.net-bootdisk'
| 82279cc1-9a34-4108-b7a6-6944f252a2c3 | test246.tetaneutral.net-bootdisk | retyping | 1 | ceph
| 313dc3e5-a04a-435b-8b35-ecc5d7b5695c | test246.tetaneutral.net-bootdisk | available | 1 | ceph-ssd
Attendre qu'il n'y ai plus que le nouveau volume
| 313dc3e5-a04a-435b-8b35-ecc5d7b5695c | test246.tetaneutral.net | available | 1 | ceph-ssd
# openstack ttnn create --ip 91.224.149.115 --flavor 1vcpu-2048ram test246.tetaneutral.net
</pre>
h3. Réaligne VM partition (guide pour vm avec une seul partition)
Prérequies:
* VM utilse grub2
*
Récuperer l'id et l'hyperviseur de la VM, ainsi que l'id du disk
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net | grep -e 'host ' -e ' id '
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
# cinder list | grep puppet
| 213e894e-2f20-42b5-a27b-21f5a355c722 | in-use | VMNAME.tetaneutral.net-bootdisk | 20 | ceph-ssd | true | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Aller sur l'hyperviseur en question, puis vérifier l'alignement:
<pre>
$ virt-alignment-scan -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
/dev/sdb1 65536 512 bad (alignment < 4K)
</pre>
Réalignemet, *aller dans un espace ou il y a 2x l'espace utile de la VM*, puis:
<pre>
$ virt-tar-out -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 / - | gzip --best > VMNAME.tar.gz
$ rbd -p ssds info volume-213e894e-2f20-42b5-a27b-21f5a355c722
rbd image 'volume-213e894e-2f20-42b5-a27b-21f5a355c722':
size 20480 MB in 5120 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.996cc92ae8944a
format: 2
features: layering
$ virt-make-fs --label=cloudimg-rootfs --partition=mbr --type=ext4 --format=raw --size=20480 VMNAME.tar.gz VMNAME.img
$ virt-customize -a VMNAME.img --run-command 'update-grub ; grub-install /dev/sda'
$ rbd mv ssds/volume-213e894e-2f20-42b5-a27b-21f5a355c722 ssds/volume-213e894e-2f20-42b5-a27b-21f5a355c722.unaligned
$ rbd import --image-format 2 VMNAME.img ssds/volume-213e894e-2f20-42b5-a27b-21f5a355c722
</pre>
Vérification:
<pre>
$ virt-alignment-scan -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
/dev/sdb1 65536 64K ok
</pre>
h3. Création/Restauration/Export snapshot
Création:
<pre>
source os.conf
/root/tools/os-snapshot-vm.sh pano.tetaneutral.net bootdisk /
* Freezing / of pano.tetaneutral.net
* Snapshoting pano.tetaneutral.net-bootdisk
Snapshot pano.tetaneutral.net-bootdisk-20150125-1600 is in state creating ..
e06727d3-df4a-4873-82af-3a8f3e6e2aa5
* pano.tetaneutral.net-bootdisk snapshoted
* / of pano.tetaneutral.net unfreezed
</pre>
Restauration:
<pre>
$ openstack volume snapshot list
...
$ openstack volume create --size 101 --snapshot pano.tetaneutral.net-bootdisk-20150125-1600 pano-restauration-test
$ openstack server add volume pano.tetaneutral.net pano-restauration-test
</pre>
Extract du snapshot pour fournir à l'adhérent:
Sur g1:
<pre>
$ openstack volume show pano.tetaneutral.net-bootdisk -f value -c id
<UUID_VOLUME>
$ openstack volume snapshot list --volume pano.tetaneutral.net-bootdisk
| <UUID_SNAPSHOT> | pano.tetaneutral.net-bootdisk-20200117-1155 | None | available | 50 |
</pre>
Sur nagios.tetaneutral.net
<pre>
rbd -p ssds export volume-<UUID_VOLUME>@snapshot-<UUID_SNAPSHOT> pano.tetaneutral.net-bootdisk.raw
qemy-img convert -O qcow2 pano.tetaneutral.net-bootdisk.raw pano.tetaneutral.net-bootdisk.qcow
rm -f pano.tetaneutral.net-bootdisk.raw
</pre>
h3. Virer cloud-init sans accés à la VM:
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net -c id -c OS-EXT-SRV-ATTR:host -c status -f value
g12
a82eb312-7d42-44e1-bce2-a81292916cc3
SHUTOFF
# virt-customize -v --connect "qemu+ssh://<SHORT HYPERVISOR HOSTNAME>:2222/system" -d <ID> --run-command "echo ::::::::::::::: ; DEBIAN_FRONTEND=noninteractive apt-get -y purge cloud-init cloud-initramfs-growroot ; echo :::::::::::: ; "
</pre>
h2. Opérations sur les hyperviseurs
h3. Reboot d'un hyperviseur
Sur g1
<pre>
# openstack ttnn evacuate HOST
Migration of :
- lagrandeourse.tetaneutral.net [g2/active]
- pontsjumeaux.tetaneutral.net [g2/active]
- log.tetaneutral.net [g2/active]
- jabber.tetaneutral.net [g2/active]
- vmfatal.tetaneutral.net [g2/active]
- zoe.tetaneutral.net [g2/active]
...
Continue (Y/n) ? Y
rollback script 'evacuate-rollback-g2.sh' created
Live migration of lagrandeourse.tetaneutral.net [g2/active]: Complete on g2 and still alive \o/
...
</pre>
Sur l'hyperviseur en question:
<pre>
# ps fauxwww|grep kvm # verifier qu'il n'y a plus de VM lancé
# virsh list --all # verifier qu'il n'y a plus de VM dans libvirt
# ceph osd set noout # pour prevenir que les OSD vont revenir
# systemctl stop ceph-mon@* # Stopper les osd
# systemctl stop ceph-osd@* # Stopper les osd
# reboot
</pre>
Une fois l'opération terminer, pour remettre l'hyperviseur en route, sur g1
<pre>
ceph osd tree # Vérifier que les OSDs de cette hypervisuer sont revenur
./tools/os-overview.sh # Vérifier que neutron et nova sont ok sur cette hyperviseur
ceph osd unset noout
./evacuate-rollback-g2.sh # Remettre les VMs dessus.
</pre>
h3. Migration d'une VM sur un autre hyperviseur
La migration se fait à chaud, grace à la copie de la RAM, et l'accès au disque sur le cluster ceph depuis n'importe quel hyperviseur.
On spécifie l'hyperviseur de destination (ici g12), et la VM à migrer (ici ring01.tetaneutral.net).
<pre>
openstack server migrate --live g12 ring01.tetaneutral.net --wait
</pre>
h2. VM de management (nommé openstack)
h3. Live Migration d'un host à l'autre
Cela fait tout à notre place niveau kvm/libvirt/ceph
<pre>
virsh migrate --persistent --undefinesource --live --p2p openstack qemu+ssh://g2.tetaneutral.net:2222/system
</pre>
h3. Recover depuis une perte de la machine hote:
Créé un fichier openstack.xml à partir d'un backup de '/etc/libvirt/qemu/openstack.xml' ou utiliser l'exemple ici: attachment:openstack.xml
_Note: il faut surement viré les uuid des interfaces openvswitch qui sont différent suivant le hosts_
Puis on recréé la VM
<pre>
$ virsh create openstack.xml
$ virsh start openstack.xml
</pre>
h2. Fonctionnement du boot des VM Openstack et de leur auto-configuration
Contrairement à la plupart des déploiements Openstack:
* Nous n’utilisons pas de server DHCP de neutron pour distribuer les IPs
* Nous n’utilisons pas le "nova/neutron-metadata-api" + "cloud-init" pour configurer les VMs (hostname, resize du fs, maj APT, DNS, clé ssh ...)
Chez TTNN, c'est plus old school et pas très cloudy, mais c'est flexible, ca marche et c'est compatible avec tous les OS.
(contrairement à cloud-init qui marche que pour les cas très simple et uniquement sous certain linux)
h3. Processus de création des VMs
Pour cela, on utilise la feature "config-drive" de Nova, qui attache un CDROM avec un fichier dedans.
Le fichier en question doit être passé en paramètre de -'openstack server create'- pour booter la VM, cela est fait +automatiquement+ quand on utilise *openstack ttnn create*.
Neutron, lui s'occupe juste de router les IPs dans le tap de la VM.
Dans notre cas le fichier est un script shell que vous trouverez ici:
https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/openstack-tools/revisions/master/entry/osc-plugins/osc_ttnn/boot-vm-user-data.tmpl
Ce script s'occupe pour tous les OS supportés (debian/ubuntu/cirros/fedora/*BSD) de:
* resize le rootfs pour prendre tout l'espace disponible
* configurer le hostname
* configurer les IPs v4 et v6
* remplir /etc/hosts
* configurer les DNS
* installer la clé ssh TTNN
* générer des clé sshd
* mettre à jour la distribution
En gros tous ce qui peut pas être fait dans l'image elle même.
Ce script sera ensuite exécuté lors du premier boot de la machine.
TTNN prépare des images spécial de VM qui lance ce script au premier boot.
h3. Processus de création des images
Les images des VMs TTNN sont construite un script lancer depuis g1:tools/images/
Ce script gére Debian, Ubuntu, Cirros, Openwrt, et vaguement Openbsd/Freebsd.
Seulement Debian est vraiment testé/utilisé régulièrement.
Ce doit s'occuper principalement de:
* télécharger l'image de base de la distribution
* installer les packages nécessaire au premier boot de la VM: ssh, tools pour resize les disques,
* configure le /etc/fstab ou équivalent
* configure le bootloader si besoin (Ajout une console serie pour avoir les logs dans openstack par example)
* configure sshd sur le port 2222
* supprime tout fichier temporary ou propre à la machine (clé sshd,
* désactive fsck au boot
* ...
* *Crée un rc.local qui montera le CDROM, lancera la script qui est dessus, puis s'auto-détruira*: https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/openstack-tools/revisions/master/entry/images/first_boot.sh
* ...
* shrink l'image/fs pour avoir un tout petit fichier à uploader et booter par la suite.
* uploader l'image dans openstack
Le script: https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/openstack-tools/revisions/master/entry/images/build-image.sh
h3. Cas d'*BSD
La fabrication des images, nécessite une image de base que Openbsd ne fournit pas, il faut la fabriquer soit même.
Ensuite linux ne supporte pas toutes les variantes et versions du filesystem UFS. Ce qui rends difficile de modifier l'image à partir de la machine g1.
J'ai déjà fait une image OpenBSD 5.7 dans le passé mais faut quand meme de farcir une install de l'OS à la main, puis faire tout ce que fait build-image.sh manuellement
Pour l'ufs2 de FreeBSD, y'a https://github.com/mkatiyar/fuse-ufs2 (qu'utilise build-image.sh pour les BSD), mais pour OpenBSD ca me marche pas.
Création de l'image de base:
<pre>
qemu-img create -f qcow2 openbsd-6.3.qcow2 15G
wget https://cloudflare.cdn.openbsd.org/pub/OpenBSD/6.3/amd64/cd63.iso
qemu-system-x86_64 -m 2048 -hda openbsd-6.3.qcow2 -cdrom cd63.iso -enable-kvm -netdev user,id=mynet0,hostfwd=tcp:127.0.0.1:7922-:22 -device e1000,netdev=mynet0 -smp 2 -vga qxl -spice port=5900,addr=127.0.0.1,disable-ticketing &
remote-viewer spice://localhost:5900
</pre>
Les questions importantes:
* X11 -> no
* com0 -> yes
* com0 speed -> 115200
* root login -> prohibit-password
* Partitionnement un seul rootfs: z, a, <enter>, <enter>, <enter, /, w, x
* sets: -x* -xgame*
* Reboot
<pre>
ssh root@localhost:7922
</pre>
Pour faire tous les manips du build-image.sh manuellement.
Puis uploader l'image manuellement dans Glance.
h2. Dépannage Openstack
h3. Journaux
Les différents composants d'Openstack (nova, etc) envoient par défaut leurs journaux dans un répertoire leur correspondant. *Mais* pour trouver les journaux plus facilement, à Tetaneutral tous les journaux sont, à la place, envoyés dans @/var/log/openstack.log@.
Les journaux sont sur différentes machines :
* chaque node (compute), hyperviseur des VMs qu'il fait tourner
* le contrôleur d'Openstack (en VM), portant l'API et la base de données centralisée, sur le réseau à _openstack.tetaneutral.net_.
h3. Openstack est indisponible
L'API d'Openstack est installée sur une VM nommée *openstack* sous libvirt.
<pre>
# Vérifier si la VM répond au ping
ping -c1 openstack.tetaneutral.net
# Vérifier sur quel serveur et dans quel état se trouve la VM
for compute in $(echo n7 g{1..12}); do ssh $compute.t virsh list --all | grep openstack && echo $compute; done
# Se connecter ensuite sur le server correspondant
# Vérifier ce qui s'est passé sur la VM
tail /var/log/libvirt/qemu/openstack.log
# Si elle a crashé, la relancer
virsh start openstack
</pre>
h1. Openstack Management TTNN
h2. Liens
* [[HOWTO add a VM]]
* [[Management_Cluster_Ceph]]
* [[Openstack Setup VM pas dans openstack]]
* [[Openstack Installation nouvelle node du cluster]]
* [[Openstack Installation TTNN]]
* "Openstack tools for ttnn":/projects/git-tetaneutral-net/repository/openstack-tools
h2. Avant toute operation Openstack
*Tres important* avant toute operation Openstack lancer sur g1 :
<pre>
root@g1:~# tools/os-overview.sh
</pre>
Si une ligne n'est pas OK relancer le composant et relancer os-overview.
h2. Création VMs
Cf. [[HOWTO add a VM]]
Example d'un VM sur ssd avec 2 disques (hard) additionels de 500G
<pre>
$ openstack ttnn create --ip <ipv4> --ssd --disk-size 20 --flavor 1vcpu-1024ram --image debian-stretch-scsi <name>.tetaneutral.net
$ openstack volume create --type ceph --size 500 <name>.tetaneutral.net-disk-1
$ openstack volume create --type ceph --size 500 <name>.tetaneutral.net-disk-2
$ openstack server add volume <name>.tetaneutral.net <name>.tetaneutral.net-disk-1
$ openstack server add volume <name>.tetaneutral.net <name>.tetaneutral.net-disk-2
</pre>
Ensuite dans la VM:
<pre>
mkfs.ext4 -E nodiscard /dev/sdb
mkfs.ext4 -E nodiscard /dev/sdc
tune2fs -c 0 -i 0 -m 0 /dev/sdb
tune2fs -c 0 -i 0 -m 0 /dev/sdc
</pre>
/!\ Ne pas mettre nodiscard pour les SSDs /!\
h2. Opération sur les VMs (des membres)
h3. Console série
Dans la VM, pour systemd:
<pre>
$ systemctl enable serial-getty@ttyS0.service
$ systemctl start serial-getty@ttyS0.service
</pre>
Dans la VM, pour sysv
<pre>
$ cat >> /etc/inittab <<EOF
T2:2345:respawn:/sbin/getty ttyS0 115200 vt102
EOF
$ init q
</pre>
Sur g1:
<pre>
$ openstack ttnn log ns2.tetaneutral.net
Debian GNU/Linux 8 ns2 ttyS0
ns2 login:
</pre>
h3. Voir la console graphique sans spice-html5:
Copier le script suivant 'gvnc' sur sa machine:
<pre>
#!/bin/bash
vm=$1
info=($(ssh openstack.tetaneutral.net -p 2222 -l root -- "mysql nova --skip-column-names --batch -e 'select host, uuid from instances where display_name=\"$vm\";'"))
if [ "${info[0]}" == "mysql" ]; then
echo "Error in mysql request"
exit 1
fi
hypervisor=${info[0]}.tetaneutral.net
uuid=${info[1]}
spice_port=$(ssh ${hypervisor} -p 2222 -l root virsh domdisplay ${uuid} | awk -F: '{print $3}')
echo "$vm on $hypervisor port $spice_port"
ssh -N $hypervisor -p 2222 -l root -L 5910:localhost:${spice_port} &
pid=$!
cleanup(){
kill $pid
}
trap cleanup EXIT
sleep 2
remote-viewer spice://localhost:5910/
</pre>
Puis
<pre>
sudo apt-get install virt-viewer
./gvnc puppet.openstack.net
</pre>
h3. Reboot VM en error
<pre>
openstack server set --state active xxx.tetaneutral.net
openstack server reboot --hard --wait xxx.tetaneutral.net
</pre>
h3. Shutdown une VM
<pre>
openstack server stop xxx.tetaneutral.net
</pre>
A noter que suspend fait une sauvegarde de la RAM comme sur un laptop. shelve est bugué ne pas utiliser.
h3. Effacer une VM
<pre>
openstack ttnn delete xxx.tetaneutral.net
</pre>
Cette commande lance la suppression de la VM et des ces interfaces réseaux.
"--with-disk" peut être ajouter pour supprimer TOUT les disques de cette VM.
h3. Changer CPU RAM
<pre>
openstack server resize --flavor 2vcpu-2048ram VMNAME.tetaneutral.net # will stop VMNAME then start VMNAME on a new KVM
openstack server resize --confirm VMNAME.tetaneutral.net # get rid of freezed KVM
# openstack flavor list
</pre>
h3. Disques de VM
Pour renommer (et permettre a boot-disk de recreer) ou effacer :
<pre>
openstack volume list
openstack volume set xxx.tetaneutral.net-bootdisk-old --name xxx.tetaneutral.net-bootdisk-new
openstack volume delete <ID_or_Name>
</pre>
h3. Offline fsck
Récuperer l'id et l'hyperviseur de la VM
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net | grep -e 'host ' -e ' id '
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Aller sur l'hyperviseur en question, puis:
<pre>
# guestfish -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
><fs> run
><fs> list-filesystems
/dev/sda: iso9660
/dev/sdb1: ext4
><fs> e2fsck-f /dev/sdb1
# ou
e2fsck /dev/sdb1 forceall:true
</pre>
Ou bien sur la machine qui host la VM :
<pre>
# virt-rescue 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
><rescue> fsck -a /dev/sdb1
</pre>
Si le fsck returns une erreur, c'est donc un probleme un peu plus grave on peut faire:
<pre>
><fs> e2fsck -y /dev/sdb1
</pre>
h3. Ajout d'un disque
Note: Si la VM vient juste d'être créé bien attendre qu'elle est fini son premier boot avant ! Sinon sda et sdb sont inversé (Oui oui, merci nova...).
<pre>
openstack volume create --type ceph --size 1000 --image debian-jessie-scsi zorun.tetaneutral.net-disk-1
openstack server add volume zorun.tetaneutral.net zorun.tetaneutral.net-disk-1
</pre>
Puis dans la VM
<pre>
mkfs.ext4 /dev/sdb
tune2fs -m 0 -i 0 -c 0 /dev/sdb
</pre>
h3. Agrandissement d'un disque
_Valable depuis Openstack Ocata and ceph jewel_. Validé également sur Openstack Queen fin 2019.
<pre>
/root/tools/os-grow-fs.sh bacasable.sileht.net-bootdisk 11
</pre>
Puis sur la VM, plusieur cas de figure:
+Disque sans partition:+
<pre>
# Note: dans un screen car plutot pas rapide
resize2fs -p /dev/sdb
</pre>
+Disque avec partition avec parted récent (>= 3.1, ie: jessie, ubuntu 13.10):+
<pre>
root@test4:~# parted /dev/sda print | grep sda
Disk /dev/sda: 64.4GB
root@test4# parted /dev/sda resizepart 1
Warning: Partition /dev/sda1 is being used. Are you sure you want to continue?
Yes/No? Yes
End? [42.9GB]? 64.4GB # METTRE ICI LA TAILLE VU AU DESSUS
Information: You may need to update /etc/fstab.
root@test4:~# resize2fs /dev/sda1
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/sda1 is now 15722400 blocks long.
root@test4:~# df -h | grep sda
/dev/vda1 60G 797M 56G 2% /
</pre>
+Disque avec partition avec vieux parted (< 3.1, ie: wheezy, vielle ubuntu):+
Pour debian wheezy, utilisation des packages ubuntu de 14.04 devrait permettre d'utiliser la méthod précendente sinon:
(pas encore testé, à voir si le kernel veut bien reload la table des partitions après)
<pre>
sfdisk -d /dev/vda > vda.mbr
cp vda.mbr vda.mbr.ori
vi vda.mbr
# mettre un tres grand nombre pour la fin de la partition
sfdisk -L -n --no-reread /dev/vda < vda.mbr
# cela va faire une erreur avec le max a mettre pour la fin de la partition
# changer la fin de la partition avec ce chiffre
sfdisk -L --no-reread /dev/vda < vda.mbr
reboot
resize2fs -p /dev/vda1
</pre>
h3. Ajout/Suppression IP/Subnet d'une VM existante (mode simple)
<pre>
openstack ttnn add-ip VM_NAME 89.234.156.212
openstack ttnn remove-ip VM_NAME 89.234.156.212
</pre>
h3. Ajout/Suppression IP/Subnet d'une VM existante (mode avancé)
Le mode avancé permet d'ajouté les ipv6 et ipv4 que l'on veut pour la VM. Contrairement au mode simple qui ajoute l'ipv4, le fe80 et le subnet ipv6 à partir de l'ipv4
Voir les IPs actutelles de la VM:
<pre>
# openstack port show backup.tetaneutral.net-eth0 -c allowed_address_pairs -c fixed_ips
| allowed_address_pairs | {"ip_address": "2a01:6600:8083:d400::/56", "mac_address": "fa:16:3e:5f:07:45"} |
| fixed_ips | {"subnet_id": "d431cacd-3b60-4ca9-af24-eacc8e5d8671", "ip_address": "89.234.156.212"} |
</pre>
fixed_ips sont la liste des ip directement router dans le tap de la VM (on ne peut pas mettre de masque):
* en ipv4, c'est le /32 de l'ipv4
* en ipv6, c'est le /64 de l'ipv6
allowed_address_pairs sont des subnets à router:
* en ipv4, via la premier ipv4 de fixed_ips (setup inutile et qui ne fonctionne pas, car bird ne re-export pas ce genre de route)
* en ipv6, via la link local correspondant si elle existe dans fixed_ips, sinon directement dans le tap
Ajout/Suppression d'une ip dans fixed_ips (noter que les ip ici non pas de masque):
<pre>
openstack ttnn add-ip --manual VM_NAME 89.234.156.212
openstack ttnn add-ip --manual VM_NAME fe80::80:12
openstack ttnn remove-ip --manual VM_NAME 89.234.156.212
openstack ttnn remove-ip --manual VM_NAME fe80::80:12
</pre>
Ajout/Suppression d'une ip dans allowed_address_pairs (noter que les ip ici on a un masque):
<pre>
openstack ttnn add-ip --manual VM_NAME 2a01:6600:8083:d400::/56
openstack ttnn remove-ip --manual VM_NAME 2a01:6600:8083:d400::/56
</pre>
h3. Ajout d'une interface réseau à une VM:
<pre>
$ openstack ttnn tap add --ip 91.224.149.19 --port-name eth1 gizmo.sileht.net-eth1
Port gizmo.sileht.net-eth1 created:
+-------------------------------+-----------------------+----------------------------+--------------------------+-------------------+
| id | name | fixed_ips | allowed_address_pairs | mac_address |
+-------------------------------+-----------------------+----------------------------+--------------------------+-------------------+
| 39c262d6-df91-4c96-96bc- | gizmo.sileht.net-eth1 | 91.224.149.19, fe80::81:13 | 2a03:7220:8081:1300::/56 | fa:16:3e:20:de:ba |
| f3573a37130a | | | | |
+-------------------------------+-----------------------+----------------------------+--------------------------+-------------------+
+--------------------------------------+------------------+------+---------------+--------+-----------------------------------------+
| id | name | host | flavor | status | addresses |
+--------------------------------------+------------------+------+---------------+--------+-----------------------------------------+
| 0346263f-77f6-4009-bdb3-d8720ec583e9 | gizmo.sileht.net | g9 | 2vcpu-4096ram | ACTIVE | vlan-routed=91.224.148.3, |
| | | | | | 91.224.149.214, fe80::80:03, |
| | | | | | fe80::81:d6, 91.224.149.19, fe80::81:13 |
+--------------------------------------+------------------+------+---------------+--------+-----------------------------------------+
</pre>
Dans la VM:
<pre>
$ dmesg | tail
[ 1315.826088] virtio-pci 0000:00:06.0: using default PCI settings
[ 1315.826102] virtio-pci 0000:00:07.0: no hotplug settings from platform
[ 1315.826102] virtio-pci 0000:00:07.0: using default PCI settings
[ 1315.826116] pci 0000:00:08.0: no hotplug settings from platform
[ 1315.826117] pci 0000:00:08.0: using default PCI settings
[ 1315.826382] virtio-pci 0000:00:08.0: enabling device (0000 -> 0003)
[ 1315.829281] virtio-pci 0000:00:08.0: setting latency timer to 64
[ 1315.829535] virtio-pci 0000:00:08.0: irq 50 for MSI/MSI-X
[ 1315.829555] virtio-pci 0000:00:08.0: irq 51 for MSI/MSI-X
[ 1315.829563] virtio-pci 0000:00:08.0: irq 52 for MSI/MSI-X
$ ip l show dev eth1
4: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether fa:16:3e:6b:32:07 brd ff:ff:ff:ff:ff:ff
$ tail -15 /etc/network/interfaces
auto eth1
iface eth1 inet6 static
pre-up /sbin/sysctl -w net.ipv6.conf.eth1.accept_ra=0
pre-up /sbin/sysctl -w net.ipv6.conf.eth1.autoconf=0
address 2a03:7220:8081:1300::1
netmask 56
gateway fe80::31
up ip addr add fe80::81:13/64 dev eth0
iface eth1 inet manual
pre-up /sbin/sysctl -w net.ipv6.conf.eth1.accept_ra=0
pre-up /sbin/sysctl -w net.ipv6.conf.eth1.autoconf=0
up ip link set eth1 up
up ip addr add 91.224.149.19/32 dev eth1
up ip route add default via 91.224.148.0 dev eth1 onlink
$ ifup eth1
</pre>
h3. Réinstallation/Réparation grub d'un VM
Récuperer l'id et l'hyperviseur de la VM
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net | grep -e 'host ' -e ' id '
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Bien attendre que la VM soir éteinte, aller sur l'hyperviseur en question, et taper
<pre>
virt-customize -v -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 --run-command 'update-grub ; grub-install /dev/sda;'
</pre>
Enfin, restart la VM
<pre>
# openstack server start VMNAME.tetaneutral.net
</pre>
h3. Monter le disque d'un vm sur une machine hote pour dépannage.
L’exemple montre la modification du fichier /etc/ssh/sshd_config
Récuperer l'id et l'hyperviseur de la VM
<pre>
root@g1# openstack server stop VMNAME.tetaneutral.net
root@gg1# openstack server show -c OS-EXT-SRV-ATTR:host -c id VMNAME.tetaneutral.net
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Aller sur l'hyperviseur en question, puis:
<pre>
root@<hyperviseur># virt-edit -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 /etc/ssh/sshd_config
</pre>
Fermer le fichier puis sur g1 restart la VM
<pre>
root@g1# openstack server start VMNAME.tetaneutral.net
</pre>
h3. Convert du fs root en ext4 et passage en scsi (tester avec ceph jewel and openstack ocata)
/!\ à retester à chaque update openstack vu que ca fait du sql /!\
Dans la VM, préparation de grub et du fstab:
<pre>
$ vi /etc/fstab
# Viré /proc
# Pour / (voir les autres) mettre:
LABEL=cloudimg-rootfs / ext4 defaults,discard,noatime 0 0
$ e2label /dev/vda1 cloudimg-rootfs
$ apt-get install grub-pc
$ apt-get purge extlinux
$ rm -f /extlinux.conf
$ grub-install /dev/vda
$ vi /etc/default/grub
# Ajouter: GRUB_CMDLINE_LINUX="elevator=noop console=tty0 console=ttyS0,115200n8"
$ update-grub
$ shutdown -h now
</pre>
Récuperer l'id et l'hyperviseur de la VM
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show -c OS-EXT-SRV-ATTR:host -c id VMNAME.tetaneutral.net
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Aller sur l'hyperviseur en question, puis:
<pre>
$ virt-rescue --suggest 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
...
# /dev/sdb1 is the root of a linux operating system
# type: linux, distro: debian, version: 8.0
# 8.0
mount /dev/sdb1 /sysroot/
mount --bind /dev /sysroot/dev
mount --bind /dev/pts /sysroot/dev/pts
mount --bind /proc /sysroot/proc
mount --bind /sys /sysroot/sys
</pre>
# Utiliser le device proposé pour la convertion en ext4:
<pre>
$ virt-rescue 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
> tune2fs -O extents,uninit_bg,dir_index /dev/sdb1
> e2fsck -fDC0 /dev/sdb1
> <CTRL+D>
</pre>
Ajout des attributs scsi
<pre>
openstack volume show VMNAME.tetaneutral.net-bootdisk
openstack volume set --image-property hw_scsi_model=virtio-scsi --image-property hw_disk_bus=scsi VMNAME.tetaneutral.net-bootdisk
</pre>
Puis supprimer et recréer la VM
<pre>
openstack server show -c name -c flavor -c addresses VMNAME.tetaneutral.net
openstack ttnn delete VMNAME.tetaneutral.net
openstack ttnn create --ip <ip> --flavor <flavor> VMNAME.tetaneutral.net # --volume disk-1 # pour les disques additionels
</pre>
h3. Transformer un volume Ceph "manuel" (type <pseudo-adherent>-vol) en volume Ceph "Openstack" (volume-<id-openstack>)
On crée d'abord in volume cinder vide de la meme taille.
<pre>
# rbd info -p disks XXXXXXXX-vol | grep size
size 1024 GB in 262144 objects
/!\ la taille ici doit être identique dans cinder et dans ceph /!\
# openstack volume create --type ceph --size 1024 vmXXXXXXXX.tetaneutral.net-disk-1
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| consistencygroup_id | None |
| created_at | 2018-08-28T06:11:57.669300 |
| description | None |
| encrypted | False |
| id | dcc26207-ef60-48e6-983e-94c1c945dXbX |
| migration_status | None |
| multiattach | False |
| name | vmXXXXXXXX.tetaneutral.net-disk-1 |
| properties | |
| replication_status | None |
| size | 1024 |
| snapshot_id | None |
| source_volid | None |
| status | creating |
| type | ceph |
| updated_at | None |
| user_id | f18b121edda04346b86610fa23983a0e |
+---------------------+--------------------------------------+
# rbd info -p disks volume-dcc26207-ef60-48e6-983e-94c1c945dXbX | grep size
size 1024 GB in 262144 objects
/!\ doit être identique à l'image d'origine /!\
</pre>
En suite on s'assure que les features de l'image sont celle attendu par Openstack:
<pre>
# rbd info -p disks volume-dcc26207-ef60-48e6-983e-94c1c945dXbX | grep features
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
# rbd info -p disks XXXXXXXX-vol | grep features
features: layering
# # NOTE, deep-flatten ne peut pas être ajouté, mais c'est pas grave.
# for i in exclusive-lock object-map fast-diff; do rbd feature enable disks/XXXXXXXX-vol $i ; done
# # Rebuild metadata file on the volume
# rbd object-map rebuild disks/XXXXXXXX-vol
Object Map Rebuild: 2% complete...
</pre>
Et pour finir on swap les deux volumes
<pre>
# rbd rm -p disks volume-dcc26207-ef60-48e6-983e-94c1c945dXbX
Removing image: 100% complete...done.
# rbd mv disks/XXXXXXXX-vol disks/volume-dcc26207-ef60-48e6-983e-94c1c945dXbX
</pre>
Voila on peut maintenant mettre le disque dans une VM:
<pre>
openstack server add volume XXXXXXXX.tetaneutral.net XXXXXXXX.tetaneutral.net-disk-1
</pre>
h3. Déplacer une VM de pool ceph (dernier test avec ceph jewel / openstack ocata)
<pre>
# openstack server show test246.tetaneutral.net -c id -c flavor -c addresses -c status
+-----------+------------------------------------------------------+
| Field | Value |
+-----------+------------------------------------------------------+
| addresses | vlan-routed=91.224.149.115, fe80::80:fe |
| flavor | 1vcpu-2048ram (7880cafc-bd0b-4045-9777-ef2e9201bd6c) |
| id | 485f270a-eb2e-452e-8733-fc4c741cbe8f |
| status | ACTIVE |
+-----------+------------------------------------------------------+
# openstack server delete test246.tetaneutral.net
Request to delete server test246.tetaneutral.net has been accepted.
# openstack volume set --type ceph-ssd --retype-policy on-demand test246.tetaneutral.net-bootdisk
# watch -n1 -- 'openstack volume list --long | grep test246.tetaneutral.net-bootdisk'
| 82279cc1-9a34-4108-b7a6-6944f252a2c3 | test246.tetaneutral.net-bootdisk | retyping | 1 | ceph
| 313dc3e5-a04a-435b-8b35-ecc5d7b5695c | test246.tetaneutral.net-bootdisk | available | 1 | ceph-ssd
Attendre qu'il n'y ai plus que le nouveau volume
| 313dc3e5-a04a-435b-8b35-ecc5d7b5695c | test246.tetaneutral.net | available | 1 | ceph-ssd
# openstack ttnn create --ip 91.224.149.115 --flavor 1vcpu-2048ram test246.tetaneutral.net
</pre>
h3. Réaligne VM partition (guide pour vm avec une seul partition)
Prérequies:
* VM utilse grub2
*
Récuperer l'id et l'hyperviseur de la VM, ainsi que l'id du disk
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net | grep -e 'host ' -e ' id '
| OS-EXT-SRV-ATTR:host | g1 |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
# cinder list | grep puppet
| 213e894e-2f20-42b5-a27b-21f5a355c722 | in-use | VMNAME.tetaneutral.net-bootdisk | 20 | ceph-ssd | true | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
</pre>
Aller sur l'hyperviseur en question, puis vérifier l'alignement:
<pre>
$ virt-alignment-scan -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
/dev/sdb1 65536 512 bad (alignment < 4K)
</pre>
Réalignemet, *aller dans un espace ou il y a 2x l'espace utile de la VM*, puis:
<pre>
$ virt-tar-out -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 / - | gzip --best > VMNAME.tar.gz
$ rbd -p ssds info volume-213e894e-2f20-42b5-a27b-21f5a355c722
rbd image 'volume-213e894e-2f20-42b5-a27b-21f5a355c722':
size 20480 MB in 5120 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.996cc92ae8944a
format: 2
features: layering
$ virt-make-fs --label=cloudimg-rootfs --partition=mbr --type=ext4 --format=raw --size=20480 VMNAME.tar.gz VMNAME.img
$ virt-customize -a VMNAME.img --run-command 'update-grub ; grub-install /dev/sda'
$ rbd mv ssds/volume-213e894e-2f20-42b5-a27b-21f5a355c722 ssds/volume-213e894e-2f20-42b5-a27b-21f5a355c722.unaligned
$ rbd import --image-format 2 VMNAME.img ssds/volume-213e894e-2f20-42b5-a27b-21f5a355c722
</pre>
Vérification:
<pre>
$ virt-alignment-scan -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
/dev/sdb1 65536 64K ok
</pre>
h3. Création/Restauration/Export snapshot
Création:
<pre>
source os.conf
/root/tools/os-snapshot-vm.sh pano.tetaneutral.net bootdisk /
* Freezing / of pano.tetaneutral.net
* Snapshoting pano.tetaneutral.net-bootdisk
Snapshot pano.tetaneutral.net-bootdisk-20150125-1600 is in state creating ..
e06727d3-df4a-4873-82af-3a8f3e6e2aa5
* pano.tetaneutral.net-bootdisk snapshoted
* / of pano.tetaneutral.net unfreezed
</pre>
Restauration:
<pre>
$ openstack volume snapshot list
...
$ openstack volume create --size 101 --snapshot pano.tetaneutral.net-bootdisk-20150125-1600 pano-restauration-test
$ openstack server add volume pano.tetaneutral.net pano-restauration-test
</pre>
Extract du snapshot pour fournir à l'adhérent:
Sur g1:
<pre>
$ openstack volume show pano.tetaneutral.net-bootdisk -f value -c id
<UUID_VOLUME>
$ openstack volume snapshot list --volume pano.tetaneutral.net-bootdisk
| <UUID_SNAPSHOT> | pano.tetaneutral.net-bootdisk-20200117-1155 | None | available | 50 |
</pre>
Sur nagios.tetaneutral.net
<pre>
rbd -p ssds export volume-<UUID_VOLUME>@snapshot-<UUID_SNAPSHOT> pano.tetaneutral.net-bootdisk.raw
qemy-img convert -O qcow2 pano.tetaneutral.net-bootdisk.raw pano.tetaneutral.net-bootdisk.qcow
rm -f pano.tetaneutral.net-bootdisk.raw
</pre>
h3. Virer cloud-init sans accés à la VM:
<pre>
# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net -c id -c OS-EXT-SRV-ATTR:host -c status -f value
g12
a82eb312-7d42-44e1-bce2-a81292916cc3
SHUTOFF
# virt-customize -v --connect "qemu+ssh://<SHORT HYPERVISOR HOSTNAME>:2222/system" -d <ID> --run-command "echo ::::::::::::::: ; DEBIAN_FRONTEND=noninteractive apt-get -y purge cloud-init cloud-initramfs-growroot ; echo :::::::::::: ; "
</pre>
h2. Opérations sur les hyperviseurs
h3. Reboot d'un hyperviseur
Sur g1
<pre>
# openstack ttnn evacuate HOST
Migration of :
- lagrandeourse.tetaneutral.net [g2/active]
- pontsjumeaux.tetaneutral.net [g2/active]
- log.tetaneutral.net [g2/active]
- jabber.tetaneutral.net [g2/active]
- vmfatal.tetaneutral.net [g2/active]
- zoe.tetaneutral.net [g2/active]
...
Continue (Y/n) ? Y
rollback script 'evacuate-rollback-g2.sh' created
Live migration of lagrandeourse.tetaneutral.net [g2/active]: Complete on g2 and still alive \o/
...
</pre>
Sur l'hyperviseur en question:
<pre>
# ps fauxwww|grep kvm # verifier qu'il n'y a plus de VM lancé
# virsh list --all # verifier qu'il n'y a plus de VM dans libvirt
# ceph osd set noout # pour prevenir que les OSD vont revenir
# systemctl stop ceph-mon@* # Stopper les osd
# systemctl stop ceph-osd@* # Stopper les osd
# reboot
</pre>
Une fois l'opération terminer, pour remettre l'hyperviseur en route, sur g1
<pre>
ceph osd tree # Vérifier que les OSDs de cette hypervisuer sont revenur
./tools/os-overview.sh # Vérifier que neutron et nova sont ok sur cette hyperviseur
ceph osd unset noout
./evacuate-rollback-g2.sh # Remettre les VMs dessus.
</pre>
h3. Migration d'une VM sur un autre hyperviseur
La migration se fait à chaud, grace à la copie de la RAM, et l'accès au disque sur le cluster ceph depuis n'importe quel hyperviseur.
On spécifie l'hyperviseur de destination (ici g12), et la VM à migrer (ici ring01.tetaneutral.net).
<pre>
openstack server migrate --live g12 ring01.tetaneutral.net --wait
</pre>
h2. VM de management (nommé openstack)
h3. Live Migration d'un host à l'autre
Cela fait tout à notre place niveau kvm/libvirt/ceph
<pre>
virsh migrate --persistent --undefinesource --live --p2p openstack qemu+ssh://g2.tetaneutral.net:2222/system
</pre>
h3. Recover depuis une perte de la machine hote:
Créé un fichier openstack.xml à partir d'un backup de '/etc/libvirt/qemu/openstack.xml' ou utiliser l'exemple ici: attachment:openstack.xml
_Note: il faut surement viré les uuid des interfaces openvswitch qui sont différent suivant le hosts_
Puis on recréé la VM
<pre>
$ virsh create openstack.xml
$ virsh start openstack.xml
</pre>
h2. Fonctionnement du boot des VM Openstack et de leur auto-configuration
Contrairement à la plupart des déploiements Openstack:
* Nous n’utilisons pas de server DHCP de neutron pour distribuer les IPs
* Nous n’utilisons pas le "nova/neutron-metadata-api" + "cloud-init" pour configurer les VMs (hostname, resize du fs, maj APT, DNS, clé ssh ...)
Chez TTNN, c'est plus old school et pas très cloudy, mais c'est flexible, ca marche et c'est compatible avec tous les OS.
(contrairement à cloud-init qui marche que pour les cas très simple et uniquement sous certain linux)
h3. Processus de création des VMs
Pour cela, on utilise la feature "config-drive" de Nova, qui attache un CDROM avec un fichier dedans.
Le fichier en question doit être passé en paramètre de -'openstack server create'- pour booter la VM, cela est fait +automatiquement+ quand on utilise *openstack ttnn create*.
Neutron, lui s'occupe juste de router les IPs dans le tap de la VM.
Dans notre cas le fichier est un script shell que vous trouverez ici:
https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/openstack-tools/revisions/master/entry/osc-plugins/osc_ttnn/boot-vm-user-data.tmpl
Ce script s'occupe pour tous les OS supportés (debian/ubuntu/cirros/fedora/*BSD) de:
* resize le rootfs pour prendre tout l'espace disponible
* configurer le hostname
* configurer les IPs v4 et v6
* remplir /etc/hosts
* configurer les DNS
* installer la clé ssh TTNN
* générer des clé sshd
* mettre à jour la distribution
En gros tous ce qui peut pas être fait dans l'image elle même.
Ce script sera ensuite exécuté lors du premier boot de la machine.
TTNN prépare des images spécial de VM qui lance ce script au premier boot.
h3. Processus de création des images
Les images des VMs TTNN sont construite un script lancer depuis g1:tools/images/
Ce script gére Debian, Ubuntu, Cirros, Openwrt, et vaguement Openbsd/Freebsd.
Seulement Debian est vraiment testé/utilisé régulièrement.
Ce doit s'occuper principalement de:
* télécharger l'image de base de la distribution
* installer les packages nécessaire au premier boot de la VM: ssh, tools pour resize les disques,
* configure le /etc/fstab ou équivalent
* configure le bootloader si besoin (Ajout une console serie pour avoir les logs dans openstack par example)
* configure sshd sur le port 2222
* supprime tout fichier temporary ou propre à la machine (clé sshd,
* désactive fsck au boot
* ...
* *Crée un rc.local qui montera le CDROM, lancera la script qui est dessus, puis s'auto-détruira*: https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/openstack-tools/revisions/master/entry/images/first_boot.sh
* ...
* shrink l'image/fs pour avoir un tout petit fichier à uploader et booter par la suite.
* uploader l'image dans openstack
Le script: https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/openstack-tools/revisions/master/entry/images/build-image.sh
h3. Cas d'*BSD
La fabrication des images, nécessite une image de base que Openbsd ne fournit pas, il faut la fabriquer soit même.
Ensuite linux ne supporte pas toutes les variantes et versions du filesystem UFS. Ce qui rends difficile de modifier l'image à partir de la machine g1.
J'ai déjà fait une image OpenBSD 5.7 dans le passé mais faut quand meme de farcir une install de l'OS à la main, puis faire tout ce que fait build-image.sh manuellement
Pour l'ufs2 de FreeBSD, y'a https://github.com/mkatiyar/fuse-ufs2 (qu'utilise build-image.sh pour les BSD), mais pour OpenBSD ca me marche pas.
Création de l'image de base:
<pre>
qemu-img create -f qcow2 openbsd-6.3.qcow2 15G
wget https://cloudflare.cdn.openbsd.org/pub/OpenBSD/6.3/amd64/cd63.iso
qemu-system-x86_64 -m 2048 -hda openbsd-6.3.qcow2 -cdrom cd63.iso -enable-kvm -netdev user,id=mynet0,hostfwd=tcp:127.0.0.1:7922-:22 -device e1000,netdev=mynet0 -smp 2 -vga qxl -spice port=5900,addr=127.0.0.1,disable-ticketing &
remote-viewer spice://localhost:5900
</pre>
Les questions importantes:
* X11 -> no
* com0 -> yes
* com0 speed -> 115200
* root login -> prohibit-password
* Partitionnement un seul rootfs: z, a, <enter>, <enter>, <enter, /, w, x
* sets: -x* -xgame*
* Reboot
<pre>
ssh root@localhost:7922
</pre>
Pour faire tous les manips du build-image.sh manuellement.
Puis uploader l'image manuellement dans Glance.
h2. Dépannage Openstack
h3. Journaux
Les différents composants d'Openstack (nova, etc) envoient par défaut leurs journaux dans un répertoire leur correspondant. *Mais* pour trouver les journaux plus facilement, à Tetaneutral tous les journaux sont, à la place, envoyés dans @/var/log/openstack.log@.
Les journaux sont sur différentes machines :
* chaque node (compute), hyperviseur des VMs qu'il fait tourner
* le contrôleur d'Openstack (en VM), portant l'API et la base de données centralisée, sur le réseau à _openstack.tetaneutral.net_.
h3. Openstack est indisponible
L'API d'Openstack est installée sur une VM nommée *openstack* sous libvirt.
<pre>
# Vérifier si la VM répond au ping
ping -c1 openstack.tetaneutral.net
# Vérifier sur quel serveur et dans quel état se trouve la VM
for compute in $(echo n7 g{1..12}); do ssh $compute.t virsh list --all | grep openstack && echo $compute; done
# Se connecter ensuite sur le server correspondant
# Vérifier ce qui s'est passé sur la VM
tail /var/log/libvirt/qemu/openstack.log
# Si elle a crashé, la relancer
virsh start openstack
</pre>