Documentation officielle d'installation de Proxmox VE : https://pve.proxmox.com/pve-docs/chapter-pve-installation.html
A la fin de l'installation de Proxmox, un petit script existe pour changer quelques configurations :
bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/misc/post-pve-install.sh)"
Afin de bénéficier de la place disponible d'un disque dur nouvellement ajouté à la machine, il fait le configurer dans Proxmox pour permettre son utilisation.
Pour cela, rendez vous dans la catégorie Disk de votre hyperviseur, et cliquer sur Create Volume Group :

Pensez à retenir le nom de votre volume, on va en avoir besoin par la suite.
Votre disque est prêt à être utilisé !
Par la suite je vais utiliser Packer et Terraform pour déployer l'infra rapidement, pour cela, je vais créer un utilisateur dédié :


Et on lui ajoute les bonnes permissions :


Là aussi vous êtes libre de créer ce template par les moyens que vous souhaitez, dans mon cas je vais en profiter pour utiliser Packer avec l'aide de l'excellent projet de QJoly :
Dans ce POC je vais avoir besoin de 3 VM.
Pour leur création, je vais utiliser Terraform.
Il faut installer le client Terraform sur sa machine, dans mon cas j'utilise MacOS donc je l'installe avec :
brew install terraform
Ensuite nous avons besoin d'un fichier pour permettre à Terraform de se connecter à notre cluster Proxmox : provider.tf
terraform {
required_providers {
proxmox = {
source = "Telmate/proxmox"
version = "2.9.14"
}
}
}
provider "proxmox" {
pm_api_url = "https://<IP_DU_PROXMOX>:8006/api2/json"
pm_user = "terraform@pve"
pm_password = "<MOT_DE_PASSE>"
pm_tls_insecure = "true"
pm_parallel = 3
}
Et d'un autre fichier pour décrire l'infrastructure que nous voulons : main.tf
module "machinetest" {
count = 3
source = "QJoly/proxmox/module"
version = "0.0.1"
node_name = "master-${count.index}-tf"
node_target = "<NOM_DU_SERVER_PROXMOX>"
node_qemuga = 1
node_pool = ""
node_size_disk = "32G"
node_bootauto = true
node_template = "<NOM_DU_TEMPLATE>"
node_storage_disk = "<NOM_DE_VOTRE_STORAGE>"
node_network_host = "vmbr0"
node_notes = "Super-VM for the customer No 01"
node_cpu = 4
node_memory = 4092
}
Ce qui nous donnes ces deux fichiers :
.
├── main.tf
└── provider.tf
# On initialise Terraform
terraform init
# On vérifie ce que va faire Terraform
terraform plan
# Et on lance les joyeusetés !
terraform apply
Voici les 3 machines virtuelles qui ont bien été créées :

hostnamectl set-hostname <NOM_DU_SERVER>
Pour ça, j'utilise directement un petit script qui m'automatise toute la configuration :
https://github.com/PAPAMICA/terminal
apt update && apt install -y curl && curl -Ls https://raw.githubusercontent.com/PAPAMICA/terminal/main/server_utils.sh | bash -s -- --motd --all-users
J'édite le fichier /etc/network/interfaces avec ces lignes :
# The primary network interface
allow-hotplug ens18
iface ens18 inet static
address 10.10.0.250
netmask 255.255.255.0
gateway 10.10.0.1
dns-nameservers 10.10.0.1 1.1.1.1
Et on applique toutes nos modifications avec un petit reboot :
reboot now
Il faut bien évidemment faire pareil sur les 3 serveurs en changeant les hostnames et les IP

On installe K3S sur le master avec la commande :
curl -sfL https://get.k3s.io | sh -
On peux récupérer le token de connexion au cluster sur le master :
cat /var/lib/rancher/k3s/server/node-token
On installe K3S et on rejoins le cluster avec cette commande sur les nodes :
curl -sfL https://get.k3s.io | K3S_URL=https://<IP_DU_MASTER>:6443 K3S_TOKEN=<TOKEN_DE_CONNEXION> sh -
Deux petites commandes pour vérifier l'état du cluster à faire sur le master :
# Vérification des services essentiels :
kubectl get pods -A
# Résultat attendu :
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system local-path-provisioner-76d776f6f9-zfvl2 1/1 Running 0 16m
kube-system coredns-59b4f5bbd5-pq9tc 1/1 Running 0 16m
kube-system helm-install-traefik-crd-2zcts 0/1 Completed 0 16m
kube-system helm-install-traefik-fp9r2 0/1 Completed 1 16m
kube-system svclb-traefik-9b862d50-55xl9 2/2 Running 0 6m15s
kube-system traefik-57c84cf78d-xz84t 1/1 Running 0 6m15s
kube-system metrics-server-7b67f64457-7tvs2 1/1 Running 0 16m
kube-system svclb-traefik-9b862d50-hmmgj 2/2 Running 0 63s
kube-system svclb-traefik-9b862d50-w92rm 0/2 Pending 0 13s
# Vérification des noeuds :
kubectl get nodes
# Résultat attendu :
NAME STATUS ROLES AGE VERSION
node01 Ready <none> 3m23s v1.26.5+k3s1
master01 Ready control-plane,master 18m v1.26.5+k3s1
node02 NotReady <none> 2m34s v1.26.5+k3s1
Le cluster K3S est prêt pour nos premiers tests !