官方指导文档 303.png

NFS的动态供应; Pod;pvc---自动创建pv

k8s会认为每个Pod也可以是操作集群的一个用户。给这个用户会给一个ServiceAccount(服务账号)

权限控制流程:

  • 用户携带令牌或者证书给k8s的api-server发送请求要求修改集群资源
  • k8s开始认证。认证通过
  • k8s查询用户的授权(有哪些权限)
  • 用户执行操作。过程中的一些操作(cpu、内存、硬盘、网络等....),利用准入控制来判断是否可以允许这样操作

一、RBAC

什么是RBAC?(基于角色的访问控制) RBAC API 声明了四种 Kubernetes 对象:Role、ClusterRole、RoleBinding 和 ClusterRoleBinding

  • Role:基于名称空间的角色。可以操作名称空间下的资源
  • RoleBinding: 把一个Role。绑定给一个用户
  • ClusterRole:基于集群的角色。可以操作集群资源
  • ClusterRoleBinding: 把一个ClusterRole,绑定给一个用户

api-server是默认安装rbac的

[root@k8s-01 rbac]# cd /etc/kubernetes/manifests/
[root@k8s-01 manifests]# ls
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml
[root@k8s-01 manifests]# cat kube-apiserver.yaml 

304.png 如果需要手动添加,需要使用以下命令添加: 要启用 RBAC,在启动 API 服务器时将 --authorization-mode 参数设置为一个逗号分隔的列表并确保其中包含 RBAC。

kube-apiserver --authorization-mode=Example,RBAC --<其他选项> --<其他选项>

查询某种资源有什么操作权限

[root@k8s-01 manifests]# kubectl api-resources -owide
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND                             VERBS
bindings                                       v1                                     true         Binding                          [create]
componentstatuses                 cs           v1                                     false        ComponentStatus                  [get list]
configmaps                        cm           v1                                     true         ConfigMap                        [create delete deletecollection get list patch update watch]
endpoints                         ep           v1                                     true         Endpoints                        [create delete deletecollection get list patch update watch]
events                            ev           v1                                     true         Event                            [create delete deletecollection get list patch update watch]
limitranges                       limits       v1                                     true         LimitRange                       [create delete deletecollection get list patch update watch]
namespaces                        ns           v1                                     false        Namespace                        [create delete get list patch update watch]
nodes                             no           v1                                     false        Node                             [create delete deletecollection get list patch update watch]
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim            [create delete deletecollection get list patch update watch]
persistentvolumes                 pv           v1                                     false        PersistentVolume                 [create delete deletecollection get list patch update watch]
pods                              po           v1                                     true         Pod                              [create delete deletecollection get list patch update watch]
podtemplates                                   v1                                     true         PodTemplate                      [create delete deletecollection get list patch update watch]
replicationcontrollers            rc           v1                                     true         ReplicationController            [create delete deletecollection get list patch update watch]

1、Role

定义一个名称空间的角色权限

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" 标明 core API 组
  resources: ["pods"]  #能操作所有pod资源
  #resourceNames:指定能操作某个名字的资源
  verbs: ["get", "watch", "list"] #get:能获取资源,list:能拿到资源列表,watch:能监控资源

2、ClusterRole

ClusterRole 同样可以用于授予 Role 能够授予的权限。 因为 ClusterRole 属于集群范围,所以它也可以为以下资源授予访问权限:

  • 集群范围资源(比如节点(Node))
  • 非资源端点(比如 /healthz)
  • 跨名字空间访问的名字空间作用域的资源(如 Pod) 比如,你可以使用 ClusterRole 来允许某特定用户执行 kubectl get pods --all-namespaces 下面是一个 ClusterRole 的示例,可用来为任一特定名字空间中的 Secret 授予读访问权限, 或者跨名字空间的访问权限(取决于该角色是如何绑定的):
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
  name: secret-reader
rules:
- apiGroups: [""]
  # 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets"
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

DashBoard为什么能操作整个集群 305.png

  • 1、创建一个serviceaccount
kubectl create serviceaccount lori -n default --dry-run=client -oyaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: lori
  namespace: default
