software:proxmox

Proxmox VE

Proxmox VE (Proxmox Virtual Environment; kurz PVE) ist eine auf Debian basierende Open-Source-Virtualisierungsplattform zum Betrieb von virtuellen Maschinen mit einer Web-Oberfläche zur Einrichtung und Steuerung von x86-Virtualisierungen. Die Umgebung basiert auf QEMU mit der Kernel-based Virtual Machine (KVM). PVE bietet neben den Betrieb von klassischen virtuellen Maschinen (Gastsystemen), die auch den Einsatz von Virtual Appliances erlauben, auch LinuX Containers (LXC) an.

Durch die Verwendung einer Web-Oberfläche wird ein Großteil der einfachen Arbeiten wie das Einrichten, Starten und Stoppen, Erstellen von Backups und Verwaltung der Netzwerkinfrastruktur und der laufende Betrieb von virtuellen Maschinen und den dazugehörigen Speichersystemen am Hostsystem erleichtert. Weiters können Cluster von mehreren PVE-Hostsystemen basierend auf der Corosync Cluster Engine gebildet werden welche gemeinsam verwaltet werden und zwischen welchen virtuelle Maschinen und deren virtuelle Festplattenspeicher ausgetauscht werden können. Dies ermöglicht den Aufbau von Hochverfügbarkeitsclustern.

Quelle: Wikipedia

PVE 6.0 bietet eine Integration von Ceph Nautilus und weitere Verbessserungen.

Bei der Installation vom Proxmox-ISO werden abgefragt:

  1. root-Passwort (aktuell x…)
  2. E-Mail-Adresse für fail-over-Warnungen etc.

Leider kann die Partitionierung nicht beeinflusst werden, daher kann es Sinn machen Proxmox auf einem Debian nachzuinstallieren: Install Proxmox VE on Debian Stretch.

https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Buster

nano /etc/hosts
hostname --ip-address
 
echo "deb http://download.proxmox.com/debian/pve buster pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
apt update && apt full-upgrade
apt install proxmox-ve postfix open-iscsi
 
apt remove os-prober

https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_11_Bullseye

wget https://enterprise.proxmox.com/debian/proxmox-release-bullseye.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg 
 
echo "deb [arch=amd64] http://download.proxmox.com/debian/pve bullseye pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
 
sha512sum /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg 
# 7fb03ec8a1675723d2853b84aa4fdb49a46a3bb72b9951361488bfd19b29aab0a789a4f8c7406e71a69aabbc727c936d3549731c4659ffa1a08f44db8fdcebfa  /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg 
apt update && apt full-upgrade
apt install proxmox-ve
systemctl disable rpcbind
systemctl stop rpcbind
 
apt remove os-prober

# create bridge

reverse-Proxy-Config 443 → https://localhost:8006

VLANS können (bei entsprechender Unterstützung durch den Switch via tagging) unterschiedliche virtuelle Netze aufspannen. Dazu wird eine „Vlan aware“-bridge einrichtet und anschließend in der Konfiguration der VM das entsprechende VLAN gesetzt werden (oder im Betriebssystem angeben werden falls es eine Firewall ist).

Achtung: Falls die Netzwerkkarte oder der Switch nicht 4096-Vlans unterstützt, muss die komplette Liste:

bridge-vlan-aware yes
bridge-vids 1-4096

durch eine spezfischere Angabe ersetzt werden:

    bridge-vlan-aware yes
    bridge-vids 100 101 102

https://forum.proxmox.com/threads/question-how-to-create-vlan-aware-bridge-with-linux-bridge.85170

Konfigurationsdatei: /etc/pve/domains.cfg

  • $SERVER hostname vom LDAP-Server
  • $DOMAIN domain
  • $TLD Endung

Beispiel sind der Baum proxmox.apps.$DOMAIN.$TLD mit Filter auf die Gruppe mit gid 1000 oder gid 1001

pam: pam
	comment Linux PAM standard authentication

pve: pve
	comment Proxmox VE authentication server

