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/createuser
、api.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 开发团队的一员。
我们在 Amazon EKS 中有一个基于 Kubernetes 的微服务架构,Ambassador 作为 API 网关。
我们有 2 位大使:1 位 public 和 1 位私人。所以我们有服务只能通过集群或VPN中的服务访问,我们有一些服务是public.
我们需要在 public 服务中将某些 URL 路径设为私有。例如,我们有一个 public API 可在 api.company.com
中访问,我们希望保留所有路径 public 如 api.company.com/createuser
、api.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 开发团队的一员。