Aller au contenu

Infrastructure DevOps

Ancienne infrastructure

Infrastructure virtualisée sous Proxmox V7 constituée de 2 serveurs placés en réplication passive.

Vue d'ensemble

flowchart TD
n1((Noeud 1))-- Réplication passive -->n2((Noeud 2))

Coûts

Acheté sur Leboncoin.fr

  • Serveur ML350 gen9 Disque 4To + 1To + 2To 486 €
  • Serveur DL120 gen9 4 Disques 300Go 350 €
  • 4 Disques SSD 800Go 328,90 €
  • 5 Disques SAS 1,2To 214,50 €
  • 1 Disque dur 2To 23,09 €
  • 9 Disques dur 4To 120 €
  • Caddies HP SFF et Carte 10Gbs 86,08 €

Total : 1608,57 €

Serveur 1

  • Installé sous Proxmox V7
  • Serveur HP ML350 Gen9 LFF (3,5 pouces)
  • Bi-Xeon E5-2630 v4 indice 23540 TDP 170W
  • 64Go DDR4 ECC 2133mhz extensible à 1500
  • HPE Smart Array P440 PCIe3 x8, 12 Gb/s SAS RAID controller en HBA mode
  • 4 SSD 800Go SAS3 12Gbs montés en grappe de mirroir ZFS (système)
  • 8 disques dur de 4To SAS2 en grappes de mirroir (données)
  • 2 disques dur de 2To SAS3 en mirroir (backup)
  • 1 disque dur de 4To SAS2 (spare)
  • Relié avec :
  • carte HP 331i intégrée 4 port 1Gbs
  • HPE FlexFabric 533FLR-T 2 port 10Gbs sur adaptateur Flexlom->PCIe
  • Alimentations redondantes 2x500w

ML350

Serveur 2

  • Installé sous Proxmox V7
  • Serveur HP DL120 Gen9 SFF (2,5 pouces)
  • Mono-Xeon E5-2623 v3 indice 6790 TDP 85W
  • 32Go DDR4 ECC 2133mhz
  • HPE Smart Array P240 PCIe3 x8, 12 Gb/s SAS RAID controller en HBA mode
  • 4 disques dur 300Go SAS3 12Gbs montés en grappe de mirroir ZFS (système)
  • 4 disques dur de 1,2To SAS2 en grappes de mirroir (données)
  • Relié avec :
  • carte HPE Embedded Dual Port 361i intégrée 2 port 1Gbs
  • Alimentation 200w

DL120

Pourquoi changer ?

Voici une magnifique configuration où les éléments constitutifs des serveurs sont qualitatifs et performants mais pourquoi changer ?

  • La consommation électrique est importante rapportée aux performances au niveau CPU. Le TDP totalise 255W pour une puissance totale de 30330 d'indice soit 118 points d'indice par Watt consommé. En pratique le serveur 1 consomme en fonctionnement normal autour de 200 watts.
  • Les nuisances sonores sont très importantes à cause de la dissipation thermique du serveur.
  • La redondance est réalisée au niveau des pièces utilisées par le serveur et non au niveau du noeud entier si bien que cela implique l'usage de pièce spécifiques plus chères. La redondance n'est pas totale sur certaines pièces (carte mère).
  • En terme de disponibilité du stockage, la réplication passive entre les deux serveur ne permet pas la mise en place d'une vraie haute disponibilité en temps réel.
  • Volumétrie trop importante par rapport aux besoins.

Les performances au niveau du stockage affichent cependant autour de 500 à 600 Mo/s ce qui est plus que satisfaisant. La capacité disponible est de 36To.

Nouvelle infrastructure

Le minimum de noeud requis afin d'obtenir la haute disponibilité est de 3. Il est impératif de mettre en oeuvre un nombre impair de noeuds. 2 noeuds seulement engendre nécessairement des problématiques de "split brain", où l'impossiblité de connaître le référentiel de donnée peut occasionner la perte de données.

Vue d'ensemble

flowchart TD
n1((Noeud 1))<-- Ceph -->n2((Noeud 2))
n1<-- Ceph -->n3((Noeud 3))
n2<-- Ceph -->n3

