k8s(RBAC)用户管理

1、K8S账户体系介绍

在k8s中,有两类用户,service account和user,我们可以通过创建role或clusterrole,再将账户和role或clusterrole进行绑定来给账号赋予权限,实现权限控制,两类账户的作用如下。

  • server account:k8s的进程、pod申请授权时使用的账户。类似于nginx服务会有一个nginx用户。
  • user:k8s的管理人员2\使用的账户,也就是我们使用的账户。

2、Service Account

2.1、 介绍

Kubernetes中所有的访问,无论外部内部,都会通过API Server处理,访问Kubernetes资源前需要经过认证与授权。

  • 在k8s中,service account(简称sa)是给集群中的进程使用的,当集群中的pod或进程需要跟apiserver申请调用资源时会使用到sa
2.2 为什么需要sa

        主要是为了权限控制,不同的sa账户对应不同的权限,如增删查等

 2.3 如何创建sa
  •  创建一个sa
[root@node1 user]# kubectl create serviceaccount sa-example --dry-run  -o yaml -n default
W1026 11:21:22.486105   25708 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: null
  name: sa-example
  namespace: default

[root@node1 user]# kubectl create serviceaccount sa-example -n default
serviceaccount/sa-example created
[root@node1 user]# kubectl  describe serviceaccount sa-example
Name:                sa-example
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   <none>
Tokens:              <none>
Events:              <none>
  • 给sa创建secret,v1.25版本后创建sa后不再自动创建secret,因此需要手动创建。secret中会包含一些认证信息,包括ca证书等.
[root@node1 user]# vim sa-example-secret.yaml
[root@node1 user]# cat sa-example-secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: secret-sa-example
  annotations:
    kubernetes.io/service-account.name: "sa-example"   # 这里填写serviceAccountName
type: kubernetes.io/service-account-token
[root@node1 user]# kubectl  apply -f  sa-example-secret.yaml 
secret/secret-sa-example created
[root@node1 user]# kubectl  describe secret secret-sa-example
Name:         secret-sa-example
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: sa-example
              kubernetes.io/service-account.uid: 118b18b3-ef04-4d6f-9e67-22110c6b025d

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1107 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkNCNE9fSlozNm02Sm1peERyM0wyUDNqVFpvcFBSdnBZbUIxTVczZS1jXzgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNlY3JldC1zYS1leGFtcGxlIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6InNhLWV4YW1wbGUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxMThiMThiMy1lZjA0LTRkNmYtOWU2Ny0yMjExMGM2YjAyNWQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpzYS1leGFtcGxlIn0.Or_zxnvsjcHNfSS5P9ZGC5EUIGTiAtRO4YddHZqgAQKfpwK3CB904eFHdOubruy1AKOOqJMRBnIZ_BU1Gx7QYiqg7Z_v3cBsOBDcSl7kuKTd74mnUHpmbgUEwp1BJUlA17gOyWrXb_ADm-43nHZhQjuFcBrA9QqMsLK2TBpu-LrLwRgC2qF-tsXGwM4O4fKNg_QtlaUEJK3KL-Y7LkWWIO49ttgD8lYFlnn7SA_n6JVw1Oba_HFedIc0NszzQSwo4ZhH3WaSYsraODtliAi5KR_zlx6zoAVTaenbAgqMqvIYgBUSLwxBNyAFLKeuNwqoeQVpF-eQI0oe3sX5YwpcZg
2.4、权限角色设定以及绑定
[root@node1 user]# kubectl  get  clusterrole cluster-admin -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: "2023-09-20T01:59:58Z"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "72"
  uid: ae192e4e-e6ed-4cce-920b-2cadc940c573
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'
[root@node1 user]# kubectl create role pod-reader --verb=list,get,watch --resource=pods --dry-run -o yaml
W1026 11:46:17.517099   33096 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: pod-reader
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - list
  - get
  - watch
[root@node1 user]# kubectl create rolebinding sunny-read-pods --user=sunny --role=pod-reader --dry-run -o yaml
W1026 11:46:53.788376   33297 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  creationTimestamp: null
  name: sunny-read-pods
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pod-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: sunny

[root@node1 user]# kubectl create clusterrole clusterrole-reader-pods --verb=get,list,watch --resource=pods --dry-run -o yaml
W1026 14:11:45.892696   75953 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  name: clusterrole-reader-pods
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch
[root@node1 user]# kubectl create clusterrolebinding cluster-reader --clusterrole=clusterrole-reader-pods --user=sunny --dry-run -o yaml
W1026 14:12:23.506608   76147 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  creationTimestamp: null
  name: cluster-reader
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: clusterrole-reader-pods
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: sunny
[root@node1 user]# kubectl create rolebinding role-to-clusterrole --clusterrole=clusterrole-reader-pods --user=sunny --dry-run -o yaml
W1026 14:13:02.193910   76331 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  creationTimestamp: null
  name: role-to-clusterrole
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: clusterrole-reader-pods
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: sunny

3、User Account

3.1、介绍

 前面说的service account在k8s集群中是给pod使用的,这里介绍的User Account,是给我们自己,也就是给客户端用的。

3.2 、为什么需要user account
  • 在k8s集群中跟linux操作系统是一样的,我们默认的账户是:kubernetes-admin@kubernetes,管理员账户,权限也是最大的,在k8s集群中畅通无阻。

但是在企业中,并不是只有我们一个人使用k8s集群,还有很多的研发人员都是需要使用集群的;这时我们需要给他们创建一些账号,但是这些账号权限又不能太大,以防误删资源,这个时候我们就能使用user account了

3.3、创建user account 

