为 Amazon EKS 创建节点类 - Amazon EKS

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

为 Amazon EKS 创建节点类

Amazon EKS 节点类是模板,可对 EKS 自动模式托管式节点的配置进行精细控制。节点类定义了适用于 EKS 集群中节点组的基础设施级别设置,包括网络配置、存储设置和资源标记等。本主题旨在介绍如何创建和配置节点类以满足您的具体运行要求。

如果需要在默认设置之外自定义 EKS 自动模式预置和配置 EC2 实例的方式,创建节点类可让您精准控制关键基础设施参数。例如,您可以指定私有子网放置来增强安全性,为性能敏感型工作负载配置实例临时存储,或者应用自定义标记以满足成本分配的需要。

创建节点类

要创建 NodeClass,请按以下步骤操作:

  1. 创建一个包含节点类配置的 YAML 文件(例如 nodeclass.yaml

  2. 使用 kubectl 将此配置应用到集群

  3. 在节点池配置中引用该节点类。有关更多信息,请参阅 为 EKS 自动模式创建节点池

您需要已经安装并配置好 kubectl。有关更多信息,请参阅 进行设置以使用 Amazon EKS

基本节点类示例

以下是一个节点类示例:

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: private-compute spec: subnetSelectorTerms: - tags: Name: "private-subnet" kubernetes.io/role/internal-elb: "1" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" ephemeralStorage: size: "160Gi"

此节点类增加了节点上的临时存储量。

使用以下命令应用此配置:

kubectl apply -f nodeclass.yaml

然后在节点池配置中引用该节点类。有关更多信息,请参阅 为 EKS 自动模式创建节点池

创建节点类访问条目

如果您创建自定义节点类,则需要创建 EKS 访问条目以允许节点加入集群。如果您使用内置节点类和节点池,EKS 会自动创建访问条目。

有关访问条目工作原理的信息,请参阅使用 EKS 访问条目向 IAM 用户授予 Kubernetes 访问权限

为 EKS 自动模式节点类创建访问条目时,需要使用 EC2 访问条目类型。

使用 CLI 创建访问条目

要为 EC2 节点创建访问条目并关联 EKS 自动节点策略,请执行以下操作:

使用集群名称和节点角色 ARN 更新以下 CLI 命令。在节点类 YAML 中指定节点角色 ARN。

# Create the access entry for EC2 nodes aws eks create-access-entry \ --cluster-name <cluster-name> \ --principal-arn <node-role-arn> \ --type EC2 # Associate the auto node policy aws eks associate-access-policy \ --cluster-name <cluster-name> \ --principal-arn <node-role-arn> \ --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy \ --access-scope type=cluster

使用 CloudFormation 创建访问条目

要为 EC2 节点创建访问条目并关联 EKS 自动节点策略,请执行以下操作:

使用集群名称和节点角色 ARN 更新以下 CloudFormation。在节点类 YAML 中指定节点角色 ARN。

EKSAutoNodeRoleAccessEntry: Type: AWS::EKS::AccessEntry Properties: ClusterName: <cluster-name> PrincipalArn: <node-role-arn> Type: "EC2" AccessPolicies: - AccessScope: Type: cluster PolicyArn: arn:aws:eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy DependsOn: [ <cluster-name> ] # previously defined in CloudFormation

有关部署 CloudFormation 堆栈的信息,请参阅 CloudFormation 入门

节点类规范

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: my-node-class spec: # Required fields role: MyNodeRole # IAM role for EC2 instances subnetSelectorTerms: - tags: Name: "private-subnet" kubernetes.io/role/internal-elb: "1" # Alternative using direct subnet ID # - id: "subnet-0123456789abcdef0" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" # Alternative approaches: # - id: "sg-0123456789abcdef0" # - name: "eks-cluster-security-group" # Optional: Pod subnet selector for advanced networking podSubnetSelectorTerms: - tags: Name: "pod-subnet" kubernetes.io/role/pod: "1" # Alternative using direct subnet ID # - id: "subnet-0987654321fedcba0" # Optional: Selects on-demand capacity reservations and capacity blocks # for EKS Auto Mode to prioritize. capacityReservationSelectorTerms: - id: cr-56fac701cc1951b03 # Alternative Approaches - tags: Name: "targeted-odcr" # Optional owning account ID filter owner: "012345678901" # Optional fields snatPolicy: Random # or Disabled networkPolicy: DefaultAllow # or DefaultDeny networkPolicyEventLogs: Disabled # or Enabled ephemeralStorage: size: "80Gi" # Range: 1-59000Gi or 1-64000G or 1-58Ti or 1-64T iops: 3000 # Range: 3000-16000 throughput: 125 # Range: 125-1000 # Optional KMS key for encryption kmsKeyID: "arn:aws:kms:region:account:key/key-id" # Accepted formats: # KMS Key ID # KMS Key ARN # Key Alias Name # Key Alias ARN # Optional: Forward proxy, commonly requires certificateBundles as well #for EC2, see https://repost.aws/knowledge-center/eks-http-proxy-containerd-automation advancedNetworking: httpsProxy: http://192.0.2.4:3128 #commonly port 3128 (Squid) or 8080 (NGINX) #Max 255 characters #httpsProxy: http://[2001:db8::4]:3128 # IPv6 address with port, use [] noProxy: #Max 50 entries - localhost #Max 255 characters each - 127.0.0.1 #- ::1 # IPv6 localhost #- 0:0:0:0:0:0:0:1 # IPv6 localhost - 169.254.169.254 # EC2 Instance Metadata Service #- [fd00:ec2::254] # IPv6 EC2 Instance Metadata Service # Domains to exclude, put all VPC endpoints here - .internal - .eks.amazonaws.com # Optional: Custom certificate bundles. certificateBundles: - name: "custom-cert" data: "base64-encoded-cert-data" # Optional: Additional EC2 tags (with restrictions) tags: Environment: "production" Team: "platform" # Note: Cannot use restricted tags like: # - kubernetes.io/cluster/* # - karpenter.sh/provisioner-name # - karpenter.sh/nodepool # - karpenter.sh/nodeclaim # - karpenter.sh/managed-by # - eks.amazonaws.com/nodeclass

注意事项

  • 卷加密:EKS 使用配置的自定义 KMS 密钥来加密实例的只读根卷和读/写数据卷。

  • 替换节点 IAM 角色 – 如果您更改与 NodeClass 关联的节点 IAM 角色,则需要创建一个新的访问条目。在创建集群期间,EKS 会自动为节点 IAM 角色创建一个访问条目。节点 IAM 角色需要具有 AmazonEKSAutoNodePolicy EKS 访问策略。有关更多信息,请参阅 使用 EKS 访问条目向 IAM 用户授予 Kubernetes 访问权限

  • 最大容器组(pod)密度 – 在 EKS 中,一个节点上最多可以有 110 个容器组(pod)。此限制将在计算现有最大容器组数量之后应用。有关更多信息,请参阅 选择最优的 Amazon EC2 节点实例类型

  • 标签 – 如果要将标签从 Kubernetes 传播到 EC2,则需要配置额外的 IAM 权限。有关更多信息,请参阅 了解 EKS 自动模式中的身份和访问权限

  • 默认节点类 – 不要将自定义节点类命名为 default。这是因为 EKS 自动模式包含一个名为 defaultNodeClass,您启用至少一个内置 NodePool 时,系统会自动预置该节点类。有关启用内置 NodePools 的信息,请参阅启用或禁用内置节点池

  • 多个子网的 subnetSelectorTerms 行为 – 如果存在多个符合 subnetSelectorTerms 条件或您按照 ID 提供的子网,则 EKS 自动模式会创建分布在子网中的节点。

    • 如果子网位于不同的可用区(AZ),则可以使用 Kubernetes 功能(例如容器组(pod)拓扑分布约束拓扑感知路由)分别在各个区域之间分布容器组(pod)和流量。

    • 如果同一个可用区中有多个子网与 subnetSelectorTerms 匹配,则 EKS 自动模式会在分布在该可用区子网中的每个节点上创建容器组(pod)。EKS 自动模式在同一可用区内其他子网中的每个节点上创建辅助网络接口。它根据每个子网中可用 IP 地址的数量进行选择,以便更高效地使用子网。但是,您无法指定 EKS 自动模式为每个容器组(pod)使用哪个子网;如果您需要容器组(pod)在特定子网中运行,请改用 容器组(pod)的子网选择

容器组(pod)的子网选择

podSubnetSelectorTermspodSecurityGroupSelectorTerms 字段允许容器组(pod)在与其节点不同的子网中运行,从而实现高级联网配置。这种分离增强了对网络流量路由和安全策略的控制。请注意,podSecurityGroupSelectorTerms 需与 podSubnetSelectorTerms 一同使用。

使用案例

在需要执行以下操作时使用 podSubnetSelectorTerms

  • 将基础设施流量(节点到节点通信)与应用程序流量(容器组(pod)到容器组(pod)通信)分开

  • 对节点子网应用与容器组(pod)子网不同的网络配置。

  • 为节点和容器组(pod)实施不同的安全策略或路由规则。

  • 在不影响容器组(pod)流量的情况下,专门为节点流量配置反向代理或网络过滤。使用 advancedNetworkingcertificateBundles 定义您的反向代理以及代理的任何自签名证书或私有证书。

示例配置

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: advanced-networking spec: role: MyNodeRole # Subnets for EC2 instances (nodes) subnetSelectorTerms: - tags: Name: "node-subnet" kubernetes.io/role/internal-elb: "1" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" # Separate subnets for pods podSubnetSelectorTerms: - tags: Name: "pod-subnet" kubernetes.io/role/pod: "1" podSecurityGroupSelectorTerms: - tags: Name: "eks-pod-sg"

容器组(pod)子网选择器的注意事项

  • 降低容器组(pod)密度:使用 podSubnetSelectorTerms 时每个节点上可以运行的容器组(pod)更少,因为节点的主网络接口位于节点子网中,不能用于容器组(pod)子网中的容器组(pod)。

  • 子网选择器限制:标准 subnetSelectorTermssecurityGroupSelectorTerms 配置不适用于容器组(pod)子网选择。

  • 网络规划:确保节点和容器组(pod)子网中有足够的 IP 地址空间,以支持您的工作负载需求。

  • 路由配置:验证容器组(pod)子网的路由表和网络访问控制列表(ACL)是否已针对节点和容器组(pod)子网之间的通信进行正确配置。