将外部 IP 分配给 Kubernetes 节点 (AWS EKS)

Fra*_*bel 5 amazon-web-services kubernetes amazon-eks

我有一个 UDP 服务,我需要从 AWS EKS 集群向 Internet 公开。AWS 负载均衡器(经典或 NLB)不执行 UDP,因此我想使用NodePort带有 Route53 的多值的 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
Run Code Online (Sandbox Code Playgroud)

为方便起见,我目前正在针对 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
Run Code Online (Sandbox Code Playgroud)

对于此示例,我的curl请求从未命中节点上运行的 HTTP 服务。我的预感是因为节点没有externalIPs。

VAS*_*VAS 0

您可以使用外部 IP 控制器为节点分配 IP。它设计用于在裸机集群上工作,但我认为它也应该适用于您的情况。

外部 IP 控制器是一个 k8s 应用程序,部署在 k8s 集群顶部,并在 k8s 工作节点上配置外部 IP 以提供 IP 连接。

描述:

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

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

查看演示以了解其工作原理。