我正在尝试使用网络外部的Token方法访问kubernetes仪表板。
我运行了这两个命令来获取令牌
kubectl -n kube-system get secret
kubectl -n kube-system describe secret replicaset-controller-token-2p4fk
将粘贴的输出令牌复制到K8登录页面。
当我单击“登录”按钮(页面未加载)时,出现此错误浏览器控制台。
我正在使用以下命令在内部服务器上运行k8:
kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
并尝试从外部网络访问k8 UI控制台。
Failed to load resource: the server responded with a status of 401 (Unauthorized)
vendor.bd425c26.js:6 Error during global settings reload: Object
:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/api/v1/rbac/status:1 Failed to load resource: the server responded with a status of 401 (Unauthorized)
vendor.bd425c26.js:6 Possibly unhandled rejection: {"data":"MSG_LOGIN_UNAUTHORIZED_ERROR\n","status":401,"config":{"method":"GET","transformRequest":[null],"transformResponse":[null],"jsonpCallbackParam":"callback","url":"api/v1/rbac/status","headers":{"Accept":"application/json, text/plain, */*"}},"statusText":"Unauthorized","xhrStatus":"complete","resource":{}}
我什至尝试了这些步骤,但是单击“登录”按钮后页面无法加载。
$ kubectl -n kube-system get secret
# All secrets with type 'kubernetes.io/service-account-token' will allow to log in.
# Note that they have different privileges.
NAME TYPE DATA AGE
deployment-controller-token-frsqj kubernetes.io/service-account-token 3 22h
$ kubectl -n kube-system describe secret deployment-controller-token-frsqj
Name: deployment-controller-token-frsqj
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name=deployment-controller
kubernetes.io/service-account.uid=64735958-ae9f-11e7-90d5-02420ac00002
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZXBsb3ltZW50LWN
这是我的Kube /配置文件
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRV..
server: https://192.168.15.97:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBD..
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJ..
为什么我没有在“签名”按钮旁边看到跳过身份验证按钮?
我也尝试了以下步骤:
运行以下命令:
此命令将在默认名称空间中为仪表板创建服务帐户
$kubectl create serviceaccount dashboard -n default
此命令会将集群绑定规则添加到您的仪表板帐户
kubectl创建clusterrolebinding仪表板-admin -n默认\ --clusterrole =集群管理员\ --serviceaccount = default:仪表板
此命令将为您提供仪表板登录所需的令牌
$kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
可以帮我一些我错过的地方吗?
一些发现:Link kubectl proxy命令仅允许HTTP连接。对于除localhost和127.0.0.1之外的域,将无法登录。单击登录页面上的“登录”按钮后,什么也不会发生。
kubectl proxy
不支持https调用。
是否可以通过外部/本地Windows网络与Kubernetes服务器IP地址一起运行 kubectl代理命令?
注意: 本地系统是Windows 10,K8是Linux服务器。 Docker版本:18.09&k8版本:v1.13.1
谢谢
答案 0 :(得分:1)
当我尝试使用普通的http和公共ip通过kubectl proxy
访问仪表板时遇到此问题。
错误详细信息:kubectl proxy
在控制台中产生错误http: proxy error: context canceled
,在浏览器中,单击“登录”后,以/plugin/config
结尾的请求之一将返回MSG_LOGIN_UNAUTHORIZED_ERROR
的json但浏览器没有显示任何错误。
解决方案(source)
kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8443:443 --address 0.0.0.0
如果只想将其绑定到一个接口,当然可以使用接口ip而不是0.0.0.0。然后转到https://your.external.ip:8443/
,它会将您重定向到https://your.external.ip:8443/#/login
,并会要求您提供令牌。接下来,如here所述:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret \
| awk '/^deployment-controller-token-/{print $1}') | awk '$1=="token:"{print $2}'
答案 1 :(得分:0)
我想您为Bearer Token
使用了错误的机密。通常,您必须创建ServiceAccount
,然后通过ClusterRoleBinding
为其分配适当的服务角色,并使用Bearer Token
登录到仪表板。查找有关Kubernetes仪表板Bearer Token
授权here的更多信息。
答案 2 :(得分:0)
https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above
我有一个音符:
不应使用kubectl proxy命令公开显示控制板,因为它仅允许HTTP连接。对于除localhost和127.0.0.1之外的域,将无法登录。单击登录页面上的“登录”按钮后,什么也不会发生。
答案 3 :(得分:0)
要在具有虚拟机的vcluster中进入仪表板,需要为外部ip容器提供处理程序netwroks,我在此https://piensoluegoinstalo.com/kubernetes-cluster-dashboard-on-premise/中发了帖
答案是使用metallb
https://piensoluegoinstalo.com/kubernetes-cluster-dashboard-on-premise/
vi metallb.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.240-192.168.1.250
kubectl create -f metallb.yaml
为您的证书创建一个容器仪表板外部的ip,并将此解析器添加到主机文件的解析ip中,我将“ dashboard”用于域名域
mkdir $HOME/certs
cd $HOME/certs
openssl genrsa -out dashboard.key 2048
openssl rsa -in dashboard.key -out dashboard.key
openssl req -sha256 -new -key dashboard.key -out dashboard.csr -subj '/CN=dashboard'
openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
kubectl -n kube-system create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
kubectl -n kube-system edit service kubernetes-dashboard
更改类型以加载平衡器
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kube-system"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}
creationTimestamp: "2019-04-24T22:21:15Z"
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
resourceVersion: "1753"
selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
uid: 4612785f-66df-11e9-8180-000c29e7b067
spec:
clusterIP: 10.110.50.44
externalTrafficPolicy: Cluster
ports:
- nodePort: 31394
port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: LoadBalancer
status:
{}
kubectl -n kube-system get service kubernetes-dashboard
nano admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
kubectl create -f admin-user.yaml
nano cluster-role.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: kube-system
kubectl create -f cluster-role.yaml
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
答案 4 :(得分:0)
如果您具有对Kubernetes的ssh访问权限,则可以在运行集群的机器上执行:
kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
然后创建本地端口转发:
ssh -L:8001:XXX.XXX.XXX.XXX:8001 username@XXX.XXX.XXX.XXX
其中username
是用于连接到计算机的用户名,而XXX.XXX.XXX.XXX
是主节点的IP地址。然后,您将能够传递令牌并访问仪表板。
当然,这是一个非常肮脏的把戏,我几乎不建议您在生产环境中使用它。
答案 5 :(得分:0)
有了这个,你可以从网上看到仪表板
microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard 443:443 --address 0.0.0.0
然后您可以通过 https://<server-host/ip>
答案 6 :(得分:-1)
看起来该令牌是Base64编码的。在粘贴到令牌字段之前,您是否曾尝试对其进行解码?参见:https://kubernetes.io/docs/concepts/configuration/secret/#decoding-a-secret