使用 serviceaccount 管理 kubernetes 用户
前言
因为我们在管理 kubernets 集群的时候,可能需要给予不同的用户不同的权限; 这个时候 kubernetes 提供的 serviceaccount 可以提供一个很不错的我们管理的切入点, 虽然 serviceaccount 本意是给运行在集群中服务使用的;
创建用户
kubectl create serviceaccount sample-sc
这时候我们将得到一个在 default namespace 的 serviceaccount 账号; 我们运行kubectl get serviceaccount sample-sc
将得到如下结果:
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2018-09-03T02:00:37Z
labels:
from: mofang
name: mofang-viewer-sc
namespace: default
resourceVersion: "18914458"
selfLink: /api/v1/namespaces/default/serviceaccounts/sample-sc
uid: 26e129dc-af1d-11e8-9453-00163e0efab0
secrets:
- name: sample-sc-token-9x7nk
因为我们在使用 serviceaccount 账号配置 kubeconfig 的时候需要使用到 sample-sc 的 token, 该 token 保存在该 serviceaccount 保存的 secret 中;
我们运行kubectl get secret sample-sc-token-9x7nk
将会得到如下结果:
apiVersion: v1
data:
ca.crt: *****
namespace: *****
token: *****
kind: Secret
metadata:
annotations:
kubernetes.io/service-account.name: sample-sc
kubernetes.io/service-account.uid: 26e129dc-af1d-11e8-9453-00163e0efab0
creationTimestamp: 2018-09-03T02:00:37Z
name: mofang-viewer-sc-token-9x7nk
namespace: default
resourceVersion: "18914310"
selfLink: /api/v1/namespaces/default/secrets/sample-sc-token-9x7nk
uid: 26e58b7c-af1d-11e8-9453-00163e0efab0
type: kubernetes.io/service-account-token
其中 {data.token}
就会是我们的用户 token 的 base64 编码,之后我们配置 kubeconfig 的时候将会用到它;
创建角色
比如我们想创建一个只可以查看集群deployments
,services
,pods
相关的角色,应该使用如下配置
apiVersion: rbac.authorization.k8s.io/v1
## 这里也可以使用 Role
kind: ClusterRole
metadata:
name: mofang-viewer-role
labels:
from: mofang
rules:
- apiGroups:
- ""
resources:
- pods
- pods/status
- pods/log
- services
- services/status
- endpoints
- endpoints/status
- deployments
verbs:
- get
- list
- watch
创建角色绑定
apiVersion: rbac.authorization.k8s.io/v1
## 这里也可以使用 RoleBinding
kind: ClusterRoleBinding
metadata:
name: sample-role-binding
labels:
from: mofang
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: mofang-viewer-role
subjects:
- kind: ServiceAccount
name: sample-sc
namespace: default
配置 kubeconfig
经过以上的步骤,我们最开始创建的 serviceaccount 就可以用来访问我们的集群了, 同时我们可以动态更改 ClusterRole
的授权来及时控制某个账号的权限(这也是使用 serviceaccount 的好处);
配置应该如下:
apiVersion: v1
clusters:
- cluster:
## 这个是集群的 TLS 证书,与授权无关,使用同一的就可以
insecure-skip-tls-verify: false
certificate-authority-data: *****
server: https://47.**.24.167:6443
name: beta
contexts:
- context:
cluster: beta
user: beta-viewer
name: beta-viewer
current-context: beta-viewer
kind: Config
preferences: {}
users:
- name: beta-viewer
user:
## 这个使我们在创建 serviceaccount 生成相关 secret 之后的 data.token 的 base64 解码字符,它本质是一个 jwt token
token: *****.******.*****