代码之家  ›  专栏  ›  技术社区  ›  vivekyad4v

AWS EKS地形-未找到标记“KubernetesCluster”或“kubernetes.io/cluster/…”

  •  1
  • vivekyad4v  · 技术社区  · 6 年前

    我跟着 https://www.terraform.io/docs/providers/aws/guides/eks-getting-started.html

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

    $ ./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环境。

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   vivekyad4v    6 年前

    确保在VPC、子网和;ASGs-

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

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

    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
  •  0
  •   Rotem jackoby    4 年前

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


    this doc

    1) 专有网络标签要求

    当您在版本1.15之前创建Amazon EKS群集时,Amazon EKS会以以下方式标记包含您指定的子网的VPC,以便Kubernetes能够发现它:

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

    键:该值与Amazon EKS集群的名称匹配。
    专有网络 .

    注: 群集用于的所有子网(公用和专用) 资源应该有这个标签 .

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

    键:该值与您的Amazon EKS集群匹配。
    子网 .

    必须按照以下方式标记专用子网,以便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
    

    标记自动缩放组

    this doc ).

    群集自动缩放器需要在节点组自动缩放组上设置以下标记,以便自动发现它们。

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

    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