从远程计算机上部署的 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 代理
更新:
使用 kubectl 代理访问仪表板
运行 kubectl proxy
然后访问
我使用了令牌进行身份验证,现在我创建了令牌:
# 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>
当我尝试从我的本地笔记本电脑访问 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 代理
更新:
使用 kubectl 代理访问仪表板
运行 kubectl proxy
然后访问
我使用了令牌进行身份验证,现在我创建了令牌:
# 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>