1

我有两个非常不同的集群(一个带有仪表板 1.0 的 kubernetes 1.13 并在 aws 中使用 kops 创建;另一个使用带有仪表板 2.0 的 kubernetes 1.14 并使用 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 时需要接受主机?

4

1 回答 1

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有效。

为错误道歉!

于 2020-05-27T15:57:02.237 回答