ldap: LDAP
	base_dn cn=users,dc=$DOMAIN,dc=$TLD
	comment my LDAP-Directory ($SERVER.$DOMAIN.$TLD)
	server1 $SERVER.$DOMAIN.$TLD
	user_attr uid
	bind_dn cn=proxmox,cn=apps,dc=$DOMAIN,dc=$TLD
	filter (|(gidNumber=1000)(gidNumber=1001))
	group_filter cn=proxceph_admins
	group_dn dc=$DOMAIN,dc=$TLD
	group_classes groupOfNames
	default 1
	secure 1
	sync-defaults-options enable-new=1,full=1,purge=0,scope=both

echo „“ > /var/www/html/index.nginx-debian.html

/etc/nginx/sites-enabled/default (SERVER.DOMAIN.TLD durch den korrekten FQDN ersetzen)

server{
  listen 80;
  listen [::]:80;

  server_name SERVER.DOMAIN.TLD;
  server_tokens off;

  return 301 https://SERVER.DOMAIN.TLD$request_uri;
}

Achtung: Fehler bei der Websocket-Configuration bricht die Funktionalität der Oberfläche und die Konsolen-Funktion kann kaputt gehen.

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=APP_cache:10m max_size=3g inactive=120m use_temp_path=off;

upstream proxmox {
  server 127.0.0.1:8006;
}


server {
    listen      80;
    listen [::]:80;
    server_name SERVER.DOMAIN.TLD;
    location / {
      return 301 https://$host$request_uri;
    }
}


server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name SERVER.DOMAIN.TLD;

    ssl_certificate /etc/letsencrypt/live/SERVER.DOMAIN.TLD/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/SERVER.DOMAIN.TLD/privkey.pem;

    include /etc/nginx/snippets/tls-hardening.conf;

    add_header Strict-Transport-Security "max-age=31536000";    

    client_max_body_size 25m;
    charset utf-8;

    access_log /var/log/nginx/SERVER.DOMAIN.TLD-access.log;
    error_log /var/log/nginx/SERVER.DOMAIN.TLD-error.log;

    # ask search engines not to index the site
    add_header X-Robots-Tag "noindex, nofollow";

    gzip on;
    gzip_types text/plain text/css application/javascript application/json;
    gzip_vary on;

    proxy_redirect off;
    location / {
        client_max_body_size 50M;

        # proper websocket proxying
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_connect_timeout 3600s;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;

        # don't buffer anything
        proxy_request_buffering off;
        proxy_buffering off;

       proxy_pass https://proxmox;
  }
}

systemctl restart nginx

  • Images auf einen proxmox-Host kopieren
  • Config anlegen und ID unten angeben
  • Import (kopiert Daten um!)
    qm importdisk <vmid> $IMAGE.qcow2 $POOL
  • Config ändern (import ist „unused disk0“):
    • virtio
    • boot einstellen!

Ablage:

  • lokal: auf /var/lib/vz/template/iso
  • alle storages die „ISO Image“ haben

Ohne eine Subskription:

  1. wird bei Web-Login eine Warnmeldung angezeigt
  2. Zugriff auf das enterprise-Repo von Proxmox ist nicht möglich → keine Kernel-Updates oder Zugriff auf kernel-header

Die Preise beginnen bei ~85€ pro Jahr und CPU-Sockel.

Anzahl der Sockel anzeigen (auch via GUI möglich).

dmidecode -t4 | egrep 'Designation|Status'
	Socket Designation: CPU1
	Status: Populated, Enabled
	Socket Designation: CPU2
	Status: Unpopulated

Proxmox bildet ein quorum über die laufendene Clustermitglieder, solange die Mehrheit der nodes sich einig sind ist der Cluster Ok (healthy). Fällt eine Node aus, können die laufenden VMs auf einem anderen Server neu gestartet werden solange ein shared-storage bestand (Ceph, Gluster, …).

Ohne shared storage bleibt nur

VM aus dem letzen backup wiederherstellen:

  • via backup-storage
  • aus einem manuellen backup (gesicherte Datei oder zfs-volume 1) )

