介绍
在 Kubernetes 集群中,基于角色的访问控制(Role-Based Access Control, RBAC)用于控制对集群内资源和操作的访问。RBAC 允许集群管理员为用户、组和服务账户定义角色和权限,从而控制对集群内资源和操作的访问。在本实验中,你将学习如何使用 RBAC 来控制对 Kubernetes 集群中资源的访问。
在 Kubernetes 集群中,基于角色的访问控制(Role-Based Access Control, RBAC)用于控制对集群内资源和操作的访问。RBAC 允许集群管理员为用户、组和服务账户定义角色和权限,从而控制对集群内资源和操作的访问。在本实验中,你将学习如何使用 RBAC 来控制对 Kubernetes 集群中资源的访问。
在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。
导航到工作目录:
打开终端并导航到默认的项目文件夹:
cd /home/labex/project
启动 Minikube:
启动 Minikube 以初始化一个 Kubernetes 集群:
minikube start
验证 Minikube 是否正在运行:
检查 Minikube 集群的状态:
minikube status
kubelet
和 apiserver
等组件是否显示为 Running
。minikube start
。如果启动 Minikube 时遇到问题,可以使用 minikube delete
来重置环境(如有需要)。
使用以下命令创建一个名为 myapp
的新命名空间:
kubectl create namespace myapp
在 myapp
命名空间中创建一个名为 myapp-reader
的 Role,允许用户读取命名空间中的 Pod 和 Service。使用以下名为 myapp-reader-role.yaml
的 YAML 文件:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: myapp
name: myapp-reader
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "watch", "list"]
此 Role 允许用户在 myapp
命名空间中读取(get、watch 和 list)Pod 和 Service。
使用以下命令创建 Role:
kubectl apply -f myapp-reader-role.yaml
创建一个 Role Binding,将 myapp-reader
Role 绑定到 myapp
命名空间中的用户或组。例如,将 myapp-reader
Role 绑定到 myapp
命名空间中的 developer
用户,创建以下名为 myapp-reader-binding.yaml
的 YAML 文件:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: myapp-reader-binding
namespace: myapp
subjects:
- kind: User
name: developer
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: myapp-reader
apiGroup: rbac.authorization.k8s.io
此 Role Binding 将 myapp-reader
Role 绑定到 myapp
命名空间中的 developer
用户。
使用以下命令创建 Role Binding:
kubectl apply -f myapp-reader-binding.yaml
通过尝试使用以下命令获取 myapp
命名空间中的 Pod 列表来测试访问权限:
kubectl get pods -n myapp --as developer
你应该会看到一条消息,提示 myapp
命名空间中没有资源,因为你的集群中可能没有 Pod。当你完成实验后,使用此命令,你应该会看到 myapp
命名空间中的 Pod 列表。
通过尝试使用以下命令获取 default
命名空间中的 Pod 列表来测试访问权限:
kubectl get pods --as developer
你应该会看到一条错误消息,提示你没有访问 default
命名空间的权限。
创建一个名为 myapp-admin
的 ClusterRole,允许用户在所有命名空间中创建、删除和更新 Pod 和 Service。使用以下名为 myapp-admin-clusterrole.yaml
的 YAML 文件:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: myapp-admin
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
此 ClusterRole 允许用户对所有命名空间中的 Pod 和 Service 执行所有操作(get、list、watch、create、update 和 delete)。
使用以下命令创建 ClusterRole:
kubectl apply -f myapp-admin-clusterrole.yaml
创建一个 ClusterRole Binding,将 myapp-admin
ClusterRole 绑定到集群中的用户或组。例如,将 myapp-admin
ClusterRole 绑定到 cluster-admin
用户,创建以下名为 myapp-admin-binding.yaml
的 YAML 文件:
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: myapp-admin-binding
subjects:
- kind: User
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: myapp-admin
apiGroup: rbac.authorization.k8s.io
此 ClusterRole Binding 将 myapp-admin
ClusterRole 绑定到 cluster-admin
用户。
使用以下命令创建 ClusterRole Binding:
kubectl apply -f myapp-admin-binding.yaml
通过使用以下名为 myapp-pod.yaml
的 YAML 文件创建 Pod 来测试在 myapp
命名空间中创建 Pod 的访问权限:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
namespace: myapp
spec:
containers:
- name: myapp-container
image: nginx
ports:
- containerPort: 80
使用以下命令创建 Pod:
kubectl apply -f myapp-pod.yaml --as cluster-admin
你应该会看到一条消息,提示 Pod 已成功创建。
通过使用以下名为 myapp-deployment.yaml
的 YAML 文件创建 Deployment 来测试在 myapp
命名空间中创建 Deployment 的访问权限:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
namespace: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp-deployment
template:
metadata:
labels:
app: myapp-deployment
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
使用以下命令创建 Deployment:
kubectl apply -f myapp-deployment.yaml --as cluster-admin
你应该会看到一条错误消息,提示你没有权限在 myapp
命名空间中创建 Deployment。
在本实验中,你学习了如何在 Kubernetes 中使用基于角色的访问控制(Role-Based Access Control, RBAC)来控制对集群内资源和操作的访问。你创建了一个命名空间、一个 Role 和一个 Role Binding,以控制对特定命名空间中资源的访问。你还创建了一个 ClusterRole 和一个 ClusterRole Binding,以控制对所有命名空间中资源的访问。通过本实验,你应该对如何使用 RBAC 控制 Kubernetes 集群中资源和操作的访问有了深入的理解。