wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
将yaml文件中的image字段修改为mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1
然后提前在所有节点下载好镜像。
docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1
[root@master2] ~$ kubectl create -f kubernetes-dashboard.yaml
secret/kubernetes-dashboard-certs created
serviceaccount/kubernetes-dashboard created
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
deployment.apps/kubernetes-dashboard created
service/kubernetes-dashboard created
[root@master2] ~$ kubectl get pod --all-namespaces -o wide| grep kubernetes-dashboard
kube-system kubernetes-dashboard-76479d66bb-p54tk 1/1 Running 0 39s 10.244.1.3 master2.hanli.com
官方文档:https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard—1.7.X-and-above
三种访问方式,不同的方式,地址不一样
kubectl proxy: 只能在localhost上访问,地址:http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
NodePort: 编辑 kubernetes-dashboard.yaml文件中,将 type: ClusterIP
改为 type: NodePort
,找到dashboard运行在哪个节点后,访问地址https://
apiserver方式: 需要在浏览器中安装用户证书。 地址: https://
打开浏览器访问 https://192.168.255.140:8443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
报错如下:
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "services \"https:kubernetes-dashboard\" is forbidden: User \"system:anonymous\" cannot get services/proxy in the namespace \"kube-system\"",
"reason": "Forbidden",
"details": {
"name": "https:kubernetes-dashboard",
"kind": "services"
},
"code": 403
}
通过message和code,我们了解到,我们使用的是一个system:anonymous这样的用户来访问位于kube-system命名空间中的名为https:kubernetes-dashboard的service资源。然后这个用户没有权限访问,所以被拒绝了。
看来我们需要先了解一下k8s中的用户和认证及授权机制。
有两种
k8s通过ClusterRoleBinding或者RoleBinding资源来实现对用户权限的赋予。
ClusterRole或者Role:意思是集群角色或角色,他们是规定了一组对集群内资源的权限规则。
roles和clusterroles的区别在于: roles只能对某个命令空间内的资源定义权限。而集群角色定义的权限都是针对整个集群的命名空间的。
首先需要确认kubectl命令的配置文件,默认情况下为/etc/kubernetes/admin.conf,而且已经自动创建在$HOME/.kube/config中,如果没有创建则需要手动赋值。
cat $HOME/.kube/config
如果确认有集群的配置,则运行以下命令来生成一个p12格式的浏览器证书
先生成kubecfg-crt
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
生成kubecfg-key
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
生成p12证书,按要求输入密码直接回车即可,密码不要胡乱输,后面给浏览器导入的时候要用。
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
运行完后在当前目录会有个kubecfg.p12证书文件。
然后你需要将这个kubecfg.p12证书文件传到桌面上。
可以通过安装yum install lrzsz
,然后使用下面的命令来将文件发送到桌面上
[root@master1] ~$ sz kubecfg.p12
点击浏览器:菜单-设置-高级-管理证书
选择“个人”这一栏(适用于chrome71以上版本,71以下不确定行不行),然后点击导入kubecfg.p12。
剩下的步骤全部默认,完成后如下:
导入成功后,重启浏览器chrome://restart
,再次访问https://192.168.255.140:8443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
,此时会弹出类似如下的证书信息对话框,点击确定即可。
问题来了,图中的kubeconfig和令牌这两种登录有什么区别呢?我应该选择哪个?除了这两种还有其他的方式吗?如果我是内网环境,我就想输入网址之后就直接能访问各种资源,而不想通过登录,可以实现吗?
可以这样做:
1、先创建一个账号
2、再创建一个有全部权限的clusterroles
3、然后将二者用clusterrolebinding绑定起来。
在第三步我们安装yaml文件时,已创建了一个名为kubernetes-dashboard的服务账户,你可以查看一下详情
[root@master2] ~$ kubectl describe serviceaccount/kubernetes-dashboard -n kube-system
Name: kubernetes-dashboard
Namespace: kube-system
Labels: k8s-app=kubernetes-dashboard
Annotations:
Image pull secrets:
Mountable secrets: kubernetes-dashboard-token-jwld4
Tokens: kubernetes-dashboard-token-jwld4
Events:
而kubernetes集群安装好后,他会自动生成一些clusterroles集群权限对象,你可以用下面的命令查看都有哪些
[root@master2] ~$ kubectl get clusterroles
NAME AGE
admin 4h21m
cluster-admin 4h21m
edit 4h21m
flannel 3h58m
system:aggregate-to-admin 4h21m
system:aggregate-to-edit 4h21m
......
比如集群管理员,我们详细的看一下,*号表示对所有资源有所有权限。
[root@master2] ~$ kubectl describe clusterroles/cluster-admin
Name: cluster-admin
Labels: kubernetes.io/bootstrapping=rbac-defaults
Annotations: rbac.authorization.kubernetes.io/autoupdate: true
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
*.* [] [] [*]
[*] [] [*]
好,用户和权限都有了,将他们绑定起来。
将kubernetes-dashboard这个服务账户和cluster-admin这个集群管理员权限对象绑定起来。
创建一个yaml文件, vim dashboard.yaml,内容如下
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
执行
[root@master2] ~$ kubectl create -f dashboard.yaml
查看是否创建成功
[root@master2] ~$ kubectl get clusterrolebindings kubernetes-dashboard
NAME AGE
kubernetes-dashboard 88s
找到kubernetes-dashboard账户的token,记下这串token,登录的时候会使用,这个token默认是永久的。
[root@master2] ~$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kubernetes-dashboard-token | awk '{print $1}')
Name: kubernetes-dashboard-token-jwld4
Namespace: kube-system
Labels:
Annotations: kubernetes.io/service-account.name: kubernetes-dashboard
kubernetes.io/service-account.uid: a2ced45f-8b61-11e9-b98f-0050563ff983
Type: kubernetes.io/service-account-token
Data
====
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1qd2xkNCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImEyY2VkNDVmLThiNjEtMTFlOS1iOThmLTAwNTA1NjNmZjk4MyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.VzsWE80t7AEMB891rxBKJVMxwt5DtuzA23_-SLxxQcjpaB80LBfB09WqUSe6G6vrkRdpMQ3wDLA2SIFCQVAapAHl-J45NuPyhxh8A-DNpfGpEk3uxFqXkn5WXYasbeCIcHw6TII27PTwG6wgS_q1qEbOf4LYJHjExdqypIqAj__F2RRGTqER378qVvJrHJndL5M6W2PhINazLOEqezxKxDRBigMFU7luOYvWCxSPFhjSd3LrsMfWwSRY-Jq5-tUEhsI7uU7Yyb3UIDDiXex-8Mwbida_TgpcIZi6BaEclPygSSfq1a177r97hnxcdv02X9ooOghztSGKM-1bDBWhNg
ca.crt: 1025 bytes
再次访问dashboard,输入token登录后界面如下;此时访问dashboard的主体是kubernetes-dashboard这个服务账户,它拥有对集群所有资源的所有使用权限。
通过web方式操作很方便,如下:进行扩缩容
如果是生产环境,我们肯定不能给所有人员赋予全部访问权限,我们需要对不同的人赋予不同的权限, 那怎么自定义权限呢?
每次都要复制token,如果每天都登录,感觉有点麻烦好像
1、先把config文件复制到别的地方
[root@master2] ~$ cp .kube/config .
2、然后把一个具有全部访问权限的token追加到最后一行。
先找出token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-token | awk '{print $1}') |grep token|tail -1
追加到config中,如下
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUd....
client-key-data: LS0tLS1CRUdJTiBSU......
token: eyJhbGciO... ...
默认情况下用户名密码登录没有启用。
如果没有该参数,默认使用的是匿名用户,并且无法检查提供的凭据是否有效。
原因是Kubernetes 需要有配置
如果要启用用户名和密码验证,必须在apiserver的部署文件中配置参数 --authorization-mode=ABAC
和and --basic-auth-file
。
然后在dashboard的部署文件中设置authentication-mode = basic
。默认情况下,它的设置是--authentication-mode = token
。
添加参数- --enable-skip-login
containers:
- args:
- --auto-generate-certificates
- --enable-skip-login
官方文档:
https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard—1.7.X-and-above
https://github.com/kubernetes/dashboard/wiki/Creating-sample-user
参考:
https://www.itsfun.tk/kubernetes-dashboard/