https://pve.proxmox.com/wiki/Backup_and_Restore https://cyberpersons.com/2016/09/13/backup-transfer-proxmox-vm-another-proxmox-node/

Nach Transfer von VMs auf einen anderen Node sind ggf. iso-Einbindungen anzupassen (:!: Wichtig! sonst funktioniert auch das automatisierte Backup nicht), zusätzlich könnten die network devices anders heißen (vmbr0 → vmbr1 o.ä.).

Übersicht

Anmerkung: Werden VMs auf einen anderen Speicher migriert, müssen snapshots vorher gelöscht werden (mindestens beim Wechsel von Blockbasierten auf Dateibasierten Storage).

Samba oder Windows als Speicherserver.

Durch ZFS on Linux ist unter Proxmox die Nutzung von ZFS möglich.

Proxmox VE ZFS replication manager (pve-zsync)

Durch PVE-zsync kann via cron-job (Intervall bis runter auf 1min) ZFS-Pools asynchron replizieren. Damit verliert man „nur“ die Daten seit dem letzen Sync.

:!: NTP-Dienst muss laufen, clock skew kommt schon mit Standardeinstellungen (Warnung bei 0,05s Unterschied) - entweder die skew höher erlauben oder NTP-intervall erhöhen „server xxx iburst minpoll 4 maxpoll 7“)

# → creating /etc/pve/priv/ceph.client.admin.keyring

/etc/network/interfaces :
auto vmbr0:1
iface vmbr0:1 inet static
        address 10.1.2.1/24

/etc/hosts (alle nodes!):

# ceph
10.1.2.1 srv1-ceph.domain.tld srv1-ceph
10.1.2.2 srv2-ceph.domain.tld srv2-ceph
10.1.2.3 srv3-ceph.domain.tld srv3-ceph
  • auf jeder Node: pveceph install
  • Netzwerk definieren (Beispielnetz: 10.1.2.0/24): pveceph init –network 10.1.2.0/24 (dieser Wert wird für public network + cluster network benutzt!)
  • mon/mgr anlegen (mind. 3x):
    1. über SSH: pveceph createmon
    2. oder über web auf einem beliebigem Node

Festplatten als OSD hinzufügen (hier sda bis sdh):

for disk in sda sdb sdc sdd sde sdf sdg sdh
do
  pveceph createosd /dev/$disk
done
ceph osd crush rule create-replicated replicated_hdd default host hdd
ceph osd crush rule create-replicated replicated_ssd default host ssd
# ceph osd crush rule create-replicated replicated_nvme default host nvme
 
#ceph osd getcrushmap > crush.map.lng.bin # CRUSH-Map extrahieren
#crushtool -d crush.map.lng.bin -o crush.map.txt
#nano crush.map.txt
 
ceph osd pool create proxmox_3repl_hdd replicated
ceph osd pool create proxmox_3repl_ssd replicated
ceph osd pool create proxmox_2repl_hdd replicated
ceph osd pool create proxmox_2repl_ssd replicated
 
ceph osd pool set proxmox_3repl_hdd size 3
ceph osd pool set proxmox_3repl_hdd min_size 2
 
ceph osd pool set proxmox_3repl_ssd size 3
ceph osd pool set proxmox_3repl_ssd min_size 2
 
ceph osd pool set proxmox_2repl_hdd size 2
ceph osd pool set proxmox_2repl_hdd min_size 1
 
ceph osd pool set proxmox_2repl_ssd size 2
ceph osd pool set proxmox_2repl_ssd min_size 1
 
ceph osd pool set proxmox_3repl_hdd crush_rule replicated_hdd
ceph osd pool set proxmox_2repl_hdd crush_rule replicated_hdd
 
ceph osd pool set proxmox_3repl_ssd crush_rule replicated_ssd
ceph osd pool set proxmox_2repl_ssd crush_rule replicated_ssd
 
# ceph osd pool set $POOL_NAME crush_rule replicated_ssd
# ceph osd pool set $POOL_NAME crush_rule replicated_nvme
 
