PrometheusでTraefikのメトリックをキャプチャする場合、これはinsecure = trueがアクティブになっている場合にのみ機能します。 insecure = falseを設定すると、404が表示されます。おそらく、正しい構成の例を誰かが持っているかもしれません。つまり、Traefik(V2.0 CLI)とprometheus.ymlの構成です。
traefik.ymlコマンドセクション:
command:
- "--metrics=true"
- "--metrics.prometheus=true"
- "--metrics.prometheus.buckets=0.100000, 0.300000, 1.200000, 5.000000"
- "--metrics.prometheus.entrypoint='metrics'"
- "--metrics.prometheus.addEntryPointsLabels=true"
- "--metrics.prometheus.addServicesLabels=true"
- "--api=true"
- "--api.dashboard=true"
- "--log.level=INFO"
- "--providers.docker=true"
- "--providers.docker.swarmmode=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "[email protected]"
- "--certificatesResolvers.sec.acme.storage=/letsencrypt/acme.json"
- "--certificatesResolvers.sec.acme.httpChallenge.entryPoint=web"
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=PathPrefix(`/api`) || PathPrefix(`/dashboard`)"
- "traefik.http.routers.api.rule=Host(`foo.bar`)"
- "traefik.http.routers.api.service=api@internal"
- "traefik.http.routers.api.middlewares=myauth"
- "traefik.http.services.api.loadbalancer.server.port=8080"
- "traefik.http.routers.api.tls.certresolver=sec"
- "traefik.http.middlewares.myauth.basicauth.users=xxx"
prometheus.yml:
global:
scrape_interval: 10s
scrape_timeout: 10s
scrape_configs:
- job_name: 'pushgateway'
static_configs:
- targets: ['pushgateway:9091']
honor_labels: true
- job_name: 'traefik'
scheme: https
static_configs:
- targets: ['foo.bar']
basic_auth:
username: myusername
password: mypassword
Dockerにいる場合は、最初に8082ポートを公開します。
そして、Traefikの起動時にこれらのコマンドを追加します。
--metrics.prometheus=true
--metrics.prometheus.entryPoint=metrics
--entryPoints.metrics.address=:8082
domain:8082/metrics
でそのメトリックにアクセス
安全でない構成(toml構成ファイルを使用します)を使用せずに、Traefikリバースプロキシ自体の背後にあるプロメテウスメトリックエンドポイントの有効な構成があります。
上記の構成例から、私が理解していることから、いくつかの要素が欠落しています。
最初に、エントリポイント 'metrics'を使用するようにPrometheusメトリックを構成したので、CLIセクションでメトリックと呼ばれるエントリポイントを構成する必要があります。このような:
- "--entrypoints.metrics.address=:8082"
TLS(traefik自体で終了)を介してメトリックエンドポイントにアクセスし、基本認証を使用する場合、メトリックエンドポイントのルーター構成とサービスがラベルとして必要です。次のように(APIエンドポイントの構成に加えて):
- "traefik.http.routers.metrics.rule=PathPrefix(`/metrics`)"
- "traefik.http.routers.metrics.rule=Host(`foo.bar`)"
- "traefik.http.routers.metrics.tls=true"
- "traefik.http.routers.metrics.tls.certResolver=sec"
- "traefik.http.routers.metrics.service=metrics"
- "traefik.http.routers.metrics.middlewares=myauth"
- "traefik.http.services.metrics.loadbalancer.server.port=8082"
さらに、次のようにdocker swarmネットワークを構成する必要がありました(そうしないと、503ゲートウェイのタイムアウトが発生します)。
- "traefik.docker.network=proxy"
(プロキシは、TraefikとTraefikがリバースプロキシになるすべてのサービスを接続する私のオーバーレイネットワークです。)
お役に立てば幸い...
セキュアモードでAPIおよびダッシュボードにアクセスする場合は、Traefikのドキュメントで説明されているapi @ internal 'magic'を使用する必要があります- ここ 。
つまり、次のようなラベルを追加します。
"traefik.http.routers.<my-api-dash-name>.service=api@internal"
言うまでもなく、これはクールではありません。基本的に、これは、標準のTraefikサービス宣言を使用するのではなく、これを特別な雪片の状況として扱います。これはいくぶん認められているようで、Traefikの将来のバージョンでは、少なくともこの内部サービスをダッシュボードに表示する予定です。
ダッシュボードに非セキュアモードを使用すると、ローカルのTraefikサーバーのポート8080が開かれることに注意してください。セキュアに切り替えると8080が閉じます。
私と同じように、内部で8080にルーティングすることにより、ダッシュボード/ APIを安全に宣言しようとしました。httpsと何らかの認証メカニズムを介してそうし、8080をDockerサービスポートとして公開しない場合でも、間違いなくIMOは安全であると考えられます-ただし、この方法で8080を活用できるようにするには、Traefik構成に安全でないダッシュボードスイッチを残す必要があります。
他の人が前の段落で説明したセキュリティモデルと不可解なapi @ internalの違いについて意見を持っている場合、私はすべて耳を傾けています。