<code>Server</code> 和 <code>ServerAuthorization</code> 是 <code>Linkerd</code> 中的两种策略资源,
用于控制对 <code>mesh</code> 应用程序的入站访问。
在 <code>linkerd</code> 安装期间,<code>policyController.defaultAllowPolicy</code> 字段用于指定当没有
<code>Server</code> 选择 <code>pod</code> 时的默认策略。此字段可以是以下之一:
<code>all-unauthenticated</code>: 允许所有请求。这是默认设置。
<code>all-authenticated</code>: 允许来自相同或不同集群(使用 <code>multi-cluster</code>)中的 <code>mesh</code> 客户端的请求。
<code>cluster-authenticated</code>: 允许来自同一集群中的 <code>mesh</code> 客户端的请求。
<code>cluster-unauthenticated</code>: 允许来自同一集群中的 <code>mesh</code> 和非 <code>mesh</code> 客户端的请求。
<code>deny</code>: 所有请求都被拒绝。(然后应创建 <code>Policy</code> 资源以允许服务之间的特定通信)。
可以通过在 <code>pod spec</code> 或其命名空间上设置注释 <code>config.linkerd.io/default-inbound-policy</code> 来覆盖此默认值。
为 <code>pod & port</code> 配置 <code>Server</code> 后,其默认行为是 deny 流量,
并且必须创建 <code>ServerAuthorization</code> 资源以允许 <code>Server</code> 上的流量。
中文手册(https://hacker-linner.com)
<code>Server</code> 在与 <code>server</code> 相同的命名空间中的一组 <code>pod</code> 上选择一个端口。
它通常选择 <code>pod</code> 上的单个端口,但在按名称引用端口时它可能会选择多个端口(例如 <code>admin-http</code>)。
虽然 <code>Server</code> 资源类似于 Kubernetes 的 <code>Service</code>,
但它增加了多个 <code>Server</code> 实例不能重叠的限制:它们不能选择相同的 <code>pod/port</code> 对。
<code>Linkerd</code> 附带了一个 <code>admission controller</code>,试图防止创建重叠的 <code>server</code>。
当服务器选择一个端口时,默认情况下会拒绝流量,
并且必须使用 <code>ServerAuthorization</code> 来授权 <code>Server</code> 选择的端口上的流量。
<code>Server</code> spec 可能包含以下顶级字段:
field
value
<code>podSelector</code>
<code>podSelector</code> 选择相同命名空间中的 <code>pod</code>。
<code>port</code>
端口名称或编号。仅考虑 <code>pod spec</code> 的 <code>ports</code> 中的端口。
<code>proxyProtocol</code>
为入站连接配置协议发现。取代 <code>config.linkerd.io/opaque-ports</code> annotation。必须是 <code>unknown</code>、<code>HTTP/1</code>、<code>HTTP/2</code>、<code>gRPC</code>、<code>opaque</code>、<code>TLS</code> 之一。 如果未设置,则默认为 <code>unknown</code>。
这与 Kubernetes 中的 labelSelector 字段相同。
属于此选择器的所有 <code>pod</code> 都将属于 <code>Server</code> 组。<code>podSelector</code> 对象必须恰好包含以下字段之一:
<code>matchExpressions</code>
<code>matchExpressions</code> 是 <code>label selector</code> 要求的列表。要求是 <code>AND</code> 组合。
<code>matchLabels</code>
<code>matchLabels</code> 是 <code>{key,value}</code> 对的映射。
有关更多详细信息,请参阅 Kubernetes LabelSelector reference。
https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/label-selector/#LabelSelector
一个 <code>Server</code> 选择具有特定标签的 <code>pod</code>,使用 <code>gRPC</code> 作为 <code>proxyProtocol</code>。
一个 <code>Server</code> 选择带有 <code>matchExpressions</code> 的 <code>pod</code>,<code>HTTP/2</code> 作为 <code>proxyProtocol</code>,在端口 <code>8080</code> 上。
<code>ServerAuthorization</code> 提供了一种向一个或多个 <code>Server</code> 授权流量的方法。
<code>ServerAuthorization spec</code> 必须包含以下顶级字段:
<code>client</code>
<code>client</code> 描述授权访问 <code>server</code> 的客户端。
<code>server</code>
<code>server</code> 在此授权适用的同一命名空间中标识 <code>Servers</code>。
<code>Server</code> 对象必须包含以下字段之一:
<code>name</code>
按名称引用 <code>Server</code> 实例。
<code>selector</code>
<code>selector</code> 选择在同一命名空间中应用此授权的 <code>server</code>。
属于此选择器的所有服务器都将应用此授权。
<code>selector</code> 对象必须恰好包含以下字段之一:
matchExpressions 是标签选择器要求的列表。 要求是 <code>AND</code> 组合。
matchLabels 是 {key,value} 对的映射。
<code>client</code> 对象必须包含以下字段之一:
<code>meshTLS</code>
<code>meshTLS</code> 用于授权 <code>mesh</code> 客户端访问服务器
<code>unauthenticated</code>
授权未经身份验证的客户端访问服务器的布尔值。
或者,它还可以包含 <code>networks</code> 字段:
<code>networks</code>
限制此授权适用的客户端 <code>IP</code> 地址。 如果未设置,服务器将选择默认值(通常为所有 <code>IP</code> 或集群的 <code>pod</code> 网络)。
<code>meshTLS</code> 对象必须恰好包含以下字段之一:
<code>unauthenticatedTLS</code>
一个布尔值,表示通信不需要客户端身份。这对于身份控制器非常重要,它必须终止来自尚未拥有证书的客户端的 TLS 连接。
<code>identities</code>
授权的代理身份字符串列表(通过 MTLS 提供)。<code>*</code> 前缀可用于匹配域中的所有身份。<code>*</code> 标识字符串表示所有身份验证客户端都已授权。
<code>serviceAccounts</code>
授权客户端 <code>serviceAccount</code> 的列表(通过 <code>MTLS</code> 提供)。
<code>serviceAccount</code> 字段包含以下顶级字段:
<code>ServiceAccount</code> 的名称。
<code>namespace</code>
<code>ServiceAccount</code> 的命名空间。如果未设置,则使用授权的命名空间。
一个 <code>ServerAuthorization</code> 允许 <code>mesh</code>
客户端使用 <code>*.emojivoto.serviceaccount.identity.linkerd.cluster.local</code> 代理身份,
即 <code>emojivoto</code> 命名空间中的所有服务帐户。
一个允许任何未经身份验证的客户端的 <code>ServerAuthorization</code>。
一个允许具有特定服务帐户的 <code>mesh</code> 客户端的 <code>ServerAuthorization</code>。