# RBD zuweisen:
ceph osd pool application enable proxmox_3repl_hdd rbd
ceph osd pool application enable proxmox_2repl_hdd rbd
ceph osd pool application enable proxmox_3repl_ssd rbd
ceph osd pool application enable proxmox_2repl_ssd rbd

via gui oder:

  1. MDS entfernen: via GUI oder pveceph mds destroy NAME
  2. ceph rm fs NAME --yes-i-really-mean-it

(leider nicht über GUI möglich)

Schema: ceph osd crush rule create-replicated <rule-name> <root> <failure-domain> <class>

Erklärung:

  • <rule-name> name of the rule, to connect with a pool (seen in GUI & CLI)
  • <root> which crush root it should belong to (default ceph root „default“)
  • <failure-domain> at which failure-domain the objects should be distributed (usually host)
  • <class> what type of OSD backing store to use (eg. nvme, ssd, hdd)

ceph osd crush rule create-replicated ssd_only default host ssd ceph osd crush rule create-replicated hdd_only default host hdd ceph osd crush rule ls

replicated_rule → mixed ssd_only → ssd hdd_only → hdd

Welche OSDs gehören zur Klasse SSD? - den kompletten Baum: ceph osd tree (Spalten CLASS, NAME) - ceph osd crush class ls-osd ssd → zeigt die osd.NUMMERN an

For replicated pools it is the ruleset specified by the osd pool default crush replicated ruleset config variable. → http://docs.ceph.com/docs/luminous/rados/operations/pools/

anschließend einem Pool zuweisen. - GUI - Shell

ceph osd pool set {pool-name} {key} {value}

Beispiel: der pool „cephfs_metadata“ bekommt nun die rule „ssd_only“: ceph osd pool set cephfs_metadata crush_rule ssd_only Ausgabe: „set pool 7 crush_rule to ssd_only“ → Achtung: Die Daten werden nun ggf. umkopiert!

Funktionieren muss:

  • pveproxy
  • Port 8006 for alle Nodes untereinander erlaubt
  • korrekte nginx-config

rpcbind muss nur aktiv sein wenn glusterfs benutzt wird aber nicht für proxmox oder console.

  • Backup-Job (System)
    1. manuell starten können
    2. inkrementelle Jobs möglich machen
    3. run before/run after-Hooks
    4. freier definierbar Backup-Jobs via GUI (Quelle z.B. ein Verzeichnis)
  • ZFS storage von der Oberfläche löschen können
    1. Erweiterung der bulk Aktionen „Bulk config change“:
    2. bridge ändern (MAC bleibt!)
    3. boot-CD ändern
    4. autostart-Modus
  • ceph
    • crush-rules editierbar machen
  • storage
    1. Spalte Dateidatum bei Content-auflistung würde z.B. beim Backup-Restore helfen
    2. Festplatte „sauber“ machen (use-case: zfs auf ehemals gebrauchten Festplatten anlegen, zfs-Befehl erkennt das mal ein ext4 drauf lag und verlangt -f/force was die gui aber nicht mitgibt. daher ssh-login und dd notwendig)
  • Permission-System anhand der Pfade ggf. verbesserungswürdig
  • Upload von Dateien über Web >2G nicht möglich (scp nehmen)

Um das Quorum zu erhalten und Split-Brain zu vermeiden muss sich eine Mehrheit der Nodes einig sein. Wenn es nur zwei davon gibt und eine nicht mehr verfügbar ist, dann ist das nicht mehr gegeben und /etc/pve wird auf Read-Only gesetzt.

Befehl auf der Shell:

pvecm expected 1

Dauerhaft: /etc/pve/cluster.conf

<cman two_node="1" expected_votes="1" [...bestehende weitere Konfiguration...] > </cman>

VM locked

Manchmal gibt es Situation wo ein Lock bestehen bleibt weil die auslösende Aktion abgebrochen wurde. Dann ist manuelle Abhilfe notwendig:

qm unlock $ID

1)
zfs list -o name,type,mountpoint z.B. local_storage_srv1/vm-100-disk-0