【问题标题】:将外部 IP 分配给 Kubernetes 节点 (AWS EKS)
【发布时间】:2019-01-14 14:12:43
【问题描述】:

我有一个 UDP 服务,我需要从 AWS EKS 集群向 Internet 公开。 AWS 负载均衡器(经典或 NLB)不执行 UDP,因此我想使用带有 Route53 多值的 NodePort 来为我的节点获取 UDP 循环负载均衡。

我在 AWS EKS 上的节点没有分配给它们的 ExternalIP。虽然运行节点的 EC2 实例具有公共 IP,但在创建集群时这些 IP 并未分配给节点。

如何将 EC2 公共 IP 分配给我的 k8s 节点?

NAME                                          STATUS    ROLES     AGE       VERSION   EXTERNAL-IP   OS-IMAGE                                         KERNEL-VERSION               CONTAINER-RUNTIME
x.us-west-2.compute.internal   Ready     <none>    7d        v1.10.3   <none>        Amazon Linux 2 (2017.12) LTS Release Candidate   4.14.42-61.37.amzn2.x86_64   docker://17.6.2
x.us-west-2.compute.internal      Ready     <none>    7d        v1.10.3   <none>        Amazon Linux 2 (2017.12) LTS Release Candidate   4.14.42-61.37.amzn2.x86_64   docker://17.6.2
x.us-west-2.compute.internal   Ready     <none>    7d        v1.10.3   <none>        Amazon Linux 2 (2017.12) LTS Release Candidate   4.14.42-61.37.amzn2.x86_64   docker://17.6.2

为了方便起见,我目前正在针对 HTTP 服务进行测试,这是我的测试服务的样子:

apiVersion: v1
kind: Service
metadata:
  name: backend-api
  labels:
    app: backend-api
spec:
  selector:
    app: backend-api
  type: NodePort
  ports:
  - name: back-http
    port: 81
    targetPort: 8000
    protocol: TCP
  externalIPs:
  - x.x.x.x
  - x.x.x.x
  - x.x.x.x

对于这个例子,我的curl 请求永远不会命中节点上运行的 HTTP 服务。我的预感是因为节点没有externalIPs。

【问题讨论】:

    标签: amazon-web-services kubernetes amazon-eks


    【解决方案1】:

    我没有尝试过 HostPort 或 UDP,但我在公共 NodePorts 上取得了成功。

    只要实例有一个公共 IP,它的安全策略会打开端口,没有操作系统防火墙,并且您没有不兼容的 NetworkPolicies,那么 HostPort 就可以正常工作。 NodePort 将操作系统的端口转发到 Kubernetes。 ExternalIP 和其他内部 Kubernetes 设置无关。

    【讨论】:

      【解决方案2】:

      您可以使用External IP controller 为节点分配IP。它设计用于裸机集群,但我认为它也应该适用于您的情况。

      External IP Controller 是一个部署在 k8s 集群之上的 k8s 应用程序,它在 k8s 工作节点上配置外部 IP 以提供 IP 连接。

      说明:

      外部 IP 控制器 kubernetes 应用程序正在其中一个上运行 节点(副本=1)。

      • 在启动时,它会从 kube-api 中提取有关服务的信息,并在指定接口(我们的 上面的例子)。
      • 它监视 kube-api 以获取具有外部 IP 的服务更新,并且:
        • 当出现新的外部 IP 时,它会显示它们。
        • 删除服务后,它会从接口中删除相应的外部 IP。
      • Kubernetes 为外部 IP 控制器提供故障转移。由于我们将副本设置为 1,因此我们将只有一个实例在 集群以避免 IP 重复。而当k8s出现问题时 节点,外部 IP 控制器将在新的 k8s 工作节点上生成 并在该节点上启动外部 IP。

      查看Demo 了解其工作原理。

      【讨论】:

      • 谢谢。我最终选择了 AWS ECS,因为我的服务需要尽快上线。我会在几周后重温这篇文章,如果它最终在 AWS EKS 上运行,我会接受你的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2022-01-03
      • 2023-03-06
      • 2020-05-13
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多