首页 文章

如何登录kubernetes仪表板?

提问于
浏览
44

我刚刚将kubeadm和kubelet升级到v1.8.0 . 并按照官方document安装仪表板 .

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

之后,我通过运行启动了仪表板

$ kubectl proxy --address="192.168.0.101" -p 8001 --accept-hosts='^*$'

幸运的是,我能够通过http://192.168.0.101:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/访问仪表板

我被重定向到这样的登录页面,这是我以前从未见过的 .
enter image description here
看起来有两种身份验证方式 .

我试图上传 /etc/kubernetes/admin.conf 作为kubeconfig但是失败了 . 然后我尝试使用从 kubeadm token list 获得的令牌登录但又失败了 .

问题是我如何在仪表板中登录 . 看起来他们添加了许多安全机制 . 谢谢 .

6 回答

  • 32

    从版本1.7 Dashboard使用更安全的设置 . 这意味着,默认情况下,它具有最小的权限集,并且只能通过HTTPS访问 . 在执行任何进一步的步骤之前,建议阅读访问控制指南 . 从版本1.7开始,Dashboard支持基于以下内容的用户身份验证:可在Dashboard登录视图上使用的承载令牌 . 可在仪表板登录视图上使用的用户名/密码 . --- Github上的仪表板

    令牌

    这里 Token 可以是 Static TokenService Account TokenOpenID Connect Token 来自Kubernetes Authenticating,但不是kubeadm Bootstrap Token .

    使用kubectl,我们可以获得默认情况下在kubernetes中创建的服务帐户(例如部署控制器) .

    $ 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.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZXBsb3ltZW50LWNvbnRyb2xsZXItdG9rZW4tZnJzcWoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVwbG95bWVudC1jb250cm9sbGVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjQ3MzU5NTgtYWU5Zi0xMWU3LTkwZDUtMDI0MjBhYzAwMDAyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRlcGxveW1lbnQtY29udHJvbGxlciJ9.OqFc4CE1Kh6T3BTCR4XxDZR8gaF1MvH4M3ZHZeCGfO-sw-D0gp826vGPHr_0M66SkGaOmlsVHmP7zmTi-SJ3NCdVO5viHaVUwPJ62hx88_JPmSfD0KJJh6G5QokKfiO0WlGN7L1GgiZj18zgXVYaJShlBSz5qGRuGf0s1jy9KOBt9slAN5xQ9_b88amym2GIXoFyBsqymt5H-iMQaGP35tbRpewKKtly9LzIdrO23bDiZ1voc5QZeAZIWrizzjPY5HPM1qOqacaY9DcGc7akh98eBJG_4vZqH2gKy76fMf0yInFTeNKr45_6fWt8gRM77DQmPwb3hbrjWXe1VvXX_g
    

    Kubeconfig

    kubeconfig文件中的用户需要 username & passwordtoken ,而 admin.conf 只有 client-certificate .

    $ kubectl config set-credentials cluster-admin --token=bearer_token
    

    替代方案(不建议用于 生产环境 )

    以下是绕过身份验证的两种方法,但请谨慎使用 .

    使用HTTP部署仪表板

    $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml
    

    可以使用 kubectl proxyhttp://localhost:8001/ui加载仪表板 .

    授予仪表板服务帐户的管理员权限

    $ cat <<EOF | kubectl create -f -
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: kubernetes-dashboard
      labels:
        k8s-app: kubernetes-dashboard
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: kubernetes-dashboard
      namespace: kube-system
    EOF
    

    之后,您可以在登录页面上使用 Skip 选项来访问仪表板 .

  • 2

    TL; DR

    要在单个oneliner中获取令牌:

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/{print $1}') | awk '$1=="token:"{print $2}'
    

    这假设您的〜/ .kube / config存在且有效 . 而且 kubectl config get-contexts 表示您正在使用正在登录的仪表板的正确上下文(集群和命名空间) .

    解释

    我从@ silverfox的回答中得到了这个答案 . 这是一篇非常翔实的文章 . 不幸的是,它没有告诉你如何将信息付诸实践 . 也许我一直在做DevOps太长时间,但我想在shell中 . 我用英语学习或教学要困难得多 .

    这是oneliner带有换行符和缩进的可读性:

    kubectl -n kube-system describe secret $(
      kubectl -n kube-system get secret | \
      awk '/^deployment-controller-token-/{print $1}'
    ) | \
    awk '$1=="token:"{print $2}'
    

    有4个不同的命令,它们按此顺序调用:

    • 第2行 - 这是来自@ silverfox的 Token 部分的第一个命令 .

    • 第3行 - 仅打印以 deployment-controller-token- 开头的行的第一个字段(即窗格名称)

    • 第1行 - 这是来自@ silverfox的 Token 部分的第二个命令 .

    • 第5行 - 仅打印第一个字段为"token:"的第二个字段

  • 17

    如果您不想向仪表板服务帐户授予管理员权限,则可以创建群集管理服务帐户 .

    $ kubectl create serviceaccount cluster-admin-dashboard-sa
    $ kubectl create clusterrolebinding cluster-admin-dashboard-sa \
      --clusterrole=cluster-admin \
      --serviceaccount=default:cluster-admin-dashboard-sa
    

    然后,您可以使用刚刚创建的集群管理服务帐户的令牌 .

    $ kubectl get secret | grep cluster-admin-dashboard-sa
    cluster-admin-dashboard-sa-token-6xm8l   kubernetes.io/service-account-token   3         18m
    $ kubectl describe secret cluster-admin-dashboard-sa-token-6xm8l
    

    我从giantswarm指南中引用它 - https://docs.giantswarm.io/guides/install-kubernetes-dashboard/

  • 0

    结合两个答案:4999269847761914

    # Create service account
    kubectl create serviceaccount cluster-admin-dashboard-sa
    
    # Bind ClusterAdmin role to the service account
    kubectl create clusterrolebinding cluster-admin-dashboard-sa \
      --clusterrole=cluster-admin \
      --serviceaccount=default:cluster-admin-dashboard-sa
    
    # Parse the token
    TOKEN=$(kubectl describe secret $(kubectl -n kube-system get secret | awk '/^cluster-admin-dashboard-sa-token-/{print $1}') | awk '$1=="token:"{print $2}')
    
  • 58

    所有以前的答案对我都很好 . 但我身边的直接回答将来自https://github.com/kubernetes/dashboard/wiki/Creating-sample-user#bearer-token . 只需使用 kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') . 对于某些键,您将拥有许多值( NameNamespaceLabels ,..., token ) . 最重要的是与你的名字相对应的 token . 复制该令牌并将其粘贴到令牌框中 . 希望这可以帮助 .

  • 8

    下载https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml

    type: NodePort for the Service
    

    然后运行此命令:

    kubectl apply -f kubernetes-dashboard.yaml
    

    使用以下命令查找公开的端口:

    kubectl get services -n kube-system
    

    您应该能够在http://hostname:exposedport/获取仪表板而无需身份验证

相关问题