• 升级Dashboard
    • 升级步骤
    • 身份认证
      • 使用 kubeconfig
      • 生成集群管理员的token
    • 参考

    升级Dashboard

    我们在kubernetes1.6的时候同时安装了dashboard插件,该插件也是基于kubernetes1.6版本开发的。如今kubernetes1.8版本业已发布,如何升级dashboard以获取新版中功能呢?

    Dashboard的升级比较简单,因为它仅仅是一个前端应用,用来展现集群信息和与后端API交互,理论上只需要更新原先dashboard的yaml配置文件中的镜像就可以了,但是为了使用dashboard1.7版本中的用户登陆功能,还需要做一些额外的操作。

    dashboard的更新日志请见release note,当前的最新版本为v1.7.1,下面将介绍将dashboard从v1.6.3升级到v1.7.1并开启用户登陆认证的详细步骤。

    升级步骤

    删除原来的版本

    首先删除原来的dashboard资源:

    1. kubectl delete -f dashboard/

    dashboard目录下的所有yaml文件中的资源全部删除,包括Deployment、service和角色绑定等。

    部署新版本

    我们使用官方的配置文件来安装,首先下载官方配置:

    1. wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

    修改其中的两个镜像地址为我们的私有地址。

    • gcr.io/google_containers/kubernetes-dashboard-init-amd64:v1.0.1
    • gcr.io/google_containers/kubernetes-dashboard-amd64:v1.7.1

    这个两个镜像可以同时从时速云上获取:

    • index.tenxcloud.com/jimmy/kubernetes-dashboard-amd64:v1.7.1
    • index.tenxcloud.com/jimmy/kubernetes-dashboard-init-amd64:v1.0.1

    将service type设置为NodePort,修改后的yaml文件见kubernetes-dashboard.yaml,然后就可以部署新版本的dashboard了。

    1. kubectl create -f kubernetes-dashboard.yaml

    获取dashboard的外网访问端口:

    1. kubectl -n kube-system get svc kubernetes-dashboard
    2. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    3. kubernetes-dashboard 10.254.177.181 <nodes> 443:32324/TCP 49m

    访问集群中的任何一个节点,即可打开dashboard登陆页面,如https://172.20.0.113:32324/(请使用https访问),支持使用kubeconfigtoken两种的认证方式:

    登陆界面

    选择本地的kubeconfig文件以登陆集群,kubeconfig文件中包括登陆的用户名、证书和token信息。

    登陆之后首先看到的界面是这样的:

    Dashboard首页

    这是因为该用户没有对default命名空间的访问权限。

    修改URL地址中的namespace字段为该用户有权限访问的命名空间如brand:https://172.20.0.113:32324/#!/overview?namespace=brand:

    Dashboard用户空间页面

    设置界面的语言

    我们看到现在 dashboard 的页面都已经被汉化了,当前支持英文、中文简体、中文繁体、日语,根据浏览器的语言自动切换的。如果想要强制设置 dashboard 中显示的语言,需要在 dahsboard 的 Deployment yaml 配置中增加如下配置:

    1. env:
    2. - name: ACCEPT_LANGUAGE
    3. value: english

    更简单的方式是,如果您使用的Chrome浏览器,则在浏览器中的配置中设置语言的顺序后刷新网页,dashboard将以您在Chrome中配置的首选语言显示。

    身份认证

    登陆 dashboard 的时候支持 kubeconfig 和 token 两种认证方式,kubeconfig 中也依赖 token 字段,所以生成 token 这一步是必不可少的。

    下文分两块来讲解两种登陆认证方式:

    • 为 brand 命名空间下的 brand 用户创建 kubeconfig 文件
    • 为集群的管理员(拥有所有命名空间的 amdin 权限)创建 token

    使用 kubeconfig

    登陆dashboard的时候可以指定kubeconfig文件来认证用户权限,如何生成登陆dashboard时指定的kubeconfig文件请参考创建用户认证授权的kubeconfig文件。

    注意我们生成的 kubeconfig 文件中没有 token 字段,需要手动添加该字段。

    比如我们为 brand namespace 下的 brand 用户生成了名为 brand.kubeconfig 的 kubeconfig 文件,还要再该文件中追加一行 token 的配置(如何生成 token 将在下文介绍),如下所示:

    kubeconfig文件

    这样就可以使用brand.kubeconfig文件来登陆dashboard了,而且只能访问和操作brand命名空间下的对象。

    生成集群管理员的token

    以下是为集群最高权限的管理员(可以任意操作所有namespace中的所有资源)生成token的步骤详解。

    注意:登陆dashboard的时候token值是必须的,而kubeconfig文件是kubectl命令所必须的,kubectl命令使用的kubeconfig文件中可以不包含token信息。

    需要创建一个admin用户并授予admin角色绑定,使用下面的yaml文件创建admin用户并赋予他管理员权限,然后可以通过token登陆dashbaord,该文件见admin-role.yaml。这种认证方式本质上是通过 Service Account 的身份认证加上 Bearer token 请求 API server 的方式实现,参考 Kubernetes 中的认证。

    1. kind: ClusterRoleBinding
    2. apiVersion: rbac.authorization.k8s.io/v1beta1
    3. metadata:
    4. name: admin
    5. annotations:
    6. rbac.authorization.kubernetes.io/autoupdate: "true"
    7. roleRef:
    8. kind: ClusterRole
    9. name: cluster-admin
    10. apiGroup: rbac.authorization.k8s.io
    11. subjects:
    12. - kind: ServiceAccount
    13. name: admin
    14. namespace: kube-system
    15. ---
    16. apiVersion: v1
    17. kind: ServiceAccount
    18. metadata:
    19. name: admin
    20. namespace: kube-system
    21. labels:
    22. kubernetes.io/cluster-service: "true"
    23. addonmanager.kubernetes.io/mode: Reconcile

    然后执行下面的命令创建 serviceaccount 和角色绑定,对于其他命名空间的其他用户只要修改上述 yaml 中的 namenamespace 字段即可:

    1. kubectl create -f admin-role.yaml

    创建完成后获取secret和token的值。

    运行下面的命令直接获取admin用户的token:

    1. kubectl -n kube-system describe secret `kubectl -n kube-system get secret|grep admin-token|cut -d " " -f1`|grep "token:"|tr -s " "|cut -d " " -f2

    手动获取

    也可以执行下面的步骤来获取token值:

    1. # 获取admin-token的secret名字
    2. $ kubectl -n kube-system get secret|grep admin-token
    3. admin-token-nwphb kubernetes.io/service-account-token 3 6m
    4. # 获取token的值
    5. $ kubectl -n kube-system describe secret admin-token-nwphb
    6. Name: admin-token-nwphb
    7. Namespace: kube-system
    8. Labels: <none>
    9. Annotations: kubernetes.io/service-account.name=admin
    10. kubernetes.io/service-account.uid=f37bd044-bfb3-11e7-87c0-f4e9d49f8ed0
    11. Type: kubernetes.io/service-account-token
    12. Data
    13. ====
    14. namespace: 11 bytes
    15. token: 非常长的字符串
    16. ca.crt: 1310 bytes

    在 dashboard 登录页面上有两种登录方式,kubeconfig 文件和 token (令牌),使用 token 登录可以直接使用上面输出中的那个非常长的字符串作为 token 登录,即可以拥有管理员权限操作整个kubernetes集群中的对象。对于 kubeconfig 文件登录方式,不能直接使用之前给 kubectl 生成的 kubeconfig 文件(~/.kube/config) 需要给它加一个 token 字段,您可以将这串 token 加到 admin 用户的kubeconfig文件中,继续使用kubeconfig登录,具体加的位置可以参考bootstrap-kubeconfig 文件,两种认证方式任您选择。

    注意:通过 kubectl get secret xxx 输出中的 token 值需要进行 base64 解码,在线解码工具 base64decode,Linux 和 Mac 有自带的 base64 命令也可以直接使用,输入 base64 是进行编码,Linux 中base64 -d 表示解码,Mac 中使用 base64 -D;通过 kubectl describe secret xxx 输出中的 token 不需要 base64 解码。

    也可以使用 jsonpath 的方式直接获取 token 的值,如:

    1. kubectl -n kube-system get secret admin-token-nwphb -o jsonpath={.data.token}|base64 -d

    注意我们使用了 base64 对其重新解码,因为 secret 都是经过 base64 编码的,如果直接使用 kubectl 中查看到的 token 值会认证失败,详见 secret 配置。关于 JSONPath 的使用请参考 JSONPath 手册。

    注意:关于如何给其它namespace的管理员生成token请参考使用kubeconfig或token进行用户身份认证。

    参考

    • Dashboard log in mechanism #2093
    • Accessing Dashboard 1.7.X and above
    • Kubernetes dashboard UX for Role-Based Access Control
    • How to sign in kubernetes dashboard? - StackOverflow
    • JSONPath 手册
    • Kubernetes 中的认证