【问题标题】:Unable to access Kubernetes Dashboard无法访问 Kubernetes 仪表板
【发布时间】:2016-12-08 14:19:53
【问题描述】:

我基于contrib repo 在CoreOS 上创建了一个Kubernetes v1.3.3 集群。我的集群看起来很健康,我想使用仪表板,但我无法访问 UI,即使禁用了所有身份验证。下面是kubernetes-dashboard 组件的详细信息,以及一些 API 服务器配置/输出。我在这里错过了什么?

仪表板组件

core@ip-10-178-153-240 ~ $ kubectl get ep kubernetes-dashboard --namespace=kube-system -o yaml
apiVersion: v1
kind: Endpoints
metadata:
  creationTimestamp: 2016-07-28T23:40:57Z
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
  name: kubernetes-dashboard
  namespace: kube-system
  resourceVersion: "345970"
  selfLink: /api/v1/namespaces/kube-system/endpoints/kubernetes-dashboard
  uid: bb49360f-551c-11e6-be8c-02b43b6aa639
subsets:
- addresses:
  - ip: 172.16.100.9
    targetRef:
      kind: Pod
      name: kubernetes-dashboard-v1.1.0-nog8g
      namespace: kube-system
      resourceVersion: "345969"
      uid: d4791722-5908-11e6-9697-02b43b6aa639
  ports:
  - port: 9090
    protocol: TCP

core@ip-10-178-153-240 ~ $ kubectl get svc kubernetes-dashboard --namespace=kube-system -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2016-07-28T23:40:57Z
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
  name: kubernetes-dashboard
  namespace: kube-system
  resourceVersion: "109199"
  selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
  uid: bb4804bd-551c-11e6-be8c-02b43b6aa639
spec:
  clusterIP: 172.20.164.194
  ports:
  - port: 80
    protocol: TCP
    targetPort: 9090
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}
core@ip-10-178-153-240 ~ $ kubectl describe svc/kubernetes-dashboard --

namespace=kube-system
Name:           kubernetes-dashboard
Namespace:      kube-system
Labels:         k8s-app=kubernetes-dashboard
            kubernetes.io/cluster-service=true
Selector:       k8s-app=kubernetes-dashboard
Type:           ClusterIP
IP:         172.20.164.194
Port:           <unset> 80/TCP
Endpoints:      172.16.100.9:9090
Session Affinity:   None
No events.

core@ip-10-178-153-240 ~ $ kubectl get po  kubernetes-dashboard-v1.1.0-nog8g --namespace=kube-system -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/created-by: |
      {"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicationController","namespace":"kube-system","name":"kubernetes-dashboard-v1.1.0","uid":"3a282a06-58c9-11e6-9ce6-02b43b6aa639","apiVersion":"v1","resourceVersion":"338823"}}
  creationTimestamp: 2016-08-02T23:28:34Z
  generateName: kubernetes-dashboard-v1.1.0-
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
    version: v1.1.0
  name: kubernetes-dashboard-v1.1.0-nog8g
  namespace: kube-system
  resourceVersion: "345969"
  selfLink: /api/v1/namespaces/kube-system/pods/kubernetes-dashboard-v1.1.0-nog8g
  uid: d4791722-5908-11e6-9697-02b43b6aa639
spec:
  containers:
  - image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.1.0
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 3
      httpGet:
        path: /
        port: 9090
        scheme: HTTP
      initialDelaySeconds: 30
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 30
    name: kubernetes-dashboard
    ports:
    - containerPort: 9090
      protocol: TCP
    resources:
      limits:
        cpu: 100m
        memory: 50Mi
      requests:
        cpu: 100m
        memory: 50Mi
    terminationMessagePath: /dev/termination-log
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-lvmnw
      readOnly: true
  dnsPolicy: ClusterFirst
  nodeName: ip-10-178-153-57.us-west-2.compute.internal
  restartPolicy: Always
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  volumes:
  - name: default-token-lvmnw
    secret:
      secretName: default-token-lvmnw
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: 2016-08-02T23:28:34Z
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: 2016-08-02T23:28:35Z
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: 2016-08-02T23:28:34Z
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://1bf65bbec830e32e85e1cd9e22a5db7a2b623c6d9d7da17c747d256a9838676f
    image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.1.0
    imageID: docker://sha256:d023c050c0651bd96508b874ca1cd628fd0077f8327e1aeec92d22070b331c53
    lastState: {}
    name: kubernetes-dashboard
    ready: true
    restartCount: 0
    state:
      running:
        startedAt: 2016-08-02T23:28:34Z
  hostIP: 10.178.153.57
  phase: Running
  podIP: 172.16.100.9
  startTime: 2016-08-02T23:28:34Z

API 服务器配置

/opt/bin/kube-apiserver --logtostderr=true --v=0 --etcd-servers=http://internal-etcd-elb-236896596.us-west-2.elb.amazonaws.com:80 --insecure-bind-address=0.0.0.0 --secure-port=443 --allow-privileged=true --service-cluster-ip-range=172.20.0.0/16 --admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ServiceAccount,ResourceQuota --bind-address=0.0.0.0 --cloud-provider=aws

API 服务器可从远程主机(笔记本电脑)访问

$ curl http://10.178.153.240:8080/
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/apps",
    "/apis/apps/v1alpha1",
    "/apis/autoscaling",
    "/apis/autoscaling/v1",
    "/apis/batch",
    "/apis/batch/v1",
    "/apis/batch/v2alpha1",
    "/apis/extensions",
    "/apis/extensions/v1beta1",
    "/apis/policy",
    "/apis/policy/v1alpha1",
    "/apis/rbac.authorization.k8s.io",
    "/apis/rbac.authorization.k8s.io/v1alpha1",
    "/healthz",
    "/healthz/ping",
    "/logs/",
    "/metrics",
    "/swaggerapi/",
    "/ui/",
    "/version"
  ]

