0

我在 kubernetes 中运行 Grafana v6.2.4,使用基本身份验证。我想使用 k8s 代理进行测试(即kubectl proxy --port=8080)。我已将GF_SERVER_ROOT_URL环境变量更改为:

{
    "name": "GF_SERVER_ROOT_URL",
    "value": "http://localhost:8080/api/v1/namespaces/my-namespace/services/grafana-prom:80/proxy/"
}

这使我可以通过我的浏览器登录并使用 Grafana http://localhost:8080/api/v1/namespaces/my-namespace/services/grafana-prom:80/proxy/

但是,我想通过 API 使用它。如果我向我发送请求,http://localhost:8080/api/v1/namespaces/my-namespace/services/grafana-prom:80/proxy/api/dashboards/db我会返回

{
    "message": "Unauthorized"
}

但是,如果我设置了一个 kubernetes 端口转发并将相同的请求发送到http://localhost:30099/api/dashboards/db,那么它会成功。

除了GF_SERVER_ROOT_URL我应该更改以使 API 服务器根通过 k8s 代理之外,是否还有其他环境变量,即http://localhost:8080/api/v1/namespaces/my-namespace/services/grafana-prom:80/proxy/api/dashboards/db?我已经看过这里但找不到它。

否则通过k8s代理访问API的正确方法是什么?

我应该补充一点,我特别想kubetctl proxy用作替代方案,kubectl port-forward所以我希望在这里找到建议的替代方案https://stackoverflow.com/a/45189081/1011724

4

1 回答 1

2

我试图复制这个,minikube我可能已经找到了您通过 API 服务器代理(使用)的请求kubectl proxy没有得到正确授权的原因。

运行以下curl命令:

curl -H "Authorization: Bearer <TOKEN>" http://localhost:8080/api/v1/namespaces/my-namespace/services/grafana-prom:80/proxy/api/dashboards/home

并使用tcpdump捕获 Pod 中的请求并tcpdump -vvvs 0 -l -A -i any产生以下结果:

GET /api/dashboards/home HTTP/1.1                                                                            
Host: localhost:8080                                                                                                 
User-Agent: curl/7.58.0                                                                                              
Accept: */*                                                                                                          
Accept-Encoding: gzip                                                                                                
X-Forwarded-For: 127.0.0.1, 192.168.99.1                                                                             
X-Forwarded-Uri: /api/v1/namespaces/my-namespace/services/grafana-prom:80/proxy/api/dashboards/home

GET请求没有Authorization标头(导致 a 401 Unauthorized),因此基本上 API 服务器似乎在将请求向下传递到 Pod 时剥离了此 HTTP 标头。

如果我改为使用请求kubectl port-forward -n my-namespace svc/grafana-prom 8080:80GET现在看起来像这样:

GET /api/dashboards/home HTTP/1.1                                                                            
Host: localhost:8080                                                                                                 
User-Agent: curl/7.58.0                                                                                              
Accept: */*                                                                                                          
Authorization: Bearer <TOKEN>

在写这个答案时,我在 k/k repo #38775中发现了这个问题,引用其中一条评论:

这按预期工作。通过 apiserver “代理”不会让您获得标准代理行为(保留端到端的授权标头),因为 API 没有被用作标准代理

这基本上意味着kubectl proxy在尝试通过它进行授权时将不起作用,它不是“常规”反向代理,并且可能出于充分的理由不会保留Authorization标头。

请注意,curl尽管上面使用了基于令牌的身份验证,但我测试了令牌和基本授权。

希望这能澄清一点!

于 2019-09-02T19:48:23.993 回答