add endpoint

This commit is contained in:
2026-01-22 23:58:51 +01:00
parent f8dbd26467
commit 84b7bf8451
9 changed files with 196 additions and 256 deletions

View File

@@ -0,0 +1,123 @@
# 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

@@ -10,6 +10,10 @@ metadata:
labels: labels:
app: external-device app: external-device
device: {{ $name }} device: {{ $name }}
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/instance: {{ $.Release.Name }}
annotations:
argocd.argoproj.io/sync-wave: "-1"
spec: spec:
type: ClusterIP type: ClusterIP
ports: ports:
@@ -26,6 +30,10 @@ metadata:
labels: labels:
app: external-device app: external-device
device: {{ $name }} device: {{ $name }}
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/instance: {{ $.Release.Name }}
annotations:
argocd.argoproj.io/sync-wave: "0"
subsets: subsets:
- addresses: - addresses:
- ip: {{ $device.ip }} - ip: {{ $device.ip }}

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,98 +0,0 @@
# External Devices - Reverse Proxy avec Traefik (Production)
Ce chart Helm expose vos équipements externes (pfSense, OpenMediaVault, NAS, etc.) via Traefik en utilisant les certificats TLS générés par cert-manager.
⚠️ **Note** : Pour le moment, seuls les services externes en **production** sont configurés.
## Principe
Au lieu d'exporter les certificats vers chaque équipement, Traefik agit comme reverse proxy :
- **Traefik** gère le HTTPS avec les certificats wildcard
- Les **équipements externes** restent en HTTP (interne)
- Les certificats sont **automatiquement renouvelés** par cert-manager
## Configuration
### 1. Modifier `values.yaml`
Configurez vos équipements dans `values.yaml` :
```yaml
externalDevices:
pfsense:
enabled: true
domain: "pfsense.prd.gkdomaine.fr"
ip: "192.168.1.1" # ⚠️ IP réelle de pfSense
port: 80
tlsSecret: "wildcard-prd-tls"
```
### 2. Déployer via ArgoCD
Le chart est déployé automatiquement via l'ApplicationSet `applicationset-external-devices.yaml`.
### 3. Vérifier
```bash
# Vérifier les services
kubectl get services -n traefik-prd | grep backend
# Vérifier les IngressRoute
kubectl get ingressroute -n traefik-prd
# Tester l'accès
curl -k https://pfsense.prd.gkdomaine.fr
```
## Ajouter un nouvel équipement
1. Ajoutez la configuration dans `values.yaml` :
```yaml
externalDevices:
mon-equipement:
enabled: true
domain: "equipement.prd.gkdomaine.fr"
ip: "192.168.1.100"
port: 80
tlsSecret: "wildcard-prd-tls"
namespace: "traefik-prd"
```
2. Le chart génère automatiquement :
- Un Service de type `ExternalName`
- Un IngressRoute avec TLS
- Une redirection HTTP → HTTPS (si activée)
## Authentification basique
Pour ajouter une authentification HTTP Basic :
```yaml
externalDevices:
pfsense:
enabled: true
domain: "pfsense.prd.gkdomaine.fr"
ip: "192.168.1.1"
port: 80
basicAuth:
enabled: true
secretName: "pfsense-basic-auth" # Secret à créer manuellement
```
Créer le secret :
```bash
# Générer le hash avec htpasswd
htpasswd -nb admin password | base64
# Créer le secret
kubectl create secret generic pfsense-basic-auth \
--from-literal=users='admin:$apr1$...' \
-n traefik-prd
```
## Documentation complète
Voir `docs/REVERSE-PROXY-EXTERNES.md` pour plus de détails.

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,37 +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 }}
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 }}
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 (PRD)
# 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.prd.gkdomaine.fr"
ip: "10.78.20.107" # ⚠️ À configurer avec l'IP réelle d'OpenMediaVault
port: 80
tlsSecret: "wildcard-prd-tls"
namespace: "traefik-prd"
basicAuth:
enabled: false
secretName: "omv-basic-auth"
# Ajoutez d'autres équipements ici
# exemple:
# autre-equipement:
# enabled: true
# domain: "autre.prd.gkdomaine.fr"
# ip: "192.168.1.30"
# port: 80
# tlsSecret: "wildcard-prd-tls"
# namespace: "traefik-prd"
# Configuration globale
global:
namespace: "traefik-prd"
tlsSecret: "wildcard-prd-tls"
redirectHttpToHttps: true

View File

@@ -0,0 +1,65 @@
#!/bin/bash
# Script pour créer manuellement les Endpoints pour les équipements externes
set -e
NAMESPACE="${1:-traefik-dev}"
SERVICE_NAME="${2:-omv-backend}"
IP="${3:-10.78.20.107}"
PORT="${4:-80}"
if [ -z "$SERVICE_NAME" ] || [ -z "$IP" ]; then
echo "Usage: $0 [namespace] <service-name> <ip> [port]"
echo ""
echo "Exemple:"
echo " $0 traefik-dev omv-backend 10.78.20.107 80"
exit 1
fi
echo "=== Création des Endpoints ==="
echo "Namespace: $NAMESPACE"
echo "Service: $SERVICE_NAME"
echo "IP: $IP"
echo "Port: $PORT"
echo ""
# Vérifier que le service existe
if ! kubectl get service "$SERVICE_NAME" -n "$NAMESPACE" &>/dev/null; then
echo "❌ Erreur: Le service '$SERVICE_NAME' n'existe pas dans '$NAMESPACE'"
exit 1
fi
# Vérifier si les Endpoints existent déjà
if kubectl get endpoints "$SERVICE_NAME" -n "$NAMESPACE" &>/dev/null; then
echo "⚠️ Les Endpoints existent déjà. Voulez-vous les mettre à jour ? (o/N)"
read -r REPLY
if [[ ! $REPLY =~ ^[OoYy]$ ]]; then
echo "Opération annulée"
exit 0
fi
echo "Suppression des anciens Endpoints..."
kubectl delete endpoints "$SERVICE_NAME" -n "$NAMESPACE"
fi
# Créer les Endpoints
echo "Création des Endpoints..."
kubectl create -f - <<EOF
apiVersion: v1
kind: Endpoints
metadata:
name: $SERVICE_NAME
namespace: $NAMESPACE
subsets:
- addresses:
- ip: $IP
ports:
- port: $PORT
protocol: TCP
EOF
echo ""
echo "✅ Endpoints créés avec succès !"
echo ""
echo "Vérification:"
kubectl get endpoints "$SERVICE_NAME" -n "$NAMESPACE" -o yaml