GKE中如何访问NodePort服务

How can I visit NodePort service in GKE

这是我的服务 yaml。在 GKE.I 上创建 svc 时不知道如何访问 svc.I 找不到用于访问 svc 的外部 ip。如何以标准流程访问此 svc。是否需要创建入口?

apiVersion: v1
kind: Service
metadata:
  namespace: dev
  name: ui-svc
  labels:
    targetEnv: dev
    app: ui-svc
spec:
  selector:
    app: ui
    targetEnv: dev
  ports:
    - name: ui
      port: 8080
      targetPort: 8080
      nodePort: 30080
  type: NodePort

如果您不使用节点没有 public IP 地址的 private cluster,您可以使用任何节点的 public IP 访问您的 NodePort 服务地址。

您可以在 Endpoints 列的 Services & Ingresses 部分看到的内容,它是您的 NodePort 服务的内部集群 IP 地址。

如果您想知道 GKE 节点 的 public IP 地址是什么,请转到 Compute Engine > 虚拟机实例:

您将看到所有 Compute Engine VM 的列表,其中还包括您的 GKE 节点。请注意 External IP 列中的 IP 地址。您应该将它与您可以在 NodePort 服务详细信息中查看的端口号一起使用。只需单击它的名称 "ui-svc" 即可查看详细信息。在页面的最底部,您应该看到 ports 部分,它可能如下所示:

所以在我的情况下我应该使用 <any_node's_public_ip_address>:31251.

还有一件重要的事情。不要忘记在 Firewall 上允许到此端口的流量,因为默认情况下它是被阻止的。所以你需要明确允许流量到你的节点,例如在 31251 端口上,以便能够从 public 互联网访问它。只需转到 VPC Network > Firewall 并设置适当的规则:

更新:

如果您创建了一个 Autopilot Cluster,默认情况下它是一个 public,这意味着它的节点有 public 个 IP 地址:

如果您在集群创建期间选择了第二个选项,即 "Private cluster",您的节点将不会有 public IP,您将无法访问您的 NodePort 任何 public IP 上的服务。因此,在这种情况下剩下的唯一选择是通过 LoadBalancer 服务或 Ingress 公开您的工作负载,其中为您创建了一个 public IP 端点,因此您可以从外部访问您的工作负载。

然而,如果您选择了默认选项,即 "Public cluster",您可以使用您节点的 public IP 来访问您的 NodePort 服务,就像您使用标准(非自动驾驶)集群。

当然,在自动驾驶模式下,您不会在 GCP 控制台中将节点视为计算引擎 VM,但您仍然可以通过 运行:

获取它们的 public IP
kubectl get nodes -o wide

它们将显示在 EXTERNAL-IP 列中。

要连接到您的集群,只需单击您可以在集群名称右侧看到的 3 个点 ("Kubernetes Engine" > "Clusters") > 单击 "Connect" > 单击 "RUN IN CLOUD SHELL".

由于您不知道为您的 GKE 自动导航节点(如果有的话)分配了哪些网络标签,因为您不管理它们并且它们不会显示在您的 GCP 控制台中,因此您不会在定义防火墙规则以允许访问您的 NodePort 服务端口时能够使用指定的网络标记,例如30543 并且您必须选择 "All instances in the network" 选项: