kubernetes-handbook/guide/auth-with-kubeconfig-or-tok...

94 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

## 使用 kubeconfig 或 token 进行用户身份认证
在开启了 TLS 的集群中,每当与集群交互的时候少不了的是身份认证,使用 kubeconfig即证书 和 token 两种认证方式是最简单也最通用的认证方式,在 dashboard 的登录功能就可以使用这两种登录功能。
下文分两块以示例的方式来讲解两种登陆认证方式:
- 为 brand 命名空间下的 brand 用户创建 kubeconfig 文件
- 为集群的管理员(拥有所有命名空间的 amdin 权限)创建 token
### 使用 kubeconfig
如何生成`kubeconfig`文件请参考[创建用户认证授权的kubeconfig文件](../guide/kubectl-user-authentication-authorization.md)。
> 注意我们生成的 kubeconfig 文件中没有 token 字段,需要手动添加该字段。
比如我们为 brand namespace 下的 brand 用户生成了名为 `brand.kubeconfig` 的 kubeconfig 文件,还要再该文件中追加一行 `token` 的配置(如何生成 token 将在下文介绍),如下所示:
![kubeconfig文件](../images/brand-kubeconfig-yaml.jpg)
对于访问 dashboard 时候的使用 kubeconfig 文件如`brand.kubeconfig` 必须追到 `token` 字段,否则认证不会通过。而使用 kubectl 命令时的用的 kubeconfig 文件则不需要包含 `token` 字段。
### 生成 token
需要创建一个admin用户并授予admin角色绑定使用下面的yaml文件创建admin用户并赋予他管理员权限然后可以通过token访问kubernetes该文件见[admin-role.yaml](https://github.com/rootsongjc/kubernetes-handbook/tree/master/manifests/dashboard-1.7.1/admin-role.yaml)。
```yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
```
然后执行下面的命令创建 serviceaccount 和角色绑定,对于其他命名空间的其他用户只要修改上述 yaml 中的 `name``namespace` 字段即可:
```bash
kubectl create -f admin-role.yaml
```
创建完成后获取secret和token的值。
```bash
# 获取admin-token的secret名字
$ kubectl -n kube-system get secret|grep admin-token
admin-token-nwphb kubernetes.io/service-account-token 3 6m
# 获取token的值
$ kubectl -n kube-system describe secret admin-token-nwphb
Name: admin-token-nwphb
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name=admin
kubernetes.io/service-account.uid=f37bd044-bfb3-11e7-87c0-f4e9d49f8ed0
Type: kubernetes.io/service-account-token
Data
====
namespace: 11 bytes
token: 非常长的字符串
ca.crt: 1310 bytes
```
也可以使用 jsonpath 的方式直接获取 token 的值,如:
```bash
kubectl -n kube-system get secret admin-token-nwphb -o jsonpath={.data.token}|base64 -d
```
**注意**yaml 输出里的那个 token 值是进行 base64 编码后的结果,一定要将 kubectl 的输出中的 token 值进行 `base64` 解码,在线解码工具 [base64decode](https://www.base64decode.org/)Linux 和 Mac 有自带的 `base64` 命令也可以直接使用,输入 `base64` 是进行编码Linux 中`base64 -d` 表示解码Mac 中使用 `base64 -D`
我们使用了 base64 对其重新解码,因为 secret 都是经过 base64 编码的,如果直接使用 kubectl 中查看到的 `token` 值会认证失败,详见 [secret 配置](../guide/secret-configuration.md)。关于 JSONPath 的使用请参考 [JSONPath 手册](https://kubernetes.io/docs/user-guide/jsonpath/)。
## 参考
- [JSONPath 手册](https://kubernetes.io/docs/user-guide/jsonpath/)
- [Kubernetes 中的认证](https://kubernetes.io/docs/admin/authentication/)