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
如果需要手动添加,需要使用以下命令添加: 要启用 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为什么能操作整个集群
- 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
标签:Kubernetes,get,watch,list,rbac,v1,k8s,安全性
From: https://blog.51cto.com/u_15410237/6238333