Coûts

Acheté sur Leboncoin.fr

  • Carte réseau QNAP 88,19 €
  • Carte réseau QNAP 65,80 €
  • Carte réseau 2.5Gbs 17,73 €
  • Commutateur KVM HDMI+USB 35,19 €
  • Ordinateur HM50 285,79 €
  • Ordinateur HM50 315,99 €
  • Ordinateur HM80 334,09 €

Total : 1142,78 €

Noeud maître

  • Installé sous Proxmox V8
  • Serveur Minis Forum HM80
  • AMD Ryzen 4800U indice 16849 TDP 15W
  • 32Go DDR4 ECC 2133mhz Stockage SATA+M.2
  • Disque M.2 2280 512Go PCIe SSD 2500Mo/s (système)
  • 2 Disques SSD 256Go 500Mo/s (données)
  • Wifi 6 802.11ax & BT 5.2 Relié avec :
  • Carte intégrée Gigabit
  • Carte intégrée 2.5Gigabit
  • Carte USB QNA-UC5G1T 5Gbs

Noeuds esclaves (x2)

  • Installé sous Proxmox V8
  • Serveur Minis Forum HM50
  • AMD Ryzen 4500U indice 11005 TDP 15W
  • 32Go DDR4 ECC 2133mhz Stockage SATA+M.2
  • Disque M.2 2280 512Go PCIe SSD 2500Mo/s (système)
  • 2 Disques SSD 256Go 500Mo/s (données)
  • Wifi 6 802.11ax & BT 5.2 Relié avec :
  • Carte intégrée Gigabit
  • Carte intégrée 2.5Gigabit
  • Carte USB QNA-UC5G1T 5Gbs

2xHM50, HM80

Résultat ?

  • La consommation électrique avoisine les 30 à 40 watts de façon nominale.
  • Les nuisances sonores sont infinitésimales.
  • La redondance est réalisée au niveau du noeud entier avec des pièces assez standard, ce qui assure une bien meilleure résilience du cluster.
  • En terme de disponibilité du stockage, la réplication est activeet permet une vraie haute disponibilité en temps réel.
  • Volumétrie adpatée aux besoins.

Les performances au niveau du stockage affichent autour de 100 à 200 Mo/s ce qui est plus que satisfaisant. La capacité disponible est de 1,5To.

Installation

Provisionnement de Debian

Debian est installé automatiquement sur les 3 noeuds par le biais d'une démarrage PXE/TFTP du noyau linux et du chargement d'une version "Preseed" de Debian 12.

Installation de Proxmox

Changement de mot de passe root

passwd 

Changement du fichier hosts

cat > /etc/hosts << EOF
127.0.0.1 localhost.localdomain localhost
10.10.0.1 nuc1.ceph.ia64.cc
10.10.0.2 nuc2.ceph.ia64.cc
10.10.0.3 nuc3.ceph.ia64.cc
10.20.0.1 nuc1.cephprivate.ia64.cc
10.20.0.2 nuc2.cephprivate.ia64.cc
10.20.0.3 nuc3.cephprivate.ia64.cc
10.50.0.1 nuc1.corosync.ia64.cc
10.50.0.2 nuc2.corosync.ia64.cc
10.50.0.3 nuc3.corosync.ia64.cc
10.0.0.1 nuc1.admin.ia64.cc nuc1
10.0.0.2 nuc2.admin.ia64.cc nuc2
10.0.0.3 nuc3.admin.ia64.cc nuc3
EOF

RESEAUX STRUCTURE

  • VLAN 2 - 10.20.x.x/16 - vmbr2 - Ceph privé
  • VLAN 3 TAG - 10.10.x.x/16 - vmbr2.3 - Ceph public
  • VLAN 4 - 10.50.x.x/16 - vmbr1 - Corosync
  • VLAN 5 TAG - 10.00.x.x/16 - vmbr0.5 - admin

RESEAUX EXPLOITATION

  • VLAN 10 TAG - 192.168.10.x/24 - vmbr0 - serveurs
  • VLAN 15 - 192.168.15.x/24 - vmbr0 - clients
  • VLAN 20 TAG - 192.168.20.x/24 - vmbr0 - ouverture

