kubernetes-dashboard安装及用户授权

使用新版的 kubespray 部署的Kubernetes 集群,已经默认安装了kubernetes-dashboard 并授予了最小的访问权限。我们需要自行创建一个能够登录dashboard 并对整个集群具有管理权限的账户。

kubernetes-dashboard安装及用户授权

需求背景

使用新版的kubespray部署的Kubernetes集群,已经默认安装了kubernetes-dashboard并使用最小的访问权限:

  • 匿名访问kubernetes-dashboard的是用户是服务账户kubernetes-dashboard
  • kubernetes-dashboard被授予最小化权限,只能访问dashboard的UI等资源

我们需要一个能够登录dashboard并对整个集群具有管理权限的账户。

下面来进行设置。

Dashboard基本配置调整

  • 修改kubernetes-dashboardservice,将端口暴露到Node节点上,使得我们能够通过host主机ip直接访问

    spec:
    ports:
      - port: 443
        targetPort: 8443
        nodePort: 30000
    type: NodePort
    

    image

  • 修改kubernetes-dashboard的认证方式,使得我们能够正常访问的到登录页面

    vim /etc/kubernetes/dashboard.yml
      spec:
        containers:
          args:
            #- --auto-generate-certificates
            - --authentication-mode=token,basic
            - --tls-key-file=dashboard.key
            - --tls-cert-file=dashboard.crt
            - --token-ttl=43200
    

    修改后的登录界面是这样子,点击Procced to 172.xx.xx.xx (unsafe)就可以跳转到登录界面了:

    image

    如果要修改dashboard登录方式为用户名密码,需要做如下修改:

    deployment中默认设置--authentication-mode=token 修改为--authentication-mode=basic

  • 创建 secret 并挂载到Pod中

    其实我们也不需要自己签发,Kubernetes 已经生成了一堆证书存放在 /etc/kubernetes/ssl 下, 我们可以复用:

    cd $HOME/certs
    cp /etc/kubernetes/ssl/apiserver.pem dashboard.crt
    cp /etc/kubernetes/ssl/apiserver-key.pem dashboard.key
      
    # 然后删除已有的 secret kubernetes-dashboard-certs 并重新创建即可
    kubectl delete secret kubernetes-dashboard-certs -n kube-system
    kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kube-system
    
    • 最后提交更新
      kubeclt -n kube-system apply -f dashboard-minimal.yml
      
  • 最后登录

    image

Dashboard访问控制

参考文档:
https://github.com/kubernetes/dashboard/wiki/Access-control
https://github.com/kubernetes/dashboard/tree/v1.8.3
建议认真查看上面第二个文档,新版的 dashboard 文档省去了一些过渡性的说明。

我们可以有2种方式来授权访问kubernetes-dashboard的管理员特权:

  • 提权kubernetes-dashboard账户的角色为ClusterRole
  • 创建新的账户,授予角色ClusterRole

提权 kubernetes-dashboard 账户的角色为 ClusterRole

由于kubernetes-dashboard用户是可以匿名访问kubernetes-dashboard的,提权会同时提升这个默认账户的匿名访问权限,具有巨大安全隐患,强烈不推荐。

但还是要介绍一下怎么做。

vim dashboard-admin.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

kubectl create -f dashboard-admin.yaml

这样,我们既可以用tokin登录kubernetes-dashboard,也可以匿名访问kubernetes-dashboard,两种情况都拥有操作集群的超级管理员权限。

创建新的账户授予角色 ClusterRole

既然上面的方式有缺陷,那我们就自己创建一个 SA,授予 ClusterRole 权限,只有拿到token的时候才能登录并操作 kubernetes-dashboard

  • 准备相应资源

    it-admin.yml

    # Example usage: kubectl create -f <this_file>
    
    # ------------------- Dashboard Secret ------------------- #
    # If not specified, it will be created when create ServiceAccount
    #apiVersion: v1
    #kind: Secret
    #metadata:
    #  name: it-admin-secret
    #  namespace: kube-system
    #type: Opaque
    
    ---
    # ------------------- Dashboard Service Account ------------------- #
    
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: it-admin-sa
      namespace: kube-system
    
    ---
    # ------------------- Dashboard Role & Role Binding ------------------- #
    
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: it-admin-role
      namespace: kube-system
    rules:
      # Allow Dashboard to create 'it-key-holder' secret.
    - apiGroups: ["", "extensions", "apps", "batch"]
      resources: ["*"]
      #verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # You can also use ["*"]
      verbs: ["*"]
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: it-admin-rb
      namespace: kube-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: it-admin-role
    subjects:
    - kind: ServiceAccount
      name: it-admin-sa
      namespace: kube-system
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: it-admin-rb
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: it-admin-sa
      namespace: kube-system
    
  • 创建资源

    kubeclt creat -f it-admin.yml
    
  • 获取token

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/it-admin-sa-token/{print $1}') | awk '$1=="token:"{print $2}'
    
  • 登录Web
    https://172.xx.xx.xx:30000/#!/login

  • 修改每页显示条目的数量
    Dashboard 默认每页显示 10 条 pod/service/deployment 等,当我们的这些资源较多时,翻页就显得很麻烦,因此有时候需要增加每页显示条目的数量。

    我们可以有2种方式实现:

    • 修改 configmap
      kubectl -n kube-system edit configmap kubernetes-dashboard-settings
      "itemsPerPage":20
      
    • 直接在界面左下角的设置中修改 itemsPerPage 为 20
      或者在界面上修改 kube-system 下的 kubernetes-dashboard-settings。