【问题标题】:How does kubernetes select nodes to add to the load balancers on AWS?Kubernetes 如何选择节点添加到 AWS 上的负载均衡器?
【发布时间】:2017-05-08 09:02:21
【问题描述】:

一些信息:

  • Kubernetes (1.5.1)
  • AWS
  • 1 个主节点和 1 个节点(均为 ubuntu 16.04)
  • 通过 kubeadm 安装 k8s
  • 我制作的 Terraform

请不要使用 kube-up、kops 或类似方式回复。这是关于了解 k8s 如何在后台工作。系统中有太多无法解释的魔法,我想了解它。

== 问题:

在 k8s[aws](例如)上创建负载均衡器类型的服务时:

apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-addon: kubernetes-dashboard.addons.k8s.io
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
    facing: external
spec:
  type: LoadBalancer
  selector:
    k8s-app: kubernetes-dashboard
  ports:
  - port: 80

我成功地创建了一个面向内部或外部的 ELB,但没有任何机器被添加到 ELB(我也可以污染主机,但没有任何变化)。我的问题基本上是这样的:

https://github.com/kubernetes/kubernetes/issues/29298#issuecomment-260659722

子网和节点(但不是 VPC)都标记有“KubernetesCluster”(再次...... elb 是在正确的位置创建的)。但是没有添加节点。

在日志中

kubectl logs kube-controller-manager-ip-x-x-x-x -n kube-system

之后:

aws_loadbalancer.go:63] Creating load balancer for 
kube-system/kubernetes-dashboard with name:
acd8acca0c7a111e69ca306f22de69ae

没有其他输出(它应该打印添加或删除的节点)。我试图理解代码:

https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/providers/aws/aws_loadbalancer.go 但是不管是什么原因,这个函数并没有添加节点。

文档没有详细解释 k8s 决策背后的“过程”。为了尝试理解 k8s,我尝试/使用了 kops、kube up、kubeadm、kubernetes 艰难的方式 repo 和阅读该死的代码,但我仍然无法理解 aws 上的 k8s 如何选择要添加到 elb 的节点。

因此,也不会在任何地方更改安全组。

它是 ec2 上的标签吗? Kublet 设置? 还有什么?

非常感谢任何帮助。

谢谢, F.

【问题讨论】:

    标签: amazon-web-services kubernetes amazon-elb kubeadm


    【解决方案1】:

    我认为史蒂夫走在正确的轨道上。确保您的 kubelet、apiserver 和控制器管理器组件都在其参数列表中包含 --cloud-provider=aws

    您提到您的子网和实例都具有匹配的KubernetesCluster 标签。你的控制器和工作人员安全组吗? K8s 将特别修改 worker SG 以允许进出它创建的服务 ELB 的流量。我也标记了我的 VPC,但我想这不是必需的,并且可能会禁止另一个集群存在于同一个 VPC 中。

    我还用kubernetes.io/role/internal-elb=true 标记我的私有子网,用kubernetes.io/role/elb=true 标记公共子网,以确定可以在哪里创建内部和公共ELB。

    标签和注释的完整列表 (AFAIK) 位于 https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/providers/aws/aws.go

    【讨论】:

      【解决方案2】:

      我认为节点注册是在 Kubernetes 之外进行管理的。我正在使用 kops,如果我在 AWS 中编辑我的 ASG 的大小,则新节点未向我的服务 ELB 注册。但是,如果我使用 kops 编辑节点数,新节点就在那里。

      在文档中,当在 AWS 上运行时,kops instance group 映射到 ASG。在code 中,它看起来像是调用 AWS 而不是 k8s API。

      我知道您没有使用 kops,但我认为在 Terraform 中您需要复制 kops 正在进行的 AWS API 调用。

      【讨论】:

        【解决方案3】:

        确保您使用 kubeadm (http://kubernetes.io/docs/admin/kubeadm/) 设置了正确的云提供商设置。

        AWS 云提供商会自动将可用节点与 ELB 同步。我创建了一个类型 LoadBalancer 然后扩展了我的集群,新节点最终被添加到 ELB:https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/providers/aws/aws_loadbalancer.go#L376

        【讨论】:

        • 我正确设置了云提供商设置,但负载均衡器无法向公共 IP 公开服务。我应该怎么做才能确保 ELB 正确同步所有节点。
        猜你喜欢
        • 1970-01-01
        • 2018-10-24
        • 1970-01-01
        • 2019-12-07
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 2021-03-28
        • 2019-05-27
        相关资源
        最近更新 更多