Linkerd Service Mesh 授权策略(Server & ServerAuthorization)_命名空间

简介

​Server​​ 和 ​​ServerAuthorization​​ 是 ​​Linkerd​​ 中的两种策略资源,

用于控制对 ​​mesh​​ 应用程序的入站访问。

在 ​​linkerd​​ 安装期间,​​policyController.defaultAllowPolicy​​ 字段用于指定当没有

​Server​​ 选择 ​​pod​​ 时的默认策略。此字段可以是以下之一:


  • ​all-unauthenticated​​: 允许所有请求。这是默认设置。
  • ​all-authenticated​​​: 允许来自相同或不同集群(使用 ​​multi-cluster​​​)中的 ​​mesh​​ 客户端的请求。
  • ​cluster-authenticated​​​: 允许来自同一集群中的 ​​mesh​​ 客户端的请求。
  • ​cluster-unauthenticated​​​: 允许来自同一集群中的 ​​mesh​​​ 和非 ​​mesh​​ 客户端的请求。
  • ​deny​​​: 所有请求都被拒绝。(然后应创建 ​​Policy​​ 资源以允许服务之间的特定通信)。

可以通过在 ​​pod spec​​​ 或其命名空间上设置注释 ​​config.linkerd.io/default-inbound-policy​​ 来覆盖此默认值。

为 ​​pod & port​​ 配置 ​​Server​​ 后,其默认行为是 deny 流量,

并且必须创建 ​​ServerAuthorization​​ 资源以允许 ​​Server​​ 上的流量。

系列

