You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K3s集群中通过Traefik Ingress暴露Thanos Sidecar gRPC服务失败求助

K3s集群中通过Traefik暴露Thanos Sidecar gRPC服务失败

环境信息

Pod详情(Thanos Sidecar作为Prometheus的Sidecar运行)

$ kubectl describe pod prometheus-monitoring-prometheus-0 -n monitoring
Name:             prometheus-monitoring-prometheus-0
Namespace:        monitoring
Priority:         0
Service Account:  monitoring-prometheus
Node:             k3s-node-1/12.345.678.910
Start Time:       Wed, 26 Jul 2023 18:35:38 +0000
Labels:           app.kubernetes.io/instance=monitoring-prometheus
                  app.kubernetes.io/managed-by=prometheus-operator
                  app.kubernetes.io/name=prometheus
                  ...
                  prometheus=monitoring-prometheus
                  statefulset.kubernetes.io/pod-name=prometheus-monitoring-prometheus-0
Annotations:      kubectl.kubernetes.io/default-container: prometheus
Status:           Running
IP:               10.42.0.200
IPs:
  IP:           10.42.0.200
Controlled By:  StatefulSet/prometheus-monitoring-prometheus
...
Containers:
  ...
  thanos-sidecar:
    Container ID:  containerd://bdc1bbfe53bf1ea260c47a44ab26110432388fe5592e037c83da5c6b6c5f696f
    Image:         quay.io/thanos/thanos:v0.31.0 
    Image ID:      quay.io/thanos/thanos@sha256:e7d337d6ac24233f0f9314ec9830291789e16e2b480b9d353be02d05ce7f2a7e
    Ports:         10902/TCP, 10901/TCP
    Host Ports:    0/TCP, 0/TCP
    Args:
      sidecar
      --prometheus.url=http://127.0.0.1:9090/
      --prometheus.http-client={"tls_config": {"insecure_skip_verify":true}}
      --grpc-address=:10901
      --http-address=:10902
      --objstore.config=$(OBJSTORE_CONFIG)
      --tsdb.path=/prometheus
      --log.level=info
      --log.format=logfmt
    State:          Running
      Started:      Wed, 26 Jul 2023 18:35:41 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      OBJSTORE_CONFIG:  <set to the key 'objstore.yml' in secret 'my-s3-bucket'>  Optional: false
    Mounts:
      /prometheus from prometheus-monitoring-prometheus-db (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-slz8t (ro)
...

Service配置

$ kubectl describe svc monitoring-thanos-discovery -n monitoring
Name:              monitoring-thanos-discovery
Namespace:         monitoring
Labels:            app=monitoring-thanos-discovery
                   app.kubernetes.io/instance=monitoring
                   app.kubernetes.io/managed-by=Helm
                   app.kubernetes.io/part-of=monitoring
                   app.kubernetes.io/version=47.2.0
                   chart=kube-prometheus-stack-47.2.0
                   heritage=Helm
                   release=monitoring
Annotations:       meta.helm.sh/release-name: monitoring
                   meta.helm.sh/release-namespace: monitoring
                   traefik.ingress.kubernetes.io/service.serversscheme: h2c
Selector:          app.kubernetes.io/name=prometheus,prometheus=monitoring-prometheus
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None
Port:              grpc  10901/TCP
TargetPort:        grpc/TCP
Endpoints:         10.42.0.200:10901
Port:              http  10902/TCP
TargetPort:        http/TCP
Endpoints:         10.42.0.200:10902
Session Affinity:  None
Events:            <none>

Ingress相关配置

用于获取TLS证书的Dummy Ingress (thanos-ingress-dummy.yaml)

# 用于为指定域名获取证书(配合IngressRoute使用)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: thanos-discovery-ingress-dummy
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  rules:
    - host: "thanos-gateway.monitoring.domain.com"
      http:
        paths:
          - path: /cert-placeholder
            pathType: Prefix
            backend:
              service:
                name: monitoring-thanos-discovery
                port:
                  name: grpc
  tls:
    - hosts:
        - "thanos-gateway.monitoring.domain.com"
      secretName: thanos-sidecar-grpc-tls

Traefik IngressRoute配置 (thanos-ingressroute.yaml)

# 用于暴露gRPC服务(支持HTTP2上的gRPC)
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: thanos-discovery-ingress
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`thanos-gateway.monitoring.domain.com`)
      kind: Rule
      services:
        - name: monitoring-thanos-discovery
          port: grpc
  tls:
    secretName: thanos-sidecar-grpc-tls

问题描述

  • 集群内部可正常访问:通过Service域名调用gRPC健康检查接口成功
$ kubectl exec -it debian-debug -- bash
root@debian-debug:/# grpcurl -plaintext monitoring-thanos-discovery.monitoring.svc.cluster.local:10901 grpc.health.v1.Health.Check
{
  "status": "SERVING"
}
  • 外部访问失败:
    • gRPC调用报错:
    $ grpcurl --plaintext thanos-gateway.monitoring.domain.com:443 list
    Failed to list services: server does not support the reflection API
    
    • Curl请求返回错误:
    $ curl https://thanos-gateway.monitoring.domain.com
    Internal Server Error
    
    $ curl http://thanos-gateway.monitoring.domain.com
    404 page not found
    

排查与修复建议

1. 修正IngressRoute的gRPC服务转发配置

Thanos Sidecar的gRPC端口使用明文HTTP/2(h2c),当前IngressRoute未明确指定服务通信协议,导致Traefik可能用HTTP/1.1转发请求引发500错误。需在IngressRoute的service配置中添加scheme: h2c:

修改后的thanos-ingressroute.yaml:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: thanos-discovery-ingress
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`thanos-gateway.monitoring.domain.com`)
      kind: Rule
      services:
        - name: monitoring-thanos-discovery
          port: grpc
          scheme: h2c  # 新增:指定使用h2c协议转发到后端服务
  tls:
    secretName: thanos-sidecar-grpc-tls

2. 修正外部gRPC调用命令

外部访问使用443端口的HTTPS服务,不能用--plaintext参数,正确调用命令:

# 调用健康检查接口
grpcurl thanos-gateway.monitoring.domain.com:443 grpc.health.v1.Health.Check

# 若需查看服务列表,需先给Thanos Sidecar添加启动参数--grpc-reflection启用反射API,再执行:
# grpcurl thanos-gateway.monitoring.domain.com:443 list

3. 验证Traefik的HTTP/2支持

确保Traefik的websecure入口点已启用HTTP/2,检查静态配置(ConfigMap或启动参数):

entryPoints:
  websecure:
    address: ":443"
    http:
      tls: {}
      http2: {}  # 确认HTTP/2已启用

4. 检查AWS NLB配置

  • 确认NLB目标组为TCP模式(而非HTTP),保证Traefik处理TLS终止后,gRPC转发的TCP连接完整性。
  • 确保NLB安全组允许443端口入站流量。
  • 验证NLB目标健康检查正常,Traefik Pod的443端口处于健康状态。

5. 查看Traefik详细日志

启用Traefik debug日志获取请求处理细节:

# 修改Traefik Deployment添加debug日志参数
kubectl edit deployment traefik -n kube-system

# 实时查看Traefik日志
kubectl logs -n kube-system -l app=traefik -f

内容的提问来源于stack exchange,提问作者Beefcake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:44:56