首页 > 解决方案 > Kubernetes中微服务的基于路径的授权

问题描述

我的任务是将 AWS lambda 微服务迁移到 Kubernetes。为简单起见,有两个服务端点:您可以在/admin其中/userGET 或 POST 请求以完成某事。

您必须在admin组中(在外部 authZ 提供程序中定义)才能命中/admin端点,否则,您会得到 401。您必须在user组中才能访问/user端点。

我会将每个端点公开为在 docker 容器中运行的服务。问题是——在 Kubernetes 中添加路由和基于路径的授权的正确方法是什么?

比如,如果我/admin在浏览器中访问,我需要 Kubernetes 检查我是否在admin组中,然后将我路由到admin服务;否则,它应该返回 401。

我可以自己编写这个路由器,但我想检查一下 Kubernetes 中是否有内置的解决方案。

标签: kubernetesauthorizationkubernetes-ingress

解决方案


检查 Kubernetes 中是否有内置解决方案

不,没有针对 L7 网络策略的内置解决方案。Kubernetes 中的网络策略处于 L4 级别,因此无法实现速率限制、基于路径的防火墙规则等。尽管您可以查看 Service Mesh,例如LinkerdIstio,甚至使用基于 Cilium 等不同的CNIeBPF插件。

Cilium 有一个 CRDCiliumNetworkPolicy可以帮助你处理你的用例。如果您想卸载身份验证/授权过程,您可以将任何代理(如 Nginx/Caddy/HAProxy)或 API 网关(如 Kong)放在其前面。您可以应用以下网络策略,这将限制/admin任何带有标签的 pod 上的端点,app: customapp并且只允许它来自带有标签的 pod app: proxyapp

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "allow-from-proxy"
specs:
  - endpointSelector:
      matchLabels:
        app: customapp
    ingress:
    - fromEndpoints:
      - matchLabels:
          app: proxyapp
      toPorts:
      - ports:
        - port: "8080"
          protocol: "TCP"
        rules:
          http:
          - method: "GET"
            path: "/admin"

推荐阅读