amazon-web-services - AWS EKS Terraform - 未找到标签 "KubernetesCluster"或 "kubernetes.io/cluster/..."

标签 amazon-web-services kubernetes amazon-eks

我按照“https://www.terraform.io/docs/providers/aws/guides/eks-getting-started.html”使用 Terraform 创建了一个 EKS 集群。

我能够成功创建配置映射,但无法获取节点详细信息 -

$ ./kubectl_1.10.3_darwin get nodes 
No resources found.

服务详情-

$ ./kubectl_1.10.3_darwin get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   2h

Kubectl 登录节点 -

Aug  5 09:14:32 ip-172-31-18-205 kubelet: I0805 09:14:32.617738   25463 aws.go:1026] Building AWS cloudprovider
Aug  5 09:14:32 ip-172-31-18-205 kubelet: I0805 09:14:32.618168   25463 aws.go:988] Zone not specified in configuration file; querying AWS metadata service
Aug  5 09:14:32 ip-172-31-18-205 kubelet: E0805 09:14:32.794914   25463 tags.go:94] Tag "KubernetesCluster" nor "kubernetes.io/cluster/..." not found; Kubernetes may behave unexpectedly.
Aug  5 09:14:32 ip-172-31-18-205 kubelet: F0805 09:14:32.795622   25463 server.go:233] failed to run Kubelet: could not init cloud provider "aws": AWS cloud failed to find ClusterID
Aug  5 09:14:32 ip-172-31-18-205 systemd: kubelet.service: main process exited, code=exited, status=255/n/a
Aug  5 09:14:32 ip-172-31-18-205 systemd: Unit kubelet.service entered failed state.
Aug  5 09:14:32 ip-172-31-18-205 systemd: kubelet.service failed.

AWS 入门文档未提及任何标签相关信息“https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html”。

一段时间后,我发现我没有将诸如“kubernetes.io/cluster/*”之类的资源标签添加到我的网络资源中。

我的网络资源是预先创建的,我使用远程状态来获取所需的详细信息。我相信我可以向它添加标签或创建一个新的 VPC 环境。

有没有其他方法可以在不添加标签或提供新资源的情况下解决这个问题?

最佳答案

确保您将如下所示的类似标签添加到您的 VPC、子网和 ASG -

"kubernetes.io/cluster/${CLUSTER_NAME}" = "shared"

注意:EKS 和 Kubernetes 需要使用下面特定的 kubernetes.io/cluster/* 资源标签来发现和管理网络资源。
注意:EKS 和 Kubernetes 需要使用下面特定的 kubernetes.io/cluster/* 资源标签来发现和管理计算资源。 - Terraform 文档

我错过了在工作节点上使用自动缩放组传播标签。我将以下代码添加到 ASG terraform 模块并开始工作,至少节点能够连接到主集群。您还需要将标签添加到 EKS 和 Kubernetes 的 VPC 和子网,以发现和管理网络资源。

对于 VPC -

locals {
  cluster_tags = {
    "kubernetes.io/cluster/${var.project}-${var.env}-cluster" = "shared"
  }
}

resource "aws_vpc" "myvpc" {
  cidr_block = "${var.vpc_cidr}"
  enable_dns_hostnames = true

  tags = "${merge(map("Name", format("%s-%s-vpcs", var.project, var.env)), var.default_tags, var.cluster_tags)}"
}

resource "aws_subnet" "private_subnet" {
  count = "${length(var.private_subnets)}"

  vpc_id            = "${aws_vpc.myvpc.id}"
  cidr_block        = "${var.private_subnets[count.index]}"
  availability_zone = "${element(var.azs, count.index)}"

  tags = "${merge(map("Name", format("%s-%s-pvt-%s", var.project, var.env, element(var.azs, count.index))), var.default_tags, var.cluster_tags)}"
}

resource "aws_subnet" "public_subnet" {
  count = "${length(var.public_subnets)}"

  vpc_id            = "${aws_vpc.myvpc.id}"
  cidr_block        = "${var.public_subnets[count.index]}"
  availability_zone = "${element(var.azs, count.index)}"
  map_public_ip_on_launch = "true"

  tags = "${merge(map("Name", format("%s-%s-pub-%s", var.project, var.env, element(var.azs, count.index))), var.default_tags, var.cluster_tags)}"
}

对于 ASG -

resource "aws_autoscaling_group" "asg-node" {
    name = "${var.project}-${var.env}-asg-${aws_launch_configuration.lc-node.name}"

    vpc_zone_identifier = ["${var.vpc_zone_identifier}"]
    min_size  = 1
    desired_capacity  = 1
    max_size  = 1
    target_group_arns = ["${var.target_group_arns}"]
    default_cooldown= 100
    health_check_grace_period = 100
    termination_policies = ["ClosestToNextInstanceHour", "NewestInstance"]
    health_check_type="EC2"
    depends_on = ["aws_launch_configuration.lc-node"]
    launch_configuration = "${aws_launch_configuration.lc-node.name}"
    lifecycle {
    create_before_destroy = true
    }

    tags = ["${data.null_data_source.tags.*.outputs}"]
    tags = [
      {
      key                 = "Name"
      value               = "${var.project}-${var.env}-asg-eks"
      propagate_at_launch = true
       },
      {
      key                 = "role"
      value               = "eks-worker"
      propagate_at_launch = true
       },
       {
      key                 = "kubernetes.io/cluster/${var.project}-${var.env}-cluster"
      value               = "owned"
      propagate_at_launch = true
      }
   ]
}

我能够在上面的更改后部署示例应用程序。

PS - 回答这个问题是因为 AWS EKS 入门文档没有非常清楚地说明这些说明,尝试手动创建 ASG 的人可能会遇到这个问题。这可能会帮助其他人节省时间。

关于amazon-web-services - AWS EKS Terraform - 未找到标签 "KubernetesCluster"或 "kubernetes.io/cluster/...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51693092/

相关文章:

amazon-web-services - 如何限制对特定前缀中的 S3 key 的访问? (在 Python/boto 中)

amazon-web-services - AWS SNS 与 AWS Step Functions

kubernetes - 在本地 Kubernetes 上公开服务

kubernetes - 资源版本太旧 :

amazon-web-services - 0 成本测试 Cloudformation 模板

amazon-web-services - 如何将 key 添加到现有 AWS::SecretsManager::Secret

python - 使用Python/Boto/Django直接上传到S3构建Policy

kubernetes - 同一部署中的Pod中可以有不同的主机安装吗?

jenkins - 使用 Jenkins Docker 容器在 Kubernetes 集群本身内处理 CI/CD 是一种不好的做法吗?

kubernetes - AWS ALB 入口 Controller 无法通过 TLS 解析