创建 User Account
1 查看当前用户认证信息
信息说明:
apiVersion: v1
clusters: #集群信息,可能有多个集群
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://127.0.0.1:6443
name: cluster.local
contexts: #context定义cluster,user,namespace元组名称,用来
#向指定的集群使用提供认证信息和命名空间向指定的集群发送
#请求,可以有多个context
- context:
cluster: cluster.local
user: kubernetes-admin
name: kubernetes-admin@cluster.local
current-context: kubernetes-admin@cluster.local #当前使用的账号所在的context
kind: Config
preferences: {}
users: #用户清单
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
从配置可以看出,当前只有一个cluster,现在使用的是kubernetes-admin的账号
2 在kubernetes默认存放用户密钥和证书的目录中,为新用户user2账号生成密钥
[root@node1 configmap]# cd /etc/kubernetes/pki/
[root@node1 pki]# (umask 077; openssl genrsa -out user2.key 2048)
3 创建证书签署请求
openssl req -new -key user2.key -out user2.csr -subj "/CN=user2/O=kubeusers"
4 使用kubeernetes集群创建时候的CA为用户颁发证书,设置有效期365天
openssl x509 -req -in user2.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out user2.crt -days 365
使用User Account设定kube-config配置文件
1 配置客户端证书以及密钥
kubectl config set-credentials user2 --client-certificate=/etc/kubernetes/pki/user2.crt --client-key=/etc/kubernetes/pki/user2.key
2 配置user2的context,组合cluster和credentials,使得可以用通过user-context来切换
kubectl config set-context user2@kubernetes --cluster=cluster.local --user=user2
3上下文切换
#切换到刚新添加的用户user2
kubectl config use-context user2@kubernetes --cluster=cluster.local --user=user2
#切换回amdin用户
kubectl config use-context kubernetes-admin@cluster.local
#临时切换
kubectl --context=user2@kubernetes get pods
4 切换到user2的上下文,显示没有权限
使用内置的ClusterRole绑定新建账号
1 查看k8s内建的clusterole
使用view这个内建的clusterrole
2 查看vimew这个clusterrole的权限
kubectl describe clusterrole view
对于大部分资源都是get .list,watch的查询权限
3 在master节点创建/labfile/rbac目录,用于保存配置文件
mkdir /root/huawei_k8s/labfile/rbac && cd /root/huawei_k8s/labfile/rbac
4 创建一个ClusterRoleBinding对象,绑定该ClusterRole,view
#vim ClusterRolebindinguser2.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: clusterrolebindinguser2
subjects:
- kind: User
name: user2
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
5 再次测试user2账号,已经可以获取到相关信息
kubectl --context=user2@kubernetes get pods
创建Service Account等相关对象
1 创建一个名称为mynamespace的命名空间
kubectl create namespace mynamespace
2 创建Service Account类型的账户
#vim serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
namespace: mynamespace
name: example-sa
3 创建并确认账号
4 编辑role的yaml文件并创建
#vim roletemplate.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: mynamespace
name: example-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get","watch","list"]
5 编写Rolebinding的YAML文件来为Service Account分配权限
#vim RoleBinding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-rolebinding
namespace: mynamespace
subjects:
- kind: ServiceAccount
name: example-sa
namespace: mynamespace
roleRef:
kind: Role
name: example-role
apiGroup: rbac.authorization.k8s.io
6 创建roleBinding
检查
创建pod引用service Account
1 编辑pod yaml文件引用该service account
#vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
namespace: mynamespace
name: nginx-test
spec:
containers:
- name: nginx
image: nginx:1.7.9
serviceAccountName: example-sa
2 创建pod
3 查看pod相关信息
kubectl describe pod nginx-test -n mynamespace
4 进入容器查看secret对象
该secret对象被挂载到该pod对应的目录下,容器里的应用就可以使用ca.crt来访问API server,此时能够做到GET,WATCH和LIST的操作。因为example-sa这个ServiceAccount的权限已经被用role做了绑定