2017-07-05 2 views
1

Ich habe eine traefik.toml Datei als Teil meiner Traefik configmap definiert. Das Snippet unten ist die Kubernetes Endpunkt-Konfiguration mit einem labelselector definiert:Problem Definition Traefik labelselector in traefik.toml vs. container arg

[kubernetes] 
    labelselector = "expose=internal" 

Wenn ich die traefik Statusseite in dieser Konfiguration überprüfen, sehe ich alle ingresses aufgeführt, nicht nur diejenigen mit der Bezeichnung „aussetzen: intern“ definiert.

Wenn ich die kubernetes.labelselector als Container Argument meines Einsatz eingestellt, jedoch nur die ingresses mit dem passenden Etikett auf der traefik Statusseite angezeigt, wie erwartet:

- --kubernetes.labelselector=expose=internal 

Nach der Kubernetes Ingress Backend Dokumentation Jedes in der Etikettenauswahl-Sektion der Labels and Selectors gültige Etikettenauswahlformat sollte in der Datei traefik.toml gültig sein. Ich habe sowohl mit der Gleichheitsbaed (wie oben gezeigt) als auch mit der Satz-basierten (nur um festzustellen, ob das "expose" -Label vorhanden ist) experimentiert, von denen keine im Toml gearbeitet hat. Das Set-basierte scheint nicht in den Container-Argumenten zu funktionieren, aber die Gleichheitsanweisungen tun dies.

Ich nehme an, es gibt ein Problem im Zusammenhang mit, wie ich den Kubernetes-Endpunkt in der Traefik.Toml-Datei formatiert habe. Bevor ich dieses Problem an GitHub meldete, hoffte ich, dass jemand die Dokumentation klären und/oder Fehler korrigieren könnte, die ich im Toml-Dateiformat gemacht habe.

Antwort

1

Wie Sie bereits herausgefunden haben, nicht vorbei --kubernetes macht die Dinge für Sie arbeiten. Der Grund ist, dass dieser Parameter nicht nur den Kubernetes-Provider aktiviert, sondern auch alle Defaults setzt. As documented, haben die Befehlszeilenargumente Vorrang vor der Konfigurationsdatei; Daher werden alle nicht standardmäßigen Kubernetes-Parameter, die in der TOML-Datei angegeben sind, durch die Standardwerte außer Kraft gesetzt, die durch --kubernetes impliziert werden. Dies ist ein (wenn auch nicht ideal dokumentiertes) Verhalten.

Sie können weiterhin die Parameter für die Befehlszeile und die TOML-Konfiguration für Kubernetes (oder einen anderen Anbieter) mischen und abgleichen, indem Sie --kubernetes weglassen. Zum Beispiel könnten Sie Ihr Beispiel TomL

haben Datei
[kubernetes] 
    labelselector = "expose=internal" 

und rufen Sie dann Traefik wie

./traefik --configfile=config.yaml --kubernetes.namespaces=other 

die Traefik bewirkt sowohl den benutzerdefinierten Etikettenwähler expose=internal zu verwenden und den Namensraum other zu beobachten.

Ich habe submitted a PR, um das Verhalten des Befehlszeile-Provider-Aktivierungsparameter in Bezug auf die Standardwerte des Providers zu klären.

+0

Können Sie '[kubernetes]' selbst in der toml-Datei definieren und die Standardwerte mit den Befehlszeilenargumenten überschreiben oder muss der kubernetes-Backend-Provider im Toml mit mindestens einer anderen Option definiert werden? –

+0

Solange Sie '-Kubernetes' nicht übergeben, sondern nur' --kubernetes. 'in der Befehlszeile sollte es funktionieren. –

0

Das Problem scheint das Mischen und Abgleichen von Befehlszeilenargumenten und toml Optionen zu sein.

Nach dem Lesen ein paar Fehlerberichte und einige zusätzliche misc. Dokumentation Ich erkannte, dass wir das kubernetes-Backend aktiviert hatten, das das Argument --kubernetes an den Traefik-Container übergab. Ich erkannte, dass die Definition von [kubernetes] im Toml auch das Kubernetes-Backend ermöglichte. Auf eine Ahnung habe ich das Kommandozeilenargument entfernt und die komplette kubernetes Backend Config in den Toml abgelegt und alles funktioniert wie erwartet.

Ich bin mir nicht sicher, ob dies erwartetes Verhalten ist oder nicht, aber dieses Verhalten scheint darauf hinzudeuten, dass es so entworfen wurde, dass Befehlszeilenargumente Vorrang vor den Konfigurationsoptionen von Toml haben, wenn doppelte Optionen bereitgestellt werden.

Verwandte Themen