Kubernetes 仪表板不接受仅查看服务帐户令牌
Kubernetes dashboard doesn't accept view-only serviceaccount token
所以我按照官方说明对 kubernetes 仪表板进行了基本设置。它与 cluser-admin 角色服务帐户令牌完美配合。但是当我使用它自己的 ClusterRole 和 CluserRoleBinding 创建另一个服务帐户时,我无法使用 "Authentication failed. Please try again." 消息登录到仪表板。
这是我采取的步骤。
1 kubectl create serviceaccount dashboard-reader -n kube-system
2
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: dashboard-reader
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "watch", "list"]
EOF
3
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: dashboard-reader
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: dashboard-reader
subjects:
- kind: ServiceAccount
name: dashboard-reader
namespace: kube-system
EOF
然后我从 dashboard-reader-xyz secret 中获取令牌并将其应用于 Dashboard 登录页面。
我试图实现的是拥有具有不同权限的单独令牌,例如管理员可以使用一个令牌登录仪表板并拥有完全权限,开发人员可以使用不同的令牌登录并且只能看到资源等。
仪表盘版本为1.10.1。
Kubernetes 版本为 1.13.5
可以在 k8s 中创建 service-account 并将其限制在特定的命名空间中。
按照以下步骤操作:
- 我假设您的 k8s 集群上安装了 k8s-dashboard。
- 我还假设您已经按照 these 步骤创建了 admin-user 来访问 k8s-dashboard。
- 现在要将开发人员限制在 k8s 上的特定命名空间,请创建一个包含以下内容的 service-account:
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: mynamespace-user
namespace: mynamespace
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: mynamespace-user-full-access
namespace: mynamespace
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["batch"]
resources:
- jobs
- cronjobs
verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: mynamespace-user-view
namespace: mynamespace
subjects:
- kind: ServiceAccount
name: mynamespace-user
namespace: mynamespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: mynamespace-user-full-access
将 mynamespace
替换为您要将开发人员限制到的命名空间的名称。
- 您可以使用可以使用此命令检索的访问令牌登录到 k8s-dashboard。
kubectl -n mynamespace describe secret $(kubectl -n flow get secret | grep mynamespace-user | awk '{print }')
- 您也可以使用 kube config 登录 k8s-dashboard。 kube 配置内容将是:
apiVersion: v1
kind: Config
preferences: {}
# Define the cluster
clusters:
- cluster:
certificate-authority-data: PLACE CERTIFICATE HERE
# You'll need the API endpoint of your Cluster here:
server: https://YOUR_KUBERNETES_API_ENDPOINT
name: my-cluster
# Define the user
users:
- name: mynamespace-user
user:
as-user-extra: {}
client-key-data: PLACE CERTIFICATE HERE
token: PLACE USER TOKEN HERE
# Define the context: linking a user to a cluster
contexts:
- context:
cluster: my-cluster
namespace: mynamespace
user: mynamespace-user
name: mynamespace
# Define current context
current-context: mynamespace
- 可以使用此命令检索证书
kubectl -n mynamespace get secret $(kubectl -n flow get secret | grep mynamespace-user | awk '{print }') -o "jsonpath={.data['ca\.crt']}"
我已经在我的环境中尝试了这些步骤并且效果很好。
参考this了解更多信息。
希望对您有所帮助。
所以我按照官方说明对 kubernetes 仪表板进行了基本设置。它与 cluser-admin 角色服务帐户令牌完美配合。但是当我使用它自己的 ClusterRole 和 CluserRoleBinding 创建另一个服务帐户时,我无法使用 "Authentication failed. Please try again." 消息登录到仪表板。
这是我采取的步骤。
1 kubectl create serviceaccount dashboard-reader -n kube-system
2
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: dashboard-reader
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "watch", "list"]
EOF
3
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: dashboard-reader
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: dashboard-reader
subjects:
- kind: ServiceAccount
name: dashboard-reader
namespace: kube-system
EOF
然后我从 dashboard-reader-xyz secret 中获取令牌并将其应用于 Dashboard 登录页面。 我试图实现的是拥有具有不同权限的单独令牌,例如管理员可以使用一个令牌登录仪表板并拥有完全权限,开发人员可以使用不同的令牌登录并且只能看到资源等。
仪表盘版本为1.10.1。 Kubernetes 版本为 1.13.5
可以在 k8s 中创建 service-account 并将其限制在特定的命名空间中。
按照以下步骤操作:
- 我假设您的 k8s 集群上安装了 k8s-dashboard。
- 我还假设您已经按照 these 步骤创建了 admin-user 来访问 k8s-dashboard。
- 现在要将开发人员限制在 k8s 上的特定命名空间,请创建一个包含以下内容的 service-account:
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: mynamespace-user
namespace: mynamespace
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: mynamespace-user-full-access
namespace: mynamespace
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["batch"]
resources:
- jobs
- cronjobs
verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: mynamespace-user-view
namespace: mynamespace
subjects:
- kind: ServiceAccount
name: mynamespace-user
namespace: mynamespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: mynamespace-user-full-access
将 mynamespace
替换为您要将开发人员限制到的命名空间的名称。
- 您可以使用可以使用此命令检索的访问令牌登录到 k8s-dashboard。
kubectl -n mynamespace describe secret $(kubectl -n flow get secret | grep mynamespace-user | awk '{print }')
- 您也可以使用 kube config 登录 k8s-dashboard。 kube 配置内容将是:
apiVersion: v1
kind: Config
preferences: {}
# Define the cluster
clusters:
- cluster:
certificate-authority-data: PLACE CERTIFICATE HERE
# You'll need the API endpoint of your Cluster here:
server: https://YOUR_KUBERNETES_API_ENDPOINT
name: my-cluster
# Define the user
users:
- name: mynamespace-user
user:
as-user-extra: {}
client-key-data: PLACE CERTIFICATE HERE
token: PLACE USER TOKEN HERE
# Define the context: linking a user to a cluster
contexts:
- context:
cluster: my-cluster
namespace: mynamespace
user: mynamespace-user
name: mynamespace
# Define current context
current-context: mynamespace
- 可以使用此命令检索证书
kubectl -n mynamespace get secret $(kubectl -n flow get secret | grep mynamespace-user | awk '{print }') -o "jsonpath={.data['ca\.crt']}"
我已经在我的环境中尝试了这些步骤并且效果很好。
参考this了解更多信息。
希望对您有所帮助。