From 84b7bf8451c5514df029f10fa5dcc8d8476dc86d Mon Sep 17 00:00:00 2001 From: Melvin GABALI Date: Thu, 22 Jan 2026 23:58:51 +0100 Subject: [PATCH] add endpoint --- docs/TROUBLESHOOTING-EXTERNAL-DEVICES.md | 123 ++++++++++++++++++ .../dev/templates/services.yaml | 8 ++ helm/external-devices/prd/Chart.yaml | 7 - helm/external-devices/prd/README.md | 98 -------------- .../prd/templates/ingressroutes.yaml | 52 -------- .../prd/templates/middlewares.yaml | 29 ----- .../prd/templates/services.yaml | 37 ------ helm/external-devices/prd/values.yaml | 33 ----- scripts/create-endpoints-manually.sh | 65 +++++++++ 9 files changed, 196 insertions(+), 256 deletions(-) create mode 100644 docs/TROUBLESHOOTING-EXTERNAL-DEVICES.md delete mode 100644 helm/external-devices/prd/Chart.yaml delete mode 100644 helm/external-devices/prd/README.md delete mode 100644 helm/external-devices/prd/templates/ingressroutes.yaml delete mode 100644 helm/external-devices/prd/templates/middlewares.yaml delete mode 100644 helm/external-devices/prd/templates/services.yaml delete mode 100644 helm/external-devices/prd/values.yaml create mode 100644 scripts/create-endpoints-manually.sh diff --git a/docs/TROUBLESHOOTING-EXTERNAL-DEVICES.md b/docs/TROUBLESHOOTING-EXTERNAL-DEVICES.md new file mode 100644 index 0000000..9491a9b --- /dev/null +++ b/docs/TROUBLESHOOTING-EXTERNAL-DEVICES.md @@ -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 -backend` retourne "NotFound" +- `kubectl describe service -backend` montre `Endpoints: ` + +### 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 +``` + diff --git a/helm/external-devices/dev/templates/services.yaml b/helm/external-devices/dev/templates/services.yaml index 9cf4f82..2c9bc49 100644 --- a/helm/external-devices/dev/templates/services.yaml +++ b/helm/external-devices/dev/templates/services.yaml @@ -10,6 +10,10 @@ metadata: 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: @@ -26,6 +30,10 @@ metadata: 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" subsets: - addresses: - ip: {{ $device.ip }} diff --git a/helm/external-devices/prd/Chart.yaml b/helm/external-devices/prd/Chart.yaml deleted file mode 100644 index d547ad3..0000000 --- a/helm/external-devices/prd/Chart.yaml +++ /dev/null @@ -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" - diff --git a/helm/external-devices/prd/README.md b/helm/external-devices/prd/README.md deleted file mode 100644 index 7d61916..0000000 --- a/helm/external-devices/prd/README.md +++ /dev/null @@ -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. - diff --git a/helm/external-devices/prd/templates/ingressroutes.yaml b/helm/external-devices/prd/templates/ingressroutes.yaml deleted file mode 100644 index de9502d..0000000 --- a/helm/external-devices/prd/templates/ingressroutes.yaml +++ /dev/null @@ -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 }} - diff --git a/helm/external-devices/prd/templates/middlewares.yaml b/helm/external-devices/prd/templates/middlewares.yaml deleted file mode 100644 index e682214..0000000 --- a/helm/external-devices/prd/templates/middlewares.yaml +++ /dev/null @@ -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 }} - diff --git a/helm/external-devices/prd/templates/services.yaml b/helm/external-devices/prd/templates/services.yaml deleted file mode 100644 index 9cf4f82..0000000 --- a/helm/external-devices/prd/templates/services.yaml +++ /dev/null @@ -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 }} - diff --git a/helm/external-devices/prd/values.yaml b/helm/external-devices/prd/values.yaml deleted file mode 100644 index 493d766..0000000 --- a/helm/external-devices/prd/values.yaml +++ /dev/null @@ -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 - diff --git a/scripts/create-endpoints-manually.sh b/scripts/create-endpoints-manually.sh new file mode 100644 index 0000000..3f24ba9 --- /dev/null +++ b/scripts/create-endpoints-manually.sh @@ -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] [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 - <