delete external device

This commit is contained in:
2026-01-23 00:05:04 +01:00
parent 84c7137c23
commit 227b92fe4f
12 changed files with 45 additions and 1195 deletions

View File

@@ -1,52 +0,0 @@
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: external-devices
namespace: argocd-ops
spec:
generators:
# Les certificats sont créés UNIQUEMENT dans le cluster OPS
# qui a cert-manager installé et accès à Internet pour Let's Encrypt
- merge:
generators:
# Premier générateur : scanne les répertoires Helm pour les certificats
- git:
repoURL: https://git.gkdomaine.fr/kubernetes/argocd.git
revision: main
directories:
- path: "helm/external-devices/*"
# Deuxième générateur : lit la config OPS uniquement
- git:
repoURL: https://git.gkdomaine.fr/kubernetes/argocd.git
revision: main
files:
- path: "configs/*/config.json"
mergeKeys:
- path.basename
template:
metadata:
name: external-devices-{{path.basename}}
annotations:
# Forcer ArgoCD à gérer les Endpoints
argocd.argoproj.io/sync-options: "ServerSideApply=true"
spec:
project: '{{path.basename}}'
source:
repoURL: '{{repository}}'
targetRevision: '{{targetRevision}}'
path: '{{helmPath}}/external-devices/{{path.basename}}'
helm:
valueFiles:
- values.yaml
destination:
name: '{{name}}'
namespace: 'traefik-{{path.basename}}'
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
# ServerSideApply pour mieux gérer les Endpoints
- ServerSideApply=true

View File

@@ -1,28 +0,0 @@
# AppProject pour inclure les Endpoints dans ArgoCD
# ⚠️ Ce fichier doit être appliqué manuellement ou via un autre mécanisme
# car les AppProjects ne sont pas gérés par ApplicationSet
#
# Usage:
# kubectl apply -f apps/appproject-dev-endpoints.yaml
#
# Ou modifiez le projet existant :
# kubectl patch appproject dev -n argocd-ops --type merge -p "$(cat apps/appproject-dev-endpoints.yaml)"
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: dev
namespace: argocd-ops
spec:
# Inclure les Endpoints dans les ressources autorisées
namespaceResourceWhitelist:
- group: ""
kind: Endpoints
# Autoriser tous les namespaces (ou spécifiez traefik-dev)
sourceNamespaces:
- '*'
# Autoriser tous les clusters (ou spécifiez cluster-dev)
destinations:
- namespace: '*'
server: '*'

View File

