【问题标题】:Unable to access Kubernetes dashboard from outside the cluster无法从集群外部访问 Kubernetes 仪表板
【发布时间】:2017-12-24 12:07:41
【问题描述】:

我已经设置了包含一个主节点和三个节点的 Kubernetes 集群。我使用以下设置:
1.kubeadm (1.7.1)
2.kubectl (1.7.1)
3.kubelet (1.7.1)
4. 编织 (weave-kube-1.6)
5. docker (17.06.0~ce-0~debian)

所有四个实例均已在 Google Cloud 中设置,操作系统为 Debian GNU/Linux 9 (stretch)

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                             READY     STATUS    RESTARTS   AGE
kube-system   etcd-master                      1/1       Running   0          19m
kube-system   kube-apiserver-master            1/1       Running   0          19m
kube-system   kube-controller-manager-master   1/1       Running   0          19m
kube-system   kube-dns-2425271678-cq9wh        3/3       Running   0          24m
kube-system   kube-proxy-q399p                 1/1       Running   0          24m
kube-system   kube-scheduler-master            1/1       Running   0          19m
kube-system   weave-net-m4bgj                  2/2       Running   0          4m


$ kubectl get nodes
NAME      STATUS     AGE       VERSION
master    Ready      1h        v1.7.1
node1     Ready      6m        v1.7.1
node2     Ready      5m        v1.7.1
node3     Ready      7m        v1.7.1

apiserver 进程使用以下参数运行:

root      1148  1101  1 04:38 ?  00:03:38 kube-apiserver 
--experimental-bootstrap-token-auth=true --allow-privileged=true 
--secure-port=6443
--insecure-port=0 --service-cluster-ip-range=10.96.0.0/12 
--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname 
--requestheader-username-headers=X-Remote-User 
--authorization-mode=Node,RBAC --advertise-address=10.128.0.2 
--etcd-servers=http://127.0.0.1:2379

我运行了以下命令来访问仪表板:

$ kubectl create -f https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml
serviceaccount "kubernetes-dashboard" created
clusterrolebinding "kubernetes-dashboard" created
deployment "kubernetes-dashboard" created

但由于仪表板无法访问,我也尝试了以下命令,尽管它看起来不太相关。在哪里见过。

kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default

最后,我遇到了一个看起来与我的问题相关的link。我试过了,但出现以下错误:

d:\Work>kubectl --kubeconfig=d:\Work\admin.conf proxy -p 80
Starting to serve on 127.0.0.1:80I0719 13:37:13.971200    5680 logs.go:41] http: proxy error: context canceled
I0719 13:37:15.893200    5680 logs.go:41] http: proxy error: dial tcp 124.179.54.120:6443: connectex: No connection could be made
because the target machine actively refused it.

如果我在端口 22 上从笔记本电脑对主 IP (124.179.54.120) 执行 telnet,它可以工作,但它在端口 6443 上不起作用。端口 6443 在主服务器上打开,因为我可以 @987654333 @ 在我的节点机器的给定主端口上,如下所示:

tom@node1:~$ nc -zv 10.128.0.2 6443
master.c.kubernetes-174104.internal [10.128.0.2] 6443 (?) open

在我的笔记本电脑上,防火墙已经被禁用,我也在主服务器上禁用了防火墙。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  anywhere             anywhere             /* kubernetes service portals */

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  anywhere             anywhere             /* kubernetes service portals */

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination

在 Google Cloud 控制台中,我将 TCP 和 UDP 端口 6443 添加到 Google Cloud 防火墙规则中的入口请求,但我仍然无法使用 http://localhost/ui 访问仪表板

主配置详细信息:

防火墙配置详情:

更新:d:\Work\admin.conf 的内容

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: <CA_cert>
    server: https://124.179.54.120:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: <client-cert>
    client-key-data: <client-key>

UPDATE1:从三个节点之一,我运行了以下命令:

tom@node1:~$ curl -v http://127.0.0.1:8001
* Rebuilt URL to: http://127.0.0.1:8001/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8001 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8001
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 502 Bad Gateway
< Date: Thu, 20 Jul 2017 06:57:48 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
<
* Curl_http_done: called premature == 0
* Connection #0 to host 127.0.0.1 left intact

【问题讨论】:

  • 如果kubectl get pods 工作,则意味着您可以与master-node:6443 通信,这意味着kubectl proxy 指的是别的东西。你能把d:\Work\admin.conf贴在这里吗?此外,端口 6443 不属于 Ingress,而是属于 kube-apiserver。 Ingress 通常配置为在端口 80 和 443 上运行。
  • kubectl get pods 在 master 本身上执行。我的本地笔记本电脑从未运行过任何命令。另外,当我说 Ingress 时,我指的是 Google Container 的 firewall rules。我在上面的帖子中的防火墙快照中显示了那些列入白名单的端口。很抱歉造成混乱。
  • @EugeneChow:由于无法发送个人信息,我想在这里提一下。在发布证书之前,已删除了数百个字符。尽管如此,它肯定会发生在某人身上。所以感谢您的编辑,您的更改肯定看起来更好。 :)
  • 干杯 :) 每个人都会犯错。无论如何,这看起来像是我不熟悉的 GCE 问题。这部分必须先解决。在节点本身中尝试kubectl proxy。如果可行,解决“GCE 入口”问题应立即允许您从笔记本电脑进行代理。
  • 我尝试从其中一个节点运行kubectl proxy,然后运行nc -zv 127.0.0.1 8001。我得到localhost [127.0.0.1] 8001 (?) open。似乎它工作正常。不知道为什么curl -Is http://127.0.0.1:8001 命令返回HTTP/1.1 502 Bad Gateway

标签: google-cloud-platform kubernetes kubeadm


【解决方案1】:

默认情况下,kubectl 代理仅接受来自 localhost 以及 ipv4 和 ipv6 环回地址的传入连接。
尝试在运行代理时设置--accept-hosts='.*',以便它开始接受来自任何地址的连接。
您可能还需要将 --address 标志设置为公共 IP,因为默认值为 127.0.0.1

更多详情请关注kubectl proxy docs

【讨论】:

  • 感谢@Toresan 的回复,但很抱歉,我无法立即验证。由于客户端使用 Rancher 设置 Kubernetes,我已经取消了设置。如果我以后碰巧设置了手动方式,我会重新访问并尝试您的建议。感谢您抽出时间回复。
  • 经过几天的搜索,这是我在整个互联网上发现的第一件事,它实际上可以让远程计算机上的浏览器访问在其他地方的服务器上运行的仪表板。令人惊讶的是,看似最常见的用例完全没有文档记录。谢谢!
猜你喜欢
  • 2019-02-09
  • 2019-01-26
  • 2018-11-03
  • 2019-07-18
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
相关资源
最近更新 更多