如何在 Kubernetes 仪表板上签名?

我刚刚将 kubeadm 和 kubelet 升级到1.8.0版本,并按照官方的 文件安装了仪表板。

$ 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得到的令牌登录,但是又失败了。

问题是我怎样才能在仪表板上签名。看起来他们比以前增加了很多安全机制。谢谢。

180025 次浏览

从1.7版开始,Dashboard 支持基于以下方面的用户身份验证:

Github 上的仪表盘

Token

这里的 Token可以是来自 库伯内特认证中Static TokenService Account TokenOpenID Connect Token,但是不能是库比德 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

仪表板可以装载在 http://localhost:8001/uikubectl proxy

授予 Dashboard 的服务帐户管理员权限

$ 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选项来访问 Dashboard。

如果使用的是指示板版本1.10.1或更高版本,则还必须将 --enable-skip-login添加到部署的命令行参数中。可以通过将其添加到 kubectl edit deployment/kubernetes-dashboard --namespace=kube-system中的 args来实现。

例如:

      containers:
- args:
- --auto-generate-certificates
- --enable-skip-login            # <-- add this line
image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1

DR

要在单个一线程中获取令牌:

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 太久了,但我认为在外壳。用英语学习或教学对我来说要困难得多。

下面是带有换行符和缩进的线条线条,以提高可读性:

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行-只打印第一个 场地为“令牌”的行的第二个 场地:

下载 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

您应该能够在 < a href = “ http://hostname: exposedport/”rel = “ nofollow norefrer”> http://hostname:exposedport/获得仪表板 没有认证

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

$ 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

我引用了巨型蜂群的指南 https://docs.giantswarm.io/guides/install-kubernetes-dashboard/

结合两个答案: 4999269847761914:

# Create service account
kubectl create serviceaccount -n kube-system cluster-admin-dashboard-sa


# Bind ClusterAdmin role to the service account
kubectl create clusterrolebinding -n kube-system cluster-admin-dashboard-sa \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:cluster-admin-dashboard-sa


# Parse the token
TOKEN=$(kubectl describe secret -n kube-system $(kubectl get secret -n kube-system | awk '/^cluster-admin-dashboard-sa-token-/{print $1}') | awk '$1=="token:"{print $2}')

以前的答案对我来说都是好的。但在我这边,一个直截了当的答案将来自 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。复制该令牌并将其粘贴到令牌框中。希望这个能帮上忙。

由于安全问题,跳过登录在默认情况下已被禁用

在仪表板 yaml 中添加这个参数

- --enable-skip-login

把它找回来

一个不言而喻的简单一行程序,用于为 kubernetes 仪表板登录提取令牌。

kubectl describe secret -n kube-system | grep deployment -A 12

复制该令牌并将其粘贴到 kubernetes 仪表板上,然后在选项中使用令牌符号,这样就可以很好地使用 kubernetes 仪表板

在进行令牌身份验证之前,您需要遵循以下步骤

  1. 创建群集管理服务帐户

    kubectl create serviceaccount dashboard -n default
    
  2. Add the cluster binding rules to your dashboard account

    kubectl create clusterrolebinding dashboard-admin -n default --clusterrole=cluster-admin --serviceaccount=default:dashboard
    
  3. Get the secret token with this command

    kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
    
  4. Choose token authentication in the Kubernetes dashboard login page enter image description here

  5. Now you can able to login

你可以拿到代币:

kubectl describe secret -n kube-system | grep deployment -A 12

取令牌值

token:    eyJhbGciOiJSUzI1NiIsI...

使用 port-forward to/kubernetes-dashboard:

kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8080:443 --address='0.0.0.0'

使用以下方法进入网站:

https://<IP-of-Master-node>:8080/

当被要求时提供令牌。 请注意 URL 上的 https。在 Firefox 上测试站点,因为随着新的更新,Google Chrome 已经变得严格禁止来自未知 SSL 证书的流量。

还要注意,8080端口应该在主节点的 VM 中打开。

获取 kubernetes-dashboard 令牌的另一种方法:

kubectl -n kubernetes-dashboard get secret -o=jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="kubernetes-dashboard")].data.token}' | base64 --decode

说明:

  1. 获取 kubernetes-dashboard名称空间中的所有 secret
  2. 查看 items数组,匹配: metadata-> annotations-> kubernetes.io/service-account.name = = kubernetes-dashboard
  3. 打印 data-> token
  4. 解码内容(如果执行 kubectl describe secret,则 token已被解码)

但是,如果您使用的是 库伯内特之后1分24秒版本,

创建服务帐户不会生成令牌 ,而应使用以下命令。

kubectl -n kubernetes-dashboard create token admin-user