Configuration réseau nuc1.admin.ia64.cc (VI)

cat > /etc/network/interfaces << EOF
# network interface settings; autogenerated
# Please do NOT modify this file directly, unless you know what
# you're doing.
#
# If you want to manage parts of the network configuration manually,
# please utilize the 'source' or 'source-directory' directives to do
# so.
# PVE will preserve these directives, but will NOT read its network
# configuration from sourced files, so do not attempt to move any of
# the PVE managed interfaces into external files!

auto lo
iface lo inet loopback

iface wlp2s0 inet manual

iface eno1 inet manual

iface enp4s0 inet manual

iface enx245ebe430155 inet manual

auto vmbr0
iface vmbr0 inet static
        bridge-ports enp4s0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-pvid 15
        bridge-vids 5,10,15,20

auto vmbr0.5
iface vmbr0.5 inet static
        address 10.0.0.1/16
        gateway 10.0.0.254

auto vmbr1
iface vmbr1 inet static
        address 10.50.0.1/16
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0

auto vmbr2
iface vmbr2 inet static
        address 10.20.0.1/16
        bridge-ports enx245ebe430155
        bridge-stp off
        bridge-fd 0

auto vmbr2.3
iface vmbr2.3 inet static
        address 10.10.0.1/16
EOF

Configuration réseau nuc2.admin.ia64.cc (VI)

cat > /etc/network/interfaces << EOF
### Interface 1GBs Bridge administration + VLAN
auto vmbr0
iface vmbr0 inet static
        bridge-ports enp4s0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-pvid 15
        bridge-vids 5,10,15,20

auto vmbr0.5
iface vmbr0.5 inet static
        address 10.0.0.2/16
        gateway 10.0.0.254

### Interface 1GBs Bridge Corosync
auto vmbr1
iface vmbr1 inet static
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware no
        address 10.50.0.2/16

#######################

### Interface 2.5GBs Bridge Ceph public + storage
auto vmbr2
iface vmbr2 inet static
        bridge-ports enx245ebe5bfab3
        bridge-stp off
        bridge-fd 0
        address 10.20.0.2/16

### Interface Ceph public
auto vmbr2.3
iface vmbr2.3 inet static
        address 10.10.0.2/16
EOF

Configuration réseau nuc3.admin.ia64.cc (VI)

cat > /etc/network/interfaces << EOF
auto lo
iface lo inet loopback

#######################

iface wlp2s0 inet manual
iface eno1 inet manual
iface enp4s0 inet manual
iface enx5c857e344936 inet manual

#######################

### Interface 1GBs Bridge administration + VLAN
auto vmbr0
iface vmbr0 inet static
        bridge-ports enp4s0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-pvid 15
        bridge-vids 5,10,15,20

auto vmbr0.5
iface vmbr0.5 inet static
        address 10.0.0.3/16
        gateway 10.0.0.254

### Interface 1GBs Bridge Corosync
auto vmbr1
iface vmbr1 inet static
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware no
        address 10.50.0.3/16

#######################

### Interface 2.5GBs Bridge Ceph public + storage
auto vmbr2
iface vmbr2 inet static
        bridge-ports enx5c857e344936
        bridge-stp off
        bridge-fd 0
        address 10.20.0.3/16

### Interface Ceph public
auto vmbr2.3
iface vmbr2.3 inet static
        address 10.10.0.3/16
EOF

Installation de proxmox

echo "deb [arch=amd64] http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-in
stall-repo.list
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.g
pg 
sha512sum /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg  #7da6fe34168adc6e479327ba517796d4702fa2f8b4f0a9833f5ea6e6b48f6507a6da403a274fe201595edc86a84463d50383d07f64bdde2e3658108db7d6dc87 
apt update && apt full-upgrade
apt install pve-kernel-6.2
systemctl reboot
apt install proxmox-ve postfix open-iscsi
apt remove linux-image-amd64 'linux-image-6.1*'
update-grub
apt remove os-prober
reboot

Ajout clause pour désactiver le NCP et forcer le SATA 3.0 (BOGUE CARTE MERE OU CPU??)

