1

我按照“ 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 环境。

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

4

2 回答 2

4

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

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

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

我错过了在工作节点上使用自动缩放组传播标签。我将以下代码添加到 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 的人可能会遇到这个问题。这可能有助于其他人节省时间。

于 2018-08-05T16:36:17.857 回答
0

我试图在下面总结所有需要标记的资源 - 我希望我没有错过任何东西。


标记网络资源

本文档的摘要)。

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 组

本文档的摘要)。

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

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

Key                                       Value

k8s.io/cluster-autoscaler/<cluster-name>  owned

k8s.io/cluster-autoscaler/enabled         true

标记安全组

(取自本文档的末尾)。

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

Key                                   Value

kubernetes.io/cluster/<cluster-name>  owned
于 2020-07-21T22:41:36.140 回答