在 AWS EKS(Elastic Kubernetes Service)中,权限管理是确保集群安全性和资源访问控制的关键。AWS EKS 的权限管理主要分为三种类型:Cluster IAM RolesNode IAM RolesRBAC Users。每种类型负责不同的权限控制范围,理解它们的区别和使用场景对于构建安全、高效的 Kubernetes 环境至关重要。

本文将详细介绍这三种权限管理方式,并探讨如何在实际场景中合理配置它们。

graph TD A[AWS EKS 权限管理] --> B[Cluster IAM Roles] A --> C[Node IAM Roles] A --> D[RBAC Users] %% 样式设置 style A fill:#f9f,stroke:#333,stroke-width:4px,font-size:24px style B fill:#bbf,stroke:#333,stroke-width:2px,font-size:20px style C fill:#bbf,stroke:#333,stroke-width:2px,font-size:20px style D fill:#bbf,stroke:#333,stroke-width:2px,font-size:20px


1. Cluster IAM Roles:管理 EKS 控制平面的权限

什么是 Cluster IAM Roles?

Cluster IAM Roles 是用于管理 EKS 控制平面(Control Plane)的权限。这些角色决定了谁可以管理 EKS 集群本身,例如创建、删除、更新集群等操作。

Amazon EKS 需要权限才能代表您调用 AWS API 来管理集群。例如,Amazon EKS 需要权限才能管理工作线程节点的 EC2 Auto Scaling。此权限由分配给您的集群的 IAM 角色控制。AWS 提供了 IAM 策略,其中包含针对此角色的推荐权限。

使用场景

  • 允许 AWS 用户或角色通过 eksctl、AWS CLI 或 AWS 控制台管理 EKS 集群。

  • 控制谁可以执行 kubectl 命令(例如 kubectl get nodes)。

权限范围

  • 管理 EKS 集群的生命周期。

  • 控制对 Kubernetes API 的访问(通过 AWS IAM 和 Kubernetes RBAC 结合)。

示例策略

  • AmazonEKSClusterPolicy:允许管理 EKS 集群。

  • AmazonEKSVPCResourceController:允许 EKS 控制平面管理 VPC 资源。

配置示例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "eks:CreateCluster",
                "eks:DeleteCluster",
                "eks:DescribeCluster"
            ],
            "Resource": "*"
        }
    ]
}

2. Node IAM Roles:管理工作节点对 AWS 资源的访问权限

什么是 Node IAM Roles?

Node IAM Roles 是附加到 EKS 工作节点(Worker Nodes)的 IAM 角色。这些角色决定了工作节点可以访问哪些 AWS 资源,例如拉取 ECR 镜像、访问 S3、访问 RDS 等。

Amazon EKS 工作线程节点上的 kubelet 守护进程代表您调用 AWS API;例如,从 Amazon Elastic Container Registry (Amazon ECR) 中提取容器映像。工作线程节点通过分配给工作线程节点的 IAM 角色获得这些 API 调用的权限。

使用场景

  • 允许工作节点拉取容器镜像(例如从 ECR)。

  • 允许工作节点访问其他 AWS 服务(例如 S3、RDS、DynamoDB 等)。

权限范围

  • 控制工作节点对 AWS 资源的访问。

示例策略

  • AmazonEKSWorkerNodePolicy:允许工作节点加入 EKS 集群。

  • AmazonEC2ContainerRegistryReadOnly:允许工作节点从 ECR 拉取镜像。

  • AmazonEKS_CNI_Policy:允许工作节点管理网络接口(用于 CNI 插件)。

配置示例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage"
            ],
            "Resource": "*"
        }
    ]
}

3. RBAC Users:管理 Kubernetes 资源的访问权限

什么是 RBAC Users?

RBAC(Role-Based Access Control)是 Kubernetes 原生的权限管理系统,用于控制用户或服务账户对 Kubernetes 资源的访问(例如 Pod、Deployment、Service 等)。

管理您的 Kubernetes 集群的管理员需要获得调用 Kubernetes API 的权限。这是通过将 IAM 角色映射到 Kubernetes RBAC 用户来实现的。用于创建集群的 IAM 角色将拥有管理集群的完全权限,这比它通常需要的权限多。出于这个原因,最佳实践是您创建一个特定的 IAM 角色来仅用于部署集群。按照最低权限原则,在 IAM 中创建额外的委托人,这些委托人映射到 RBAC 中更加受限的角色以执行日常操作。

使用场景

  • 控制谁可以在 Kubernetes 集群内执行操作(例如创建 Pod、查看日志、删除 Deployment 等)。

  • 控制服务账户(Service Account)的权限(例如允许某个 Pod 访问 Kubernetes API)。

权限范围

  • 控制对 Kubernetes 资源的访问。

示例配置

  1. 创建 Role

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list", "watch"]
  2. 创建 RoleBinding

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: read-pods
      namespace: default
    subjects:
    - kind: User
      name: alice
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io

三种权限的关系

  1. Cluster IAM RolesNode IAM Roles 是 AWS IAM 层面的权限,用于控制对 AWS 资源(如 EKS 集群、EC2 实例、RDS 等)的访问。

  2. RBAC Users 是 Kubernetes 层面的权限,用于控制对 Kubernetes 资源(如 Pod、Deployment、Service 等)的访问。


实际应用场景

场景 1:管理员管理 EKS 集群

  • 使用 Cluster IAM Roles,确保只有管理员可以创建或删除 EKS 集群。

  • 使用 RBAC Users,控制管理员对 Kubernetes 资源的访问权限。

场景 2:工作节点访问 AWS 资源

  • 使用 Node IAM Roles,确保工作节点可以拉取容器镜像(例如从 ECR)。

  • 使用 Node IAM Roles,确保工作节点可以访问其他 AWS 服务(例如 RDS、S3)。

场景 3:开发人员访问 Kubernetes 资源

  • 使用 RBAC Users,控制开发人员对 Kubernetes 资源的访问权限(例如创建 Pod、查看日志)。


总结

AWS EKS 的权限管理主要分为三种类型:

  1. Cluster IAM Roles:管理 EKS 控制平面的权限。

  2. Node IAM Roles:管理工作节点对 AWS 资源的访问权限。

  3. RBAC Users:管理 Kubernetes 资源的访问权限。

通过合理配置这三种权限,可以确保 EKS 集群的安全性、灵活性和可管理性。无论是管理员、开发人员还是工作节点,都可以在各自的权限范围内高效地完成任务,同时避免不必要的安全风险。