sed -i /etc/default/grub 's/quiet/quiet libata.force=noncq,3.0G/'
update-grub

Si d'aventure la commande kernel fonctionne pas

for drive in sd{b..x};do NCQDisabled=cat /sys/block/$drive/device/queue_depth #echo $drive $NCQDisabled if [ "$NCQDisabled" != "1" ]; then echo "disabling NCQ for $drive" echo 1 > /sys/block/$drive/device/queue_depth else echo "NCQ already disabled for $drive" fi done

Installation outils réseau + NTP

apt install net-tools chrony -y

Mise en place Corosync

pvecm create clusternuc
pvecm e 1
pvecm add 10.50.0.2
pvecm add 10.50.0.3
pvecm status

Installation de Ceph

Installation des OSD

#on node 1
pveceph install --repository no-subscription --version quincy 
pveceph init --cluster-network 10.20.0.1/16 --min_size 2 --network 10.10.0.1/16 --size 3
#on node 1
pveceph createmon --mon-address 10.10.0.1
#on node 2
pveceph createmon --mon-address 10.10.0.2
#on node 3
pveceph createmon --mon-address 10.10.0.3
#on node 1,2,3
pveceph createosd /dev/sda
pveceph createosd /dev/sdb
#on node 1
pveceph pool create datastore_ceph --add_storages 1 --application rdb --min_size 2 --pg_autoscale_mode on --pg_num 32 --size 3

Pour effacer un disque et le préparer à Ceph

ceph-volume lvm zap /dev/sd[X] --destroy

Benchmark de Ceph - préparation

ceph osd pool create testbench 100 100
rados bench -p testbench 10 write --no-cleanup
rados bench -p testbench 10 seq
rados bench -p testbench 10 rand
rados bench -p testbench 10 write -t 4 --run-name client1
rados -p testbench cleanup

Résultats

Maintaining 16 concurrent writes of 4194304 bytes to objects of size 4194304 for up to 10 seconds or 0 objects
Object prefix: benchmark_data_nuc1_12546
  sec Cur ops   started  finished  avg MB/s  cur MB/s last lat(s)  avg lat(s)
    0       0         0         0         0         0           -           0
    1      16        53        37   147.991       148    0.250132    0.308324
    2      16        99        83   165.984       184    0.539806    0.333284
    3      16       127       111    147.98       112    0.367396    0.339734
    4      16       154       138   137.981       108   0.0993989    0.409614
    5      16       184       168   134.383       120    0.071967    0.430416
    6      16       216       200   133.316       128    0.460771     0.45064
    7      16       247       231   131.983       124    0.118444    0.449762
    8      16       291       275   137.483       176    0.280182    0.451612
    9      16       334       318   141.316       172    0.128481    0.437606
   10      16       366       350   139.983       128     1.25476    0.455516
Total time run:         10.4048
Total writes made:      366
Write size:             4194304
Object size:            4194304
Bandwidth (MB/sec):     140.704
Stddev Bandwidth:       28.0317
Max bandwidth (MB/sec): 184
Min bandwidth (MB/sec): 108
Average IOPS:           35
Stddev IOPS:            7.00793
Max IOPS:               46
Min IOPS:               27
Average Latency(s):     0.450302
Stddev Latency(s):      0.321563
Max latency(s):         1.86754
Min latency(s):         0.0581945
hints = 1
  sec Cur ops   started  finished  avg MB/s  cur MB/s last lat(s)  avg lat(s)
    0       0         0         0         0         0           -           0
    1      16        61        45   179.956       180   0.0430398   0.0975382
    2      16        87        71   141.973       104   0.0433136    0.350415
    3      16       127       111   147.963       160   0.0406719    0.268465
    4      16       149       133   132.969        88   0.0203966    0.344561
    5      16       207       191   152.762       232    0.135074    0.384776
    6      16       249       233   155.289       168    0.035774    0.329294
    7      16       265       249   142.243        64   0.0411561    0.354386
    8      16       270       254   126.964        20   0.0389323    0.369548
    9      16       294       278   123.522        96   0.0507035    0.388509
   10      16       311       295    117.97        68   0.0230662    0.431991
