在开启了 TLS 的集群中,每当与集群交互的时候少不了的是身份认证,使用 kubeconfig(即证书) 和 token 两种认证方式是最简单也最通用的认证方式,在 dashboard 的登录功能就可以使用这两种登录功能。
下文分两块以示例的方式来讲解两种登陆认证方式:
· Token认证:
- 创建新的namespace,为新的namespace创建用户,并分配新的namespace权限给用户
- 为集群的管理员(拥有所有namespace的管理权限权限)创建 token
· kubeconfig认证:为 brand 命名空间下的 brand 用户创建 kubeconfig 文件
#创建test命名空间
kubectl create namespace test
#在test命名空间创建serviceaccount:test-admin
kubectl create serviceaccount test-admin -n test
#查看指定命名空间下的serviceaccount
kubectl get serviceaccount -n test
#进行角色绑定,以下命令在test名称空间下创建一个rolebinding,名字叫做test-admin-rolebinding,将test名称空间下的test-admin账号通过clusterrole绑定集群角色cluster-admin,这样test-admin账号就有了cluster-admin角色的权限。最后--serviceaccount指定test-admin账号的权限只能限制在test名称空间下。
kubectl create rolebinding test-admin-rolebinding -n test --clusterrole=cluster-admin --serviceaccount=test:test-admin
#查看test命名空间下所有的secret
kubectl get secret -n test
#查看指定test-admin-token-7zhrw的token等信息
kubectl describe secret test-admin-token-7zhrw -n test
就可以使用获得的token登录dashboard了,该token只能访问test命名空间。
# 在kube-system命名空间下创建名为dashboard-admin的serviceaccount
kubectl create serviceaccount dashboard-admin -n kube-system
# 创建名为dashboard-admin的clusterrolebinding,通过clusterrole绑定集群角色cluster-admin,这样指定账号就有了cluster-admin角色的权限。最后--serviceaccount指定dashboard-admin账号的权限应用在kube-system命名空间下。
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
就可以使用获得的token登录dashboard了,该token能访问所有命名空间。
kubeconfig文件保存了k8s集群的集群、用户、命名空间、认证的信息。kubectl命令使用kubeconfig文件来获取集群的信息,然后和API server进行通讯。
注意:用于配置对集群的访问的文件称为kubecconfig文件。也就是说,kubeconfig文件中包含的内容是集群的配置。但是,并不是必须有个文件名字叫kubeconfig,而是指定格式的文件。
默认情况下,kubectl命令从$HOME/.kube目录下查找一个名字叫做config的文件。可以通过KUBECONFIG环境变量或者--kubeconfig参数来指定其他的kubeconfig文件。
kubeconfig中主要由如下部分组成:
- clusters (集群)
- users(用户)
- context(上下文)
执行如下命令查看kubeconfig的配置,得到的配置可能是来自一个kubeconfig文件,也可能是来自多个kubeconfig文件合并的结果。
kubectl config view
以下开始配置kubeconfig文件,指定--kubeconfig参数后,所有的配置都会写到对应的文件中。如果不指定--kubeconfig参数那么就会将配置文件写到~/.kube/config这个文件中。
#集群有CA认证,并且将证书的输入嵌入到配置文件中,--certificate-authority后面是ca证书的路径,需要确保这个证书是存在的。
kubectl config --kubeconfig=config-demo set-cluster development --server=https://172.16.200.70:6443/ --embed-certs --certificate-authority=ca.crt
#集群没有证书的
kubectl config --kubeconfig=config-demo set-cluster development --server=https://172.16.200.70:6443/
#集群有证书,但是证书验证的
kubectl config --kubeconfig=config-demo set-cluster development --server=https://172.16.200.70:6443/ --insecure-skip-tls-verify
#删除集群
kubectl config --kubeconfig=config-demo unset clusters.development
#设置用户,使用客户端的证书和客户端密钥,并且将证书数据嵌入到配置文件中。注意:客户端证书和key必须要存在。
kubectl config --kubeconfig=config-demo set-credentials developer --client-certificate=fake-cert-file --client-key=fake-key-seefile --embed-certs=true
#设置用户,使用用户名和密码
kubectl config --kubeconfig=config-demo set-credentials developer --username=hack --password=123456
#设置用户,使用Token
kubectl config --kubeconfig=config-demo set-credentials developer --token=Token
#删除用户
kubectl config --kubeconfig=config-demo unset users.developer
每个context都有3个参数:
- cluster (集群)
- namespace(命名空间)
- user(用户)
默认情况下,kubectl命令从current context中来获取参数,然后与集群进行通讯。
#设置上下文信息context,在dev-fronted这个context以developer1用户的信息访问developement1集群的frontend命名空间。
kubectl config --kubeconfig=config-demo set-context dev-frontend --cluster=development1 --namespace=frontend --user=developer1
#设置上下文信息context,在dev-storage这个context以developer2用户的信息访问developement2集群的storage命名空间。
kubectl config --kubeconfig=config-demo set-context dev-storage --cluster=development2 --namespace=storage --user=developer2
#查看配置中所有的context
kubectl config --kubeconfig=config-demo get-contexts
#设置当前的context
kubectl config --kubeconfig=config-demo use-context dev-frontend
#查看当前的context
kubectl config --kubeconfig=config-demo current-context
#只查看和当前context有关的配置信息
kubectl config --kubeconfig=config-demo view --minify
#删除context
kubectl config --kubeconfig=config-demo delete-context dev-storage
使用kubectl命令行进行认证
kubectl --kubeconfig=config-demo get pods -A
也可以在dashboard窗口勾选Kubeconfig,然后选择config-demo文件进行认证。
可以在星球里跟我讨论交流。星球里有一千七百多位同样爱好安全技术的小伙伴一起交流!
参考:
https://www.kancloud.cn/chriswenwu/g_k8s/1006519
https://www.jb51.net/article/234998.htm