如何向全世界展示我在 AWS 上托管的 Kubernetes 服务?

如何向全世界展示我在 AWS 上托管的 Kubernetes 服务?

我在 AWS 上有一个使用(公共拓扑)安装的 Kubernetes 集群kops。我的一个部署是我想通过 CloudFront 公开的 Web 服务器,另一个是我想通过 ALB 公开的 API 服务器。

在这两种情况下,这意味着证书都由我来处理。特别是对于 API 服务器,对我来说,拥有客户端 IP 地址非常重要,因此我需要 HTTP 负载平衡,而不仅仅是 TCP。我还使用 WebSockets,因此我需要 ALB,而不是 ELB。

创建“外部服务”会给我一个 ELB TCP 负载均衡器。对于 Web 服务器,我可以将 CloudFront 指向该服务器(弹性 IP 地址是否使其稳定?)以进行 TLS 和缓存。对于 API 服务器,我可以将 ALB 指向该服务器,但这似乎有点多余。

根据k8s 文档,我应该在 ELB 后面使用 nginx 入口控制器,但这样我就必须向 nginx 提供证书(该解决方案是否与 Let's Encrypt 集成?),而且我会丢失客户端 IP 地址。不幸的是,示例尚未编写。

对于我想要做的事情,目前正确的解决方案是什么?我认为这是很常见的情况。

答案1

您不需要 ELB 和 ALB。

将一些集群节点专用为负载均衡器节点。将它们放在不同的节点组中,为它们添加一些标签:mynodelabel/ingress: nginx,然后在该节点组上托管 nginx ingress 守护进程集。

最重要的选项是:

spec:
  restartPolicy: Always
  dnsPolicy: ClusterFirst
  hostNetwork: true
  nodeSelector:
    mynodelabel/ingress: nginx

  ports:
    - containerPort: 80
      hostPort: 80
    - containerPort: 443
      hostPort: 443

这样您就可以获得原始用户流量!

Nginx 入口控制器与 kube-lego Let's Encrypt 完美配合!

将 elasticIPs 分配给您的 k8s 负载均衡器节点,并将 route53 DNS 条目指向它们。

您可以选择污染您的负载均衡器节点,以便常规 pod 无法在其上运行并降低 nginx 的速度。

相关内容