Kubernetes Nginx 入口 - 无法确保负载均衡器:找不到任何合适的子网来创建 ELB

Kubernetes Nginx ingress - failed to ensure load balancer: could not find any suitable subnets for creating the ELB

我想使用 Terraform 在 AWS 上部署一个最小的 k8s 集群,并使用 Helm 安装一个 Nginx Ingress Controller。

地形代码:

provider "aws" {
  region = "us-east-1"
}

data "aws_eks_cluster" "cluster" {
  name = module.eks.cluster_id
}

data "aws_eks_cluster_auth" "cluster" {
  name = module.eks.cluster_id
}

variable "cluster_name" {
  default = "my-cluster"
}

variable "instance_type" {
  default = "t2.large"
}

provider "kubernetes" {
  host                   = data.aws_eks_cluster.cluster.endpoint
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
  token                  = data.aws_eks_cluster_auth.cluster.token
  load_config_file       = false
  version                = "~> 1.11"
}

data "aws_availability_zones" "available" {
}


module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "3.0.0"

  name                 = "k8s-${var.cluster_name}-vpc"
  cidr                 = "172.16.0.0/16"
  azs                  = data.aws_availability_zones.available.names
  private_subnets      = ["172.16.1.0/24", "172.16.2.0/24", "172.16.3.0/24"]
  public_subnets       = ["172.16.4.0/24", "172.16.5.0/24", "172.16.6.0/24"]
  enable_nat_gateway   = true
  single_nat_gateway   = true
  enable_dns_hostnames = true

  public_subnet_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/elb"                    = "1"
  }

  private_subnet_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/internal-elb"           = "1"
  }
}

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "12.2.0"

  cluster_name    = "eks-${var.cluster_name}"
  cluster_version = "1.18"
  subnets         = module.vpc.private_subnets

  vpc_id = module.vpc.vpc_id

  worker_groups = [
   {
     name                          = "worker-group-1"
     instance_type                 = "t3.small"
     additional_userdata           = "echo foo bar"
     asg_desired_capacity          = 2
   },
   {
     name                          = "worker-group-2"
     instance_type                 = "t3.small"
     additional_userdata           = "echo foo bar"
     asg_desired_capacity          = 1
   },
  ]
  

  write_kubeconfig   = true
  config_output_path = "./"

  workers_additional_policies = [aws_iam_policy.worker_policy.arn]
}

resource "aws_iam_policy" "worker_policy" {
  name        = "worker-policy-${var.cluster_name}"
  description = "Worker policy for the ALB Ingress"

  policy = file("iam-policy.json")
}

安装正确执行: helm install my-release nginx-stable/nginx-ingress

NAME: my-release
LAST DEPLOYED: Sat Jun 26 22:17:28 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The NGINX Ingress Controller has been installed.

kubectl describe service my-release-nginx-ingress returns:

Error syncing load balancer: failed to ensure load balancer: could not find any suitable subnets for creating the ELB

VPC 已创建并且 public 子网似乎已正确标记,缺少什么让 Ingress 知道 public 子网?

eks 模块中,您在集群名称前加上 eks-:

cluster_name    = "eks-${var.cluster_name}"

但是您没有在子网标记中使用前缀:

"kubernetes.io/cluster/${var.cluster_name}" = "shared"

cluster_name 中删除前缀并将其添加到集群名称变量中(假设您完全需要前缀)。或者,您可以在标签中添加前缀来解决问题,但这种方法更容易引入不一致。