Virtualisation : isolation avec OpenVZ sur serveur linux (centos / fedora)
Sans doute le meilleur compromis fonctionnalité / performance / souplesse actuellement
OpenVZ est testé ici sur un serveur dédié Centos 6 (vous installerez centos 7 à l'intérieur des CT) avec 32Go de ram, 8 cores cpu et 2To HD raid 1 soft
ACTU avril 2015 : problem réseau on container after update ?
Introduction et vocabulaire :
en virtualisation on parle souvent de VM (virtual machine), mais ici en isolation on parle plutot de container (puisque qu'on va lancer des OS de manière isolée dans les containairs, plutôt qu'une totale et + lourde virtualisation de machine)
Les containers sont souvent notés "CT" dans la documentation officielle avec " CT0" qui désigne l'hôte, puis CT1 etc les containers
Sommaire :
- installation
- OS templates
- création, tunning et ressources d'un CT
- supervision
- réseau : adresse ip publique (ip failover) , venet et veth
- clock zone et autres réglages du CT
- dump et restore
- mount transverses : les dossiers paratagés entre vos CT
- a connaitre aussi
- les hyperviseurs (solusVM , proxmox)
- besoin d'un consultant pour vous aider ?
1/ installation du noyau modifié openVZ , tune et reboot :
Le principe est simple : on va installer un noyau linux centos modifié qui va être capable de gérer l'isolation des processus de chaque container, mais aussi la gestion des ressources (cpu, ram etc) . Il faudra donc rebooter la machine sur ce noyau.
Le package OpenVZ va également fournir les commandes "vz" nécessaires pour créer et administrer nos containers.
On installe le serveur hôte sous Centos, mais les containers pourront être indifféremment sous Centos, fedora , debian, ubuntu etc
Créer un dossier ou une partition /vz pour héberger tout cet univers de containers
Si vous voulez désactiver la collecte de statistique qui se fait automatiquement avec remontée vers l'équipe de dvpt d'openVZ :
Si besoin de conntracking sur iptables il faut le réactiver dans /etc/modprobe.d/openvz.conf depuis openvz 4.7 :
Et pour finir, bien sur , il faut rebooter le serveur pour qu'il boot sur ce kernel openvz (vérifiez éventuellement votre grub.conf avant) :
Pour en savoir plus sur toutes ces étapes :
http://openvz.org/Quick_installation
2/ Installation des OS-templates:
mkdir -p /vz/template/cache
wget -P /vz/template/cache/ http://download.openvz.org/template/precreated/centos-6-x86_64.tar.gz
wget -P /vz/template/cache/ http://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz
wget -P /vz/template/cache/ http://download.openvz.org/template/precreated/fedora-19-x86_64.tar.gz
wget -P /vz/template/cache/ http://download.openvz.org/template/precreated/fedora-20-x86_64.tar.gz
cf http://openvz.org/Download/templates/precreated
3/ Création et réglages d'un container :
- vzctl create 101 --ostemplate fedora-19-x86_64 --layout=ploop
(si vous voulez utiliser les snapshots, vzdump etc, je vous recommande le layout ploop plutôt simfs , nécessite une version récente d'openvz, pour en savoir + http://openvz.org/Ploop/Why ) - vzctl set 101 --hostname vz1 --save
- vzctl set 101 --onboot yes --save
- vzctl start 101
- vzctl create 102 --ostemplate centos-7-x86_64 --layout=ploop
- vzctl set 102 --hostname vz2 --save
- vzctl start 102
- vzlist -a
CTID NPROC STATUS IP_ADDR HOSTNAME
101 18 running - vz1
102 18 running - vz2
En 2 lignes :
- vzctl create 103 --ostemplate centos-7-x86_64 --layout=ploop
- vzctl set 103 --hostname vz3 --onboot yes --diskspace 6G:7G --ram 2G --swap 2G --ipadd X.X.X.X --save
test : lancer des commandes dans le container avec vzctl exec :
- vzctl exec 101 ps ax
- vzctl exec 101 df -h
Ressources management :
HD
- vzctl set 101 --diskspace 6G:7G --save
on regarde ce que ça donne dans le container :
# vzctl exec 101 df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/simfs 6.0G 580M 5.5G 10% /
- vzctl set 101 --diskinodes 1000000:1500000 --save
on regarde ce que ça donne dans le container (inutile sur le layout ploop) :
# vzctl exec 101 df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/simfs 2000000 194029 1805971 10% /
limite d'espace disk soft et hard . immédiatement prise en compte par le filesystem de la vm , comme tous les réglages ! (c'est un des avantages de l'isolation VS la virtualisation)
http://openvz.org/Resource_shortage#Disk_quota
CPU
- vzctl set 101 --cpuunits 1000 --save
- vzctl set 102 --cpuunits 3000 --save
cpuunit permet de faire un partage de ressource cpu façon nice , dans cet exemple nous donnons 3x plus de ressources cpu au CT 102 qu'au CT 101.
mais ces 2 CT peuvent exploiter 100% des ressources cpu totales de l'hôte (effet burst)
- vzctl set 101 --cpulimit 30% --save
le % est automatiquement convertit en load average : 100 = 100% d'un core cpu, sur un machine 4 cores, le total dispo est donc de 400 , ainsi 30% du total cpu = 120
attention, avec cpulimit le CT ne profitera pas du burst cpu au dela de la dite limite ...
http://openvz.org/Resource_shortage#CPU
RAM
-
vzctl set 101 --ram 512M --swap 1G --save
on regarde ce que ça donne dans le container :
# vzctl exec 101 free -m
total used free shared buffers cached
Mem: 512M 31M 480M 0B 0B 14M
-/+ buffers/cache: 17M 494M
Swap: 1.0G 0B 1.0G
IO
- vzctl set 101 --ioprio 2 --save
ioprio = priorité d'acces disk : valeur de 0 à 7, inverse de nice , donc le + donne le +
cf man vzctl pour voir toutes les possibilités !
4/ Supervision :
Vue complète avec vzlist :
vzlist -a -o "ctid,status,ip,laverage,kmemsize,kmemsize.m,diskspace,diskspace.s,numproc,cpus,cpuunits,cpulimit,tcpsndbuf.m,tcprcvbuf.m,ioprio,onboot,layout,hostname"
# vzcalc -v 102
Resource Current(%) Promised(%) Max(%)
Low Mem 0.14 0.69 0.69
Total RAM 0.34 n/a n/a
Mem + Swap 0.08 0.78 n/a
Alloc. Mem 0.31 0.97 1.86
Num. Proc 0.01 n/a 0.19
--------------------------------------------
Memory 0.34 0.97 1.86
# vzmemcheck -v
Output values in %
CTID LowMem LowMem RAM MemSwap MemSwap Alloc Alloc Alloc
util commit util util commit util commit limit
102 0.14 0.69 0.34 0.08 0.78 0.31 0.97 1.86
101 1.06 114.74 4.59 0.26 35.60 0.50 35.60 48.60
--------------------------------------------------------------------------
Summary: 1.20 115.43 4.93 0.34 36.39 0.81 36.58 50.46
# vzcpucheck -v
VEID CPUUNITS
-------------------------
0 1000
101 1000
102 1000
Current CPU utilization: 3000
Power of the node: 618592
5/ Réseau :
vzctl set 101 --ipadd X.X.X.X --save
C'est tout (en cas de pb vérifiez votre firewall)
Pour en savoir plus :
La plupart du temps on veut une ip publique associée à chaque container.
Chez OVH vous pouvez louer des "ip failover" pour rajouter des ip à votre machine.
Evitez de prendre es mac adresses virtuelles avec.
Evitez également de suivre la procédure d'install que vous recevez par mail, elle n'est pas adaptée à la virtualisation !
Il existe plusieurs méthode le bridge, le nat hote/container en ip privée etc ,
voici le + simple à mon goût : venet , l'interface virtuelle par défaut.
Llimitations de ce choix :
pas de ARP donc pas de mac adresses virtuelles, pas de bridge, pas de config réseau depuis l'intérieur du CT, support ipv6 limité , sniffing de packet limité, par contre meilleure performance, meilleure sécurité et surtout grande simplicité de config puisqu'il est inutile de faire la config réseau de chaque CT, une ligne de config depuis l'hôte suffit comme nous allons voir
Ce qu'il faut c'est absolument activer l'ip forwarding de packet sur l'hote (sur openVZ version récente, ça se fait tout seul puisque openVZ gère sysctl ) , mais en cas de pb pensez à votre firewall qui peut poser pb et jettez un oeil à vos iptables
Il suffit d'attribuer votre nouvelle ip publique "failover" à votre container :
vzctl set 102 --ipadd X.X.X.X --save
à partir de là, depuis la machine hôte vous pouvez pinger le container :
ping X.X.X.X
maintenant rentrez dans le container :
vzctl enter 102
tentez un ping de l'adresse ip de l'hôte pour voir si le container arrive à atteindre l'hôte
ensuite remplissez le fichier /etc/resolv.conf si nécessaire du container, sur les dernières versions c'est inutile (sinon vous trouverez le dns dans le ficher /etc/resolv.conf de l'hôte) :
nameserver 213.186.33.99
à partir de là vous pouvez vérifier la résolution dns ET l'accès au réseau externe :
ping google.fr
si ça passe, c'est tout bon, sinon vérifiez le firewall de l'hôte qui vous empêche peut être de sortir (ip forward)
Bien depuis l'extérieur vous devez accéder en ssh à ce CT
Pour installer apache, toujours depuis l'intérieur du container :
yum install httpd
echo coucou >/var/www/html/index.html
service httpd start
chkconfig httpd on
ensuite depuis l'extérieur, vous devez voir coucou sur http://VOTRE.IP.FAIL.OVER
Références sur la partie réseau :
venet : https://openvz.org/Virtual_network_device
venet VS veth : https://openvz.org/Differences_between_venet_and_veth
https://openvz.org/FAQ#Networking
6/ clock zone et tunning :
1/ pb de clock zone sur le CT ? sur le host vérifiez /etc/sysconfig/clock et /etc/localtime , puis restart du CT
si ça ne suffit pas, entrez dans le CT et :
- dans /etc/sysconfig/clock :
ZONE="Europe/Paris"
UTC=true
- dans /etc/adjtime :
-30.380942 1402473579 0.000000
1402473579
UTC
- et localtime :
cat /usr/share/zoneinfo/Europe/Paris > /etc/localtime
2/ Tunning du CT : vzctl enter CT
- yum cron : yum install yum-cron; chkconfig yum-cron on ;service yum-cron start
- sendmail : yum install sendmail sendmail-cf; chkconfig sendmail on ;service sendmail start
- centos7 : syslog : yum install rsyslog; chkconfig rsyslog on ; service rsyslog start
- centos7 : yum install cronie-anacron
- logwatch : yum install logwatch
- aliases : fixer alias root dans /etc/aliases , exposed user et masquerades dans /etc/mail/sendmail.mc , tous les aliases dans /etc/mail/local-host-names (celui du CT et celui de la zone dns) pour recevoir les mails sysadmin du CT sur votre bal
- centos 6 : rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
- centos 7 : yum install epel-release
- rpm forge centos 7 (attention pb conflit possible avec epel sur certains packages ) :
yum install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm - yum update
- echo "export HISTFILE=/root/.bash_history" >> /root/.bashrc
3/ Tunning coté maitre (CT0) :
- Pour le firewall (iptables) il est préférable de travailler sur le maitre et d'ouvrir les flux utiles pour chaque CT (en forward).
- /etc/sysconfig/iptables /etc/sysconfig/ip6tables (activer ou non ipv6 via sysctl et /etc/sysconfing/network)
- chkconfig smartd on; service smartd restart
- yum install logwatch
- yum erase postfix
- yum install sendmail sendmail-cf; chkconfig sendmail on ;service sendmail start
- cf /etc/aliases, exposed user et masquerades dans /etc/mail/sendmail.mc pour recevoir les mails sysadmin
- yum cron : yum install yum-cron; chkconfig yum-cron on ;service yum-cron start
- /etc/sysconfig/iptables (attention si vous regrouper les regles de firewall sur le maitre avec iptables, depuis la version 4.6.1 de vzctl il faut réactiver l'ip conntrack coté maitre : pour en savoir + )
- crontab : pensez à ntpdate , surv iptables, smartctl etc ...
7/ dump et restore d'un CT
a/ Si vous êtes en layout ploop :
modprobe vzcpt
Créer un snapshot:
vzctl snapshot CTID [--id $UUID] [--name name] [--description desc] [--skip-suspend] [--skip-config]
Lister les snapshots :
vzctl snapshot-list CTID
Mount un snapshot (pour ensuite copier le contenu vers un backup):
vzctl snapshot-mount CTID --id uuid --target directory
Rollback to a snapshot:
vzctl snapshot-switch CTID --id uuid
Delete a snapshot :
vzctl snapshot-delete CTID --id uuid
Voici le source du script vzbackup que vous pourrez utiliser en faisant : vzbackup 101 /destination/
#!/bin/bash
if [ -z "$1" -o -z "$2" ]
then
echo "Usage: vzbackup CTID BACKUP-PATH"
exit 1
fi
CTID=$1
FOLDER=$2
BACKUPPATH=$FOLDER/$CTID-$( date +%F_%H_%M )
#create BACKUP-PATH
mkdir -p $BACKUPPATH
# Known snapshot ID
ID=$(uuidgen)
VE_PRIVATE=$(VEID=$CTID; source /etc/vz/vz.conf; source /etc/vz/conf/$CTID.conf; echo $VE_PRIVATE)
# Take a snapshot without suspending a CT and saving its config
vzctl snapshot $CTID --id $ID --skip-suspend --skip-config
# Perform a backup using your favorite backup tool
# (cp is just an example)
cp $VE_PRIVATE/root.hdd/* $BACKUPPATH/
# Delete (merge) the snapshot
vzctl snapshot-delete $CTID --id $ID
# remove old backups
rm -rf $( find $FOLDER -type d -name "$CTID*" -exec ls -d1rt "{}" + | head -n-15 )
cf http://openvz.org/Ploop/Backup
b/ Avec VZdump :
yum install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
yum install http://download.openvz.org/contrib/utils/vzdump/vzdump-1.2-4.noarch.rpm
dump :
vzdump --mailto root --bwlimit KBPS --dumpdir DIR CTid
(il va essayer le mode "snapshot" sans coupure de service si vous êtes en LVM, sinon "suspend" pour une coupure minimale, sinon "stop" )
ou pour préciser / forcer un mode (ici stop), débrider la limite de bande passante (bw) et forcé le dossier de sauvegarde (attention à l'espace disk) :
vzdump --dumpdir /save --mailto root --bw 0 --maxfiles 7 --stop 102
fichier produit 1,7Go :
/save/vzdump-openvz-102-2013_12_15-12_55_15.tar
restore :
vzrestore /save/vzdump-openvz-102-2013_12_15-12_55_15.tar 104
ASTUCE Container HS suite à un disque full 100 % ?
error : Image is clean but unable to fix the header on ro image
error : Dirty flag is set
faites un check -f -d en manuel des ploop de vos snapshots :
ploop check --check -f -d "/vz/private/106/root.hdd/root.hdd.{66374898-d130-4ac0-921e-b3aba7b0b4f2}"
8/ Mount transverse ou dossiers partagés entre CT :
Il est possible de partager un dossier entre tous les CT
depuis le CT maitre (host), créer les dossiers de partage par exemple /web /echange /videos, puis dans /etc/vz/conf il suffit de créer un fichier CTID.mount , par exemple 101.mount :
#!/bin/bash
. /etc/vz/vz.conf
. ${VE_CONFFILE}
for REP in /web /echange /videos;do
if [ ! -e ${VE_ROOT}${REP} ]; then mkdir -p ${VE_ROOT}${REP}; fi
mount --bind ${REP} ${VE_ROOT}${REP}
done
9/ A connaitre aussi :
- modprobe vzrst; modprobe vzcpt; (à faire des 2 cotés)
vzmigrate -v -t --live --keep-dst remote-host CTid
--live permet de faire un transfert sans coupure de service,
--keep-dst permettra de reprendre la sync des datas en cas de coupure : on laisse les datas copiés sur le remote en cas d'erreur
-t pour times infos
- alternative avec coupure de service :
vzctl stop CTid ; vzmigrate -v remote-host CTid
- vzquota
Et la config :
- /etc/sysconfig/vz
- /etc/vz et /etc/vz/vz.conf
- le daemon : chkconfig --list vz
- rpm -qa |grep vz
Références générales sur openVZ :
10/ A voir aussi, les Hyperviseurs : Proxmox (debian), SolusVM (centos) , openvz web panel (de google)
Vous pouvez utiliser Proxmox (gratuit et payant) ou Solusvm (payant à 10$/mois) : ils offrent une interface graphique web, une vue globale de vos containers, les ressources utilisées et la plupart des fonctions de réglages et création utiles.
Ils gèrent les containers OpenVZ mais aussi d'autres comme Xen, kvm etc
Le plus simple c'est au départ d'installer une distribution linux Centos, puis vous installer SolusVM qui va lui même installer le noyau OpenVZ modifié et faire toutes les configs utiles décrites ci dessus
Si vous louez votre serveur chez ovh, vous pouvez aussi opter pour une distrib clef en main type ovh Proxmox ou ovh SolusVM (cf ovh / serveur / réinstall / proxmox ou solusvm) qui va vous dispenser de cette étape (à vérifier pour l'ovh solusvm un bug est référencé sur la doc solusvm)
J'ai testé pour vous : ça peut vraiment simplifier la vie surtout si vous préférez la souris au clavier.
C'est également intéressant pour des grosses infra car vous aurez un tableau de bord de tous vous serveurs physiques et des VM et CT installés dessus , une vue globale de vos IP etc ... mais attention, SolusVM est tres complet, si vous êtes un habitué du clavier et que vous avez un seul serveur physique, je ne suis pas certain que vous allez gagner du temps (c'est mon cas) ...
Un autre challenger très intéressant : openvz web panel de Google code, une interface web gratuite à installer sur votre serveur maitre .
11/ Vous êtes une web agency ? l'isolation des sites web de vos clients vous intéresse ?
vous avez besoin d'un coup de main pour préparer et/ou administrer votre serveur ?
vous pensez comme moi qu'à chacun son métier ?
Bouilleur de Code (AERL)
Consultant Redhat, Centos et Fedora - Redhat Certified Engineer since 2004
www.bouilleur-de-code.fr
12/ Problem reseau on centos 7.1 (avril 2015)
on host: modify /etc/vz/dists/scripts/redhat-add_ip.sh by adding ARPCHECK="no" in function create_config()
function create_config()
{
local ip=$1
local netmask=$2
local ifnum=$3
local file=${IFCFG_DIR}/bak/${VENET_DEV_CFG}:${ifnum}
echo "DEVICE=${VENET_DEV}:${ifnum}
ONBOOT=yes
IPADDR=${ip}
NETMASK=${netmask}"
ARPCHECK="no" > $file ||
error "Can't write to file $file" ${VZ_FS_NO_DISK_SPACE}
}
then restart containers
11 889 clics - Créé le 17/10/2013 par Tito - Modifié le 01/07/2015