如何使用 GCE Ingress 从 GKE 集群外部隐藏端点?

How to hide endpoint from outside the GKE cluster with GCE Ingress?

假设我的 GKE 集群中有一个“用户服务”运行,具有以下 Ingress 配置:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: 'gce'
    kubernetes.io/ingress.allow-http: 'false'
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /users/*
            backend:
              serviceName: users-service
              servicePort: 12345

在我的用户服务中,我公开了一些关于 users-service/metrics 的指标。我想从集群外部隐藏这个 /metrics 端点。类似于:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: 'gce'
    kubernetes.io/ingress.allow-http: 'false'
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /users/*
            respond:
              path: metrics
              status: 404
            backend:
              serviceName: users-service
              servicePort: 12345

因此,每当外部客户端向示例发出请求时。com/users/metrics他都会收到 404 响应。 GCE Ingress 可以做到这一点吗?

您可以在规范中指定多个路径。请求将匹配最具体的路径。 因此,您的规范中会有 /user/* 的路径和 /user/metrics/* 的路径。 GKE 还提供了一个名为 default-http-backend 的默认后端服务,它将 return 一个 404。把这些放在一起,你会得到类似的东西:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: 'gce'
    kubernetes.io/ingress.allow-http: 'false'
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /users/*
            backend:
              serviceName: users-service
              servicePort: 12345
          - path: /users/metrics/*
            backend:
              serviceName: default-http-backend
              servicePort: 80

根据以上内容,发送到 example.com/users/metrics/* 的任何内容都应该 return 404。