GCP 别名 IP 不可访问

GCP Alias IP Not reachable

我有一个别名 IP 范围是 10.7.0.0/16

已配置具有辅助范围的 VPC 原生集群,因此我的 pods/service 可以具有别名 IP 范围

在 GKE 中,有一项服务正在使用别名 IP 范围

❯ k get svc
NAME             TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
hasura-service   NodePort   10.7.165.27   <none>        80:30891/TCP   2d21h
---
apiVersion: v1
kind: Service
metadata:
  name: sura-service
  namespace: sura
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
spec:
  selector:
    app: sura
  ports:
  - port: 80
    targetPort: 8080
  type: NodePort

Project 中的其他实例无法与 10.7.165.27:80 通信,这些实例在同一子网中 10.152.0.0/20

我是否需要配置任何其他内容才能使用来自 VPC 本身的别名范围的连接?

注释 cloud.google.com/neg: '{"ingress": true}' 用于 ClusterIP,不适用于 NodePort,这意味着该服务将以两种方式公开:

  1. 幕后将创建一个独立的 ClusterIP,只能从位于 10.7.165.27[=21= 的同一子网中的其他 pods 访问]

  2. 将在您的 GKE 节点子网

    的端口 30891/tcp 中的所有 GKE 节点中创建转发规则 iptables

在您当前的情况下,注释将被接受但不会对其执行任何操作,即使您在幕后创建 ClusterIP(点“1”),也不会进行生效,因为它不是设计的方式。

话虽如此,这里有多个路径。

a) 你可以就此打住,直接在端口 30891/tcp 与你的 GKE 节点通信,我只会将此作为最后的手段,因为我个人不喜欢处理随机(或手动)选择的端口,在较长的 运行 中可能会影响处理。

b) 您也可以直接与您的 GKE pod IP 地址通信(假设没有 GCP 防火墙规则阻止连接),我也不会使用它,因为 GKE pod IP 可能会在任何给定时间更改,因此请保持跟踪它需要一些手动工作来完成,如果你有多个 pods 提供相同的服务,你也不会有任何“平衡”。

c) 您可以实现以下 ClusterIP yaml 文件而不是当前的文件:

apiVersion: "v1"
kind: "Service"
metadata:
  name: "sura-service"
  annotations:
    cloud.google.com/neg: '{"exposed_ports": {"80":{}}}'
  namespace: "sura"
spec:
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 8080
  selector:
    app: "sura"
  type: "ClusterIP"

这将创建一个 NEG,您需要将您的连接指向将要创建的 GCP NEG 内部 IP,如果您需要将 GCP NEG 用于任何原因。

d) 如果您不需要像这样使用 NEG,您也可以部署一个内部 TCP 负载平衡器:

apiVersion: "v1"
kind: "Service"
metadata:
  name: "sura-l4"
  namespace: "sura"
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
spec:
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 8080
  selector:
    app: "sura"
  type: "LoadBalancer"
  loadBalancerIP: ""

根据您要实现的目标,您可以将其与 NEG 和/或全局访问结合使用。

---
apiVersion: v1
kind: Service
metadata:
  name: sura-service
  namespace: sura
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
spec:
  selector:
    app: sura
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 8080
  type: ClusterIP

这将创建一个具有辅助别名范围的服务,仍然无法从 VPC 访问。

使用仅代理子网创建内部负载均衡器 - https://cloud.google.com/load-balancing/docs/l7-internal/proxy-only-subnets

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: sura-ingress
  namespace: sura
  annotations:
    kubernetes.io/ingress.class: "gce-internal"
spec:
  backend:
    serviceName: sura-service
    servicePort: 80

这是数据包流