【问题标题】:How to access Kubernetes Dashboard from outside network如何从外部网络访问 Kubernetes Dashboard
【发布时间】:2019-05-26 05:06:54
【问题描述】:

我正在尝试使用网络外的Token方法访问kubernetes Dashboard。

我运行了这两个命令来获取令牌

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/config 文件

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..

为什么我在“签名”按钮旁边没有看到 跳过 auth 按钮?

我也尝试了这些步骤:

运行以下命令:

  1. 此命令将在默认命名空间中为仪表板创建一个服务帐户

    $kubectl create serviceaccount dashboard -n default

  2. 此命令会将集群绑定规则添加到您的仪表板帐户中

    kubectl create clusterrolebinding dashboard-admin -n default \ --clusterrole=集群管理员\ --serviceaccount=default:dashboard

  3. 此命令将为您提供仪表板登录所需的令牌

    $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 网络运行 kubectl proxy 命令以及 Kubernetes 服务器 IP 地址?

注意: 本地系统是 Windows 10,K8 是 Linux 服务器。 Docker 版本:18.09 & k8 版本:v1.13.1

谢谢,

【问题讨论】:

    标签: kubernetes kubernetes-dashboard


    【解决方案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}'
    

    【讨论】:

    • 感谢您的提示,它对我有用。这种方法的安全隐患是什么?如何在不从命令行运行的情况下使服务始终可用。?谢谢
    • @yaach 抱歉,那是很久以前的事了,从那时起我尽量避免使用 k8s。所以我只是不记得了。
    【解决方案2】:

    https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above

    我有一个笔记:

    不应使用 kubectl proxy 命令公开显示仪表板,因为它只允许 HTTP 连接。对于 localhost 和 127.0.0.1 以外的域,将无法登录。单击登录页面上的登录按钮后不会发生任何事情。

    【讨论】:

      【解决方案3】:

      这样你就可以从网上看到仪表板

      microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard 443:443 --address 0.0.0.0
      

      然后您可以通过https://&lt;server-host/ip&gt;访问仪表板

      【讨论】:

        【解决方案4】:

        我想您对Bearer Token 使用了错误的密码。通常,您必须创建ServiceAccount,然后通过ClusterRoleBinding 为其分配适当的服务角色,然后使用Bearer Token 登录到仪表板。查找有关 Kubernetes Dashboard Bearer Token 授权 here 的更多信息。

        【讨论】:

        • 我已经更新了我的问题,请立即查看,我也尝试了这些步骤。
        • kubernetes-dashboard 使用什么命名空间?
        • kube-system 命名空间
        【解决方案5】:

        对于在具有虚拟机的 vcluster 中进入仪表板需要一个处理程序网络来处理外部 ip 容器,我有一个来自 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,我使用“仪表板”作为名称域

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

        https://youtu.be/nZ-CDc7PjSg

        【讨论】:

          【解决方案6】:

          如果你有 ssh 访问 Kubernetes,你可以在运行集群的机器上执行:

          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 地址。然后您将能够传递令牌并访问仪表板。

          当然,这是一个非常肮脏的技巧,我几乎不建议不要在生产环境中使用它。

          【讨论】:

            【解决方案7】:

            看起来令牌是 Base64 编码的。您是否尝试在将其粘贴到令牌字段之前对其进行解码?见:https://kubernetes.io/docs/concepts/configuration/secret/#decoding-a-secret

            【讨论】:

            • 我尝试通过传递令牌值,它抛出错误'无效输入'
            猜你喜欢
            • 1970-01-01
            • 2012-02-20
            • 2022-07-26
            • 2015-07-30
            • 1970-01-01
            • 2017-11-07
            • 2019-01-03
            • 2018-06-27
            • 1970-01-01
            相关资源
            最近更新 更多