【问题标题】:Kubernetes exhausting IPs on a single subnetKubernetes 耗尽单个子网上的 IP
【发布时间】:2022-01-22 02:46:16
【问题描述】:

我当前的 eks 集群与 4 个子网相关联,其中 4 个子网耗尽了单个子网的 IP 分配,这意味着没有 IP 可以分配给 pod。所有可用子网都有一个 /24 的 CIDR 块。谁能帮助我了解分配的工作原理以及它只考虑某个子网组而不在所有子网上进行分布式分配的可能原因是什么?

提前致谢。

【问题讨论】:

    标签: amazon-web-services kubernetes amazon-eks amazon-vpc


    【解决方案1】:

    您是否在多个子网上有工作人员?如果不这样做,那么只有单个子网中的节点才会添加 pod。

    EKS 的一个好的做法是为每个子网的工作人员创建一个 ASG,这样可以确保只要该区域启动并运行,您就始终在该子网中拥有节点。

    此外,这将解决具有持久卷的节点在错误的子网上重生并且无法连接到卷的问题。

    这就是我通过 terraform 构建子网的方式。

    module "vpc" {
      source = "terraform-aws-modules/vpc/aws"
    
      name                 = local.cluster_name
      cidr                 = module.subnet_addrs.base_cidr_block
      azs                  = data.aws_availability_zones.available.names
      private_subnets      = local.private_subnets
      public_subnets       = [module.subnet_addrs.network_cidr_blocks.pub1, module.subnet_addrs.network_cidr_blocks.pub2, module.subnet_addrs.network_cidr_blocks.pub3]
      enable_nat_gateway   = true
      single_nat_gateway   = true
      enable_dns_hostnames = true
      reuse_nat_ips        = true # <= Skip creation of EIPs for the NAT Gateways
      external_nat_ip_ids  = aws_eip.nat.*.id
    
      public_subnet_tags = {
        "kubernetes.io/cluster/${local.cluster_name}" = "shared"
        "kubernetes.io/role/elb"                      = "1"
      }
    
      private_subnet_tags = {
        "kubernetes.io/cluster/${local.cluster_name}" = "shared"
        "kubernetes.io/role/internal-elb"             = "1"
      }
      tags = local.tags
    }
    
    module "eks" {
      source = "terraform-aws-modules/eks/aws"
    
      cluster_name    = local.cluster_name
      cluster_version = var.cluster_version
      subnets         = module.vpc.private_subnets
      vpc_id          = module.vpc.vpc_id
      enable_irsa     = true
      map_roles       = concat(var.map_roles, local.map_roles)
      map_users       = var.map_users
      cluster_encryption_config = [
        {
          provider_key_arn = aws_kms_key.eks.arn
          resources        = ["secrets"]
        }
      ]
      cluster_endpoint_public_access_cidrs = var.cluster_endpoint_public_access_cidrs
      tags                                 = local.tags
      worker_groups                        = var.worker_groups
    
      worker_groups_launch_template = [
        {
          name                 = "bottlerocket-nodes"
          ami_id               = local.bottlerocket_ami
          instance_type        = "t3a.small"
          asg_desired_capacity = 1
    
          # This section overrides default userdata template to pass bottlerocket
          # specific user data
          userdata_template_file = "${path.module}/userdata.toml"
          # we are using this section to pass additional arguments for
          # userdata template rendering
          userdata_template_extra_args = {
            enable_admin_container   = false
            enable_control_container = true
            aws_region               = var.aws_region
          }
          # example of k8s/kubelet configuration via additional_userdata
          additional_userdata = <<EOT
    [settings.kubernetes.node-labels]
    ingress = "allowed"
    EOT
        }
      ]
      node_groups_defaults = {
        ami_type = "AL2_x86_64"
      }
    
      node_groups = local.node_groups
    }
    

    【讨论】:

    • 是的,我的工人在多个子网上。
    • 你的 pod 是否在多个节点上?
    • 是的,Pod 也在多个节点上进行了调度。问题在于它使用单个私有子网进行分配,而不是分布式方式
    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2017-03-23
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多