Total time run:       10.9593
Total reads made:     311
Read size:            4194304
Object size:          4194304
Bandwidth (MB/sec):   113.511
Average IOPS:         28
Stddev IOPS:          16.1813
Max IOPS:             58
Min IOPS:             5
Average Latency(s):   0.548529
Max latency(s):       6.796
Min latency(s):       0.0203966
hints = 1
  sec Cur ops   started  finished  avg MB/s  cur MB/s last lat(s)  avg lat(s)
    0       0         0         0         0         0           -           0
    1      16       122       106   423.898       424    0.638815   0.0954765
    2      16       143       127   253.922        84   0.0440528    0.129585
    3      16       162       146   194.617        76   0.0404834    0.150424
    4      16       197       181    180.96       140  0.00838309       0.294
    5      16       244       228   182.363       188   0.0186008    0.297677
    6      16       265       249   165.968        84   0.0371396    0.296993
    7      16       318       302    172.54       212    0.043736     0.31674
    8      16       348       332    165.97       120   0.0340587    0.337632
    9      16       387       371   164.861       156   0.0427758    0.330386
   10      16       448       432   172.771       244   0.0244284    0.316743
   11       1       448       447   162.519        60     1.80617    0.383099
Total time run:       11.0088
Total reads made:     448
Read size:            4194304
Object size:          4194304
Bandwidth (MB/sec):   162.779
Average IOPS:         40
Stddev IOPS:          26.3145
Max IOPS:             106
Min IOPS:             15
Average Latency(s):   0.384807
Max latency(s):       3.9948
Min latency(s):       0.00323655
hints = 1
Maintaining 4 concurrent writes of 4194304 bytes to objects of size 4194304 for up to 10 seconds or 0 objects
Object prefix: benchmark_data_nuc1_12830
  sec Cur ops   started  finished  avg MB/s  cur MB/s last lat(s)  avg lat(s)
    0       0         0         0         0         0           -           0
    1       4        32        28   111.995       112     0.10545    0.132302
    2       4        61        57   113.989       116   0.0956211     0.13079
    3       4        88        84   111.987       108    0.303472    0.141727
    4       4       109       105   104.986        84    0.153796    0.150383
    5       4       126       122    97.583        68    0.141047    0.157844
    6       4       143       139   92.6511        68    0.121779    0.169712
    7       4       165       161   91.9851        88    0.132059    0.172284
    8       4       197       193   96.4848       128     0.14058    0.164039
    9       4       230       226   100.429       132   0.0995982    0.158129
   10       4       261       257   102.784       124    0.190499    0.154848
Total time run:         10.1032
Total writes made:      261
Write size:             4194304
Object size:            4194304
Bandwidth (MB/sec):     103.333
Stddev Bandwidth:       24.0777
Max bandwidth (MB/sec): 132
Min bandwidth (MB/sec): 68
Average IOPS:           25
Stddev IOPS:            6.01941
Max IOPS:               33
Min IOPS:               17
Average Latency(s):     0.154141
Stddev Latency(s):      0.0778747
Max latency(s):         0.513045
Min latency(s):         0.0539921
Cleaning up (deleting benchmark objects)
Removed 261 objects
Clean up completed and total clean up time :2.06974
Removed 366 objects

Installation de K0S (Kubernetes)

Récupération des informations terraform

#Sur noeud 1
apt install git -y
git clone  https://git.ia86.cc/administrateur/k0s-terraform.git

Création du template

#Sur noeud 1
cd k0s-terraform/
./template.sh

Création d'un role pour acces API

#Sur noeud 1
pveum role add terraform_role -privs "Pool.Allocate VM.Console VM.Allocate VM.Clone VM.Config.CDROM VM.Config.CPU VM.Config.Cloudinit VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Monitor VM.Audit VM.PowerMgmt Datastore.AllocateSpace Datastore.Audit SDN.Use Sys.Audit Sys.Console Sys.Modify VM.Migrate"
pveum user add terraform@pve
pveum aclmod / -user terraform@pve -role terraform_role
pveum user token add terraform@pve terraform --privsep 0

Execution de terraform

#Sur VM
cd k0s-terraform/
./run