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

Site can not be reached problem while accessing on local laptop from deployed kubernetes dashboard service on remote machine

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

遵循的程序:

我遵循了以下 link、

中的文档

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

我在我的前提机器上创建了一个集群,其中有一个主节点和一个工作节点。每台机器都是ubuntu16.04。我安装了 kubectl 并从我的控制虚拟机访问这个集群,我在 运行ning Jenkins 中为 ci/cd 管道。从这个控制虚拟机,我按照文档中的说明绑定了 clusterrole 并部署了 Kubernetes 仪表板。

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

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 }')

和运行以下用于仪表板服务的命令:

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 时,出现 "your connection is not private" 之类的错误。我在下面添加屏幕截图,

我哪里做错了?

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

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

编辑:

否则使用 nodeport 机制访问它而不使用 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 服务器访问仪表板

在浏览器中使用此 url https://<master-ip>:<apiserver-port>/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 或令牌才能访问。令牌可以通过上述机制创建。

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

节点端口

这种访问仪表板的方式只推荐用于单节点设置中的开发环境。

编辑 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://<master-ip>:31707。可以通过执行 kubectl cluster-info 找到 master-ip。通常它是 127.0.0.1 或你机器的 IP,假设你的集群直接在机器上 运行,执行这些命令。

如果您尝试在多节点集群上使用 NodePort 公开 Dashboard,那么您必须找出 Dashboard 所在节点的 IP 运行 访问它。您应该访问 https://<node-ip>:<nodePort>.

而不是访问 https://<master-ip>:<nodePort>