关于kubernetes-dashboard出现forbidden无法访问的解决办法 作者: sysit 分类: d 发表于 2019-03-15 1523人围观 > dashboard的部署是一个难点,涵盖角色、用户和权限等,在kubeadm部署过程中遇到过很多的坑,其中最突出的就是出现Forbidden无法访问的问题,这个在kubeadm部署kubernetes-HA-v1.13.4一文中已经表述,这里单独提取出来,便于检索查询。 ## 1. 部署dashboard的操作步骤 ``` curl -fsSL https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml | sed "s+k8s.gcr.io+registry.aliyuncs.com/google_containers+g" | kubectl apply -f - ``` 执行完毕即可通过api-server访问dashboard ``` https://192.168.112.51:6443/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 resource \"services/proxy\" in API group \"\" in the namespace \"kube-system\"", "reason": "Forbidden", "details": { "name": "https:kubernetes-dashboard:", "kind": "services" }, "code": 403 } ``` 这个是因为kubernetes基于安全性的考虑,浏览器必须要一个根证书,防止中间人攻击,见`https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/` ## 2. 创建浏览器证书 ``` #生成crt grep 'client-certificate-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt #生成key文件 grep 'client-key-data' /etc/kubernetes/admin.conf | 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导入浏览器即可正常访问。  这个时候我们需要一个超级管理员的账号来登录,dashboard自带的账号角色权限太低。 ## 3. 创建一个token ``` #创建一个服务账号 cat <<EOF | kubectl create -f - apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system EOF # 创建ClusterRoleBinding cat <<EOF | kubectl create -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kube-system EOF # 生成Token kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') ``` ## 4. 填入Token并访问  如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作! 赞赏支持