@@ -1,101 +0,0 @@
# Configuration ArgoCD pour gérer les Endpoints
Par défaut, ArgoCD **exclut** les ressources de type `Endpoints` car elles sont généralement gérées automatiquement par Kubernetes. Pour que ArgoCD gère les Endpoints créés par Helm, il faut les inclure explicitement.
## Solution 1 : Configurer le projet ArgoCD (Recommandé - OBLIGATOIRE)
⚠️ **IMPORTANT** : Cette étape est **obligatoire**. Sans cette configuration, ArgoCD ne créera jamais les Endpoints, même avec les annotations dans les templates.
Modifiez le projet ArgoCD pour inclure les Endpoints :
```bash
# Récupérer la configuration du projet
kubectl get appproject dev -n argocd-ops -o yaml > project-dev.yaml
# Ajouter resourceInclusions dans le projet
```
Ou via l'interface ArgoCD :
1. Allez dans **Settings > Projects**
2. Sélectionnez le projet `dev`
3. Dans **Resource Inclusion**, ajoutez :
- **Group** : (vide)
- **Kind** : `Endpoints`
4. Sauvegardez
## Solution 2 : Configurer l'application directement
Modifiez l'application `external-devices-dev` pour inclure les Endpoints :
```bash
kubectl patch application external-devices-dev -n argocd-ops \
--type merge \
-p '{"spec":{"source":{"helm":{"includeCRDs":true}}}}'
```
Puis ajoutez la configuration dans l'Application :
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: external-devices-dev
namespace: argocd-ops
spec:
# ... autres configurations ...
source:
helm:
# Inclure les Endpoints
includeCRDs: true
# Ou utiliser resourceInclusions au niveau de l'application
# (nécessite ArgoCD 2.4+)
```
## Solution 3 : Modifier la configuration globale d'ArgoCD
Modifiez le ConfigMap `argocd-cm` pour inclure les Endpoints globalement :
```bash
kubectl edit configmap argocd-cm -n argocd-ops
```
Ajoutez :
```yaml
resourceInclusions: |
- apiGroups: [""]
kinds: ["Endpoints"]
clusters: ["*"]
```
⚠️ **Attention** : Cette modification affecte **toutes** les applications ArgoCD.
## Solution 4 : Utiliser une annotation sur l'Application
Si vous utilisez ArgoCD 2.4+, vous pouvez ajouter une annotation directement sur l'Application :
```yaml
metadata:
annotations:
argocd.argoproj.io/sync-options: IncludeEndpoints=true
```
## Vérification
Après la configuration, vérifiez que les Endpoints sont gérés :
```bash
# Vérifier que l'application voit les Endpoints
argocd app get external-devices-dev
# Vérifier que les Endpoints sont créés
kubectl get endpoints omv-backend -n traefik-dev
```
## Recommandation
Pour ce cas d'usage spécifique (Endpoints pour équipements externes), la **Solution 1** (configurer le projet) est recommandée car :
- Elle est limitée au projet `dev`
- Elle n'affecte pas les autres applications
- Elle est persistante et versionnée si vous utilisez GitOps pour les projets

View File

@@ -1,252 +0,0 @@
# Export des Certificats TLS pour Équipements Externes
Ce guide explique comment exporter et utiliser les certificats TLS générés par cert-manager pour des équipements externes au cluster Kubernetes (pfSense, OpenMediaVault, NAS, etc.).
## Vue d'ensemble
Les certificats TLS sont générés par cert-manager dans le namespace `certificates-ops` et stockés sous forme de secrets Kubernetes. Pour les utiliser sur des équipements externes, il faut :
1. **Exporter** le certificat depuis Kubernetes
2. **Convertir** au format approprié (PEM, PKCS12, etc.)
3. **Importer** dans l'équipement externe
4. **Automatiser** le renouvellement (optionnel)
## Méthode 1 : Export manuel avec script
### Prérequis
- Accès au cluster Kubernetes avec `kubectl`
- `openssl` installé sur votre machine
- `base64` disponible (généralement inclus)
### Export du certificat
Utilisez le script `scripts/export-certificate.sh` :
```bash
# Export en format PEM (par défaut)
./scripts/export-certificate.sh wildcard-prd-tls certificates-ops cluster-ops ./certs pem
# Export en format PKCS12 (pour pfSense)
./scripts/export-certificate.sh wildcard-prd-tls certificates-ops cluster-ops ./certs pkcs12
```
### Formats disponibles
- **PEM** : Format standard, certificat et clé séparés (`.crt` et `.key`)
- **PKCS12/PFX** : Format conteneurisé avec certificat et clé dans un seul fichier (`.p12` ou `.pfx`)
## Méthode 2 : Export direct avec kubectl
### Export en format PEM
```bash
# Définir les variables
SECRET_NAME="wildcard-prd-tls"
NAMESPACE="certificates-ops"
CONTEXT="cluster-ops"
OUTPUT_DIR="./certs"
# Créer le répertoire
mkdir -p "$OUTPUT_DIR"
# Extraire le certificat
kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" --context="$CONTEXT" \
-o jsonpath='{.data.tls\.crt}' | base64 -d > "$OUTPUT_DIR/certificate.crt"
# Extraire la clé privée
kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" --context="$CONTEXT" \
-o jsonpath='{.data.tls\.key}' | base64 -d > "$OUTPUT_DIR/private.key"
```
### Conversion en PKCS12
```bash
# Créer un fichier PKCS12 (mot de passe optionnel)
openssl pkcs12 -export \
-out "$OUTPUT_DIR/certificate.p12" \
-inkey "$OUTPUT_DIR/private.key" \
-in "$OUTPUT_DIR/certificate.crt" \
-name "wildcard-prd" \
-passout pass: # Laissez vide pour aucun mot de passe
```
## Import dans les équipements
### pfSense
#### Méthode 1 : Import PKCS12 (recommandé)
1. Allez dans **System > Certificates**
2. Cliquez sur **Import**
3. Sélectionnez le fichier `.p12` ou `.pfx`
4. Entrez le mot de passe si nécessaire
5. Cliquez sur **Import**
#### Méthode 2 : Import PEM séparé
1. Allez dans **System > Certificates**
2. Cliquez sur **Add**
3. Dans **Method**, sélectionnez **Import an existing Certificate**
4. Collez le contenu du fichier `.crt` dans **Certificate data**
5. Collez le contenu du fichier `.key` dans **Private key data**
6. Cliquez sur **Save**
#### Utilisation dans pfSense
1. Allez dans **System > Certificates**
2. Sélectionnez le certificat importé
3. Utilisez-le dans :
- **System > Advanced > WebGUI** (certificat HTTPS)
- **Services > HAProxy** (certificats backend)
- **VPN > OpenVPN** (certificats serveur)
### OpenMediaVault
1. Allez dans **System > Certificates > SSL**
2. Cliquez sur **Import**
3. Sélectionnez le fichier certificat (`.crt` ou `.p12`)
4. Si vous utilisez PEM, importez séparément :
- **Certificate** : Fichier `.crt`
- **Private Key** : Fichier `.key`
5. Cliquez sur **Save**
### Synology NAS
1. Allez dans **Control Panel > Security > Certificate**
2. Cliquez sur **Add**
3. Sélectionnez **Import Certificate**
4. Choisissez le fichier (`.p12` ou `.crt` + `.key`)
5. Entrez le mot de passe si nécessaire
6. Cliquez sur **OK**
### Autres équipements
La plupart des équipements réseau supportent l'import de certificats en format :
- **PEM** : Certificat et clé séparés
- **PKCS12/PFX** : Format conteneurisé
Consultez la documentation de votre équipement pour les détails spécifiques.
## Automatisation du renouvellement
Les certificats Let's Encrypt sont valides 90 jours et sont renouvelés automatiquement par cert-manager. Pour synchroniser automatiquement les certificats vers vos équipements externes :
### Option 1 : Webhook cert-manager
Créez un webhook qui s'exécute lors du renouvellement du certificat :
```yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: wildcard-prd-tls
namespace: certificates-ops
spec:
# ... configuration du certificat ...
secretTemplate:
annotations:
cert-manager.io/allow-direct-injection: "true"
# Webhook pour exporter automatiquement
# (nécessite un contrôleur personnalisé)
```
### Option 2 : Script CronJob
Créez un CronJob qui vérifie périodiquement les certificats et les exporte :
```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: export-certificates
namespace: certificates-ops
spec:
schedule: "0 0 * * *" # Tous les jours
jobTemplate:
spec:
template:
spec:
containers:
- name: export
image: alpine/k8s:1.33.0
command:
- /bin/sh
- -c
- |
# Exporter le certificat
kubectl get secret wildcard-prd-tls -n certificates-ops \
-o jsonpath='{.data.tls\.crt}' | base64 -d > /export/cert.crt
# Envoyer vers l'équipement externe (API, SCP, etc.)
# Exemple avec curl vers une API pfSense
# curl -X POST https://pfsense.example.com/api/certificates \
# -F "cert=@/export/cert.crt"
```
### Option 3 : API REST
Si votre équipement supporte une API REST (comme pfSense), créez un service qui :
1. Surveille les changements de secrets Kubernetes
2. Exporte automatiquement le certificat
3. Envoie une requête API à l'équipement pour mettre à jour le certificat
## Sécurité
⚠️ **Important** : Les certificats et clés privées sont des données sensibles.
- **Ne stockez jamais** les clés privées dans Git
- **Supprimez** les fichiers exportés après import
- **Utilisez des permissions restrictives** sur les fichiers (chmod 600)
- **Chiffrez** les fichiers si vous devez les transférer
```bash
# Permissions restrictives
chmod 600 certificate.key
chmod 644 certificate.crt
# Supprimer après import
rm -f certificate.*
```
## Dépannage
### Erreur "secret not found"
Vérifiez que le secret existe :
```bash
kubectl get secret wildcard-prd-tls -n certificates-ops --context=cluster-ops
```
### Erreur "certificate expired"
Les certificats sont renouvelés automatiquement. Vérifiez le statut :
```bash
kubectl get certificate wildcard-prd-tls -n certificates-ops --context=cluster-ops
```
### Format non reconnu par l'équipement
Essayez de convertir dans un autre format :
```bash
# PEM vers DER
openssl x509 -in certificate.crt -out certificate.der -outform DER
# PKCS12 avec mot de passe
openssl pkcs12 -export -out certificate.p12 \
-inkey private.key -in certificate.crt \
-passout pass:VOTRE_MOT_DE_PASSE
```
## Exemples de certificats disponibles
Dans le namespace `certificates-ops` :
- `wildcard-dev-tls` : `*.dev.gkdomaine.fr`
- `wildcard-rct-tls` : `*.rct.gkdomaine.fr`
- `wildcard-prd-tls` : `*.prd.gkdomaine.fr`
Pour lister tous les certificats :
```bash
kubectl get certificates -n certificates-ops --context=cluster-ops
```

View File

@@ -1,471 +0,0 @@
# Reverse Proxy Traefik pour Équipements Externes
Ce guide explique comment utiliser Traefik comme reverse proxy pour exposer vos équipements externes (pfSense, OpenMediaVault, NAS, etc.) via les certificats TLS générés par cert-manager, **sans exporter les certificats**.
## Avantages de cette approche
**Certificats gérés automatiquement** : Les certificats restent dans Kubernetes et sont renouvelés automatiquement par cert-manager
**Configuration centralisée** : Tous les certificats sont gérés au même endroit
**Pas d'export/import** : Plus besoin d'exporter et importer les certificats sur chaque équipement
**Sécurité** : Les certificats ne quittent jamais le cluster Kubernetes
**HTTPS automatique** : Traefik gère le TLS de bout en bout
## Architecture
```
Internet/Intranet
Traefik (Kubernetes) ← Certificat wildcard (*.dev.gkdomaine.fr)
↓ HTTPS
Équipement externe (pfSense, OMV, NAS, etc.) ← HTTP (interne)
```
## Prérequis
1. **Traefik déployé** dans le cluster avec accès aux certificats wildcard
2. **Certificats wildcard** générés (ex: `wildcard-prd-tls` pour la production)
3. **Accès réseau** depuis Traefik vers les équipements externes
4. **Service externe** accessible en HTTP (ou HTTPS avec certificat auto-signé)
⚠️ **Note** : Pour le moment, seuls les services externes en **production** sont configurés. Les environnements dev et rct peuvent être ajoutés ultérieurement si nécessaire.
## Configuration de base
### 1. Créer un IngressRoute pour un équipement externe
Créez un fichier `helm/traefik/dev/templates/external-pfsense.yaml` :
```yaml
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: pfsense-external
namespace: traefik-dev
spec:
entryPoints:
- websecure
routes:
- match: Host(`pfsense.dev.gkdomaine.fr`)
kind: Rule
services:
- name: pfsense-backend
port: 80
scheme: http
# Optionnel : si pfSense utilise HTTPS avec certificat auto-signé
# scheme: https
# serversTransport: pfsense-insecure
tls:
secretName: wildcard-dev-tls
```
### 2. Créer un Service Kubernetes pointant vers l'équipement externe
Créez un fichier `helm/traefik/dev/templates/external-services.yaml` :
```yaml
---
# Service pour pfSense
apiVersion: v1
kind: Service
metadata:
name: pfsense-backend
namespace: traefik-dev
spec:
type: ExternalName
externalName: 192.168.1.1 # IP interne de pfSense
ports:
- port: 80
targetPort: 80
protocol: TCP
---
# Service pour OpenMediaVault
apiVersion: v1
kind: Service
metadata:
name: omv-backend
namespace: traefik-dev
spec:
type: ExternalName
externalName: 192.168.1.10 # IP interne d'OpenMediaVault
ports:
- port: 80
targetPort: 80
protocol: TCP
---
# Service pour Synology NAS
apiVersion: v1
kind: Service
metadata:
name: synology-backend
namespace: traefik-dev
spec:
type: ExternalName
externalName: 192.168.1.20 # IP interne du NAS
ports:
- port: 5000 # Port DSM
targetPort: 5000
protocol: TCP
```
### 3. Configuration pour HTTPS backend (certificat auto-signé)
Si votre équipement utilise HTTPS avec un certificat auto-signé, créez un `ServersTransport` :
```yaml
---
apiVersion: traefik.io/v1alpha1
kind: ServersTransport
metadata:
name: pfsense-insecure
namespace: traefik-dev
spec:
insecureSkipVerify: true # Ignorer la vérification du certificat
```
## Exemples complets par équipement
### pfSense
```yaml
---
apiVersion: v1
kind: Service
metadata:
name: pfsense-backend
namespace: traefik-dev
spec:
type: ExternalName
externalName: 192.168.1.1 # IP de pfSense
ports:
- port: 80
targetPort: 80
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: pfsense
namespace: traefik-dev
spec:
entryPoints:
- websecure
routes:
- match: Host(`pfsense.dev.gkdomaine.fr`)
kind: Rule
services:
- name: pfsense-backend
port: 80
tls:
secretName: wildcard-dev-tls
```
**Configuration pfSense** :
1. Allez dans **System > Advanced > Admin Access**
2. Désactivez **HTTPS Redirect** (Traefik gère le HTTPS)
3. Optionnel : Configurez **Trusted Proxies** avec l'IP de Traefik pour les headers X-Forwarded-*
### OpenMediaVault
```yaml
---
apiVersion: v1
kind: Service
metadata:
name: omv-backend
namespace: traefik-dev
spec:
type: ExternalName
externalName: 192.168.1.10 # IP d'OpenMediaVault
ports:
- port: 80
targetPort: 80
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: omv
namespace: traefik-dev
spec:
entryPoints:
- websecure
routes:
- match: Host(`omv.dev.gkdomaine.fr`)
kind: Rule
services:
- name: omv-backend
port: 80
tls:
secretName: wildcard-dev-tls
```
**Configuration OpenMediaVault** :
1. Allez dans **System > Certificates > SSL**
2. Désactivez le certificat SSL (Traefik gère le HTTPS)
3. Configurez les **Trusted Proxies** dans **System > Network > General**
### Synology NAS
```yaml
---
apiVersion: v1
kind: Service
metadata:
name: synology-backend
namespace: traefik-dev
spec:
type: ExternalName
externalName: 192.168.1.20 # IP du NAS
ports:
- port: 5000 # Port DSM
targetPort: 5000
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: synology
namespace: traefik-dev
spec:
entryPoints:
- websecure
routes:
- match: Host(`nas.dev.gkdomaine.fr`)
kind: Rule
services:
- name: synology-backend
port: 5000
tls:
secretName: wildcard-dev-tls
```
**Configuration Synology** :
1. Allez dans **Control Panel > Network > DSM Settings**
2. Désactivez **HTTPS** (Traefik gère le HTTPS)
3. Configurez **Reverse Proxy** si nécessaire
### Autres équipements
Le principe est le même pour tous les équipements :
1. **Créer un Service** de type `ExternalName` pointant vers l'IP de l'équipement
2. **Créer un IngressRoute** avec :
- Le domaine souhaité (ex: `equipement.dev.gkdomaine.fr`)
- Le service backend créé
- Le certificat wildcard (`wildcard-dev-tls`)
## Configuration avancée
### Headers personnalisés
Pour passer des headers spécifiques à l'équipement backend :
```yaml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: pfsense-headers
namespace: traefik-dev
spec:
headers:
customRequestHeaders:
X-Forwarded-Proto: "https"
X-Real-IP: ""
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: pfsense
namespace: traefik-dev
spec:
entryPoints:
- websecure
routes:
- match: Host(`pfsense.dev.gkdomaine.fr`)
kind: Rule
services:
- name: pfsense-backend
port: 80
middlewares:
- name: pfsense-headers
tls:
secretName: wildcard-dev-tls
```
### Authentification basique
Pour ajouter une authentification HTTP Basic :
```yaml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: pfsense-auth
namespace: traefik-dev
spec:
basicAuth:
secret: pfsense-basic-auth # Secret contenant user:password hashé
---
apiVersion: v1
kind: Secret
metadata:
name: pfsense-basic-auth
namespace: traefik-dev
type: Opaque
data:
users: | # Format: user:password_hash (généré avec htpasswd)
admin:$apr1$...
```
### Redirection HTTP vers HTTPS
Pour rediriger automatiquement HTTP vers HTTPS :
```yaml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: redirect-https
namespace: traefik-dev
spec:
redirectScheme:
scheme: https
permanent: true
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: pfsense-http-redirect
namespace: traefik-dev
spec:
entryPoints:
- web
routes:
- match: Host(`pfsense.dev.gkdomaine.fr`)
kind: Rule
middlewares:
- name: redirect-https
services:
- name: pfsense-backend
port: 80
```
## Structure recommandée
Créez un chart Helm dédié pour les équipements externes :
```
helm/
└── external-devices/
└── dev/
├── Chart.yaml
├── values.yaml
└── templates/
├── services.yaml
├── ingressroutes.yaml
└── middlewares.yaml
```
**values.yaml** (production) :
```yaml
externalDevices:
pfsense:
enabled: true
domain: "pfsense.prd.gkdomaine.fr"
ip: "192.168.1.1"
port: 80
tlsSecret: "wildcard-prd-tls"
omv:
enabled: true
domain: "omv.prd.gkdomaine.fr"
ip: "192.168.1.10"
port: 80
tlsSecret: "wildcard-prd-tls"
synology:
enabled: true
domain: "nas.prd.gkdomaine.fr"
ip: "192.168.1.20"
port: 5000
tlsSecret: "wildcard-prd-tls"
```
## Vérification
### Vérifier que les services sont créés
```bash
kubectl get services -n traefik-dev | grep -E "pfsense|omv|synology"
```
### Vérifier que les IngressRoute sont créés
```bash
kubectl get ingressroute -n traefik-dev
```
### Tester l'accès
```bash
# Test depuis l'intérieur du cluster
curl -k https://pfsense.dev.gkdomaine.fr
# Vérifier les logs Traefik
kubectl logs -n traefik-dev -l app.kubernetes.io/name=traefik --tail=50
```
## Dépannage
### Erreur "no endpoints available"
Vérifiez que l'IP de l'équipement est correcte et accessible depuis les pods Traefik :
```bash
# Depuis un pod Traefik
kubectl exec -n traefik-dev -it <traefik-pod> -- curl http://192.168.1.1
```
### Erreur "certificate not found"
Vérifiez que le secret TLS existe :
```bash
kubectl get secret wildcard-prd-tls -n traefik-prd
```
### Équipement non accessible
Vérifiez :
1. **Réseau** : L'IP est-elle accessible depuis les pods Traefik ?
2. **Firewall** : Le port est-il ouvert sur l'équipement ?
3. **Service** : Le service Kubernetes pointe-t-il vers la bonne IP/port ?
## Sécurité
⚠️ **Important** :
1. **Restreindre l'accès** : Utilisez des NetworkPolicies pour limiter l'accès aux équipements
2. **Authentification** : Ajoutez une authentification (Basic Auth, OAuth, etc.) pour les équipements sensibles
3. **Whitelist IP** : Limitez l'accès aux IPs autorisées si possible
4. **Monitoring** : Surveillez les accès aux équipements via les logs Traefik
## Avantages vs Export de certificats
| Critère | Reverse Proxy | Export de certificats |
|---------|---------------|----------------------|
| Gestion des certificats | ✅ Automatique | ❌ Manuel |
| Renouvellement | ✅ Automatique | ❌ Manuel |
| Configuration | ✅ Centralisée | ❌ Par équipement |
| Sécurité | ✅ Certificats dans K8s | ⚠️ Certificats exportés |
| Complexité | ✅ Simple | ❌ Plus complexe |
## Conclusion
La solution reverse proxy avec Traefik est **recommandée** car elle :
- Simplifie la gestion des certificats
- Centralise la configuration
- Améliore la sécurité
- Réduit la maintenance
Les équipements externes n'ont plus besoin de gérer les certificats TLS - Traefik s'en charge complètement !

View File

@@ -1,123 +0,0 @@
# Dépannage - External Devices
## Problème : "no available server" ou Endpoints manquants
### Symptômes
- Erreur "no available server" dans le navigateur
- `kubectl get endpoints <service>-backend` retourne "NotFound"
- `kubectl describe service <service>-backend` montre `Endpoints: <none>`
### Cause
Les Endpoints n'ont pas été créés. Cela peut arriver si :
1. ArgoCD n'a pas encore synchronisé les changements du template
2. Le template n'inclut pas les Endpoints
3. Les Endpoints ont été supprimés
### Solution
#### 1. Vérifier le statut ArgoCD
```bash
# Vérifier le statut de l'application
argocd app get external-devices-dev
# Vérifier si une synchronisation est nécessaire
argocd app diff external-devices-dev
```
#### 2. Forcer une synchronisation
```bash
# Synchroniser l'application
argocd app sync external-devices-dev
# Ou via kubectl si ArgoCD est dans le cluster
kubectl patch application external-devices-dev -n argocd-ops \
-p '{"operation":{"initiatedBy":{"username":"admin"},"sync":{"revision":"HEAD"}}}' \
--type merge
```
#### 3. Vérifier que les Endpoints sont créés
```bash
# Vérifier les Endpoints
kubectl get endpoints omv-backend -n traefik-dev
# Vérifier le détail
kubectl get endpoints omv-backend -n traefik-dev -o yaml
```
Les Endpoints devraient contenir :
```yaml
subsets:
- addresses:
- ip: 10.78.20.107 # L'IP de votre équipement
ports:
- port: 80
protocol: TCP
```
#### 4. Vérifier la connectivité
Une fois les Endpoints créés, tester la connexion :
```bash
# Depuis un pod Traefik
POD=$(kubectl get pods -n traefik-dev -l app.kubernetes.io/name=traefik -o jsonpath='{.items[0].metadata.name}')
kubectl exec -n traefik-dev -it $POD -- curl -v http://10.78.20.107:80
```
### Vérification complète
```bash
# 1. Service existe
kubectl get service omv-backend -n traefik-dev
# 2. Endpoints existent
kubectl get endpoints omv-backend -n traefik-dev
# 3. IngressRoute existe
kubectl get ingressroute omv -n traefik-dev
# 4. Secret TLS existe
kubectl get secret wildcard-dev-tls -n traefik-dev
# 5. Test de connectivité
kubectl exec -n traefik-dev -it $(kubectl get pods -n traefik-dev -l app.kubernetes.io/name=traefik -o jsonpath='{.items[0].metadata.name}') -- curl -v http://10.78.20.107:80
```
## Problème : IP non accessible
### Symptômes
- Endpoints créés mais erreur "connection refused" ou timeout
- `curl` depuis un pod Traefik échoue
### Solution
1. **Vérifier l'IP** : L'IP est-elle correcte dans `values.yaml` ?
2. **Vérifier le réseau** : L'IP est-elle accessible depuis les pods Traefik ?
3. **Vérifier le firewall** : Le port est-il ouvert sur l'équipement externe ?
4. **Vérifier le port** : Le port dans `values.yaml` correspond-il au port de l'équipement ?
```bash
# Test depuis un pod Traefik
POD=$(kubectl get pods -n traefik-dev -l app.kubernetes.io/name=traefik -o jsonpath='{.items[0].metadata.name}')
kubectl exec -n traefik-dev -it $POD -- curl -v --connect-timeout 5 http://10.78.20.107:80
```
## Problème : Certificat TLS manquant
### Symptômes
- Erreur "certificate not found" dans les logs Traefik
- IngressRoute en erreur
### Solution
```bash
# Vérifier que le secret existe
kubectl get secret wildcard-dev-tls -n traefik-dev
# Si le secret n'existe pas, vérifier qu'il est synchronisé depuis OPS
# Voir docs/tls-sync-wildcard.md
```

View File

@@ -1,7 +0,0 @@
apiVersion: v2
name: external-devices
description: Chart pour exposer les équipements externes via Traefik reverse proxy
type: application
version: 0.1.0
appVersion: "1.0"

View File

@@ -1,52 +0,0 @@
{{- range $name, $device := .Values.externalDevices }}
{{- if $device.enabled }}
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: {{ $name }}
namespace: {{ $device.namespace | default $.Values.global.namespace }}
labels:
app: external-device
device: {{ $name }}
spec:
entryPoints:
- websecure
routes:
- match: Host(`{{ $device.domain }}`)
kind: Rule
services:
- name: {{ $name }}-backend
port: {{ $device.port }}
{{- if $device.basicAuth.enabled }}
middlewares:
- name: {{ $name }}-auth
{{- end }}
tls:
secretName: {{ $device.tlsSecret | default $.Values.global.tlsSecret }}
{{- if $.Values.global.redirectHttpToHttps }}
---
# Redirection HTTP vers HTTPS
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: {{ $name }}-http-redirect
namespace: {{ $device.namespace | default $.Values.global.namespace }}
labels:
app: external-device
device: {{ $name }}
spec:
entryPoints:
- web
routes:
- match: Host(`{{ $device.domain }}`)
kind: Rule
middlewares:
- name: redirect-https
services:
- name: {{ $name }}-backend
port: {{ $device.port }}
{{- end }}
{{- end }}
{{- end }}

View File

@@ -1,29 +0,0 @@
{{- if .Values.global.redirectHttpToHttps }}
---
# Middleware pour rediriger HTTP vers HTTPS
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: redirect-https
namespace: {{ .Values.global.namespace }}
spec:
redirectScheme:
scheme: https
permanent: true
{{- end }}
{{- range $name, $device := .Values.externalDevices }}
{{- if and $device.enabled $device.basicAuth.enabled }}
---
# Middleware d'authentification basique pour {{ $name }}
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: {{ $name }}-auth
namespace: {{ $device.namespace | default $.Values.global.namespace }}
spec:
basicAuth:
secret: {{ $device.basicAuth.secretName }}
{{- end }}
{{- end }}

View File

@@ -1,47 +0,0 @@
{{- range $name, $device := .Values.externalDevices }}
{{- if $device.enabled }}
---
# Service pour {{ $name }}
apiVersion: v1
kind: Service
metadata:
name: {{ $name }}-backend
namespace: {{ $device.namespace | default $.Values.global.namespace }}
labels:
app: external-device
device: {{ $name }}
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/instance: {{ $.Release.Name }}
annotations:
argocd.argoproj.io/sync-wave: "-1"
spec:
type: ClusterIP
ports:
- port: {{ $device.port }}
targetPort: {{ $device.port }}
protocol: TCP
---
# Endpoints pour {{ $name }} (pointe vers l'IP externe)
apiVersion: v1
kind: Endpoints
metadata:
name: {{ $name }}-backend
namespace: {{ $device.namespace | default $.Values.global.namespace }}
labels:
app: external-device
device: {{ $name }}
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/instance: {{ $.Release.Name }}
annotations:
argocd.argoproj.io/sync-wave: "0"
# Forcer ArgoCD à gérer cette ressource même si elle est normalement exclue
argocd.argoproj.io/sync-options: "ServerSideApply=true"
subsets:
- addresses:
- ip: {{ $device.ip }}
ports:
- port: {{ $device.port }}
protocol: TCP
{{- end }}
{{- end }}

View File

@@ -1,33 +0,0 @@
# Configuration pour les équipements externes exposés via Traefik (dev)
# Les certificats TLS sont gérés par cert-manager dans le cluster OPS
# ⚠️ Pour le moment, seuls les services externes en production sont configurés
externalDevices:
# OpenMediaVault
omv:
enabled: true
domain: "nas.dev.gkdomaine.fr"
ip: "10.78.20.107" # ⚠️ À configurer avec l'IP réelle d'OpenMediaVault
port: 80
tlsSecret: "wildcard-dev-tls"
namespace: "traefik-dev"
basicAuth:
enabled: false
secretName: "omv-basic-auth"
# Ajoutez d'autres équipements ici
# exemple:
# autre-equipement:
# enabled: true
# domain: "autre.dev.gkdomaine.fr"
# ip: "192.168.1.30"
# port: 80
# tlsSecret: "wildcard-dev-tls"
# namespace: "traefik-dev"
# Configuration globale
global:
namespace: "traefik-dev"
tlsSecret: "wildcard-dev-tls"
redirectHttpToHttps: true

View File

@@ -0,0 +1,45 @@
#!/bin/bash
# Script pour patcher le projet ArgoCD 'dev' pour autoriser les Endpoints et le repository
set -e
NAMESPACE="${1:-argocd-ops}"
PROJECT="${2:-dev}"
echo "=== Patch du projet ArgoCD '$PROJECT' ==="
echo "Namespace: $NAMESPACE"
echo ""
# Vérifier que le projet existe
if ! kubectl get appproject "$PROJECT" -n "$NAMESPACE" &>/dev/null; then
echo "❌ Erreur: Le projet '$PROJECT' n'existe pas dans '$NAMESPACE'"
exit 1
fi
echo "📋 Configuration actuelle du projet:"
kubectl get appproject "$PROJECT" -n "$NAMESPACE" -o jsonpath='{.spec}' | jq . 2>/dev/null || kubectl get appproject "$PROJECT" -n "$NAMESPACE" -o yaml | grep -A 20 "^spec:"
echo ""
# Patcher le projet
echo "🔧 Application du patch..."
kubectl patch appproject "$PROJECT" -n "$NAMESPACE" --type merge -p '
{
"spec": {
"sourceRepos": ["https://git.gkdomaine.fr/kubernetes/argocd.git", "*"],
"namespaceResourceWhitelist": [
{
"group": "",
"kind": "Endpoints"
}
]
}
}
'
echo ""
echo "✅ Patch appliqué avec succès !"
echo ""
echo "📋 Vérification:"
kubectl get appproject "$PROJECT" -n "$NAMESPACE" -o jsonpath='{.spec.sourceRepos}' && echo ""
kubectl get appproject "$PROJECT" -n "$NAMESPACE" -o jsonpath='{.spec.namespaceResourceWhitelist}' && echo ""