[root@k8s-01 rbac]# vim test2.yaml
[root@k8s-01 rbac]# kubectl apply -f test2.yaml 
serviceaccount/lori created
[root@k8s-01 rbac]# kubectl get serviceaccounts 
NAME                     SECRETS   AGE
default                  1         15d
lori                     1         17s
nfs-client-provisioner   1         27h
[root@k8s-01 rbac]# kubectl describe serviceaccounts lori
Name:                lori
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   lori-token-6pjfx
Tokens:              lori-token-6pjfx
Events:              <none>
[root@k8s-01 rbac]# kubectl get secrets 
NAME                                 TYPE                                  DATA   AGE
default-token-r8plt                  kubernetes.io/service-account-token   3      15d
dev-db-secret                        Opaque                                2      2d4h
it666-tls                            kubernetes.io/tls                     2      2d23h
lori-token-6pjfx                     kubernetes.io/service-account-token   3      2m11s
nfs-client-provisioner-token-7vrrj   kubernetes.io/service-account-token   3      27h
[root@k8s-01 rbac]# kubectl describe secrets lori-token-6pjfx 
Name:         lori-token-6pjfx
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: lori
              kubernetes.io/service-account.uid: f4f35db8-02d4-4d24-8524-0605ef2b9cb6

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Il9WTW9ydDRGbnRXRU5HVlozc1FCQzU5eDhkRnowYWkybkp0MlhIVkdySW8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImxvcmktdG9rZW4tNnBqZngiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoibG9yaSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImY0ZjM1ZGI4LTAyZDQtNGQyNC04NTI0LTA2MDVlZjJiOWNiNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmxvcmkifQ.wDEVQi5oQWcXDq08M7sDNIbbebMVwozgstA7tOWkeIZ6QLo6SEU9cw2COjZuKFfaP-D4Gftz6yd6ml8xzglvByNsfgGLH_NHNItfhYGvF_CQijN8QFwI3ygLobXogCmWFLGY5jjFiJ1TytnpJ-2TnrWACLTMhnEWY0QneLXvoApFW3jd15uQ2LQACKR1JXer3-GKqzw1RQ0SCgbX8NEH0MwJ_q2FGjQusBHEvoEDZKQhbLnVnWsXZttyTbm6E1fcRUE9cvCl7vzqYjeXDmV-OU7YvGvTjO866Og1dGjCJCPDQ_3_U1jpikZZTMjTcmZ48U2nNIhr7224W5G0iJ0C9w
[root@k8s-01 rbac]# 

可以用token登录k8s的ui界面

  • 创建一个角色,赋予权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: ns-read
rules:
- apiGroups: [""] # "" 标明 core API 组
  resources: ["namespaces"]  #能操作所有pod资源
  #resourceNames:指定能操作某个名字的资源
  verbs: ["get", "watch", "list"] #get:能获取资源,list:能拿到资源列表,watch:能监控资源

3、ClusterRoleBinding

  • 角色和账号绑定
apiVersion: rbac.authorization.k8s.io/v1
# 此集群角色绑定允许 “manager” 组中的任何人访问任何名字空间中的 Secret 资源
kind: ClusterRoleBinding
metadata:
  name: read-ns-global
subjects:
- kind: ServiceAccount
  name: lori      # 'name' 是区分大小写的
  namespace: default
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: ns-read
  apiGroup: rbac.authorization.k8s.io

4、ServiceAccount

1、创建ServiceAccount

  • 每个名称空间都会有自己默认的服务账号
    • 空的服务账号。
    • 每个Pod都会挂载这个默认服务账号。
    • 每个Pod可以自己声明 serviceAccountName: lori
    • 特殊Pod(比如动态供应等)需要自己创建SA,并绑定相关的集群Role。给Pod挂载。才能操作

集群几个可用的角色

cluster-admin:  整个集群全部全部权限  *.* ** *
admin: 很多资源的crud,不包括 直接给api-server发送http请求。/api
edit: 所有资源的编辑修改创建等权限
view: 集群的查看权限

2、测试基于ServiceAccount的rbac

apiVersion: v1
kind: ServiceAccount
metadata:
  name: lfy
  namespace: default
# ---
# ## 写Role
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # namespace: default  ## 所属的名称空间
  name: ns-reader 
rules: ## 当前角色的规则
- apiGroups: [""] # "" 标明 core API 组
  resources: ["namespaces"] ## 获取集群的所有名称空间
  verbs: ["get", "watch", "list"] # 动词。
---
## 编写角色和账号的绑定关系
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-ns-global
subjects:  ## 主体
- kind: ServiceAccount
  name: lfy # 'name' 是不区分大小写的
  namespace: default
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: ns-reader 
  apiGroup: rbac.authorization.k8s.io