add endpoint
This commit is contained in:
123
docs/TROUBLESHOOTING-EXTERNAL-DEVICES.md
Normal file
123
docs/TROUBLESHOOTING-EXTERNAL-DEVICES.md
Normal 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
|
||||||
|
```
|
||||||
|
|
||||||
@@ -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 }}
|
||||||
|
|||||||
@@ -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"
|
|
||||||
|
|
||||||
@@ -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.
|
|
||||||
|
|
||||||
@@ -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 }}
|
|
||||||
|
|
||||||
@@ -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 }}
|
|
||||||
|
|
||||||
@@ -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 }}
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
65
scripts/create-endpoints-manually.sh
Normal file
65
scripts/create-endpoints-manually.sh
Normal 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
|
||||||
|
|
||||||
Reference in New Issue
Block a user