我有两个非常不同的集群(一个带有仪表板 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 时需要接受主机?