如何使用 Terraform for Amazon EKS 设置节点污点

Posted

技术标签:

【中文标题】如何使用 Terraform for Amazon EKS 设置节点污点【英文标题】:How to set node taints using Terraform for Amazon EKS 【发布时间】:2020-12-17 12:03:30 【问题描述】:

我正在使用 this Terraform provider 构建 AWS EKS 集群。但是,我找不到将节点污点应用于托管节点组或工作组的方法。 This issue and its resolution 似乎暗示这是不可能的。有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

在该提供程序的 Terraform 脚本中,您可以将以下内容添加到工作组:

(在main.tf

worker_groups = [
  
      name                          = "my_node_group"
      instance_type                 = "t3.medium"
      asg_desired_capacity          = 1
      asg_min_size                  = 1
      additional_security_group_ids = [aws_security_group.all_worker_mgmt.id]
      kubelet_extra_args            = "--node-labels=my_node_label --register-with-taints=my_node_label:NoSchedule"
      asg_max_size                  = 1
      tags = []
    ,
]

重要的部分是设置kubelet_extra_args 以将节点标签应用于节点,并使用该节点标签通过--register-with-taints 设置污点。这些是 EK​​S 在启动时在每个工作节点上运行的命令。 (注意,我在worker组中设置的所有其他参数都可以根据您的要求更改)

您可以使用kubectl describe node <node_ip>检查节点上的污点。

【讨论】:

【参考方案2】:

现在eks 模块确实支持taints 开箱即用,只需使用以下配置:

module "eks" 
  source = "terraform-aws-modules/eks/aws"
  ...
  node_groups = 
    test_name = 
      ...
      taints = [
        
          key    = "dedicated"
          value  = "statefulset"
          effect = "NO_SCHEDULE"
        
      ] 
    
  

【讨论】:

酷!既然这是可用的,我将你的设置为正确答案。【参考方案3】:

请注意,您不必为此功能使用专用模块,因为 Hashicorp AWS 提供商通过 taint configuration block 支持开箱即用的污点:

resource "aws_eks_node_group" "statefulset-ng" 
  cluster_name    = aws_eks_cluster.main.name
  node_group_name = "statefulset-ng"
  .
  .
  .
  
  # Block 1 
  taint 
    key = "statefulset-no-schedule"
    value  = "true"
    effect = "NO_SCHEDULE"
  

  # Block 2    
  taint 
    key = "statefulset-no-execute"
    value  = "true"
    effect = "NO_EXECUTE"
  

请注意,每个污点都需要在一个单独的配置块中进行配置。

【讨论】:

【参考方案4】:

这就是我使用 aws_eks_node_group 资源和预先创建的 EKS 集群创建带有污点的节点组的方式。

resource "aws_eks_node_group" "test" 
  cluster_name    = var.cluster_name
  node_group_name = "test"
  node_role_arn   = master.worker_iam_role_arn
  subnet_ids      = var.vpc.private_subnets_id
  disk_size       = 20
  taint 
    key = "dedicated"
    value = "gpuGroup"
    effect = "NO_SCHEDULE"
  
  scaling_config 
      desired_size = 1
      max_size     = 3
      min_size     = 1
  
  labels = 
        "some-labels" = "labels"
  
  instance_types = ["t3.micro"]
  remote_access 
    ec2_ssh_key = ssh-key.key_name
  

参考:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eks_node_group#taint

【讨论】:

以上是关于如何使用 Terraform for Amazon EKS 设置节点污点的主要内容,如果未能解决你的问题,请参考以下文章

如何在 terraform 中正确使用 for_each 中的 each.value?

Terraform For_Each:如何引用创建的资源 ID

具有下游依赖项的 Terraform 条件“for_each”

Terraform : for_each 一个一个

使用 terraform 在 for_each 嵌套资源中循环

Terraform:运行空资源后如何强制资源更新?