Services/Proxmox/I11.md
... ...
@@ -0,0 +1,417 @@
1
+# Architecture Proxmox du I11
2
+
3
+[-> Interface graphique](https://proxmox.resel.fr/)
4
+À Brest, le groupe principal est composé de 3 hyperviseurs ([Camille](/Serveurs/Camille), [Nikita](/Serveurs/Nikita) et [Proxima](/Serveurs/Proxima)) qui partagent tous un même espace de stockage sur le [SAN](/Services/SAN). Cette architecture permet un load balancing de la charge et un fail over en cas de perte d'un noeud.
5
+
6
+Architecture montée par Alexandre Levavasseur FIP 2016 en février-mars 2015, puis mise à jour en 2016.
7
+>> Image de l'archi à ajouter.
8
+https://sandstorm.resel.fr/shared/W65mdEUXHx9quIuNaWQckm1eCOPNcrqBKOmjT5nZfT9
9
+
10
+## Configuration Réseau
11
+
12
+La première chose à configurer, via l'interface graphique, c'est le réseau ( https://pve.proxmox.com/wiki/Open_vSwitch ).
13
+* désactiver `vmbr0` (par défaut) en décochant l'autoboot, retirant la passerelle (sinon conflit dans les étapes suivantes), mettant `eth0.997` au lieu de `eth0`
14
+* créer 2 OVS Bridge `vmbr1` et `vmbr2`, aucune option
15
+* créer 2 OVS Bond `bond1` (attention au nom !) prenant eth0 et eth1, puis bond2 prenant eth2 et eth3, les 2 en mode balance-tcp
16
+* Créer 2 OVS IntPort :
17
+ * `mgr` portant l'adresse de management (reprendre les paramètres de l'install), dans le vlan 997
18
+ * `sto` portant une adresse dans le vlan stockage, seuls adresse et masque sont renseignés
19
+
20
+Un différentiel est disponible dans le cadre du bas. Lorsque vous avez bien tout configuré et vérifié, il faudra mettre en place les jumbo frames sur l'interface de stockage (possible avant le reboot de changement des interfaces en modifiant `interfaces.new`), en éditant `/etc/netwok/interfaces :
21
+```
22
+iface sto inet static
23
+[..]
24
+ mtu 9000
25
+
26
+iface bond2 inet manual
27
+[..]
28
+ pre-up ( ifconfig eth2 mtu 9000 && ifconfig eth3 mtu 9000 )
29
+ mtu 9000
30
+
31
+iface vmbr2 inet manual
32
+[..]
33
+ mtu 9000
34
+```
35
+
36
+Les hyperviseurs sont connectés aux switch sur le VLAN 5 qui sert uniquement pour le stockage à l'aide de 2 liens LACP Gi.
37
+Le Port Channel configuré par interface sur Laetitia:
38
+* PC 5 : LACP SAN - Laetitia (eth2 : Gi0/35, eth3 : Gi0/34)
39
+* PC 10 : LACP SAN - Camille (eth2 : Gi0/32, eth3 : Gi0/33)
40
+* PC 11 : LACP SAN - Nikita (eth2 : Gi0/28, eth3 : Gi0/29)
41
+* PC 20 : LACP Core - Camillle (eth0 : Gi0/30, eth1 : Gi0/31)
42
+* PC 21 : LACP Core - Nikita (eth0 : Gi0/26, eth1 : Gi0/27)
43
+
44
+Le LACP est un protocole permettant d'agréger des liens sur un même switch afin d'avoir une résistance en cas de chute de lien, mais également plus de débit. [Documentation Cisco sur le LACP](https://www.cisco.com/c/en/us/td/docs/ios/12_2sb/feature/guide/gigeth.html).
45
+
46
+[Alternative au LACP iSCSI Multipath](https://pve.proxmox.com/wiki/ISCSI_Multipath)
47
+
48
+Il faut adapter la configuration des ports du switch en face ; un exemple :
49
+
50
+Attention, cette documentation peut évoluer (car les confs des sw c'est facile à changer), n'hésitez pas à aller [voir la configuration de Laetitia](https://git.resel.fr/confs/cisco) en cas de doute.
51
+
52
+```
53
+!
54
+interface GigabitEthernet0/26
55
+ description Nikita LACP CORE 1
56
+ switchport trunk encapsulation dot1q
57
+ switchport mode trunk
58
+ storm-control broadcast level pps 300 250
59
+ storm-control action trap
60
+ channel-protocol lacp
61
+ channel-group 21 mode passive
62
+!
63
+interface GigabitEthernet0/27
64
+ description Nikita LACP CORE 2
65
+ switchport trunk encapsulation dot1q
66
+ switchport mode trunk
67
+ ip access-group 101 in
68
+ mls qos trust dscp
69
+ snmp trap mac-notification change added
70
+ snmp trap mac-notification change removed
71
+ storm-control broadcast level pps 300 250
72
+ storm-control action trap
73
+ channel-protocol lacp
74
+ channel-group 21 mode passive
75
+ spanning-tree portfast
76
+ spanning-tree bpdufilter enable
77
+ ip dhcp snooping trust
78
+!
79
+interface GigabitEthernet0/28
80
+ description Nikita LACP SAN 1
81
+ switchport access vlan 5
82
+ storm-control broadcast level pps 200 5
83
+ storm-control action trap
84
+ channel-protocol lacp
85
+ channel-group 11 mode passive
86
+ spanning-tree portfast
87
+ spanning-tree bpdufilter enable
88
+!
89
+interface GigabitEthernet0/29
90
+ description Nikita LACP SAN 2
91
+ switchport access vlan 5
92
+ storm-control broadcast level pps 200 5
93
+ storm-control action trap
94
+ channel-protocol lacp
95
+ channel-group 11 mode passive
96
+ spanning-tree portfast
97
+ spanning-tree bpdufilter enable
98
+!
99
+interface GigabitEthernet0/30
100
+ description Camille LACP CORE 1
101
+ switchport trunk encapsulation dot1q
102
+ switchport mode trunk
103
+ ip access-group 101 in
104
+ mls qos trust dscp
105
+ storm-control broadcast level pps 300 250
106
+ storm-control action trap
107
+ channel-protocol lacp
108
+ channel-group 20 mode passive
109
+ spanning-tree portfast
110
+ spanning-tree bpdufilter enable
111
+ ip dhcp snooping trust
112
+!
113
+interface GigabitEthernet0/31
114
+ description Camille LACP CORE 2
115
+ switchport trunk encapsulation dot1q
116
+ switchport mode trunk
117
+ ip access-group 101 in
118
+ mls qos trust dscp
119
+ snmp trap mac-notification change added
120
+ snmp trap mac-notification change removed
121
+ storm-control broadcast level pps 300 250
122
+ storm-control action trap
123
+ channel-protocol lacp
124
+ channel-group 20 mode passive
125
+ spanning-tree portfast
126
+ spanning-tree bpdufilter enable
127
+ ip dhcp snooping trust
128
+!
129
+interface GigabitEthernet0/32
130
+ description Camille LACP SAN 1
131
+ switchport access vlan 5
132
+ storm-control broadcast level pps 200 5
133
+ storm-control action trap
134
+ channel-protocol lacp
135
+ channel-group 10 mode passive
136
+ spanning-tree portfast
137
+ spanning-tree bpdufilter enable
138
+!
139
+interface GigabitEthernet0/33
140
+ description Camille LACP SAN 2
141
+ switchport access vlan 5
142
+ storm-control broadcast level pps 200 5
143
+ storm-control action trap
144
+ channel-protocol lacp
145
+ channel-group 10 mode passive
146
+ spanning-tree portfast
147
+ spanning-tree bpdufilter enable
148
+!
149
+interface GigabitEthernet0/34
150
+ description Sanizator LACP 2
151
+ switchport access vlan 5
152
+ storm-control broadcast level pps 200 5
153
+ storm-control action trap
154
+ channel-protocol lacp
155
+ channel-group 5 mode passive
156
+ spanning-tree portfast
157
+ spanning-tree bpdufilter enable
158
+!
159
+interface GigabitEthernet0/35
160
+ description Sanizator LACP
161
+ switchport access vlan 5
162
+ storm-control broadcast level pps 200 5
163
+ storm-control action trap
164
+ channel-protocol lacp
165
+ channel-group 5 mode passive
166
+ spanning-tree portfast
167
+ spanning-tree bpdufilter enable
168
+```
169
+
170
+**Uniquement pour promox 3** :
171
+Enfin, pour la partie réseau, il reste un détail (à mettre en place au bon moment de l'installation mais décrit ici) : le passage dans un état réellement fonctionnel des interfaces tels que sw semble pouvoir mettre beaucoup de temps au boot, or entre l'initialisation du réseau et la tentative de formation du cluster il ne s'écoule que quelques secondes au plus, ce qui peut poser des problèmes (notamment, le problème a été diagnostiqué parce que le noeud tente de s'unfencer -> fail -> pas de join du domain de fence -> pas de rmanager). Il faut donc attendre que le réseau soit bien prêt avant de continuer, j'ai pour cela créé un petit script qui va vérifier que les adresses fournies (et choisie pour permettre de vérifier l'état de l'interface) sont bien opérationnelles avant de continuer :
172
+
173
+```
174
+echo > /etc/network/if-up.d/z-boot-wait <<EOF
175
+#!/usr/bin/env sh
176
+#
177
+# Script d'attente au boot par Alexandre Levavasseur, FIP16
178
+# --
179
+# Attend que les réseaux nécessaires, ici lien avec laetitia et avec le san, soient
180
+# prêts avant de continuer le boot ; si délai > 5 minutes le script laisse quand
181
+# même le système booter (pour éviter les erreurs humaines).
182
+
183
+log() {
184
+ echo "[boot-wait] $*"
185
+}
186
+
187
+NEEDED="172.22.5.5 172.22.0.115"
188
+MAX_WAIT=300
189
+
190
+t=0
191
+if [ "$IFACE" = "--all" ] && [ "$PHASE" = "post-up" ]; then
192
+ for addr in $NEEDED; do
193
+ echo -n "[boot-wait] Waiting for $addr .. "
194
+ until [ $t -gt $MAX_WAIT ] || ping -c1 -W1 $addr > /dev/null; do
195
+ t=$((t+1))
196
+ done
197
+ echo "exited at t=$t"
198
+ done
199
+
200
+ if [ $t -gt $MAX_WAIT ]; then
201
+ log "Failed, deadline expired"
202
+ exit 1
203
+ else
204
+ log "Ok :)"
205
+ fi
206
+fi
207
+EOF
208
+
209
+puis
210
+
211
+chmod +x /etc/network/if-up.d/z-boot-wait
212
+```
213
+
214
+## Reverse proxy
215
+
216
+Pour profiter du HA du pool, les trois hyperviseurs peuvent proposer l'interface graphique de proxmox. Ceux-ci sont situés derrière le reverse proxy situs en round robin. L'option `ip_hash` est très importante pour éviter de se connecter sur les 3 serveurs à tour de rôle, cela pose des problèmes lors de l'ouverture de la console qui va s'ouvrir sur un autre hyperviseur.
217
+
218
+Voici la configuration (au 2017-01-29):
219
+```
220
+upstream proxmox {
221
+ ip_hash;
222
+ server 172.22.2.42:8006; # Nikita
223
+ server 172.22.2.58:8006; # Camille
224
+ server 172.22.2.63:8006; # Proxima
225
+}
226
+
227
+server {
228
+ listen 80;
229
+ server_name proxmox.resel.fr;
230
+ return 301 https://$server_name$request_uri;
231
+}
232
+
233
+server {
234
+ listen 443 ssl;
235
+ server_name proxmox.resel.fr;
236
+
237
+ access_log /var/log/nginx/proxmox.resel.fr/access.log;
238
+ error_log /var/log/nginx/proxmox.resel.fr/errors.log;
239
+
240
+ proxy_redirect off;
241
+ location / {
242
+ proxy_http_version 1.1;
243
+ proxy_set_header Upgrade $http_upgrade;
244
+ proxy_set_header Connection "upgrade";
245
+ proxy_pass https://proxmox;
246
+ }
247
+}
248
+```
249
+
250
+## Stockage
251
+
252
+Le stockage se fait sur le SAN Sanizator qui exporte des volumes en iSCSI (tcp).
253
+
254
+### Création des volumes
255
+TODO
256
+
257
+### Configuration des volumes dans proxmox
258
+
259
+La configuration dans proxmox 4 se fait depuis l'interface graphiques. On commence par ajouter les volumes iSCSI, l'ID sera le nom attribué, le portal l'adresse du SAN, la target la cible contenant les volumes voulus. Pas de restriction sur les noeuds.
260
+
261
+| ID | Portal | Target | Direct* |
262
+| ------- | -------| ------ | -------- |
263
+| SAN-VMs | 172.22.5.5 | iqn.2015-02.fr.resel:promox | Non |
264
+| VM-SAN-Clubs | 172.22.5.5 | iqn.2015-02.fr.resel:clubs | Oui |
265
+| VM-SAN-Miroir | 172.22.5.5 | iqn.2015-02.fr.resel:miroir | Oui |
266
+| VM-SAN-Reloaded | 172.22.5.5 | iqn.2017-01.fr.resel:proxmox-reloaded | Non |
267
+
268
+**Direct* indique que les volumes pourront être utilisés directement par les VMs. Pour le moment Proxmox ne protège pas ces accès direct contre les accès multiples ni dans le reste de l'interface Proxmox, il font donc savoir qu'ils ne doivent pas être utilisés. Ils sont préfixés par VM pour indiquer que leur usage est réservé aux VMs.**
269
+
270
+Ensuite, dans le LUN (volume) 1 de la target `promox`, crée les VG qui accueillent les VMs.
271
+Add>LVM :
272
+
273
+| ID | Base Storage | Base Volume | Volume Group | Shared |
274
+| --- | ------------ | ----------- | ------------ | ------ |
275
+| Disks-VMs | SAN-VMs | LUN00 | vms | Oui |
276
+| Disks-ViM-Reloaded | VM-SAN-Reloaded | LUN01 | vg-reloaded | Oui |
277
+
278
+On peut vérifier la prise en compte avec la commande vgs :
279
+```
280
+lcarr@camille:~$ sudo vgs
281
+ VG #PV #LV #SN Attr VSize VFree
282
+ clubs 1 1 0 wz--n- 1024.00g 0
283
+ miroir 1 4 0 wz--n- 900.00g 30.00g
284
+ pve 1 3 0 wz--n- 136.00g 15.84g
285
+ vg-reloaded 1 29 0 wz--n- 1024.00g 595.50g
286
+ vms 1 44 0 wz--n- 1024.00g 500.50g
287
+```
288
+
289
+
290
+### Informations sur le CLVM
291
+
292
+Des liens en vrac en attendant plus de doc :
293
+* https://github.com/proxmox/lvm/blob/master/patchdir/fix-clvm-init.patch
294
+* http://forum.proxmox.com/threads/5207-shared-storage-LVM2-or-CLVM
295
+* http://forum.proxmox.com/threads/14703-When-is-CLVM-needed
296
+* http://forum.proxmox.com/threads/7225-cLVM
297
+* http://serverfault.com/questions/444043/does-proxmox-ve-support-lvm-as-block-storage-for-kvm-guests
298
+* http://forum.proxmox.com/threads/12798-Proxmox-VE-2-2-and-clvm
299
+* http://pve.proxmox.com/wiki/Proxmox_ISCSI_installation + pas de clvm mais resynchro des metas
300
+
301
+
302
+## Mise en place de la HA
303
+
304
+### Explications
305
+La haute disponibilité est la technologie permettant d'avoir un service constant malgré la chute de noeuds. Elle est enforcée ici par le fait qu'il y ait 3 noeuds en concurrence.
306
+
307
+**Quorum** : Un quorum est le principe qui permet de vérifier l'état d'un service distribué à l'aide d'un vote. Chacun des noeuds du service possède un (ou plusieurs) votes et si le quorum est atteint (généralement la majorité) le noeud considère qu'il est dans une partition fonctionnelle. Si il le quorum n'est pas atteint, le noeud considère qu'il est isolé ou dysfonctionnel.
308
+
309
+**Fencing** : Le fencing est le processus permettant d'isoler du système un noeud qui est dysfonctionnel.
310
+
311
+### Mise en cluster
312
+
313
+Nous créons un cluster nommé `lyoko-cluster` :
314
+```bash
315
+root@camille:~# pvecm create lyoko-cluster
316
+Restarting pve cluster filesystem: pve-cluster[dcdb] notice: wrote new cluster config '/etc/cluster/cluster.conf'
317
+.
318
+Starting cluster:
319
+ Checking if cluster has been disabled at boot... [ OK ]
320
+ Checking Network Manager... [ OK ]
321
+ Global setup... [ OK ]
322
+ Loading kernel modules... [ OK ]
323
+ Mounting configfs... [ OK ]
324
+ Starting cman... [ OK ]
325
+ Waiting for quorum... [ OK ]
326
+ Starting fenced... [ OK ]
327
+ Starting dlm_controld... [ OK ]
328
+ Tuning DLM kernel config... [ OK ]
329
+ Unfencing self... [ OK ]
330
+```
331
+
332
+Ajout des noeuds au quorum :
333
+```bash
334
+root@nikita:~# pvecm add 172.22.2.58 # Nikita
335
+The authenticity of host '172.22.2.58 (172.22.2.58)' can't be established.
336
+ECDSA key fingerprint is 0d:f2:dd:e1:bb:ae:e4:71:86:ad:ed:5e:02:78:cf:7c.
337
+Are you sure you want to continue connecting (yes/no)? yes
338
+root@172.22.2.58's password:
339
+copy corosync auth key
340
+stopping pve-cluster service
341
+Stopping pve cluster filesystem: pve-cluster.
342
+backup old database
343
+Starting pve cluster filesystem : pve-cluster.
344
+Starting cluster:
345
+ Checking if cluster has been disabled at boot... [ OK ]
346
+ Checking Network Manager... [ OK ]
347
+ Global setup... [ OK ]
348
+ Loading kernel modules... [ OK ]
349
+ Mounting configfs... [ OK ]
350
+ Starting cman... [ OK ]
351
+ Waiting for quorum... [ OK ]
352
+ Starting fenced... [ OK ]
353
+ Starting dlm_controld... [ OK ]
354
+ Tuning DLM kernel config... [ OK ]
355
+ Unfencing self... [ OK ]
356
+waiting for quorum...OK
357
+generating node certificates
358
+merge known_hosts file
359
+restart services
360
+Restarting PVE Daemon: pvedaemon.
361
+Restarting PVE API Proxy Server: pveproxy.
362
+successfully added node 'nikita' to cluster.
363
+
364
+
365
+root@nikita:~# pvecm add 172.22.2.63 # Proxima
366
+```
367
+
368
+Pour voir l'état du cluster :
369
+```bash
370
+ root@camille ~ # pvecm status
371
+Quorum information
372
+------------------
373
+Date: Sun Jan 29 01:36:56 2017
374
+Quorum provider: corosync_votequorum
375
+Nodes: 3
376
+Node ID: 0x00000002
377
+Ring ID: 1/25104
378
+Quorate: Yes
379
+
380
+Votequorum information
381
+----------------------
382
+Expected votes: 3
383
+Highest expected: 3
384
+Total votes: 3
385
+Quorum: 2
386
+Flags: Quorate
387
+
388
+Membership information
389
+----------------------
390
+ Nodeid Votes Name
391
+0x00000001 1 172.22.2.42
392
+0x00000002 1 172.22.2.58 (local)
393
+0x00000004 1 172.22.2.63
394
+zsh: exit 1 pvecm status
395
+```
396
+
397
+La liste des noeuds :
398
+```bash
399
+root@camille ~ # pvecm nodes
400
+
401
+Membership information
402
+----------------------
403
+ Nodeid Votes Name
404
+ 1 1 nikita
405
+ 2 1 camille (local)
406
+ 4 1 proxima
407
+```
408
+
409
+Liens (concernant la mise en quorum):
410
+* http://blogs.technet.com/b/windowsinternals/archive/2009/03/30/le-quorum-et-le-cluster.aspx
411
+* http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html/Clusters_from_Scratch/_perform_a_failover.html#_quorum_and_two_node_clusters
412
+* http://techthoughts.typepad.com/managing_computers/2007/10/split-brain-quo.html
413
+* http://linux-ha.org/wiki/Cluster_Concepts
414
+* http://blogs.msdn.com/b/clustering/archive/2011/05/27/10169261.aspx
415
+* https://pve.proxmox.com/wiki/Proxmox_VE_2.0_Cluster#Two_nodes_cluster_and_quorum_issues
416
+* https://pve.proxmox.com/wiki/Two-Node_High_Availability_Cluster
417
+* http://serverfault.com/questions/371067/how-to-setup-stonith-in-a-2-node-active-passive-linux-ha-pacemaker-cluster