Kubernetes 手记(13)- 用户认证系统
十三 用户认证系统
apiserver 是所有请求访问的网关接口,请求过程中,认证用于实现身份识别,授权用于实现权限检查,实际上,我们使用命令行:kubectl apply -f ment.yaml,实际上是转换为 HTTP 协议向 apiserver 发起请求的,而认证是信息由 ~/.kube/config 这个文件提供的,这个文件记录了管理员权限的用户信息。
k8s 的 API 是 RESTfull 风格的,所以资源是由路径标明的,在 k8s 中,资源只能属于两个地方:属于集群 或 属于名称空间。
例如:请求 delfault 名称空间下的 myapp-deploy 控制器,就是下面的写法
上面表示:http://172.16.100.100:6443 集群的 apis 下的 apps 组的 v1 版本的 namespaces 下寻找 default 下的 myapp-deploy 控制器
13.1 用户的类型
我们使用 kubectl 连接 k8s 集群进行控制,实际上是使用用户家目录下 .kube/config 这个文件中的用户连接到 apiserver 实现认证的,而有些 POD (如:CoreDNS)也需要获取集群的信息,它们也需要连接到 k8s 集群中,所以 k8s 中用户的类型有两种:
人类使用的用户:useraccount,处于用户家目录 .kube/config 文件中,可使用 kubectl config --help 获取帮助创建
POD 使用的用户:serviceaccunt,是一种 k8s 对象,它可以使用 kubectl create serviceaccount --help 获取帮助创建
13.2 POD 如何连接集群
POD 需要使用 serviceaccount 连接并认证到集群,POD 之所以能够连接到集群是因为有一个内置的 service 将 POD 的请求代理至 apiserver 的地址了。
名字为 kubernetes 的 servie 为 POD 连接到 apiserver 提供了通信
13.3 serviceaccount 对象
k8s 的认证有两种一种是:human user、一种是 serviceaccount,下面就是创建 serviceaccount 它是 POD 访问 apiserver 所用的一种对象,而 human user,即使 kubectl 命令行通过读取 config 中的用户而认证到 apiserver 的。
创建一个 serviceaccount 对象,它会自动创建并关联一个 secret,这个 serviceaccount 可以到 apiserver 上进行认证,但是认证不代表有权限,所以需要授权
创建 POD 使用指定的 serviceaccount 对象
13.3.1 在 POD 中使用 serviceaccount
POD 连接 apiserver 时候,需要在清单中指定 serviceAccountName 这个字段,详见:kubectl explain pods.spec
每个 POD 默认自带一个 volumes,这是一个 secret,这个存储卷保存着 default-token-bq2gn 用来访问 apiserver ,而这个 secret 权限仅仅能通过 api 访问当前 POD 自身的信息,如果想要一个 POD 拥有管理集群的权限,那么可以手动创建一个 secret 并通过 volumes 挂载到 POD 上。
serviceaccout 也属于标准的 k8s 对象,这个对象提供了账号信息,但是账号由没有权限需要 rbac 机制来决定。
13.4 kubectl 配置文件
kubectl 配置文件解析,详见:kubectl config view
配置文件保存了:多个集群、多用户的配置,kubectl 可以使用不同的用户访问不同的集群。
13.5 添加证书用户到 config
k8s apiserver 认证方式有两种:ssl 证书 和 token 认证,本次使用 ssl 证书创建用户
13.5.1 创建 SSL 证书用户
创建连接 apiserver 的用户证书
13.5.2 添加 SSL 证书用户到 config
将 kaliarch 用户添加到 k8s 的 config 中,设置客户端证书为 kaliarch.crt,设置客户端私钥为:kaliarch.key,使用 --embed-certs=true 来隐藏这些机密信息
13.5.3 创建切换上下文
创建上下文对象,授权 kaliarch 用户访问名称为 kubernetes 的集群
切换当前使用的上下文,到授权 kaliarch 到 kubernetes 的上下文上
由于这个用户没有授权,所以这个用户是无法 get 到信息的,可以再切换回来
13.6 创建新 config 文件
使用 kubectl config set-cluster 创建一个新的 config 文件,想要设定这个新创建的 config 文件可以使用 --kubeconfig=/tmp/test.conf 指明。
设置集群的连接的 ca 机构证书,--kubeconfig 可以指定 kubectl 使用的配置文件位置,默认为用户家目录 .kube 目录中的 config
将 kaliarch 用户添加到 k8s 的 config 中,设置客户端证书为 kaliarch.crt,设置客户端私钥为:kaliarch.key,使用 --embed-certs=true 来隐藏这些机密信息
创建上下文对象,授权 kaliarch 用户访问名称为 kubernetes 的集群
切换当前使用的上下文,到授权 kaliarch 到 kubernetes 的上下文上
13.7 基于 token 认证
13.7.1 创建 serviceaccount
为 POD 创建一个 serviceaccount 对象,它是 POD 访问 apiserver 的凭证
13.7.2 绑定集群管理员角色
创建 clusterrolebinding 将用户绑定至 cluster-admin 集群管理员(最高权限)
13.7.3 通过 serviceaccount 得到 Token
找到刚才创建的 serviceaccount 对象
得到 serviceaccount 对象中的 Token
其他
自己将手记发在:https://github.com/redhatxl/awesome-kubernetes-notes欢迎一键三连
版权声明: 本文为 InfoQ 作者【雪雷】的原创文章。
原文链接:【http://xie.infoq.cn/article/34e8d0878fcbff8c16839dadf】。文章转载请联系作者。
评论