Proxmox Guide erweitert und aufgeteilt.

This commit is contained in:
Daniel Spittank 2024-06-02 20:31:42 +02:00
parent 4525956c0d
commit d7619bba35
4 changed files with 355 additions and 212 deletions

View File

@ -1,3 +1,4 @@
# Übersicht Guides
[Einrichtung eines verschlüsselten Proxmox-HA-Clusters](proxmox.md)
- [Proxmox-Basissetup](proxmox.md)
- [Einrichtung eines verschlüsselten Proxmox-HA-Clusters](proxmox-cluster.md)

View File

@ -0,0 +1,152 @@
# Proxmox-Cluster mit Ceph
## Basissetup
Siehe [Proxmox-Basissetup](proxmox.md)
## Clusterkonfiguration
1. Einrichtung des Clusters auf einer der Nodes über die GUI. Der Link sollte auf das schnelle Netz zeigen.
2. Die anderen Nodes über die GUI joinen.
3. Bei komplexeren Setups mit Failover etc. bietet es sich an, die Adressen der Hosts in den Hosts-Datei zu spezifizieren und die ```/etc/corosync/corosync.conf``` manuell anzupassen. Siehe [Seperate Cluster Network](https://pve.proxmox.com/wiki/Separate_Cluster_Network) im Proxmox-Wiki.
!!! warning
Bei jeder Änderung der ```/etc/corosync/corosync.conf``` *muss* die ```config_version``` erhöht werden, damit die Datei im Cluster aktiv wird!
4. Das Migration-Netzwerk sollte vom Cluster-Netzwerk getrenn sein und muss dann manuell festgelegt werden. Dies erfolgt in der ```/etc/pve/datacenter.cfg```:
``` json
migration: secure,network=192.168.10.0/24
```
## Ceph-Einrichtung
### Grundeinrichtung
1. Ceph auf dem ersten Node in der GUI installieren (Advanced aktivieren), Netzwerke passend auswählen, Replicas passend einstellen.
2. Ceph auf den anderen Nodes in der GUI installieren (Adcanced aktivieren).
3. Monitore, Manager und Metadata-Server auf den weiteren Nodes hinzufügen.
4. OSDs auf allen Nodes hinzufügen, dabei für HDD evtl. WAL+DB auf SSD auslagern sowie Encryption aktivieren.
!!! tip
Wenn WAL+DB auf einer Partition angelegt werden soll, muss zunächst das LVM vorbereitet werden, dazu:
1. Mit fdisk Partition anlegen (Typ 30)
2. LVM anlegen
``` bash
# Physival Volume erstellen
pvcreate /dev/sdX4
# Volumegroup erstellen
vgcreate ceph-db-0 /dev/sdX4
```
### Pools einrichten
#### Replikation verwenden
1. Wenn SSDs und HDDs zum Einsatz kommen, können unterschiedliche Crush-Regeln angelegt
werden, um Pools für schnellen und langsamen Speicher zu erstellen:
``` bash
ceph osd crush rule create-replicated replicated_hdd default host hdd
ceph osd crush rule create-replicated replicated_ssd default host ssd
```
2. Pools anlegen und dabei die Crush-Regeln und die Redundanz (Replicas = Original + Anzahl Kopien) passend auswählen.
#### Erasurecode verwenden
Es ist auch möglich, Erasurecode zu verwenden. So werden Daten nicht
vollständig repliziert, sondern Prüfsummen erstellt (ähnlich zu RAID5
etc.). Dies benötigt mehr Rechenleistung und etwas bis erheblich
weniger Speicherplatz. Hier wird von einer Konfiguration analog zu
RAID5 ausgegangen, d.h. auf zwei Datenblöcke (k=2) kommt ein
Paritätsblock (m=1). Somit kann der Ausfall einer Einheit kompensiert
werden. Dies ist nur für unwichtige Daten sinnvoll, denn es ist sehr
wahrscheinlich, dass beim Recovery eine zweite Einheit ausfällt
(analog zu RAID5). Es geht also lediglich darum, den Betrieb aufrecht
zu erhalten. Notfalls kann später ein vorhandenes Backup eingespielt
werden.
Dieses Problem lässt sich durch weitere Nodes / OSDs verkleinern, sodass
es nicht mehr so kritisch wie bei einem RAID5 ist. Außerdem können
natürlich mehr redundante Blöcke vorgehalten werden (m>1).
k+m entspricht der Anzahl der benötigten Nodes (wenn die Fehlerdomain auf
'host' eingestellt wird).
``` bash
# EC-Profil anlegen
ceph osd erasure-code-profile set erasure_medien_hdd\
plugin=jerasure k=2 m=1 technique=reed_sol_van\
crush-root=default crush-failure-domain=host\
crush-device-class=hdd
# Pool erstellen
ceph osd pool create cephfs_ec_data 128 erasure erasure_medien_hdd
# Overwrites für CephFS-Nutzung erlauben
ceph osd pool set cephfs_ec_data allow_ec_overwrites true
# Gleichzeitiges lesen von mehreren OSDs
ceph osd pool set cephfs_ec_data fast_read true
```
### VM-Disks anlegen
Die Pools können direkt als Storage genutzt werden. Wichtig ist, dass als Dateisystem XFS verwendet wird. Dies ist etwas schneller und deutlich stabiler in den Transferraten als ext4. Außerdem kann man zur Leistungssteigerung den Writeback-Cache aktivieren und den IO-Thread aktivieren (dazu als SCSI-Controller in der VM _Virtio SCSI single_ auswählen.
### CephFS nutzen
Wenn man CephFS nutzt, können die angelegten Pools entsprechenden Crush-Regeln zugewiesen werden. Der Metadata-Pool sollte immer auf SSDs liegen!
1. Zugangsdaten auf dem Cluster anlegen
``` bash
# ceph fs authorize <cephfs-name> client.<nutzername>
# <verzeichnis> <berechtigung> ... <verzeichnis> <berechtigung>
ceph fs authorize cephfs client.daniel / rw
```
2. Den angezeigten Key in eine Datei auf dem Client kopieren
3. Vom Client aus mounten
``` bash
mount.ceph <monitor-ip>:/ /mnt -o name=daniel,secretfile=ceph.key
```
4. Oder in der /etc/fstab eintragen:
```
<mon1_ip>,<mon2_ip>,<mon3_ip>:/ /mnt/cephfs/ ceph name=<username>,secretfile=<keyfile>,noatime,_netdev 0 0
```
Sehr viele weitere Einstellungen und sehr differenzierte Berechtigungen sind möglich. Siehe [Client-Auth](https://docs.ceph.com/en/latest/cephfs/client-auth/).
### CephFS mit Erasurecode-Pool nutzen
Es kann, aufgrund des geringeren Speicherplatzbedarfs, sinnvoll sein, für den
CephFS-Pool einen Erasurecode-Pool zu verwenden. Dies ist nur für den
Datenpool möglich, der Metadatenpool muss immer ein replizierter Pool sein.
``` bash
# Zu CephFS hinzufügen
ceph fs add_data_pool cephfs cephfs_ec_data
```
Auf dem Client im (als client.admin) gemounteten Filesystem:
``` bash
# Unterverzeichnis anlegen
mkdir ec
# Verzeichnis an neuen Pool binden
setfattr -n ceph.dir.layout.pool -v cephfs_ec_data ec
```
### VM-Disk vs. gemountetes CephFS
Man kann statt eine VM-Disk anzulegen auch ein CephFS direkt mounten. Dies hat verschiedene Vor- und Nachteile.
| Eigenschaft | Disk | Mount |
| ---------------------------------------------- | --------------------------------- | --------------------------------- |
| einfachere Einrichtung | :material-check-circle:{ .green } | :material-close-circle:{ .red } |
| Backup in Proxmox möglich | :material-check-circle:{ .green } | :material-close-circle:{ .red } |
| als Systemlaufwerk nutzbar | :material-check-circle:{ .green } | :material-close-circle:{ .red } |
| Nutzung von verschiedenen Clients gleichzeitig | :material-close-circle:{ .red } | :material-check-circle:{ .green } |
| "unbegrenztes" Wachstum | :material-close-circle:{ .red } | :material-check-circle:{ .green } |
| geringfügig höhere Geschwindigkeit | :material-close-circle:{ .red } | :material-check-circle:{ .green } |

View File

@ -1,11 +1,150 @@
# Proxmox-Cluster mit Ceph
# Proxmox-Basissetup
## Basissetup
## Proxmox installieren
Mittels Installationsassistent die Installation durchführen. Wichtig ist es lediglich, die Netzwerkkonfiguration für die Managementschnittstelle korrekt zu konfigurieren und das korrekte RAID-Level (In der Regel Mirroring) für die Systemplatten auszuwählen. Alle weiteren Netzwerke und Speichermedien werden nach der Installation konfiguriert.
## Netzwerkkonfiguration vornehmen
1. Alle Schnittstellen auf MTU 9000 einstellen (unter Advanced), dies ist für die volle Bandbreite bei 10G notwendig!
2. Mindestens ein eigenes Netz für den Cluster und Ceph erstellen (vorzugsweise 10G)
3. Bridge anlegen für VLANs für die VMs anlegen (vmbr1, vorzugsweise 10G)
4. IPs passend festlegen
5. Konnektivität prüfen
## Laufwerke mit ZFS einrichten
1. Einzelne ZFS-Volumes korrekt einrichten
2. Jeweils geeignete RAID-Level auswählen
!!! tip
Optional: Falls eine Verschlüsselung gewünscht wird, ist es sinnvoll, zunächst das Standard-Datenset zu verschlüsseln und danach weitere Volumes direkt verschlüsselt anzulegen. In diesem Fall diesen Schritt auslassen. Er wird [später](#datenpartitionen-verschlusseln) nachgeholt.
## Systemupdates
### Paketquellen anpassen
Üblicherweise wird man im heimischen Umfeld keine Lizenz für Proxmox besitzen. Daher stehen die Enterprise-Repos nicht zur Verfügung. Diese sollte entfernt und die Standard-Repos hinzugefügt werden.
``` bash
# No-Subscription Repo anlegen
echo "deb http://download.proxmox.com/debian/pve $(hostnamectl |\
awk -F: '/Operating System:/ {print $2}' | awk\
'{gsub(/[()]/, "", $NF); print $NF}') pve-no-subscription" >\
/etc/apt/sources.list.d/pve-no-subscription.list
# Enterprise-Repo löschen
rm /etc/apt/sources.list.d/pve-enterprise.list
```
### Nagscreen entfernen
Der aus der fehlenden Lizenz resultierende Nagscreen lässt sich mittels eines Hooks für DPKG dauerhaft entfernen. (Siehe auch [^2])
``` bash
# Nagscreen mittels Post-Invoke-Hook dauerhaft entfernen.
echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | \
grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { \
echo 'Removing subscription nag from UI...'; \
sed -i '/.*data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' \
/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; \
}; fi\"; };" > /etc/apt/apt.conf.d/no-nag-script
# Widget Toolkit neuinstallieren, um Nagscreen anzuwenden.
apt --reinstall install proxmox-widget-toolkit
```
### System updaten
``` bash
apt update
apt full-upgrade
```
## SSH einrichten
1. SSH-Keys hinterlegen (```/root/.ssh/authorized_keys```)
2. SSHD-Konfiguration anpassen (```/etc/ssh/sshd_config```)
``` bash
# Port 22 wird immer für die Clusterkommunikation benötigt,
# kann aber natürlich später mit Firewallregeln auf die
# betroffenen Hosts beschränkt werden. Auf jeden Fall muss Port
# 22 hier zusätzlich angegeben werden.
# Port 2222
Port 22
# Root-Login nur mit Key
PermitRootLogin prohibit-password
# Passwort-Login verbieten
PasswordAuthentication no
# TCP-Forwarding (Tunnel) erlauben
AllowTcpForwarding yes
# X11-Weiterleitung verbieten
X11Forwarding no
```
## Mail einrichten
### Postfix mit Relay
1. In ```/etc/postfix/main.cf``` folgende Ergänzungen vornehmen:
``` cf
relayhost = [smtp.example.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps = regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check
```
2. ```/etc/postfix/sasl_passwd``` mit Zugangsdaten erstellen:
```
[smtp.example.com]:587 ich@example.com:mein1234passwort
```
3. Abhängigkeiten installieren
``` bash
apt install libsasl2-modules
```
4. Absender erzwingen
- In ```/etc/postfix/sender_canonical_maps```:
```
/.+/ ich@example.com
```
- In ```/etc/postfix/smtp_header_checks```:
```
/From:.*/ REPLACE From: SERVERNAME <ich@example.com>
```
5. Berechtigungen anpassen und Konfigurationsdateien mappen
``` bash
chmod 600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd
postmap /etc/postfix/sender_canonical_maps
postmap /etc/postfix/smtp_header_checks
```
6. Dienst neustarten und testen
``` bash
systemctl restart postfix.service
echo "Testmail von postfix" | mail -s "Postfixtest" test@example.com
```
## Verschlüsselung einrichten
### Proxmox-Root verschlüsseln
(Siehe auch [^1])
!!! danger
Der Verlust der verwendeten Passphrase führt unweigerlich zum Datenverlust! Das Starten des Servers und der Zugriff auf die enthaltenen Daten ist nur mit dieser Passphrase möglich!
1. System von einem externen Medium mit ZFS-Support starten (z.B. im Proxmox-Installer ++ctrl+alt+f3++ drücken).
2. In der Shell folgende Schritte ausführen:
1. Proxmox installieren (mit ZFS)
2. Proxmox-Root verschlüsseln [^1]
1. System von einem externen Medium mit ZFS-Support starten (z.B. Ubuntu oder im Proxmox-Installer ++ctrl+alt+f3++ drücken, das ist jedoch sehr unkomfortabel).
2. In der Shell folgende Schritte ausführen:
``` bash
# Aktuellen Root-Pool importieren
zpool import -f rpool
@ -44,67 +183,32 @@ zfs destroy -r rpool/copyroot
# Den Pool wieder exportieren
zpool export rpool
```
3. System neustarten
3. System updaten
1. Packagelists anpassen
``` bash
# No-Subscription Repo anlegen
echo "deb http://download.proxmox.com/debian/pve\
bullseye pve-no-subscription" >\
/etc/apt/sources.list.d/pve-no-subscription.list
3. System neustarten
# Enterprise-Repo löschen
rm /etc/apt/sources.list.d/pve-enterprise.list
```
2. Updaten
``` bash
apt update
apt full-upgrade
```
4. SSH einrichten
1. SSH-Keys hinterlegen (```/root/.ssh/authorized_keys```)
2. SSHD-Konfiguration anpassen (```/etc/ssh/sshd_config```)
``` bash
# Port 22 wird immer für die Clusterkommunikation benötigt,
# kann aber natürlich später mit Firewallregeln auf die
# betroffenen Hosts beschränkt werden. Auf jeden Fall muss Port
# 22 hier zusätzlich angegeben werden.
# Port 2222
Port 22
# Root-Login nur mit Key
PermitRootLogin prohibit-password
### Remote-Unlock aktivieren
Damit man den Server auch über das Netzwerk mittels SSH entschlüsseln und somit starten kann, muss man Dropbear SSH einrichten.
# Passwort-Login verbieten
PasswordAuthentication no
# TCP-Forwarding (Tunnel) erlauben
AllowTcpForwarding yes
# X11-Weiterleitung verbieten
X11Forwarding no
```
5. Remote-Unlock aktivieren
1. dropbear-initramfs installieren (``` apt install dropbear-initramfs```)
2. initramfs mit fester IP ausstatten (```/etc/initramfs-tools/initramfs.conf```)
1. dropbear-initramfs installieren (```apt install dropbear-initramfs```)
2. initramfs mit fester IP ausstatten (```/etc/initramfs-tools/initramfs.conf```)
``` bash
IP=192.168.1.100::192.168.1.1:255.255.255.0::enp2s0:off
```
2. dropbear konfigurieren (```/etc/dropbear-initramfs/config```)
3. dropbear konfigurieren (```/etc/dropbear/initramfs```)
``` bash
# z.B. -p2222 für Port 2222
DROPBEAR_OPTIONS=
```
3. Keys für dropbear hinterlegen
4. Keys für dropbear hinterlegen
``` bash
# Autorisierte Schlüssel hinterlegen
cp /root/.ssh/authorized_keys /etc/dropbear-initramfs
cp /root/.ssh/authorized_keys /etc/dropbear/initramfs
# Hostkeys konvertieren
rm /etc/dropbear-initramfs/*_key
rm /etc/dropbear/initramfs/*_key
cd /etc/ssh
for file in ssh_host_*_key; do
echo Konvertiere $file
@ -113,7 +217,7 @@ for file in ssh_host_*_key; do
newfile=${file/ssh_host/dropbear}
newfile=${newfile/key/host_key}
dropbearconvert openssh dropbear /tmp/$file /tmp/$newfile
mv /tmp/$newfile /etc/dropbear-initramfs/
mv /tmp/$newfile /etc/dropbear/initramfs/
rm /tmp/$file
done
@ -121,9 +225,9 @@ done
update-initramfs -u
```
6. Datenset verschlüsseln
### Datenpartitionen verschlüsseln
!!! info
Die Datenpartition wird mit einem Key verschlüsselt, der im Dateisystem des Servers liegt. Dieser ist durch die Verschlüsselung des Root-Sets geschützt, wenn der Server ausgeschaltet ist, ist jedoch prinzipiell lesbar, wenn der Server läuft.
Die Datenpartitionen werden mit einem Key verschlüsselt, der im Dateisystem des Servers liegt. Dieser ist durch die Verschlüsselung des Root-Sets geschützt, wenn der Server ausgeschaltet ist, ist jedoch prinzipiell lesbar, wenn der Server läuft.
Die Rechte des Keyfiles sind konservativ gesetzt (Zugriff nur für root) dennoch bleibt dies eine Abwägung zwischen Komfort und Sicherheit.
@ -132,18 +236,50 @@ update-initramfs -u
!!! tip
Optional: Insbesondere bei Clustereinrichtung sollte in Proxmox der Storage (local-zfs) gelöscht und nach der Verschlüsselung ein passender neuer angelegt werden, der der Storage-ID im Cluster entspricht.
!!! danger
Der Verlust der verwendeten Schlüsseldatei (```/root/local.key```) führt unweigerlich zum Datenverlust! Das Starten des Servers und der Zugriff auf die enthaltenen Daten ist nur mit dieser Schlüsseldatei möglich!
``` bash
# Key generieren
dd if=/dev/urandom of=/root/local.key bs=32 count=1
chmod 600 /root/local.key
# Datenset löschen
# Datensets löschen, evtl. weitere
zfs destroy -r rpool/data
zfs destroy -r rpool/var-lib-vz
# Neue, verschlüsselte Datensets anlegen
zfs create -o encryption=on -o keyformat=raw \
-o keylocation=file:///root/local.key rpool/data
zfs create -o encryption=on -o keyformat=raw \
-o keylocation=file:///root/local.key rpool/var-lib-vz
# Abweichende Mountpoints setzen
zfs set mountpoint=/var/lib/vz rpool/var-lib-vz
```
#### Optional: Weitere Pools anlegen (z.B. HDD)
``` bash
# Pool erstellen (statt mirror nach Bedaf auch raidz1, raidz2 usw.)
# Alternativ über die UI von Proxmox erstellen, dort aber das Häkchen
# bei "Add Storage" entfernen.
zpool create -m /HDD HDD mirror /dev/sdb /dev/sdc
# Neues, verschlüsseltes Datenset anlegen
zfs create -o encryption=on -o keyformat=raw \
-o keylocation=file:///root/local.key rpool/data
-o keylocation=file:///root/local.key HDD/data
# Als Storage zu Proxmox hinzufügen
pvesm add zfspool HDD -pool HDD/data
```
### Unlock beim Systemstart
Standardmäßig wird beim Systemstart nur die Root-Partition entschlüsselt, um den Vorgang komfortabel zu halten, werden die weiteren Datensets hier mit Keymaterial aus dieser Partition entschlüsselt (Siehe [Hinweis](#datenpartitionen-verschlusseln)). Dazu wird ein entsprechender Dienst angelegt.
Passiert dies nicht, wird Proxmox viele Fehler produzieren, da es versucht, die VMS und Container zu starten, jedoch nicht auf deren Images zugreifen kann.
``` bash
# Dienst zum Unlock beim Systemstart anlegen
cat > /etc/systemd/system/zfs-load-key.service <<EOF
[Unit]
@ -168,160 +304,7 @@ systemctl enable zfs-load-key.service
!!! warning
Anschließend den Key (```/root/local.key```) sichern!
7. Netzwerkkonfiguration vornehmen
1. Alle Schnittstellen auf MTU 9000 einstellen (unter Advanced)
2. Mindestens ein eigenes Netz für den Cluster und Ceph erstellen (vorzugsweise 10G)
3. Bridge anlegen für VLANs für die VMs anlegen (vmbr1, vorzugsweise 10G)
4. IPs passend festlegen
5. Konnektivität prüfen
## Clusterkonfiguration
1. Einrichtung des Clusters auf einer der Nodes über die GUI. Der Link sollte auf das schnelle Netz zeigen.
2. Die anderen Nodes über die GUI joinen.
3. Bei komplexeren Setups mit Failover etc. bietet es sich an, die Adressen der Hosts in den Hosts-Datei zu spezifizieren und die ```/etc/corosync/corosync.conf``` manuell anzupassen. Siehe [Seperate Cluster Network](https://pve.proxmox.com/wiki/Separate_Cluster_Network) im Proxmox-Wiki.
!!! warning
Bei jeder Änderung der ```/etc/corosync/corosync.conf``` *muss* die ```config_version``` erhöht werden, damit die Datei im Cluster aktiv wird!
4. Das Migration-Netzwerk sollte vom Cluster-Netzwerk getrenn sein und muss dann manuell festgelegt werden. Dies erfolgt in der ```/etc/pve/datacenter.cfg```:
``` json
migration: secure,network=192.168.10.0/24
```
## Ceph-Einrichtung
### Grundeinrichtung
1. Ceph auf dem ersten Node in der GUI installieren (Advanced aktivieren), Netzwerke passend auswählen, Replicas passend einstellen.
2. Ceph auf den anderen Nodes in der GUI installieren (Adcanced aktivieren).
3. Monitore, Manager und Metadata-Server auf den weiteren Nodes hinzufügen.
4. OSDs auf allen Nodes hinzufügen, dabei für HDD evtl. WAL+DB auf SSD auslagern sowie Encryption aktivieren.
!!! tip
Wenn WAL+DB auf einer Partition angelegt werden soll, muss zunächst das LVM vorbereitet werden, dazu:
1. Mit fdisk Partition anlegen (Typ 30)
2. LVM anlegen
``` bash
# Physival Volume erstellen
pvcreate /dev/sdX4
# Volumegroup erstellen
vgcreate ceph-db-0 /dev/sdX4
```
### Pools einrichten
#### Replikation verwenden
1. Wenn SSDs und HDDs zum Einsatz kommen, können unterschiedliche Crush-Regeln angelegt
werden, um Pools für schnellen und langsamen Speicher zu erstellen:
``` bash
ceph osd crush rule create-replicated replicated_hdd default host hdd
ceph osd crush rule create-replicated replicated_ssd default host ssd
```
2. Pools anlegen und dabei die Crush-Regeln und die Redundanz (Replicas = Original + Anzahl Kopien) passend auswählen.
#### Erasurecode verwenden
Es ist auch möglich, Erasurecode zu verwenden. So werden Daten nicht
vollständig repliziert, sondern Prüfsummen erstellt (ähnlich zu RAID5
etc.). Dies benötigt mehr Rechenleistung und etwas bis erheblich
weniger Speicherplatz. Hier wird von einer Konfiguration analog zu
RAID5 ausgegangen, d.h. auf zwei Datenblöcke (k=2) kommt ein
Paritätsblock (m=1). Somit kann der Ausfall einer Einheit kompensiert
werden. Dies ist nur für unwichtige Daten sinnvoll, denn es ist sehr
wahrscheinlich, dass beim Recovery eine zweite Einheit ausfällt
(analog zu RAID5). Es geht also lediglich darum, den Betrieb aufrecht
zu erhalten. Notfalls kann später ein vorhandenes Backup eingespielt
werden.
Dieses Problem lässt sich durch weitere Nodes / OSDs verkleinern, sodass
es nicht mehr so kritisch wie bei einem RAID5 ist. Außerdem können
natürlich mehr redundante Blöcke vorgehalten werden (m>1).
k+m entspricht der Anzahl der benötigten Nodes (wenn die Fehlerdomain auf
'host' eingestellt wird).
``` bash
# EC-Profil anlegen
ceph osd erasure-code-profile set erasure_medien_hdd\
plugin=jerasure k=2 m=1 technique=reed_sol_van\
crush-root=default crush-failure-domain=host\
crush-device-class=hdd
# Pool erstellen
ceph osd pool create cephfs_ec_data 128 erasure erasure_medien_hdd
# Overwrites für CephFS-Nutzung erlauben
ceph osd pool set cephfs_ec_data allow_ec_overwrites true
# Gleichzeitiges lesen von mehreren OSDs
ceph osd pool set cephfs_ec_data fast_read true
```
### VM-Disks anlegen
Die Pools können direkt als Storage genutzt werden. Wichtig ist, dass als Dateisystem XFS verwendet wird. Dies ist etwas schneller und deutlich stabiler in den Transferraten als ext4. Außerdem kann man zur Leistungssteigerung den Writeback-Cache aktivieren und den IO-Thread aktivieren (dazu als SCSI-Controller in der VM _Virtio SCSI single_ auswählen.
### CephFS nutzen
Wenn man CephFS nutzt, können die angelegten Pools entsprechenden Crush-Regeln zugewiesen werden. Der Metadata-Pool sollte immer auf SSDs liegen!
1. Zugangsdaten auf dem Cluster anlegen
``` bash
# ceph fs authorize <cephfs-name> client.<nutzername>
# <verzeichnis> <berechtigung> ... <verzeichnis> <berechtigung>
ceph fs authorize cephfs client.daniel / rw
```
2. Den angezeigten Key in eine Datei auf dem Client kopieren
3. Vom Client aus mounten
``` bash
mount.ceph <monitor-ip>:/ /mnt -o name=daniel,secretfile=ceph.key
```
4. Oder in der /etc/fstab eintragen:
```
<mon1_ip>,<mon2_ip>,<mon3_ip>:/ /mnt/cephfs/ ceph name=<username>,secretfile=<keyfile>,noatime,_netdev 0 0
```
Sehr viele weitere Einstellungen und sehr differenzierte Berechtigungen sind möglich. Siehe [Client-Auth](https://docs.ceph.com/en/latest/cephfs/client-auth/).
### CephFS mit Erasurecode-Pool nutzen
Es kann, aufgrund des geringeren Speicherplatzbedarfs, sinnvoll sein, für den
CephFS-Pool einen Erasurecode-Pool zu verwenden. Dies ist nur für den
Datenpool möglich, der Metadatenpool muss immer ein replizierter Pool sein.
``` bash
# Zu CephFS hinzufügen
ceph fs add_data_pool cephfs cephfs_ec_data
```
Auf dem Client im (als client.admin) gemounteten Filesystem:
``` bash
# Unterverzeichnis anlegen
mkdir ec
# Verzeichnis an neuen Pool binden
setfattr -n ceph.dir.layout.pool -v cephfs_ec_data ec
```
### VM-Disk vs. gemountetes CephFS
Man kann statt eine VM-Disk anzulegen auch ein CephFS direkt mounten. Dies hat verschiedene Vor- und Nachteile.
| Eigenschaft | Disk | Mount |
| ---------------------------------------------- | --------------------------------- | --------------------------------- |
| einfachere Einrichtung | :material-check-circle:{ .green } | :material-close-circle:{ .red } |
| Backup in Proxmox möglich | :material-check-circle:{ .green } | :material-close-circle:{ .red } |
| als Systemlaufwerk nutzbar | :material-check-circle:{ .green } | :material-close-circle:{ .red } |
| Nutzung von verschiedenen Clients gleichzeitig | :material-close-circle:{ .red } | :material-check-circle:{ .green } |
| "unbegrenztes" Wachstum | :material-close-circle:{ .red } | :material-check-circle:{ .green } |
| geringfügig höhere Geschwindigkeit | :material-close-circle:{ .red } | :material-check-circle:{ .green } |
## Fußnoten
[^1]: Native ZFS-Verschlüsselung mit Proxmox: [Quelle](https://gist.github.com/yvesh/ae77a68414484c8c79da03c4a4f6fd55)
[^2]: Nagscreen mit DPKG-Post-Invoke-Hook dauerhaft entfernen: [Quelle](https://github.com/tteck/Proxmox/blob/main/misc/post-pve-install.sh)

View File

@ -27,9 +27,16 @@ theme:
- navigation.tabs
- navigation.tabs.sticky
- navigation.instant
- navigation.instant.prefetch
- navigation.tracking
- navigation.top
- navigation.path
- navigation.prune
- navigation.indexes
- toc.follow
- content.code.select
- content.code.copy
- content.code.annotate
- search.suggest
- search.highlight
- search.share