KONG 使用私有 IP 进入 GKE

KONG ingress in GKE with private IP

当我尝试在 GKE 中创建 kong 入口控制器时,它实际上创建了面向 public 的第 4 层 tcp 负载均衡器,有什么方法可以阻止外部 IP 并使用私有 IP

如果我对这里的问题理解正确,我认为你应该可以使用内部 L7 Ingress。这是一个配置示例:

https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress

但请检查您是否符合要求: https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress#requirements

回答问题:

How can I create an Ingress resource used by Kong Ingress Controller that is available only through the private/internal IP with GKE cluster?

您可以按照以下步骤进行操作:

  • 修改并应用 Kong Ingress 控制器清单。
  • 创建并应用将由 Kong 使用的 Ingress 资源。

A side note!

Ingress controllers like nginx-ingress, kong, etc. are using the Service of type Loadbalancer (Layer 4) for incoming traffic.


修改并应用 Kong Ingress 控制器清单

Kong github 页数:

如前所述,您需要下载、修改和应用 Kong Ingress 控制器清单。 默认情况下,您的控制器将暴露给外部资源,但您可以通过指定以下注释来更改此行为(在您下载的清单的 Service 类型 LoadBalancer 中):

  • networking.gke.io/load-balancer-type: "Internal"

您需要像下面这样编辑 Service

apiVersion: v1
kind: Service
metadata:
  annotations:
    networking.gke.io/load-balancer-type: "Internal" # <-- IMPORTANT, ADD THIS
  name: kong-proxy
  namespace: kong
spec:
  ports:
  - name: proxy
    port: 80
    protocol: TCP
    targetPort: 8000
  - name: proxy-ssl
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    app: ingress-kong
  type: LoadBalancer

生成后修改 YAML 表明你的 Service 负责传入流量应该如下所示:

  • $ kubectl get service -n kong
NAME                      TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                      AGE
kong-proxy                LoadBalancer   10.8.5.66    10.156.0.92   80:32764/TCP,443:32002/TCP   14m
kong-validation-webhook   ClusterIP      10.8.6.32    <none>        443/TCP                      14m

如您所见,kong-proxyExternal IP 位于 GKE 节点的 CIDR 之内。您需要将请求发送到子网内的这个特定地址。


创建并应用 Ingress 将由 Kong

使用的资源

要检查您新创建的 Ingress 控制器是否正常运行,您可以使用以下示例进行检查:

  • $ kubectl create deployment nginx --image=nginx
  • $ kubectl expose deployment nginx --port=80 --type=ClusterIP

Ingress 资源 YAML 此示例的清单如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kong-ingress
  annotations:
    kubernetes.io/ingress.class: "kong" # <-- IMPORTANT, ADD THIS
spec:
  rules:
  - host:
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80

ingress.class 用于告诉您的 Kubernetes 集群哪个 Ingress 控制器应该处理这个资源。

应用以上资源后,您应该可以通过调用看到它:

  • $ kubectl get ingress kong-ingress
NAME           CLASS    HOSTS   ADDRESS       PORTS   AGE
kong-ingress   <none>   *       10.156.0.92   80      16m

如您所见,您的 kong-ingress 内部 IP 上可用,与类型 LoadBalancerService 相同。

您可以使用子网中的其他 VM 来检查它是否工作 运行:

  • curl 10.156.0.92

应该可以看到 NGINX 欢迎页面。


其他资源: