【问题标题】:kubernetes dashboard reachable with curl but not chrome/firefox via kubectl proxykubernetes 仪表板可通过 curl 访问,但不能通过 kubectl 代理访问 chrome/firefox
【发布时间】:2020-05-27 23:57:02
【问题描述】:

我有两个非常不同的集群(一个使用 kubernetes 1.13 和仪表板 1.0 并在 aws 中使用 kops 创建;另一个使用 kubernetes 1.14 和仪表板 2.0 并使用 EKS 创建)两者都有相同的问题,我使用 kubectl 1.17 进行接口既。启动kubectl proxy 后,我可以通过curl 访问我刚刚安装的仪表板。例如,在较新的 EKS 集群中使用仪表板 2.0:

在一个终端中:

$ kubectl proxy 
Starting to serve on 127.0.0.1:8001

在另一个终端

$ curl http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
<!--
Copyright 2017 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>Kubernetes Dashboard</title>
  <link rel="icon" type="image/png" href="assets/images/kubernetes-logo.png"/>
  <meta name="viewport" content="width=device-width">
<link rel="stylesheet" href="styles.d8a1833bf9631b49f8ae.css"></head>

<body>
  <kd-root></kd-root>
<script src="runtime.a3c2fb5c390e8fb10577.js" defer=""></script><script src="polyfills-es5.ddf623b9f96429e29863.js" nomodule="" defer=""></script><script src="polyfills.24a7a4821c30c3b30717.js" defer=""></script><script src="scripts.391d299173602e261418.js" defer=""></script><script src="main.a0d83b15387cfc420c65.js" defer=""></script></body>

</html>

显然仪表板服务是可访问的并响应请求。其他集群/仪表板组合的 html 有点不同,但仍然没有错误。

但是来自 chrome 或 firefox 的完全相同的 URL(当然在同一主机上运行)给了我一个错误:

This site can’t be reached
127.0.0.1 refused to connect.
Try:
Checking the connection
Checking the proxy and the firewall
ERR_CONNECTION_REFUSED

仪表板 2.0 本身似乎很高兴:

$ kubectl get all -n kubernetes-dashboard
NAME                                             READY   STATUS    RESTARTS   AGE
pod/dashboard-metrics-scraper-76679bc5b9-k7qjp   1/1     Running   0          136m
pod/kubernetes-dashboard-565688d4c4-dtw5w        1/1     Running   0          136m

NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/dashboard-metrics-scraper   ClusterIP   172.20.42.193    <none>        8000/TCP   142m
service/kubernetes-dashboard        ClusterIP   172.20.232.104   <none>        443/TCP    142m

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/dashboard-metrics-scraper   1/1     1            1           142m
deployment.apps/kubernetes-dashboard        1/1     1            1           142m

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/dashboard-metrics-scraper-6c554969c6   0         0         0       137m
replicaset.apps/dashboard-metrics-scraper-76679bc5b9   1         1         1       142m
replicaset.apps/kubernetes-dashboard-565688d4c4        1         1         1       142m
replicaset.apps/kubernetes-dashboard-56c5f95c6b        0         0         0       137m

任何想法有什么问题吗?它怎么可能与 curl 而不是 Web 浏览器一起使用?

更新信息:

我检查了 ifconfig:

$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ...    
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        ...

使用以下 kubectl proxy 命令,我也可以在浏览器中访问仪表板:

在一个终端中:

kubectl proxy --address='172.17.0.2' --accept-hosts='.*'

然后 chrome 浏览器到http://172.17.0.2:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 显示登录屏幕。

这两个标志都是必需的,否则 curl 和浏览器都不起作用(如果我不使用 --accept-hosts,则响应是禁止的——尽管该响应来自服务,所以它至少比使用环回时更好)。

用 localhost 替换 127.0.0.1 没有帮助。只有当我使用完整的代理命令和http://172.17.0.2:8001/api 时,我才能访问 api 服务器。

有谁知道为什么 chrome 不能处理 127.0.0.1,而 curl 可以,为什么在 curl 172.12 IP 而不是使用 127 IP 时需要接受主机?

【问题讨论】:

  • 如果您在浏览器中使用 localhost 而不是 12.0.0.1 是否有效?您是否可以通过 kubectl 代理从浏览器访问其他任何内容?例如 localhost:8001/api
  • @arghya 在帖子中添加了信息,但两个问题基本上都没有。

标签: google-chrome curl kubernetes kubernetes-dashboard kubernetes-apiserver


【解决方案1】:

这很尴尬,但我想我不妨留下这个问题并发布一个答案,以防其他人忘记了显而易见的事情:

在运行 curl 和 kubectl 代理命令时,我被装入了在我的主机上运行的 docker 容器中(我忘了!因为它不停地运行)。容器共享主机的网络,这就是 172.17 从浏览器工作的原因,而不是环回。

如果您将容器设置为端口转发,例如端口 8080 到 8080 (docker ... -p 8080:8080 ...),那么以下代理命令(来自该容器内部)也可以:

$ kubectl proxy --port 8080 --address='0.0.0.0'

即在主机上浏览到http://localhost:8080/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

对不起!

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 2022-08-12
    • 2018-06-12
    • 2017-12-23
    • 2018-11-19
    • 2018-11-17
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多