从远程机器上部署的 kubernetes 仪表板服务访问本地笔记本电脑时无法访问站点问题

Posted

技术标签:

【中文标题】从远程机器上部署的 kubernetes 仪表板服务访问本地笔记本电脑时无法访问站点问题【英文标题】:Site can not be reached problem while accessing on local laptop from deployed kubernetes dashboard service on remote machine 【发布时间】:2020-04-19 02:09:56 【问题描述】:

当我尝试从本地笔记本电脑访问 Kubernetes 仪表板服务时,我收到无法访问站点的消息。

程序如下:

我按照以下链接中的文档进行操作,

https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/

我在我的本地机器上创建了包含一个主节点和一个工作节点的集群。每台机器都是ubuntu 16.04。我安装了 kubectl 并从我的控制 vm 访问这个集群,我在其中运行 Jenkins 用于 ci/cd 管道。从这个控制虚拟机中,我按照文档中的说明绑定了集群角色并部署了 Kubernetes 仪表板。

我运行以下命令,使用 kuectl 命令(在集群外)从我的控制 vm 部署默认仪表板服务:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

我使用以下内容创建了角色绑定 yaml dashboard-adminuser.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

并使用以下命令创建了这个:

 kubectl apply -f dashboard-adminuser.yaml

使用以下命令访问令牌:

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk 'print $1')

并运行以下命令来提供仪表板服务:

kubectl proxy

当我运行显示“Starting serving on 127.0.0.1:8001”的命令时。

我尝试通过将以下 URL 放在浏览器上来访问仪表板,

http://192.168.16.170:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

但我只收到无法访问网站的消息。

更新

现在我正在尝试通过将仪表板服务类型编辑为NodePort类型来使用NodePort机制进行访问。当我尝试访问 URL 时,我收到“您的连接不是私有的”之类的错误。我在下面添加截图,

我哪里出错了?

【问题讨论】:

来自度量服务器和仪表板 pod 的日志说明了什么? @ArghyaSadhu - 我没有为我的仪表板找到任何 pod 或服务。这就是我的问题。当我运行 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml 时,我也没有收到任何错误。因为我添加了我在上面逐步实现的每个步骤。运行 kubectl 代理后,它显示开始在 127.0.0.1:8001 上服务。 Kubectl get pods -n kubernetes-dashboard 应该给你 pods 然后检查 pods 的日志 @ArghyaSadhu - 当我尝试命令 kubectl get pods 时,它没有列出。现在我明白了,我更新了有问题的结果。它显示它处于运行状态。你能检查编辑的问题吗? 这是什么意思 kubectl logs kubernetes-dashboard-5996555fd8-rdjn7 -n kubernetes-dashboard 【参考方案1】:

您需要将服务类型更改为 NodePort 才能从本地访问它。

节点端口

这种访问 Dashboard 的方式仅推荐用于单节点设置的开发环境。

编辑 kubernetes-dashboard 服务。

$ kubectl -n kubernetes-dashboard 编辑服务 kubernetes-dashboard

您应该会看到服务的 yaml 表示。将类型:ClusterIP 更改为类型:NodePort 并保存文件。

apiVersion: v1
...
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
  resourceVersion: "343478"
  selfLink: /api/v1/namespaces/kubernetes-dashboard/services/kubernetes- 
  dashboard
  uid: 8e48f478-993d-11e7-87e0-901b0e532516
spec:
  clusterIP: 10.100.124.90
  externalTrafficPolicy: Cluster
  ports:
   - port: 443
     protocol: TCP
     targetPort: 8443
  selector:
   k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: 

接下来我们需要检查 Dashboard 暴露的端口。

$ kubectl -n kubernetes-dashboard get service kubernetes-dashboard

NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        
AGE
kubernetes-dashboard   NodePort   10.100.124.90   <nodes>       443:31707/TCP   
21h

仪表板已在端口 31707 (HTTPS) 上公开。现在您可以通过浏览器访问它:https://&lt;master-ip&gt;:31707。可以通过执行 kubectl cluster-info 找到 master-ip。通常它是您机器的 127.0.0.1 或 IP,假设您的集群直接在执行这些命令的机器上运行。

