【问题标题】:AWS EKS Terraform - Tag "KubernetesCluster" nor "kubernetes.io/cluster/..." not foundAWS EKS Terraform - 未找到标记“KubernetesCluster”或“kubernetes.io/cluster/...”
【发布时间】:2019-01-12 13:19:37
【问题描述】:

我跟随“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 环境。

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

【问题讨论】:

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


    【解决方案1】:

    确保为您的 VPC、子网和 ASG 添加如下类似的标签 -

    "kubernetes.io/cluster/${CLUSTER_NAME}" = "共享"

    注意: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 的人可能会遇到这个问题。这可能有助于其他人节省时间。

    【讨论】:

      【解决方案2】:

      我试图在下面总结所有需要标记的资源 - 我希望我没有遗漏什么。


      标记网络资源

      this doc 的摘要)。

      1) VPC 标记要求

      当您创建低于 1.15 版的 Amazon EKS 集群时,Amazon EKS 会按以下方式标记包含您指定的子网的 VPC,以便 Kubernetes 可以发现它:

      Key                                       Value
      
      kubernetes.io/cluster/<cluster-name>      shared
      

      键:该值与您的 Amazon EKS 集群的名称匹配。
      值:共享值允许多个集群使用此VPC

      2) 子网标记要求

      当您创建 Amazon EKS 集群时,Amazon EKS 按以下方式标记您指定的子网,以便 Kubernetes 可以发现它们:

      注意:您的集群用于的所有子网(公共和私有) 资源应该有这个标签

      Key                                     Value
      kubernetes.io/cluster/<cluster-name>    shared
      

      键:该值与您的 Amazon EKS 集群匹配。
      值:共享值允许多个集群使用此子网

      3) 内部负载平衡器的私有子网标记要求

      必须按以下方式标记私有子网,以便 Kubernetes 知道它可以将子网用于内部负载均衡器。如果您使用 Amazon EKS AWS CloudFormation 模板创建...

      Key                              Value
      
      kubernetes.io/role/internal-elb  1
      

      4) 外部负载平衡器的公共子网标记选项

      您必须在 VPC 中标记公有子网,以便 Kubernetes 知道仅将这些子网用于外部负载均衡器,而不是在每个可用区中选择公有子网(按子网 ID 的字典顺序) .如果您使用 Amazon EKS AWS CloudFormation 模板...

      Key                      Value
      
      kubernetes.io/role/elb   1
      

      标记 Auto Scaling 组

      this doc的摘要)。

      Cluster Autoscaler 需要您的节点组 Auto Scaling 组上有以下标记,以便可以自动发现它们。

      如果您使用之前的 eksctl 命令创建节点组,则会自动应用这些标签。如果没有,您必须使用以下标签手动标记您的 Auto Scaling 组。

      Key                                       Value
      
      k8s.io/cluster-autoscaler/<cluster-name>  owned
      
      k8s.io/cluster-autoscaler/enabled         true
      

      标记安全组

      (取自this doc末尾)。

      如果您有多个与节点关联的安全组,则其中一个安全组必须应用以下标签。如果您只有一个与节点关联的安全组,则该标签是可选的。

      Key                                   Value
      
      kubernetes.io/cluster/<cluster-name>  owned
      

      【讨论】:

        猜你喜欢
        • 2019-12-21
        • 2022-12-16
        • 2019-08-24
        • 2020-09-01
        • 2020-10-18
        • 2020-05-10
        • 2021-03-25
        • 2021-10-12
        • 2021-03-16
        相关资源
        最近更新 更多