Add k8s configs and update documentation with AWX setup

This commit is contained in:
darnodo
2025-08-29 15:05:17 +02:00
parent 97b88a7b94
commit bc0c9dd450
5 changed files with 325 additions and 105 deletions

1
.gitmodules vendored
View File

@@ -1,3 +1,4 @@
[submodule "k8s/aws/awx-operator"] [submodule "k8s/aws/awx-operator"]
path = k8s/aws/awx-operator path = k8s/aws/awx-operator
url = https://github.com/ansible/awx-operator.git url = https://github.com/ansible/awx-operator.git
ignore = all

374
README.md
View File

@@ -2,15 +2,35 @@
## Description ## Description
Ce repository contient l'Infrastructure as Code (IaC) pour un environnement de homelab. Il utilise Terraform pour provisionner des machines virtuelles sur Proxmox VE avec une configuration automatique via Cloud-Init et une intégration Tailscale. Ce repository contient l'Infrastructure as Code (IaC) pour un environnement de homelab moderne. Il utilise Terraform pour provisionner des machines virtuelles sur Proxmox VE avec une configuration automatique via Cloud-Init, une intégration Tailscale, et un déploiement Kubernetes avec AWX pour l'orchestration Ansible.
## Fonctionnalités ## Fonctionnalités
- 🚀 **Déploiement automatisé** : Création de VMs via Terraform - 🚀 **Déploiement automatisé** : Création de VMs via Terraform
- 🔧 **Configuration automatique** : Initialisation via Cloud-Init - 🔧 **Configuration automatique** : Initialisation via Cloud-Init
- 🌐 **Réseau sécurisé** : Connexion automatique à Tailscale - 🌐 **Réseau sécurisé** : Connexion automatique à Tailscale
- ☸️ **Orchestration Kubernetes** : Cluster K8s avec services exposés via Tailscale
- 🎯 **AWX/Ansible** : Interface web pour l'exécution de playbooks
- 📦 **Templates multiples** : Support Ubuntu, Debian, Alpine, Rocky, CentOS - 📦 **Templates multiples** : Support Ubuntu, Debian, Alpine, Rocky, CentOS
- 🏷️ **Organisation** : Système de tags pour classifier les VMs - 🏷️ **Organisation** : Système de tags pour classifier les VMs
- 🔒 **Exposition sécurisée** : Services HTTPS automatiques via Tailscale Operator
## Architecture
```
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Proxmox VE │ │ Tailscale │ │ Applications │
│ │ │ Network │ │ │
│ ┌─────────────┐ │ │ │ │ ┌─────────────┐ │
│ │ VM K8s │─┼────┤ ├────┤ │ AWX │ │
│ │ Master │ │ │ │ │ │ (HTTPS) │ │
│ └─────────────┘ │ │ │ │ └─────────────┘ │
│ ┌─────────────┐ │ │ │ │ ┌─────────────┐ │
│ │ VM Apps │─┼────┤ ├────┤ │ Autres │ │
│ │ │ │ │ │ │ │ Services │ │
│ └─────────────┘ │ │ │ │ └─────────────┘ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
```
## Structure du projet ## Structure du projet
@@ -25,18 +45,30 @@ iac-homelab/
│ ├── variables.tf # Variables │ ├── variables.tf # Variables
│ ├── terraform.tfvars # Configuration personnalisée │ ├── terraform.tfvars # Configuration personnalisée
│ └── terraform.tfvars.example # Exemple de configuration │ └── terraform.tfvars.example # Exemple de configuration
── cloud-init/ ── cloud-init/
└── user-data.yml.tftpl # Template Cloud-Init └── user-data.yml.tftpl # Template Cloud-Init
└── k8s/
└── awx/
├── awx-cr.yml # AWX Custom Resource
├── awx-pvc.yml # Stockage persistant AWX
└── tailscale-ingress.yml # Exposition HTTPS via Tailscale
``` ```
## Prérequis ## Prérequis
### Infrastructure de base
- **Terraform** : Version récente installée - **Terraform** : Version récente installée
- **Proxmox VE** : Serveur opérationnel avec API activée - **Proxmox VE** : Serveur opérationnel avec API activée
- **Templates VM** : Templates configurés avec les tags appropriés - **Templates VM** : Templates configurés avec les tags appropriés
- **Tailscale** : Compte avec clé d'authentification - **Tailscale** : Compte avec clé d'authentification
- **SSH** : Clés SSH configurées - **SSH** : Clés SSH configurées
### Kubernetes et services
- **kubectl** : CLI Kubernetes installé
- **Helm** : Gestionnaire de packages Kubernetes
- **AWX Operator** : Pour le déploiement d'AWX
- **Tailscale Operator** : Pour l'exposition sécurisée des services
## Configuration initiale ## Configuration initiale
### 1. Proxmox VE ### 1. Proxmox VE
@@ -67,9 +99,25 @@ Créer des templates sur Proxmox avec les tags suivants :
| Rocky | `["rocky", "template"]` | | Rocky | `["rocky", "template"]` |
| CentOS | `["centos", "template"]` | | CentOS | `["centos", "template"]` |
### 3. Configuration Tailscale
Dans votre console d'administration Tailscale, ajouter les tags requis dans le fichier ACL :
```json
"tagOwners": {
"tag:k8s-operator": [],
"tag:k8s": ["tag:k8s-operator"],
}
```
Créer un client OAuth avec les permissions :
- **Devices** : Read/Write
- **Keys/authkeys** : Read/Write
- **Tags** : `k8s-operator`
## Déploiement ## Déploiement
### 1. Configuration ### 1. Infrastructure Terraform
```bash ```bash
# Cloner le repository # Cloner le repository
@@ -83,9 +131,7 @@ cp terraform.tfvars.example terraform.tfvars
vim terraform.tfvars vim terraform.tfvars
``` ```
### 2. Variables importantes Configuration des VMs dans `terraform.tfvars` :
Dans `terraform.tfvars`, configurer :
```hcl ```hcl
# Proxmox # Proxmox
@@ -100,19 +146,28 @@ admin_ssh_public_key_path = "~/.ssh/id_rsa.pub"
# VMs # VMs
virtual_machines = { virtual_machines = {
"monitoring" = { "k8s-master" = {
os = "debian"
cores = 4
memory = 8192
disk_gb = 50
ip = "192.168.1.160"
gateway = "192.168.1.254"
tags = ["kubernetes", "master"]
},
"apps" = {
os = "debian" os = "debian"
cores = 2 cores = 2
memory = 4096 memory = 4096
disk_gb = 30 disk_gb = 30
ip = "192.168.1.161" ip = "192.168.1.161"
gateway = "192.168.1.254" gateway = "192.168.1.254"
tags = ["monitoring"] tags = ["applications"]
} }
} }
``` ```
### 3. Déploiement Déployer l'infrastructure :
```bash ```bash
# Initialisation # Initialisation
@@ -125,139 +180,248 @@ terraform plan
terraform apply terraform apply
``` ```
## Configuration des VMs ### 2. Installation Kubernetes
### Options de base Sur la VM master Kubernetes :
```hcl ```bash
"nom-vm" = { # Installation de K3s (exemple)
os = "debian" # Template à utiliser curl -sfL https://get.k3s.io | sh -
cores = 2 # Nombre de cœurs CPU
memory = 4096 # RAM en MB # Récupérer le kubeconfig
disk_gb = 30 # Taille du disque en GB sudo cat /etc/rancher/k3s/k3s.yaml
ip = "192.168.1.100" # Adresse IP statique
gateway = "192.168.1.254" # Passerelle réseau
tags = ["web"] # Tags pour l'organisation
}
``` ```
### Options avancées ### 3. Installation Tailscale Operator
```hcl ```bash
"nom-vm-avancee" = { # Créer le namespace avec labels privilégiés
# Configuration de base kubectl create namespace tailscale
os = "ubuntu" kubectl label namespace tailscale pod-security.kubernetes.io/enforce=privileged
cores = 4
memory = 8192 # Ajouter le repository Helm
disk_gb = 50 helm repo add tailscale https://pkgs.tailscale.com/helmcharts
ip = "192.168.1.101" helm repo update
gateway = "192.168.1.254"
# Installer l'opérateur
# Options avancées helm upgrade \
cpu_type = "host" --install \
datastore = "local-lvm" tailscale-operator \
network_bridge = "vmbr0" tailscale/tailscale-operator \
username = "admin" --namespace=tailscale \
--create-namespace \
# Disques supplémentaires --set-string oauth.clientId="<OAuth-client-ID>" \
additional_disks = [ --set-string oauth.clientSecret="<OAuth-client-secret>" \
{ --wait
interface = "scsi1"
datastore = "local-lvm"
size = 100
}
]
}
``` ```
## Fonctionnalités automatiques ### 4. Installation AWX
### Cloud-Init ```bash
# Créer le namespace AWX
kubectl create namespace awx
Chaque VM est automatiquement configurée avec : # Installer l'opérateur AWX
- Installation des packages de base kubectl apply -f https://raw.githubusercontent.com/ansible/awx-operator/devel/deploy/awx-operator.yaml
- Configuration de l'utilisateur et des clés SSH
- Installation du QEMU Guest Agent
- Configuration du hostname
### Tailscale # Déployer AWX avec la configuration personnalisée
kubectl apply -f k8s/awx/awx-pvc.yml
kubectl apply -f k8s/awx/awx-cr.yml
Installation et connexion automatique : # Exposer AWX via Tailscale avec HTTPS automatique
- Téléchargement et installation de Tailscale kubectl apply -f k8s/awx/tailscale-ingress.yml
- Connexion au réseau avec la clé d'authentification ```
- Configuration du hostname sur le réseau
## Configuration des services
### AWX avec Tailscale
Le fichier `k8s/awx/tailscale-ingress.yml` configure l'exposition sécurisée d'AWX :
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: awx-tailscale-ingress
namespace: awx
annotations:
tailscale.com/expose: "true"
tailscale.com/hostname: "awx"
spec:
ingressClassName: tailscale
defaultBackend:
service:
name: awx-service
port:
number: 80
tls:
- hosts:
- awx.taila5ad8.ts.net
```
### Fonctionnalités automatiques
1. **Certificats HTTPS automatiques** : Tailscale génère et renouvelle les certificats
2. **Terminaison TLS** : L'ingress gère HTTPS → HTTP
3. **Routage intelligent** : Traffic dirigé vers les bons services
4. **Sécurité réseau** : Exposition uniquement via Tailscale
### Flow de traffic
```
https://awx.taila5ad8.ts.net (HTTPS:443)
Tailscale Ingress Controller
↓ (Terminaison TLS)
awx-service (HTTP:80)
AWX Pod (HTTP:8052)
```
## Avantages de l'architecture
### Sécurité
-**Pas d'exposition publique** : Services accessibles uniquement via Tailscale
-**HTTPS automatique** : Certificats gérés par Tailscale
-**Authentification** : Contrôle d'accès via Tailscale ACL
-**Isolation réseau** : Pods non privilégiés
### Simplicité
-**Configuration déclarative** : Infrastructure et services en code
-**Déploiement automatisé** : Une commande pour tout déployer
-**Gestion centralisée** : Tout via Kubernetes et Terraform
-**URLs propres** : `https://service.tailnet.ts.net`
### Évolutivité
-**Ajout facile de services** : Nouveau ingress = nouveau service exposé
-**Load balancing** : Kubernetes gère la répartition de charge
-**Haute disponibilité** : Pods redémarrés automatiquement
-**Monitoring** : Métriques Kubernetes natives
## Utilisation d'AWX
### Accès
- URL: `https://awx.taila5ad8.ts.net`
- Identifiants: Configurés dans le secret Kubernetes
### Execution Environments (EE)
Pour les playbooks nécessitant Tailscale, deux approches possibles :
#### Approche recommandée : Tailscale Operator
```yaml
# Les EE utilisent le réseau via l'opérateur
task_privileged: false # Plus sécurisé
```
#### Approche alternative : Tailscale dans EE
```yaml
# EE avec Tailscale installé directement
task_privileged: true # Nécessaire pour networking
```
## Maintenance ## Maintenance
### Ajouter une VM ### Ajouter un service Kubernetes
1. Déployer le service :
```bash ```bash
# 1. Ajouter la configuration dans terraform.tfvars kubectl apply -f new-service.yml
# 2. Appliquer les changements
terraform apply
``` ```
### Supprimer une VM 2. Créer l'ingress Tailscale :
```yaml
```bash apiVersion: networking.k8s.io/v1
# 1. Retirer la configuration de terraform.tfvars kind: Ingress
# 2. Appliquer les changements metadata:
terraform apply name: new-service-ingress
annotations:
tailscale.com/expose: "true"
tailscale.com/hostname: "new-service"
spec:
ingressClassName: tailscale
defaultBackend:
service:
name: new-service
port:
number: 80
tls:
- hosts:
- new-service.taila5ad8.ts.net
``` ```
### Modifier une VM ### Monitoring
```bash ```bash
# 1. Modifier la configuration dans terraform.tfvars # Vérifier les services Tailscale
# 2. Vérifier les changements kubectl get ingress -n <namespace>
terraform plan kubectl describe ingress <ingress-name> -n <namespace>
# 3. Appliquer
terraform apply # Vérifier l'opérateur Tailscale
kubectl logs -n tailscale -l app=tailscale-operator
# Vérifier AWX
kubectl get pods -n awx
kubectl logs -n awx -l app.kubernetes.io/name=awx
``` ```
## Sécurité ### Dépannage courant
- ✅ Authentification par tokens API
- ✅ Connexion SSH par clés uniquement
- ✅ Réseau sécurisé via Tailscale
- ✅ Isolation des VMs
- ✅ Permissions minimales sur Proxmox
## Dépannage
### Problèmes courants
| Problème | Solution | | Problème | Solution |
|---|---| |---|---|
| Template non trouvé | Vérifier les tags sur Proxmox | | Certificat HTTPS non généré | Vérifier les annotations Tailscale et les permissions OAuth |
| IP déjà utilisée | Vérifier les conflits d'adresses | | Service non accessible | Vérifier l'ingress et le service backend |
| Erreur SSH | Vérifier le chemin de la clé publique | | AWX non fonctionnel | Vérifier les PVC et les secrets de configuration |
| Tailscale | Vérifier la validité de la clé d'authentification | | EE sans accès réseau | Configurer ProxyClass ou privilèges selon l'approche choisie |
### Logs détaillés ## Configuration avancée
```bash ### Execution Environments avec Tailscale Operator
# Logs Terraform détaillés
TF_LOG=DEBUG terraform apply
# État des ressources ```yaml
terraform show apiVersion: tailscale.com/v1alpha1
kind: ProxyClass
# Liste des ressources metadata:
terraform state list name: awx-ee-proxy
namespace: awx
spec:
hostname: "awx-ee"
---
# Configuration AWX pour utiliser le proxy
spec:
task_extra_env: |
- name: HTTPS_PROXY
value: "http://tailscale-proxy:8080"
``` ```
### Autres services recommandés
| Service | Description | URL |
|---|---|---|
| Grafana | Monitoring et dashboards | `https://grafana.taila5ad8.ts.net` |
| Prometheus | Métriques | `https://prometheus.taila5ad8.ts.net` |
| ArgoCD | GitOps | `https://argocd.taila5ad8.ts.net` |
| Longhorn | Stockage | `https://longhorn.taila5ad8.ts.net` |
## Ressources recommandées ## Ressources recommandées
| Type de service | CPU | RAM | Disque | | Type de service | CPU | RAM | Disque |
|---|---|---|---| |---|---|---|---|
| K8s Master | 4+ | 8GB+ | 50GB+ |
| AWX | 2 | 4GB | 20GB |
| Monitoring | 2 | 4GB | 30GB | | Monitoring | 2 | 4GB | 30GB |
| Web server | 2 | 2GB | 20GB | | Applications | 2+ | 2GB+ | 20GB+ |
| Database | 4+ | 8GB+ | 50GB+ |
| Kubernetes | 4+ | 4GB+ | 40GB+ |
## Support ## Support et références
- 📚 [Documentation Terraform Proxmox Provider](https://registry.terraform.io/providers/bpg/proxmox/latest/docs) - 📚 [Documentation Terraform Proxmox Provider](https://registry.terraform.io/providers/bpg/proxmox/latest/docs)
- 🔧 [Proxmox VE Documentation](https://pve.proxmox.com/wiki/Main_Page) - 🔧 [Proxmox VE Documentation](https://pve.proxmox.com/wiki/Main_Page)
- 🌐 [Tailscale Documentation](https://tailscale.com/kb/) - 🌐 [Tailscale Documentation](https://tailscale.com/kb/)
- ☸️ [Kubernetes Documentation](https://kubernetes.io/docs/)
- 🎯 [AWX Operator Documentation](https://github.com/ansible/awx-operator)
- 🔒 [Tailscale Kubernetes Operator](https://tailscale.com/kb/1236/kubernetes-operator)
## Inspirations
Ce projet s'inspire des meilleures pratiques DevOps et des articles de la communauté, notamment :
- [Securely Exposing Applications on Kubernetes With Tailscale](https://joshrnoll.com/securely-exposing-applications-on-kubernetes-with-tailscale/) par Josh Noll

25
k8s/awx/awx-cr.yml Normal file
View File

@@ -0,0 +1,25 @@
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
name: awx
namespace: awx
spec:
# Ajuste ces valeurs selon ta version & ressources
postgres_configuration_secret: awx-postgres-configuration
postgres_storage_class: local-path
postgres_storage_requirements:
requests:
storage: 8Gi
projects_persistence: true
projects_existing_claim: awx-projects-claim
# important: pas d'exposition publique
service_type: ClusterIP
ingress_type: none
# Job pods puissent être privilégiés
# (Necessaire avec tailscale dans les EE)
task_privileged: true
image: quay.io/ansible/awx
image_version: "latest"

12
k8s/awx/awx-pvc.yml Normal file
View File

@@ -0,0 +1,12 @@
# awx-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: awx-projects-claim
namespace: awx
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 12Gi
storageClassName: local-path

View File

@@ -0,0 +1,18 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: awx-tailscale-ingress
namespace: awx
annotations:
tailscale.com/expose: "true"
tailscale.com/hostname: "awx"
spec:
ingressClassName: tailscale
defaultBackend:
service:
name: awx-service
port:
number: 80
tls:
- hosts:
- awx.taila5ad8.ts.net