如果您尝试在多节点集群上使用 NodePort 公开 Dashboard,那么您必须找出运行 Dashboard 的节点的 IP 才能访问它。您应该访问https://&lt;node-ip&gt;:&lt;nodePort&gt;,而不是访问https://&lt;master-ip&gt;:&lt;nodePort&gt;

【讨论】:

【参考方案2】:

只能从执行命令(kubectl 代理)的机器访问 UI。在那台机器上试试

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

编辑:

否则使用no​​deport机制访问它而不使用kubectl代理

https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/1.7.x-and-above.md#nodeport

更新:

使用 kubectl 代理访问仪表板

运行kubectl proxy然后访问

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/overview?namespace=default

我使用了一个令牌进行身份验证,现在我创建了这个令牌:

# Create the service account in the current namespace 
# (we assume default)
kubectl create serviceaccount my-dashboard-sa
# Give that service account root on the cluster
kubectl create clusterrolebinding my-dashboard-sa \
  --clusterrole=cluster-admin \
  --serviceaccount=default:my-dashboard-sa
# Find the secret that was created to hold the token for the SA
kubectl get secrets
# Show the contents of the secret to extract the token
kubectl describe secret my-dashboard-sa-token-xxxxx

通过公开的 API Server 访问仪表板

在浏览器中使用此网址https://&lt;master-ip&gt;:&lt;apiserver-port&gt;/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

这会给你以下错误:


  "kind": "Status",
  "apiVersion": "v1",
  "metadata": 

  ,
  "status": "Failure",
  "message": "services \"https:kubernetes-dashboard:\" is forbidden: User \"system:anonymous\" cannot get resource \"services/proxy\" in API group \"\" in the namespace \"kube-system\"",
  "reason": "Forbidden",
  "details": 
    "name": "https:kubernetes-dashboard:",
    "kind": "services"
  ,
  "code": 403

要解决上述错误,请应用以下 yaml 来配置 RBAC:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kubernetes-dashboard-anonymous
rules:
- apiGroups: [""]
  resources: ["services/proxy"]
  resourceNames: ["https:kubernetes-dashboard:"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- nonResourceURLs: ["/ui", "/ui/*", "/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/*"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard-anonymous
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-dashboard-anonymous
subjects:
- kind: User
  name: system:anonymous

您仍然需要 kubeconfig 或令牌才能访问。 Token可以通过上述机制创建。

【讨论】:

感谢您的回复。在我的情况下,适合的是第二种选择。我现在通过编辑仪表板服务来使用 nodeport 机制。但是当我使用 node ip:node port 访问 url 时,我只收到“您的连接不是私有的”消息,一个隐私错误。 如果您将 https 端点 nodeip:port 提供的 ca 证书(自签名)添加到您的系统受信任的 ca 证书,则通信将开始通过 https 进行,您不会收到该错误 我不明白您所说的“由 https 端点 nodeip:port 提供给系统”是什么意思。我需要添加哪个 CA 证书?当我要去 /etc/ssl/certs 文件夹时,我可以同时看到 .pem 和 .crt 文件。你能帮我澄清一下吗? 我可以按照以下文档进行操作吗,hostadvice.com/how-to/… 已经在运行 kubectl proxy。但是我将集群角色与服务帐户绑定并部署仪表板服务的机器不是来自我的本地。那是 k8 集群外的一个远程 Ubuntu vm,仅用于我的 CI(Jenkins 安装)。我没有直接访问那台机器的权限。所以我不能从那里做localhost。因为我只能通过 ssh 访问终端。所以我试图通过用远程机器IP地址替换本地主机来从我的本地做到这一点。我希望你明白我想要做什么。如果我走错了方向,请指导我。

以上是关于从远程机器上部署的 kubernetes 仪表板服务访问本地笔记本电脑时无法访问站点问题的主要内容,如果未能解决你的问题,请参考以下文章

如何从我在 Google Cloud Platform 上的部署中删除 Kubernetes 仪表板资源?

远程访问 EC2 上的 Kubernetes 仪表板

在windows电脑上配置kubectl远程操作kubernetes

安装部署 Kubernetes 仪表板(Dashboard)

如何在Rancher 2.0上快速部署Datadog

Kubernetes 仪表板部署 YAML 文件链接已损坏