Kubernetes 基于角色的访问控制(RBAC)

KubernetesKubernetesIntermediate
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在 Kubernetes 集群中,基于角色的访问控制(Role-Based Access Control, RBAC)用于控制对集群内资源和操作的访问。RBAC 允许集群管理员为用户、组和服务账户定义角色和权限,从而控制对集群内资源和操作的访问。在本实验中,你将学习如何使用 RBAC 来控制对 Kubernetes 集群中资源的访问。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/BasicCommandsGroup -.-> kubernetes/delete("`Delete`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") subgraph Lab Skills kubernetes/initialization -.-> lab-9203{{"`Kubernetes 基于角色的访问控制(RBAC)`"}} kubernetes/get -.-> lab-9203{{"`Kubernetes 基于角色的访问控制(RBAC)`"}} kubernetes/create -.-> lab-9203{{"`Kubernetes 基于角色的访问控制(RBAC)`"}} kubernetes/delete -.-> lab-9203{{"`Kubernetes 基于角色的访问控制(RBAC)`"}} kubernetes/apply -.-> lab-9203{{"`Kubernetes 基于角色的访问控制(RBAC)`"}} end

启动 Minikube 集群

在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。

  1. 导航到工作目录

    打开终端并导航到默认的项目文件夹:

    cd /home/labex/project
  2. 启动 Minikube

    启动 Minikube 以初始化一个 Kubernetes 集群:

    minikube start
    • 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
    • 根据系统性能,Minikube 可能需要几分钟才能启动。
  3. 验证 Minikube 是否正在运行

    检查 Minikube 集群的状态:

    minikube status
    • 查找 kubeletapiserver 等组件是否显示为 Running
    • 如果集群未运行,请重新运行 minikube start

如果启动 Minikube 时遇到问题,可以使用 minikube delete 来重置环境(如有需要)。

创建命名空间

使用以下命令创建一个名为 myapp 的新命名空间:

kubectl create namespace myapp

创建 Role

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

创建一个 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 命名空间的权限。

创建 ClusterRole

创建一个名为 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

创建一个 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 集群中资源和操作的访问有了深入的理解。

您可能感兴趣的其他 Kubernetes 教程