1

我正在尝试通过网络负载均衡器在 Kubernetes 中部署一项服务。我知道目前这是一个 alpha 功能,但我正在运行一些测试。我有一个可以正常工作的部署定义。我的没有 nlb 注释的服务定义看起来像这样并且工作正常:

kind: Service
apiVersion: v1
metadata:
  name: service1
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
spec:
  type: LoadBalancer
  selector:
    app: some-app
  ports:
  - port: 80
    protocol: TCP

但是,当我切换到 NLB 时,即使“正确”地创建和配置了负载均衡器,AWS 目标组中的目标也总是显得不健康,我无法通过 HTTP 访问该服务。这是服务定义:

kind: Service
apiVersion: v1
metadata:
  name: service1
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  selector:
    app: some-app
  ports:
  - port: 80
    protocol: TCP
  externalTrafficPolicy: Local
4

3 回答 3

1

我不认为 N​​LB 是问题所在。

externalTrafficPolicy:本地

AWS 上的 kops 不支持,并且由于某些 AWS 限制,在 AWS 上运行的其他一些 K8s 发行版存在问题。
尝试将其更改为

externalTrafficPolicy:集群

源 IP 是负载均衡器而不是真正的外部客户端的问题,可以通过在服务上使用代理协议注释 + 向入口控制器添加一些配置来解决。

但是,还有第二个问题,虽然您可以在技术上破解它并强制它工作,但通常不值得打扰。

externalTrafficPolicy:本地


创建一个 NodePort /healthz 端点,以便 LB 将流量发送到具有服务端点的节点子集,而不是所有工作节点。它在初始配置时被破坏,并且对帐循环也被破坏。

https://github.com/kubernetes/kubernetes/issues/80579
^更深入地描述了这个问题。

https://github.com/kubernetes/kubernetes/issues/61486
^描述了一种解决方法,以使用 kops 钩子强制它工作

但老实说,你应该坚持 externalTrafficPolicy: Cluster 因为它总是更稳定。

于 2019-08-14T16:37:40.520 回答
1

k8s 节点安全组中似乎缺少一条规则,因为 NLB 转发客户端 IP。

于 2018-03-28T20:51:27.783 回答
0

NLB 安全组实现中存在错误。它已在 1.11.7、1.12.5 和下一个 1.13 补丁中修复。

https://github.com/kubernetes/kubernetes/pull/68422

于 2019-01-26T03:30:23.117 回答