赞
踩
K8s的用户和权限管理包括两个方面:认证和授权。认证解决用户是谁的问题,授权解决用户能做什么的问题。通过合理的权限管理,能够保证系统的安全可靠。
K8s的认证包含以下3种方式。这3种方式可以同时存在,认证时只按一种即可。
证书认证
设置apiserver的启动参数:--client_ca_file=SOMEFILE。
Token认证
设置apiserver的启动参数:--token_auth_file=SOMEFILE。
基本信息认证
设置apiserver的启动参数:--basic_auth_file=SOMEFILE。
1. 用户分类
K8s的用户分两种,一种是普通用户,一种是ServiceAccount(服务账户)。
1.1普通用户是假定被外部或独立服务管理的。管理员分配私钥。平时常用的kubectl命令都是普通用户执行的。
1.2ServiceAccount(服务帐户)是由Kubernetes API管理的用户。它们绑定到特定的命名空间,并由API服务器自动创建或通过API调用手动创建。服务帐户与存储为Secrets的一组证书相关联,这些凭据被挂载到pod中,以便集群进程与Kubernetes API通信。(登录dashboard时我们使用的就是ServiceAccount)
2. 普通用户的创建和查看及授权
普通用户并不是通过k8s来创建和维护,是通过创建证书和切换上下文环境的方式来创建和切换用户。
创建用户证书
创建devuser-csr.json文件:
k8s的用户名就是从CN上获取的。组是从O上获取的。这个用户或者组用于后面的角色绑定使用
cat > devuser-csr.json <<EOF
{
"CN": "devuser",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
接下来生成user的证书:
$ cfssl gencert -ca=ca.crt -ca-key=ca.key -config=ca-config.json -profile=kubernetes devuser-csr.json | cfssljson -bare devuser
就会生成下面的文件:
devuser.csr devuser-key.pem devuser.pem
校验证书
# cfssl-certinfo -cert kubernetes.pem
生成config文件
kubeadm已经生成了admin.conf,我们拷贝过来这个文件,这样生成的配置文件会将admin用户的信息也保存下来
$ cp /etc/kubernetes/admin.conf devuser.kubeconfig
设置客户端认证参数:
kubectl config set-credentials devuser \
--client-certificate=/root/ssl/devuser.pem \
--client-key=/root/ssl/devuser-key.pem \
--embed-certs=true \
--kubeconfig=devuser.kubeconfig
设置上下文参数:
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=devuser \
--namespace=kube-system \
--kubeconfig=devuser.kubeconfig
创建角色
创建一个叫pod-reader的角色
[root@master1 ~]# cat pod-reader.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: kube-system
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
kubectl create -f pod-reader.yaml
绑定用户
创建一个角色绑定,把pod-reader角色绑定到 devuser上
[root@master1 ~]# cat devuser-role-bind.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: kube-system
subjects:
- kind: User
name: devuser # 目标用户
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader # 角色信息
apiGroup: rbac.authorization.k8s.io
kubectl create -f devuser-role-bind.yaml
设置当前用户环境为新建的用户devuser
kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig
使用新的config文件
rm $HOME/.kube/config && cp devuser.kubeconfig $HOME/.kube/config
发现已经没有别的namespace的权限了,也不能访问node信息了:
查看配置文件中包含的用户:
3.服务用户的创建和授权
服务账户的用户信息数据是由k8s来管理和维护的的。service account是给进程用的,让进程有相关的权限。如dasboard就是一个进程,我们就可以创建一个service account给它,让它去访问k8s。Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。
查看所有的service account
新增一个新的用户cnych
该用户只能对命名空间kube-system下面的pods和deployments进行管理
第一步新建一个ServiceAccount:
$ kubectl create sa cnych -n kube-system
然后我们新建一个角色role-cnych:(role.yaml)
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: kube-system
name: role-cnych
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
- apiGroups: ["extensions", "apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
注意上面的rules规则:管理pods和deployments的权限。
然后我们创建一个角色绑定,将上面的角色role-cnych绑定到cnych的ServiceAccount上:(role-bind.yaml)
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: role-bind-cnych
namespace: kube-system
subjects:
- kind: ServiceAccount
name: cnych
namespace: kube-system
roleRef:
kind: Role
name: role-cnych
apiGroup: rbac.authorization.k8s.io
分别执行上面两个yaml文件:
$ kubect create -f role.yaml
$ kubect create -f role-bind.yaml
这样ServiceAccount cnych就创建好了,并授予了权限。
查看token名称
kubectl get secret -n kube-system
获取token
kubectl describe secret/{token_name} -n kube-system
这样就可以使用查找到的token登录dashboard了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。