【问题标题】:unable to give static ip to nlb无法给 nlb 静态 ip
【发布时间】:2019-12-11 09:31:23
【问题描述】:

我很难使用入口控制器与 NLB 一起工作: https://kubernetes.github.io/ingress-nginx/deploy/#network-load-balancer-nlb

即使子网在这里也没有生效,它没有在创建 NLB 的 API 中传递我的配置:

================================
kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-eip-allocations: "eipalloc- 
    07e3afcd4b7b5d644,eipalloc-0d9cb0154be5ab55d,eipalloc-0e4e5ec3df81aa3ea"
    service.beta.kubernetes.io/aws-load-balancer-subnets: "subnet- 
    061f4a497621a7179,subnet-001c2e5df9cc93960"
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
  - name: http
    port: 80
    targetPort: http
  - name: https
    port: 443
    targetPort: https

【问题讨论】:

  • 你能补充更多细节吗?您遵循了哪些步骤?如果您看到挂起状​​态或任何其他问题,您能否添加此命令的输出和可能的日志? $ kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx --watch
  • 你说的是入口控制器服务的公共IP地址吗?您的 K8S 集群是如何安装的(托管服务 EKS、kubeadm、kubespray、kops...)?你能显示kubectl -n get svc ingress-nginx ingress-nginx?的输出吗?
  • 是的,我说的是公共 ip
  • 您是如何获得分配 ID 的?

标签: amazon-web-services kubernetes nlb eip


【解决方案1】:

因此,事实证明 - 这些注释将仅在 Kubernetes 1.16 之后才受支持,这在 AWS 上“即将推出”。 目前支持的版本是1.15,只是忽略了那些注解...

考虑到您在此处使用 AWS 特定的注释 (service.beta.kubernetes.io/aws-load-balancer-eip-allocations) - 我认为这正是它不适用于您的情况的原因。

作为一种解决方法,我建议:

  1. 创建自定义部署后脚本,在每次 Kubernetes 服务更新后重新配置新创建的 LoadBalancer。
  2. 改用更传统的方式,例如 ELB 与您的 Container 以及 AutoScaling 组(我们就是这样做的)。
  3. 设置您自己的 Kubernetes 控制器(超级难的东西,一旦 1.16 正式发布,它将完全过时并且基本上会浪费时间)。见this how-to
  4. 等等……

官方声明: https://docs.aws.amazon.com/eks/latest/userguide/update-cluster.html#1-16-prequisites

注释的完整列表(何时“支持”ofc): https://github.com/kubernetes/kubernetes/blob/v1.16.0/staging/src/k8s.io/legacy-cloud-providers/aws/aws.go#L208-L211

敬请期待! :(

【讨论】:

  • 仅出于历史原因,简短更新:我们已设法使其在 1.17 上运行,但请注意配置 eIP 将花费一些明显的时间(在我们的案例中最多 10 分钟)。此外,如果您确实需要类似的功能 - 您可以考虑使用 Terraform,它不会使设置变得复杂,同时为您提供部署后操作的选项,例如分配这些 IP,同时保持您的设置更多版本-不可知论者。
【解决方案2】:

eip allocations 的数量必须与subnet annotation 中的子网数量匹配。

service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-xyz, eipalloc-zzz

service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-xxxx, mySubnet

您有 3 个分配,但只有 2 个子网。

另外,注解

service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing" 不见了。

默认情况下,这将使用“内部”方案。

我假设因为您正在分配您可能想要“面向互联网”的弹性 IP 地址。

此外,您使用的是用于“AWS 负载均衡器控制器”的注释,但您使用的是“AWS 云提供商负载均衡器控制器”

aws-load-balancer-type 的外部值是导致 AWS 负载均衡器控制器,而不是 AWS 云提供商负载 平衡器控制器,用于创建网络负载平衡器。 docs

您正在使用service.beta.kubernetes.io/aws-load-balancer-type: nlb 这意味着此答案前面提供的链接都与您的负载均衡器无关。 nlb 类型是“AWS 云提供商负载均衡器控制器”而不是“AWS 负载均衡器控制器”

对于“AWS 云提供商负载均衡器控制器”,所有 the docs 引用均为 this。

【讨论】:

    猜你喜欢
    • 2022-10-19
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2021-02-18
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多