nginx 代理无法传递给 kubernetes 中的 kibana
Can't nginx proxy pass to kibana in kubernetes
我正在尝试使用带有 nginx 的代理传递到使用基本身份验证的 Kibana pod。
用于测试(它是另一个 k8s 集群,但非常相似,在 pods 匹配中使用相同的命名空间、kube-dns、env,并且它们相互看到)
上下文:我在 AWS 的 k8s 通过 helm 部署它,nginx 有一个 Kubernetes LB 服务类型(基本上它是 AWS 的一个 ELB,它的 cname 在 route53)。
如果我将 nginx pod 指向 kibana-app.kube-system.svc.cluster.local:5601 我看到来自 nginx 的 kibana pod 的请求,但是 returning 404 试图去 server.basePath: /api/v1/proxy/namespaces/kube-system/services/kibana-app/
我可以通过从 "kubectl cluster-info" 获取 url 然后检查日志来访问 kibana-app pod,请求是这样的:
"method":"get","statusCode":200,"req":{"url":"/app/kibana"
"x-forwarded-uri":"/api/v1/proxy/namespaces/kube-system/services/kibana-logging/app/kibana
尝试从 nginx 访问 Kibana 路径时找不到问题(在执行基本身份验证后)
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log;
location / {
auth_basic "simple auth";
auth_basic_user_file /var/kibana_config/htpasswd;
try_files KIBANA @kibana-app;
}
location @kibanaapp {
return 301 http://kiban-app-url-from-route53/server.basePath;
}
location /api {
proxy_pass https://api.awszone.mydomain/api;
proxy_set_header Authorization "Basic ";
}
}
还尝试移动 proxy_pass 语句,删除 return 并只是从 kibana 的 pod 正在侦听的地方执行 proxy_pass 但两者都不起作用,请求永远不会得到到 pod 或者当请求到达 kibana-app pod 时,它 return 是 404。
有什么想法吗?
谢谢!
更新:
我快到了,现在我可以看到 "kibana is loading screen" 但从未完成加载包,json 和东西,nginx pod 日志:
获取/api/v1/proxy/namespaces/kube-system/services/kibana-logging/bundles/commons.style.css
kibana pod 的相同请求 returning 404:
"statusCode":404,"req":{"url":"/app/kibana/v1/proxy/namespaces/kube-system/services/kibana-logging/bundles/commons.bundle.js?v=10146","method": "get","headers":{"host":"kibana.app.env.com","referer":"http://kibana.app.env.com/api "referer":"http://kibana.app.env.com/api"},"res":{"statusCode":404,"responseTime":2,"contentLength":9},"message":"GET /app/kibana/v1/proxy/namespaces/kube-system/services/kibana-logging/bundles/commons.bundle.js?v=10146
我的 nginx 配置文件:
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log;
location / {
auth_basic "simple auth";
auth_basic_user_file /var/kibana_config/htpasswd;
try_files KIBANA @kibana-app;
}
location @kibana-app {
return 301 kibana.app.env.com/server.basePath;
}
location /api {
proxy_pass http://kibana-logging.kube-system.svc.cluster.local:5601;
proxy_set_header HOST $host;
proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Authorization "simple auth ";
}
}
"kibana.app.env.com" 它只是 kubernetes 在 route53 创建的 FQDN 作为 ELB 的 CNAME,它命中 nginx/kibana pods 所在的节点。那是我在浏览器上使用的 url,它应该到达 nginx,询问我基本授权,然后带我到带有 server.basePath 的 kibana pod:/api/v1/proxy/namespaces/kube-system/services/kibana-logging 请问我一些事情,如果我'我不清楚,抱歉我不能 copy/paste 一切。
不确定这在另一个集群上是如何工作的。所以你提到的基本路径:/api/v1/proxy/namespaces/kube-system/services/kibana-app/
看起来像一个 kube-apiserver 基本路径,这是使用 kubectl proxy
的代理设置与集群中的应用程序和服务对话的路径。
如果您真的想在集群内从 nginx 与 Kibana 通信,您必须将 kibana-app.kube-system.svc.cluster.local:5601
端点添加到您的 nginx 后端。
终于开始工作了:
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log;
location / {
auth_basic "simple auth";
auth_basic_user_file /var/kibana_config/htpasswd;
try_files KIBANA @kibana-app;
}
location @kibana-app {
return 301 /api/v1/proxy/namespaces/kube-system/services/kibana-logging/;
}
location /api/v1/proxy/namespaces/kube-system/services/kibana-logging/ {
proxy_set_header Authorization "simple auth ";
proxy_pass http://kibana-logging.kube-system.svc.cluster.local:5601/;
proxy_set_header HOST $host;
proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_cache_bypass $http_upgrade;
}
}
转到 K8s 在 AWS 创建的作为 ELB (kibana-app.env.com) 的 URL 重定向到 /api/v1/proxy/namespaces/kube-system/services/kibana-logging/ 其中 proxy_pass 到 kibana pod:http://kibana-logging.kube-system.svc.cluster.local:5601
我正在尝试使用带有 nginx 的代理传递到使用基本身份验证的 Kibana pod。
用于测试(它是另一个 k8s 集群,但非常相似,在 pods 匹配中使用相同的命名空间、kube-dns、env,并且它们相互看到) 上下文:我在 AWS 的 k8s 通过 helm 部署它,nginx 有一个 Kubernetes LB 服务类型(基本上它是 AWS 的一个 ELB,它的 cname 在 route53)。
如果我将 nginx pod 指向 kibana-app.kube-system.svc.cluster.local:5601 我看到来自 nginx 的 kibana pod 的请求,但是 returning 404 试图去 server.basePath: /api/v1/proxy/namespaces/kube-system/services/kibana-app/
我可以通过从 "kubectl cluster-info" 获取 url 然后检查日志来访问 kibana-app pod,请求是这样的:
"method":"get","statusCode":200,"req":{"url":"/app/kibana"
"x-forwarded-uri":"/api/v1/proxy/namespaces/kube-system/services/kibana-logging/app/kibana
尝试从 nginx 访问 Kibana 路径时找不到问题(在执行基本身份验证后)
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log;
location / {
auth_basic "simple auth";
auth_basic_user_file /var/kibana_config/htpasswd;
try_files KIBANA @kibana-app;
}
location @kibanaapp {
return 301 http://kiban-app-url-from-route53/server.basePath;
}
location /api {
proxy_pass https://api.awszone.mydomain/api;
proxy_set_header Authorization "Basic ";
}
}
还尝试移动 proxy_pass 语句,删除 return 并只是从 kibana 的 pod 正在侦听的地方执行 proxy_pass 但两者都不起作用,请求永远不会得到到 pod 或者当请求到达 kibana-app pod 时,它 return 是 404。
有什么想法吗?
谢谢!
更新:
我快到了,现在我可以看到 "kibana is loading screen" 但从未完成加载包,json 和东西,nginx pod 日志:
获取/api/v1/proxy/namespaces/kube-system/services/kibana-logging/bundles/commons.style.css
kibana pod 的相同请求 returning 404:
"statusCode":404,"req":{"url":"/app/kibana/v1/proxy/namespaces/kube-system/services/kibana-logging/bundles/commons.bundle.js?v=10146","method": "get","headers":{"host":"kibana.app.env.com","referer":"http://kibana.app.env.com/api "referer":"http://kibana.app.env.com/api"},"res":{"statusCode":404,"responseTime":2,"contentLength":9},"message":"GET /app/kibana/v1/proxy/namespaces/kube-system/services/kibana-logging/bundles/commons.bundle.js?v=10146
我的 nginx 配置文件:
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log;
location / {
auth_basic "simple auth";
auth_basic_user_file /var/kibana_config/htpasswd;
try_files KIBANA @kibana-app;
}
location @kibana-app {
return 301 kibana.app.env.com/server.basePath;
}
location /api {
proxy_pass http://kibana-logging.kube-system.svc.cluster.local:5601;
proxy_set_header HOST $host;
proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Authorization "simple auth ";
}
}
"kibana.app.env.com" 它只是 kubernetes 在 route53 创建的 FQDN 作为 ELB 的 CNAME,它命中 nginx/kibana pods 所在的节点。那是我在浏览器上使用的 url,它应该到达 nginx,询问我基本授权,然后带我到带有 server.basePath 的 kibana pod:/api/v1/proxy/namespaces/kube-system/services/kibana-logging 请问我一些事情,如果我'我不清楚,抱歉我不能 copy/paste 一切。
不确定这在另一个集群上是如何工作的。所以你提到的基本路径:/api/v1/proxy/namespaces/kube-system/services/kibana-app/
看起来像一个 kube-apiserver 基本路径,这是使用 kubectl proxy
的代理设置与集群中的应用程序和服务对话的路径。
如果您真的想在集群内从 nginx 与 Kibana 通信,您必须将 kibana-app.kube-system.svc.cluster.local:5601
端点添加到您的 nginx 后端。
终于开始工作了:
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log;
location / {
auth_basic "simple auth";
auth_basic_user_file /var/kibana_config/htpasswd;
try_files KIBANA @kibana-app;
}
location @kibana-app {
return 301 /api/v1/proxy/namespaces/kube-system/services/kibana-logging/;
}
location /api/v1/proxy/namespaces/kube-system/services/kibana-logging/ {
proxy_set_header Authorization "simple auth ";
proxy_pass http://kibana-logging.kube-system.svc.cluster.local:5601/;
proxy_set_header HOST $host;
proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_cache_bypass $http_upgrade;
}
}
转到 K8s 在 AWS 创建的作为 ELB (kibana-app.env.com) 的 URL 重定向到 /api/v1/proxy/namespaces/kube-system/services/kibana-logging/ 其中 proxy_pass 到 kibana pod:http://kibana-logging.kube-system.svc.cluster.local:5601