中文手册(​​https://hacker-linner.com​​)

Server

​Server​​ 在与 ​​server​​ 相同的命名空间中的一组 ​​pod​​ 上选择一个端口。

它通常选择 ​​pod​​ 上的单个端口,但在按名称引用端口时它可能会选择多个端口(例如 ​​admin-http​​)。

虽然 ​​Server​​ 资源类似于 Kubernetes 的 ​​Service​​,

但它增加了多个 ​​Server​​ 实例不能重叠的限制:它们不能选择相同的 ​​pod/port​​ 对。

​Linkerd​​ 附带了一个 ​​admission controller​​,试图防止创建重叠的 ​​server​​。

当服务器选择一个端口时,默认情况下会拒绝流量,

并且必须使用 ​​ServerAuthorization​​ 来授权 ​​Server​​ 选择的端口上的流量。

Spec

​Server​​ spec 可能包含以下顶级字段:

field

value

​podSelector​

​podSelector​​​ 选择相同命名空间中的 ​​pod​​。

​port​

端口名称或编号。仅考虑 ​​pod spec​​​ 的 ​​ports​​ 中的端口。

​proxyProtocol​

为入站连接配置协议发现。取代 ​​config.linkerd.io/opaque-ports​​​ annotation。必须是 ​​unknown​​​、​​HTTP/1​​​、​​HTTP/2​​​、​​gRPC​​​、​​opaque​​​、​​TLS​​​ 之一。 如果未设置,则默认为 ​​unknown​​。

podSelector

这与 Kubernetes 中的 labelSelector 字段相同。

属于此选择器的所有 ​​pod​​ 都将属于 ​​Server​​ 组。​​podSelector​​ 对象必须恰好包含以下字段之一:

field

value

​matchExpressions​

​matchExpressions​​​ 是 ​​label selector​​​ 要求的列表。要求是 ​​AND​​ 组合。

​matchLabels​

​matchLabels​​​ 是 ​​{key,value}​​ 对的映射。


Server 示例

一个 ​​Server​​​ 选择具有特定标签的 ​​pod​​​,使用 ​​gRPC​​​ 作为 ​​proxyProtocol​​。

apiVersion: policy.linkerd.io/v1beta1
kind: Server
metadata:
namespace: emojivoto
name: emoji-grpc
spec:
podSelector:
matchLabels:
app: emoji-svc
port: grpc
proxyProtocol: gRPC

一个 ​​Server​​​ 选择带有 ​​matchExpressions​​​ 的 ​​pod​​​,​​HTTP/2​​​ 作为 ​​proxyProtocol​​​,在端口 ​​8080​​ 上。

apiVersion: policy.linkerd.io/v1beta1
kind: Server
metadata:
namespace: emojivoto
name: backend-services
spec:
podSelector:
matchExpressions:
- {key: app, operator: In, values: [voting-svc, emoji-svc]}
- {key: environment, operator: NotIn, values: [dev]}
port: 8080
proxyProtocol: "HTTP/2"

ServerAuthorization

​ServerAuthorization​​​ 提供了一种向一个或多个 ​​Server​​ 授权流量的方法。

Spec

​ServerAuthorization spec​​ 必须包含以下顶级字段:

field

value

​client​

​client​​​ 描述授权访问 ​​server​​ 的客户端。

​server​

​server​​​ 在此授权适用的同一命名空间中标识 ​​Servers​​。

Server

​Server​​ 对象必须包含以下字段之一:

field

value

​name​

按名称引用​Server​​ 实例。

​selector​

​selector​​​ 选择在同一命名空间中应用此授权的 ​​server​​。

selector

这与 Kubernetes 中的 labelSelector 字段相同。

属于此选择器的所有服务器都将应用此授权。

​selector​​ 对象必须恰好包含以下字段之一:

field

value

​matchExpressions​

matchExpressions 是标签选择器要求的列表。 要求是 ​​AND​​ 组合。

​matchLabels​

matchLabels 是 {key,value} 对的映射。

client

​client​​ 对象必须包含以下字段之一:

field

value

​meshTLS​

​meshTLS​​​ 用于授权 ​​mesh​​ 客户端访问服务器

​unauthenticated​

授权未经身份验证的客户端访问服务器的布尔值。

或者,它还可以包含 ​​networks​​ 字段:

field

value

​networks​

限制此授权适用的客户端 ​​IP​​​ 地址。 如果未设置,服务器将选择默认值(通常为所有 ​​IP​​​ 或集群的 ​​pod​​ 网络)。

meshTLS

​meshTLS​​ 对象必须恰好包含以下字段之一:

field

value

​unauthenticatedTLS​

一个布尔值,表示通信不需要客户端身份。这对于身份控制器非常重要,它必须终止来自尚未拥有证书的客户端的 TLS 连接。

​identities​

授权的代理身份字符串列表(通过 MTLS 提供)。​​*​​​ 前缀可用于匹配域中的所有身份。​​*​​ 标识字符串表示所有身份验证客户端都已授权。

​serviceAccounts​

授权客户端 ​​serviceAccount​​​ 的列表(通过 ​​MTLS​​ 提供)。

serviceAccount

​serviceAccount​​ 字段包含以下顶级字段:

field

value

​name​

​ServiceAccount​​ 的名称。

​namespace​

​ServiceAccount​​ 的命名空间。如果未设置,则使用授权的命名空间。

ServerAuthorization 示例

一个 ​​ServerAuthorization​​ 允许 ​​mesh​

客户端使用 ​​*.emojivoto.serviceaccount.identity.linkerd.cluster.local​​ 代理身份,

即 ​​emojivoto​​ 命名空间中的所有服务帐户。

apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
namespace: emojivoto
name: emoji-grpc
spec:
# Allow all authenticated clients to access the (read-only) emoji service.
server:
selector:
matchLabels:
app: emoji-svc
client:
meshTLS:
identities:
- "*.emojivoto.serviceaccount.identity.linkerd.cluster.local"

一个允许任何未经身份验证的客户端的 ​​ServerAuthorization​​。

apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
namespace: emojivoto
name: web-public
spec:
server:
name: web-http
# Allow all clients to access the web HTTP port without regard for
# authentication. If unauthenticated connections are permitted, there is no
# need to describe authenticated clients.
client:
unauthenticated: true
networks:
- cidr: 0.0.0.0/0
- cidr: ::/0

一个允许具有特定服务帐户的 ​​mesh​​​ 客户端的 ​​ServerAuthorization​​。

apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
namespace: emojivoto
name: prom-prometheus
spec:
server:
name: prom
client:
meshTLS:
serviceAccounts:
- namespace: linkerd-viz
name: prometheus
公众号:黑客下午茶