如何访问GKE中的NodePort服务

Pen*_* Wu 2 kubernetes google-kubernetes-engine

这是我的服务 yaml。在 GKE 上创建 svc 时。我不知道如何访问 svc。我找不到用于访问 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

mar*_*rio 9

如果您不使用节点没有公共 IP 地址的私有集群NodePort,则可以使用任何节点的公共 IP 地址访问您的服务。

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

如果您想知道GKE 节点的公共 IP 地址是什么,请转到计算引擎>虚拟机实例

在此输入图像描述

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

在此输入图像描述

所以就我而言,我应该使用<any_node's_public_ip_address>:31251.

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

在此输入图像描述

更新:

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

在此输入图像描述

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

但是,如果您选择了默认选项 ie "Public cluster",则可以使用节点的公共 IP 来访问您的NodePort服务,就像使用标准(非自动驾驶仪)集群一样。

当然,在自动驾驶模式下,您不会在 GCP 控制台中将节点视为计算引擎虚拟机,但您仍然可以通过运行以下命令来获取其公共 IP:

kubectl get nodes -o wide
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此输入图像描述