Incompatibilité Gorse + ClickHouse Cloud
Problème
Le moteur de recommandation Gorse échoue à se connecter à ClickHouse Cloud avec des erreurs EOF lors de la négociation du protocole, même si la poignée de main TLS réussit.
Contexte / Conditions déclenchantes
- Les pods Gorse master/server affichent CrashLoopBackOff
- Les logs montrent :
failed to connect data database: EOFoutransport failed to send a request to ClickHouse: EOF - Utilisation de ClickHouse Cloud (*.clickhouse.cloud) comme GORSE_DATA_STORE
- La connexion TLS fonctionne quand testée avec openssl s_client
- Tentatives avec différents paramètres de connexion sans succès
Cause racine
Bien que le schéma d'URL clickhouse:// suggère le protocole natif, Gorse utilise en réalité l'interface HTTP sur le port 8123 (pas le protocole natif sur le port 9000/9440). L'interface HTTP de ClickHouse Cloud sur le port 8443 a des problèmes de compatibilité avec le driver de Gorse.
Faits clés :
- Gorse utilise l'interface HTTP de ClickHouse (port 8123), PAS le protocole natif (port 9000)
- Port 8443 de ClickHouse Cloud : protocole HTTP/HTTPS
- Port 9440 de ClickHouse Cloud : protocole natif avec TLS
- Gorse n'accepte que :
clickhouse://,mysql://,postgres://,mongodb:// - Gorse ne supporte PAS le schéma
https://(retourne « unsupported data storage backend ») - Redis est uniquement pour le cache, PAS pour le data store
- Si vous utilisez le port 9000 avec une ClickHouse in-cluster, vous obtiendrez : « Port 9000 is for clickhouse-client program. You must use port 8123 for HTTP. »
Options de solution
Option 1 : Utiliser une ClickHouse In-Cluster (Recommandé)
Déployez l'opérateur ClickHouse avec une instance in-cluster pour Gorse :
# La connexion standard in-cluster fonctionne
GORSE_DATA_STORE: "clickhouse://user:password@clickhouse-host:8123/gorse"
Option 2 : Utiliser une base de données différente
Gorse supporte MySQL et PostgreSQL comme data stores :
GORSE_DATA_STORE: "mysql://user:password@host:3306/gorse"
# ou
GORSE_DATA_STORE: "postgres://user:password@host:5432/gorse"
Option 3 : Déployer un proxy ClickHouse
Mettez en place un proxy (comme chproxy) qui traduit entre les protocoles.
Option 4 : Revenir aux vidéos populaires
Gardez Gorse désactivé et laissez l'API utiliser les recommandations basées sur la popularité :
{"videos": [...], "source": "popular"}
Vérification
Après avoir choisi une solution, vérifiez les logs du master Gorse :
kubectl logs -l app=gorse-master -n gorse --tail=20
Devrait afficher une connexion réussie au lieu des erreurs EOF.
Remarques
- La couche TLS fonctionne correctement - le problème est au niveau du protocole ClickHouse
- Cela peut être corrigé dans les futures versions du driver clickhouse-go
- La ClickHouse in-cluster n'a pas ce problème car elle utilise une connexion en clair sur le port 8123