kubernetes如何选择要添加到AWS上的负载均衡器的节点?

时间:2016-12-22 16:56:11

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

一些信息:

  • Kubernetes(1.5.1)
  • AWS
  • 1个主节点和1个节点(均为ubuntu 16.04)
  • k8s通过kubeadm安装
  • 我制作的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艰难的回购和阅读该死的代码,但我仍然无法理解如何在aws上选择k8s节点添加到elb。

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

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

非常感谢任何帮助。

谢谢, F。

3 个答案:

答案 0 :(得分:1)

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

您提到您的子网和实例都具有匹配的KubernetesCluster标记。做你的控制器&工人安全小组? K8s将特别修改工作者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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

确保使用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