步骤如下

  • 创建用户所需的证书文件和密钥
  • 创建用户
  • 创建角色
  • 将角色和用户进行绑定
 3.3.1、用户证书生成

前面介绍的sa账户,secret创建时会创建好证书,对于用户的话我们需要自己创建证书。 

openssl genrsa -out pulin.key 2048

openssl req -new -key pulin.key -out pulin.csr -subj "/CN=pulin/O=devops"

[root@node1 pki]# openssl x509 -req -in pulin.csr -CA /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key  -CAcreateserial -out pulin.crt -days 3650
Signature ok
subject=/CN=pulin/O=devops
Getting CA Private Key
[root@node1 pki]# ls
apiserver.crt              apiserver-kubelet-client.crt  ca.srl              front-proxy-client.crt  pulin.key
apiserver-etcd-client.crt  apiserver-kubelet-client.key  etcd                front-proxy-client.key  sa.key
apiserver-etcd-client.key  ca.crt                        front-proxy-ca.crt  pulin.crt               sa.pub
apiserver.key              ca.key                        front-proxy-ca.key  pulin.csr

 3.3.2、创建用户

现在我们想要通过kubectl以singless的身份来操作集群,需要将singless的认证信息添加进kubectl的配置,即~/.kube/config中,通过以下命令将用户singless的验证信息添加进kubectl的配置:

[root@node1 pki]# kubectl config set-credentials pulin  --client-certificate=pulin.crt --client-key=pulin.key
User "pulin" set.
[root@node1 pki]# kubectl  config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   
###添加完成后在~/.kube/config可以看到新增了
[root@node1 pki]# cat ~/.kube/config |tail -4
- name: pulin
  user:
    client-certificate: /etc/kubernetes/pki/pulin.crt
    client-key: /etc/kubernetes/pki/pulin.key
##创建context,通过context来绑定用户,来实现精细话的权限控制。context可以理解为登录用户时所需的环境变量。删除使用kubectl config delete-context命令
[root@k8s-master01 ~]# kubectl config get-contexts  ##查询当前环境的context
[root@node1 pki]# kubectl config set-context pulin --cluster=kubernetes --namespace=* --user=pulin
Context "pulin" created.
[root@node1 pki]# kubectl  config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   
          pulin                         kubernetes   pulin              *
3.3.3、创建角色

角色主要分为两种:role和clusterrole,角色(role)是比较有限制性的,只针对于指定的资源生效。而集群角色(clusterrole)就权限就比较广泛了,新建了一个集群角色之后,这个角色将对整个集群受影响。 

 创建角色有两种方法:

  • 通过命令行进行创建
[root@node1 pki]# kubectl create role myrole  --verb=get,list,watch --resource=pod,svc --dry-run -o yaml
W1026 14:54:31.031360   88676 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: myrole
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - services
  verbs:
  - get
  - list
  - watch
[root@node1 pki]# kubectl create clusterrole myrole  --verb=get,list,watch --resource=pod,svc --dry-run -o yaml
W1026 14:55:16.119402   88881 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  name: myrole
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - services
  verbs:
  - get
  - list
  - watch

[root@node1 pki]# kubectl create clusterrole pulin-admin  --verb="*" --resource="*" --non-resource-url="*"  --dry-run -o yaml
W1026 15:11:28.972822   93761 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  name: pulin-admin
rules:
- apiGroups:
  - ""
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'
[root@node1 pki]# kubectl create clusterrole pulin-admin  --verb="*" --resource="*" --non-resource-url="*"
clusterrole.rbac.authorization.k8s.io/pulin-admin created
  • 通过yaml文件进行创建
[root@k8s-master01 ~]# cat myrole2.yaml
apiVersion: rbac.authorization.k8s.io/v1
#api版本,使用kubectl explain +【要查询的资源,比如pod】
kind: Role
metadata:
  name: myrole2
rules:          #规则
- apiGroups: [""]  # 空字符串""表明使用支持所有的api版本,一般都放空
  resources: ["pods"]           #resources:资源,现在这些权限对哪些资源生效,这里写的是pod,如果想要多写几个,就用逗号隔开,其实就是一个列表
  verbs: ["get", "watch", "list"]       #详细的权限:这三个都是查看的权限。如果需要所有权限,直接填写一个*号即可
[root@k8s-master01 ~]# kubectl create -f myrole2.yaml
role.rbac.authorization.k8s.io/myrole2 created
3.3.4、角色绑定用户
[root@node1 pki]# kubectl create rolebinding myrole-binding --role=myrole2 --user=pulin --dry-run -o yaml
\W1026 15:00:23.884947   90400 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  creationTimestamp: null
  name: myrole-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: myrole2
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: pulin
[root@node1 pki]# kubectl  create clusterrolebinding pulin-admin-ding --user=pulin  --clusterrole=pulin-admin --dry-run -o yaml
W1026 15:14:24.283139   94613 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  creationTimestamp: null
  name: pulin-admin-ding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: pulin-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: pulin
[root@node1 pki]# kubectl  create clusterrolebinding pulin-admin-ding --user=pulin  --clusterrole=pulin-admin
clusterrolebinding.rbac.authorization.k8s.io/pulin-admin-ding created
 3.4、使用账户
[root@node1 pki]# kubectl  config use-context pulin
Switched to context "pulin".
[root@node1 pki]# kubectl  config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
          kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   
*         pulin                         kubernetes   pulin              *

使用下列命令可以将context切换回管理员用户

 [root@node1 pki]# kubectl  config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".

[root@node1 pki]# kubectl config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   
          pulin                         kubernetes   pulin              *

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值