用户界面无法远程访问

$ curl -L http://10.178.153.240:8080/ui
Error: 'dial tcp 172.16.100.9:9090: i/o timeout'
Trying to reach: 'http://172.16.100.9:9090/'

UI 可从 Minion 节点访问

core@ip-10-178-153-57 ~$ curl -L 172.16.100.9:9090
 <!doctype html> <html ng-app="kubernetesDashboard">...

API 服务器路由表

core@ip-10-178-153-240 ~ $ ip route show
default via 10.178.153.1 dev eth0  proto dhcp  src 10.178.153.240  metric 1024
10.178.153.0/24 dev eth0  proto kernel  scope link  src 10.178.153.240
10.178.153.1 dev eth0  proto dhcp  scope link  src 10.178.153.240  metric 1024
172.16.0.0/12 dev flannel.1  proto kernel  scope link  src 172.16.6.0
172.16.6.0/24 dev docker0  proto kernel  scope link  src 172.16.6.1

Minion(pod 所在的地方)路由表

core@ip-10-178-153-57 ~ $ ip route show
default via 10.178.153.1 dev eth0  proto dhcp  src 10.178.153.57  metric 1024
10.178.153.0/24 dev eth0  proto kernel  scope link  src 10.178.153.57
10.178.153.1 dev eth0  proto dhcp  scope link  src 10.178.153.57  metric 1024
172.16.0.0/12 dev flannel.1
172.16.100.0/24 dev docker0  proto kernel  scope link  src 172.16.100.1

法兰绒日志 似乎这条路线与 Flannel 行为不端。我在日志中收到这些错误,但重新启动守护程序似乎无法解决它。

...Watch subnets: client: etcd cluster is unavailable or misconfigured

... L3 miss: 172.16.100.9

... calling NeighSet: 172.16.100.9

【问题讨论】:

  • 这可能是服务未定义或创建的问题?您可以尝试粘贴 kubectl describe svc 的输出吗?
  • 绝对是@SantanuDey。我向 OP 添加了 describe 调用,它到达了显示页面的 172.16.100.9 端点。
  • 如果收到:9090 的响应,则表示一切正常。您可能需要定义一个节点端口类型的附加服务,以便能够使用节点 IP 或从外部访问它。

标签: kubernetes


【解决方案1】:

您必须使用上一个答案中提到的 NodePort 类型的服务在集群外部公开您的服务,或者如果您在 API 服务器上启用了基本身份验证,您可以使用以下 URL 访问您的服务:

http://kubernetes_master_address/api/v1/proxy/namespaces/namespace_name/services/service_name

见:http://kubernetes.io/docs/user-guide/accessing-the-cluster/#manually-constructing-apiserver-proxy-urls

【讨论】:

  • 谢谢安托万。我添加了一个基本的身份验证文件,重新启动了 api-server,但我仍然看到 Error: 'dial tcp 172.16.100.9:9090: i/o timeout' Trying to reach: 'http://172.16.100.9:9090/' 问题。如果我尝试使用 base64 用户:pw 卷曲,我会获得未经授权的权限。我确实尝试了 NodePort,但也无法从外部访问底层容器。代理中是否存在配置错误的内容? @antoine-cotten
  • 那是因为您正在尝试访问您的服务 IP,这很可能在您的工作站所在的网络中无法路由!尝试使用我发布的 URL(替换 namespace_nameservice_name),并确保您使用的是您的 master IP/地址
  • 是的,这就是我正在做的事情。这是我尝试访问的完整 URL:10.178.153.240/api/v1/proxy/namespaces/kube-system/services/…
  • 你的master在你的overlay网络中吗?用于路由与 Docker 网桥(Flannel、Weave...)关联的子网的网络
  • 是的,主人在叠加层内。我在主服务器上运行法兰绒守护程序,但如果我尝试从主服务器上点击http://172.16.100.9:9090,我会收到连接超时。只有当我在其中一个奴才/节点上时,我才能获得成功的响应。所以也许这是我的叠加层的问题?
【解决方案2】:

对于任何找到解决此问题的方法的人,我想发布最终解决方案,因为这不是 Flannel、Kubernetes 或 SkyDNS 问题,而是无意中的防火墙。一旦我在 API 服务器上打开防火墙,我的 Flannel 路由就可以正常工作,我可以访问仪表板(假设在 API 服务器上启用了基本身份验证)。

所以最后,用户错误:)

【讨论】:

  • Flannel 需要哪些流程才能正常运行?谢谢!
  • 我在防火墙中暴露了 TCP 流量,但没有 UDP。开放该限制解决了它。
【解决方案3】:

如果您尝试添加如下定义中的其他服务,那么您我认为您应该能够使用任何节点 IP 和本示例中的节点端口 30100 访问仪表板

kind: Service
apiVersion: v1
metadata:
  name: kube-expose-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 80
      protocol: TCP
      nodePort: 30100
      targetPort: 9090
  selector:
    app: kubernetes-dashboard

【讨论】:

  • 正确。没有必要为此创建另一个服务,可以通过简单地修补现有服务来添加 NodePort,例如使用kubectl edit svc kubernetes-dashboard
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 2019-02-09
  • 2020-06-02
  • 2018-06-12
  • 2020-06-12
  • 2021-01-20
  • 2017-12-24
相关资源
最近更新 更多