public API 中的私有路径与 Kubernetes

Private paths in a public API with Kubernetes

我们在 Amazon EKS 中有一个基于 Kubernetes 的微服务架构,Ambassador 作为 API 网关。

我们有 2 位大使:1 位 public 和 1 位私人。所以我们有服务只能通过集群或VPN中的服务访问,我们有一些服务是public.

我们需要在 public 服务中将某些 URL 路径设为私有。例如,我们有一个 public API 可在 api.company.com 中访问,我们希望保留所有路径 public 如 api.company.com/createuserapi.company.com/login等等...但对于其他路径,我们希望将它们设为私有,例如:api.company.com/swagger.html

我们知道我们可以为 API 中的那些路径启用身份验证,但我们正在寻找没有身份验证的解决方案。

我们如何使用 Ambassador 为 public 服务配置 K8s 服务的示例:

apiVersion: v1
kind: Service
metadata:
  annotations:
    getambassador.io/config: |
      ---
      apiVersion: ambassador/v0
      kind:  Mapping
      name:  backends_mapping
      prefix: /
      ambassador_id: ambassador-public
      service: backends.svc:8080
      host: api.mycompany.com
  labels:
    app: backends
  name: backends
  namespace: svc
spec:
  ports:
  - name: http-backends
    port: 8080
    protocol: TCP
    targetPort: http-api
  selector:
    app: backends
  type: ClusterIP

不确定没有授权是什么意思。您将需要某种检查来提供内部内容。

实现此目的的一种方法是(请注意,这是一个高级概述)。

您可以将服务设为私有,不要直接公开此服务。

/internal//private/ 前缀为所有内部路由添加前缀。
所以 api.company.com/swagger.html 变成 api.company.com/internal/swagger.html

您可以创建一个指向此中间件的负载平衡器。 中间件(public 服务)将拦截所有请求。我觉得这里可以用Nginx。如果请求有 /internal/ 路径检查它是否满足条件(来源,内部网络等)。

如果检查通过,则重定向到私人服务。 如果检查失败 return 403 forbidden 或任何适合的响应代码。

Cilium 可以做你想做的事:http://docs.cilium.io/en/stable/policy/language/#http

基本上你可以指定 L7 网络策略,它只允许从某些 pods.

访问你们中的一些 API 路径

Cilium 项目页面:https://cilium.io/ 第 7 层策略示例:http://docs.cilium.io/en/stable/policy/language/#http EKS 安装指南:http://docs.cilium.io/en/v1.4/gettingstarted/k8s-install-eks/?highlight=eks

免责声明:我是 Cilium 开发团队的一员。