如何在GCE上将NodePort暴露到Internet上

28
如何将类型为NodePort的服务暴露到互联网上,而不使用LoadBalancer类型?我发现的每个资源都是通过使用负载均衡器实现的。但我的用例中并不需要负载均衡,因为我正在运行一个postgres映像的实例,它连接到持久磁盘,并且我想能够使用pgAdmin从我的PC连接到我的数据库。如果可能的话,可以提供更详细的答案,因为我对Kubernetes、GCE和网络方面很陌生。
仅供记录和更多上下文,我有一个部署正在运行3个API服务器的副本,我通过设置loadBalancerIP连接到这些服务器。另外还有一个部署,它运行一个postgres实例,并通过NodePort服务与我的API服务器进行通信。我的问题是,不带公共访问的维护数据库很困难。

如果您始终希望拥有恰好1个Postgres副本,则在Kubernetes集群上运行它实际上几乎没有任何附加价值:您可以直接在具有公共IP的VM上运行它。 - morgwai
3个回答

39

使用 NodePort 作为服务类型可以直接运行,例如:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30080
      name: http
    - port: 443
      nodePort: 30443
      name: https
  selector:
    name: nginx

更多细节可以在文档中找到。

使用NodePort的缺点是你必须自己处理与提供商防火墙的集成问题。在官方文档的配置云提供商防火墙部分中也可以找到用于起始端口的信息。

对于 GCE,公开所有节点的上述内容可能如下所示:

gcloud compute firewall-rules create myservice --allow tcp:30080,tcp:30443

一旦完成上述步骤,您的服务应该可以通过节点的任何公共IP地址进行访问。您可以通过以下方式找到它们:

Once this is in place your services should be accessible through any of the public IPs of your nodes. You'll find them with:

gcloud compute instances list

我该如何找到要在连接字符串中使用的IP地址?我可以从GCE中的Networking> External IP addresses中使用一些预定义的IP吗?还是我会自动获取一个IP地址? - Hnus
2
我无法让它工作。我按照您告诉我的方式进行操作,但在运行“gcloud compute instances list”时获得的3个IP地址都没有响应,而且我没有忘记使用“30080”端口。我需要做些其他的事情吗? - Hnus
在我描述步骤之前,我已经进行了测试,请确保检查容器和 Pod 是否运行,并且服务中的选择器与 Pod 标签匹配。 - pagid
6
我也遇到了同样的问题,最终在浪费了几个小时的学习之后弄清楚了:我的服务selector中包含了一个错误的旧部署名称(使用kubectl expose deployment wrong-old-value命令创建),因此它看起来像它有所作为,但实际上过滤掉了我的新部署。大家要检查一下你们的selector哦! - Dzmitry Lazerka

1
为了提高安全性:如果您对将数据库等服务暴露在公共互联网上感到疑惑,您可能会喜欢将其隐藏在一个称为跳板机(也称为GCP官方文档中的堡垒主机)的简单Linux虚拟机后面。这样,您的数据库实例将继续向内部网络开放。然后,您可以删除外部IP地址,使其不再暴露于互联网上。
高层次概念:
public internet <- SSH:22 -> bastion host <- db:5432 -> database service

在设置完ssh连接并建立连接后,您可以通过转发数据库端口(如下例所示)访问数据库。

流程概述

创建GCE VM

特定要求:

  1. 选择您熟悉的Linux发行版的映像
  2. VM连接到互联网:将公共IP附加到VM(您可以在安装期间或之后执行此操作)
  3. 安全性:转到防火墙规则并添加一个新规则,在内部VM IP上打开22号端口。限制传入连接到您的家庭公共IP
  4. 转到您要连接的本地机器,并按以下示例设置连接。

SSH连接到堡垒主机VM

您的ssh连接示例设置位于$HOME/.ssh/config(如果不存在名为config的文件,请创建它):

Host bastion-host-vm
     Hostname external-vm-ip
     User root
     IdentityFile ~/.ssh/id_ed25519
     LocalForward 5432 internal-vm-ip:5432

现在,您可以使用以下命令从本地计算机终端进行连接:
ssh bastion-host-vm

一旦连接成功,您现在可以选择您喜欢的数据库客户端并连接到 localhost:5432(这是通过远程数据库实例的 ssh 连接转发的端口,该实例位于 ssh 主机后面)。 注意:端口转发仅在 ssh 连接建立时起作用。如果您断开连接或关闭终端窗口,则 ssh 连接将关闭,因此数据库端口转发也将关闭。因此,在使用数据库连接时,请保持终端开启并连接到您的堡垒主机。

GCE VM 成本节省的专业提示

您可以使用免费的套餐提供创建堡垒主机 VM,这意味着免费增加了保护措施。 在官方表格中搜索“Compute Engine” 以获取更多信息。 您可以查看此线程以获取有关 GCE 免费限制的更多详细信息

1
你可以在终端窗口(Windows中的命令或PowerShell)中运行kubectl,将postgresql部署转发到本地主机。
kubectl port-forward deployment/my-pg-deployment 5432:5432

当此命令正在运行时(它在前台运行),您可以使用pgAdmin指向localhost:5432来访问gke上的pod。使用pgadmin完成后,只需关闭终端。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接