GKE默认GCE Ingress控制器下Linkerd路由指标无法生效求助
问题描述
在GKE中运行微服务,尝试让默认GKE GCE Ingress与Linkerd配合以获取基于路由的指标。根据Linkerd文档,GCE Ingress应启用ingress模式注入(使用linkerd.io/inject: ingress注解而非默认的enabled)。配置了如下Ingress资源后,路由指标仍未生成,通过linkerd tap检查发现rt_route未被设置。怀疑该注解应添加到Ingress控制器,但由于是GKE托管的,不知道如何操作。
Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress namespace: emojivoto annotations: ingress.kubernetes.io/custom-request-headers: "l5d-dst-override: web-svc.emojivoto.svc.cluster.local:80" ingress.gcp.kubernetes.io/pre-shared-cert: "managed-cert-name" kubernetes.io/ingress.global-static-ip-name: "static-ip-name" linkerd.io/inject: ingress spec: ingressClassName: gce rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: web-svc port: number: 80
解决方案
1. 纠正注入注解的使用位置
你将linkerd.io/inject: ingress注解加在了Ingress资源上,这是无效的——该注解用于触发Linkerd Sidecar注入到Pod中,Ingress资源本身不会被注入。
由于GKE托管的GCE Ingress控制器属于系统组件(运行在kube-system命名空间),用户无法直接修改其Pod或Deployment的注解来注入Sidecar,因此这条路走不通。
2. 添加路由覆盖头生成指标
要让Linkerd生成rt_route指标,需要在Ingress转发的请求中添加l5d-route-override头,配合已有的l5d-dst-override头使用:
- 修改Ingress的
ingress.kubernetes.io/custom-request-headers注解,补充路由覆盖配置:
这里的ingress.kubernetes.io/custom-request-headers: "l5d-dst-override: web-svc.emojivoto.svc.cluster.local:80,l5d-route-override: /"/对应Ingress规则中的路径前缀,可根据实际路由规则调整(比如/api/*对应l5d-route-override: /api)。
3. 确保后端服务已被Linkerd注入
确认后端web-svc对应的Deployment已添加默认模式的Linkerd注入注解:
- 在Deployment的
metadata.annotations中添加linkerd.io/inject: enabled,或通过命令重新部署:kubectl get deployment web -n emojivoto -o yaml | linkerd inject - | kubectl apply -f -
4. 验证配置效果
更新Ingress和后端Deployment后,通过linkerd tap再次检查流量:
linkerd tap deploy/web -n emojivoto
此时应能看到rt_route标签被正确设置为l5d-route-override中指定的值,对应的路由指标也会在Linkerd Dashboard中显示。
内容的提问来源于stack exchange,提问作者Dmitry Korolev

