您现在的位置是:亿华云 > 应用开发
聊聊 Linkerd Service Mesh 授权策略 (Server & ServerAuthorization)
亿华云2025-10-03 02:09:51【应用开发】6人已围观
简介简介Server 和 ServerAuthorization 是 Linkerd 中的两种策略资源, 用于控制对 mesh 应用程序的入站访问。在 linkerd 安装期间,policyControl
简介
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} 对的映射。
有关更多详细信息,请参阅 Kubernetes LabelSelector reference。
https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/label-selector/#LabelSelectorServer 示例
一个 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很赞哦!(68)
上一篇: 可持续数据中心的时代