【问题标题】:Can't nginx proxy pass to kibana in kubernetes无法将 nginx 代理传递给 kubernetes 中的 kibana
【发布时间】:2019-03-10 04:59:39
【问题描述】:

我正在尝试使用带有 nginx 的代理传递到使用基本身份验证的 Kibana pod。

用于测试(它是另一个 k8s 集群,但非常相似,使用相同的命名空间、kube-dns、pod 内的 env 匹配并且它们彼此看到) 上下文:我通过 helm 在 AWS 中的 k8s 部署它,nginx 有一个 Kubernetes LB 服务类型(基本上它是 AWS 的 ELB,其 cname 在 route53)。

如果我将 nginx pod 指向 kibana-app.kube-system.svc.cluster.local:5601 我会在 kibana pod 上看到来自 nginx 的请求,但在尝试转到 server.basePath:/api/v1 时返回 404 /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 时,它返回 404。

有什么想法吗?

谢谢!

更新:

我快到了,现在我可以看到“kibana 正在加载屏幕”,但从未完成加载包、json 和东西、nginx pod 日志:

GET /api/v1/proxy/namespaces/kube-system/services/kibana-logging/bundles/commons.style.css

在 kibana pod 返回 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","re​​ferer":"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 pod 所在的节点命中。那是我在浏览器上使用的 url,它应该到达 nginx,向我询问基本授权,然后带我到带有 server.basePath 的 kibana pod:/api/v1/proxy/namespaces/kube-system/services/kibana-logging 请,如果我不清楚,请问我,抱歉我不能复制/粘贴所有内容。

【问题讨论】:

    标签: nginx kubernetes kibana


    【解决方案1】:

    终于成功了:

        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

    【讨论】:

      【解决方案2】:

      不确定这在另一个集群上是如何工作的。因此,您提到的基本路径:/api/v1/proxy/namespaces/kube-system/services/kibana-app/ 似乎是 kube-apiserver 基本路径,这就是使用 kubectl proxy 的代理设置与集群中的应用程序和服务通信的路径。

      如果您真的想在集群内从 nginx 与 Kibana 通信,您必须将 kibana-app.kube-system.svc.cluster.local:5601 端点添加到您的 nginx 后端。

      【讨论】:

      • 由于评论中允许的字符较少,因此不得不回复。再次感谢。
      • 它可能会被标记,您也可以编辑您的原始问题
      • Ty,我将其添加为更新。我正在努力让它发挥作用。如果我设置,只能在 kibana pod 上看到日志:proxy_pass kibana-logging.kube-system.svc.cluster.local:5601 但仍然得到 404s。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2023-03-24
      • 2018-06-11
      • 1970-01-01
      • 2019-11-05
      • 2021-09-09
      • 1970-01-01
      相关资源
      最近更新 更多