8. 授权策略

Linkerd 的服务器授权策略允许您控制允许哪些类型的流量进入网格化 pod。 例如,您可以将与特定服务的通信限制为仅来自某些其他服务; 或者您可以强制必须在某个端口上使用 mTLS;等等。

在您的服务上添加流量策略

默认情况下,Linkerd 允许所有流量通过 mesh, 并使用各种机制(包括重试负载平衡)来确保成功传递请求。

但是,有时我们希望限制允许的流量类型。Linkerd 的策略功能允许您在特定条件下拒绝流量。 它配置了两个基本机制:

  1. 一组基本的默认策略,可以通过 Kubernetes annotationsclusternamespaceworkloadPod 级别进行设置。
  2. ServerServer Authorization CRD 为特定端口指定细粒度策略

这些机制协同工作。例如,deny 的默认集群范围策略将禁止任何流量到任何网格化 pod; 然后必须通过使用 ServerServerAuthorization CRD 明确允许流量。

策略注释

config.linkerd.io/default-inbound-policy annotation 可以在 namespaceworkloadpod 级别进行设置, 并将确定层次结构中该点的默认流量策略。有效的默认策略包括:

  • all-unauthenticated: 入站代理允许所有连接
  • all-authenticated: 入站代理仅允许来自其他网格化 PodmTLS 连接。
  • cluster-unauthenticated: 入站代理允许来自集群 clusterNetworks 中客户端 IP 的所有连接(必须在安装时配置)。
  • cluster-authenticated: 入站代理仅允许来自集群 clusterNetworksIP 的其他网格化 podmTLS 连接。
  • deny: 入站代理拒绝所有未明确授权的连接。

有关更多默认策略,请参阅策略 reference

每个集群都有一个默认策略(默认情况下,all-unauthenticated),在安装/升级时设置。 在 Pod 创建时 workloadnamespace 级别存在的 annotation 可以覆盖该值以确定该 Pod 的默认策略。 请注意,默认策略在代理初始化时固定,因此,在创建 Pod 后,更改 annotation 不会更改该 Pod 的默认策略。

策略自定义资源定义

ServerServerAuthorization CRD 在默认策略之外进一步配置 Linkerd 的策略。 与 annotation 相反,这些 CRD 可以动态更改,并且策略行为将即时更新。

Server 选择一个端口和一组受策略约束的 pod。 这组 pod 可以对应于单个 workload,也可以对应多个 workload(例如,namespace 中每个 pod 的端口 4191)。 一旦创建,Server 资源会拒绝所有到该端口的流量,并且只能通过创建 ServerAuthorization 资源来启用到该端口的流量。

ServerAuthorization 定义了一组允许的 Server 流量。 ServerAuthorization 可以允许基于任意数量的流量,包括 IP 地址; 使用 mTLS;特定的 mTLS 身份(包括通配符,以允许 namespace 选择);特定的 Service Account;和更多。

有关 ServerServerAuthorization 资源的更多信息,请参阅策略 reference

策略拒绝

任何被策略拒绝的已知为 HTTP(包括 HTTP/2gRPC)的流量都将导致代理返回 HTTP 403。 任何非 HTTP 流量都将在 TCP 级别被拒绝,即通过拒绝连接。

请注意,动态更改策略可能会导致现有 TCP 连接突然终止。

示例

有关Emojivoto 示例应用程序的一组示例策略定义, 请参阅 emojivoto-policy.yml