【问题标题】:Cannot access kubernetes dashboard with kubectl proxy via a web browser无法通过 Web 浏览器使用 kubectl 代理访问 kubernetes 仪表板
【发布时间】:2016-10-05 18:24:01
【问题描述】:

这是与this 类似的问题,但我无法从中找到解决方案。我已经按照step by step guide 在 AWS 上设置了具有 CoreOS 2 主服务器和 3 个节点的 Kubernetes 集群。 k8s 版本是 1.4.0,所有服务器都在一个私有子网中,所以我在不同的 VPC 上构建了一个堡垒 VPN 服务器,并通过具有 VPC 对等互连的堡垒服务器连接到 k8s 集群。

它基本上工作得很好,但我注意到我无法从 Web 浏览器访问 kubernetes 仪表板。 这些是我的 kuberentes 仪表板 svc 和 rc yaml 文件。

apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: kubernetes-dashboard
  ports:
  - port: 80
    targetPort: 9090
---
apiVersion: v1
kind: ReplicationController
metadata:
  name: kubernetes-dashboard-v1.4.0
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    version: v1.4.0
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 1
  selector:
    k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        version: v1.4.0
        kubernetes.io/cluster-service: "true"
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
        scheduler.alpha.kubernetes.io/tolerations: '[{"key":"CriticalAddonsOnly", "operator":"Exists"}]'
    spec:
      containers:
      - name: kubernetes-dashboard
        image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.4.0
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
        ports:
        - containerPort: 9090
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30

如果我只是访问https://master-host/ui,它会返回一个身份验证错误。我理解它并且觉得没有问题,因为api服务器需要认证。但是当我运行kubectl proxy --port=8001 然后访问http://localhost:8001/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard/ 时,浏览器返回

Error: 'dial tcp 10.10.93.3:9090: i/o timeout'
Trying to reach: 'http://10.10.93.3:9090/'

虽然对 api 服务器的请求只是像 http://localhost:8001/static 这样的文件返回:

{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/apps",
    "/apis/apps/v1alpha1",
    "/apis/authentication.k8s.io",
    "/apis/authentication.k8s.io/v1beta1",
    "/apis/authorization.k8s.io",
    "/apis/authorization.k8s.io/v1beta1",
    "/apis/autoscaling",
    "/apis/autoscaling/v1",
    "/apis/batch",
    "/apis/batch/v1",
    "/apis/batch/v2alpha1",
    "/apis/certificates.k8s.io",
    "/apis/certificates.k8s.io/v1alpha1",
    "/apis/extensions",
    "/apis/extensions/v1beta1",
    "/apis/policy",
    "/apis/policy/v1alpha1",
    "/apis/rbac.authorization.k8s.io",
    "/apis/rbac.authorization.k8s.io/v1alpha1",
    "/apis/storage.k8s.io",
    "/apis/storage.k8s.io/v1beta1",
    "/healthz",
    "/healthz/ping",
    "/logs",
    "/metrics",
    "/swaggerapi/",
    "/ui/",
    "/version"
  ]
}

看起来 master 上的 pod 无法连接到节点上的 pod。从节点上的busybox,

kubectl exec busybox -- wget 10.10.93.3:9090

可以获取 index.html,因此节点到节点的通信应该没问题。

服务描述的结果:

❯❯❯ kubectl describe svc kubernetes-dashboard --namespace=kube-system                                                                        ⏎ master ⬆ ✭ ✚ ✱ ➜ ◼
Name:           kubernetes-dashboard
Namespace:      kube-system
Labels:         k8s-app=kubernetes-dashboard
            kubernetes.io/cluster-service=true
Selector:       k8s-app=kubernetes-dashboard
Type:           ClusterIP
IP:         10.11.0.82
Port:           <unset> 80/TCP
Endpoints:      10.10.93.9:9090
Session Affinity:   None
No events.

我还缺少什么?如果我使用 NodePort,我可以看到仪表板,但我不想公开仪表板。我怀疑我必须在 AWS 安全组设置上打开一些缺少的端口,或者一些 flanneld/docker/cni 网络设置出错并导致问题。

这是仪表板窗格的日志。

Starting HTTP server on port 9090
Creating API server client for https://10.11.0.1:443
Successful initial request to the apiserver, version: v1.4.0+coreos.1
Creating in-cluster Heapster client

所以它看起来实际上没有到达仪表板。

[更新] 我在 api-server pod 上找到了这些日志。

 proxy.go:186] Error proxying data from backend to client: write tcp [master-ip-address]:443->[vpn-ip-address]:61980: write: connection timed out

很明显,在 api 服务器和 VPN 服务器之间进行代理时发生了一些事情。

【问题讨论】:

    标签: amazon-web-services kubernetes coreos


    【解决方案1】:

    啊...最后我注意到我的 AWS 安全设置有错误。也就是我开启了flanneld关于master=>node通信的TCP 8472端口,应该是UDP。我知道应该是UDP,所以花了很长时间才重新检查并注意到错误。

    更新设置后,kubectl proxy 立即生效,我现在可以看到 kubernetes 仪表板。

    【讨论】:

      【解决方案2】:

      您的服务配置似乎有错字:

      spec:
        selector:
          k8s-app: kubernetes-dashboar
      

      您应该能够执行kubectl describe svc kubernetes-dashboard --namespace=kube-system 并在一切正常时看到有效的端点。

      【讨论】:

      • 对不起,我在粘贴到这篇文章时打错字了,在实际的 yaml 文件中,它写成“k8s-app: kubernetes-dashboard”,所以这是不相关的。我修改了我的第一篇文章。
      • @NorioAkagi - 你的kubectl describe svc kubernetes-dashboard --namespace=kube-system 说什么?它是否提到任何端点?
      • 我在第一篇文章中粘贴了命令的结果。它显示了一个端点。我还在帖子底部发布了 api 服务器上的错误日志。我目前怀疑由于 VPN 连接存在一些故障。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 2021-05-23
      • 2018-11-17
      • 2016-09-14
      • 2016-12-08
      相关资源
      最近更新 更多