聊聊 Linkerd Service Mesh 授权策略 (Server & ServerAuthorization)

开发 前端
Server 和 ServerAuthorization 是 Linkerd 中的两种策略资源, 用于控制对 mesh 应用程序的入站访问。

[[439865]]

简介

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。必须是 unknownHTTP/1HTTP/2gRPCopaqueTLS 之一。如果未设置,则默认为 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/#LabelSelector

Server 示例

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

  1. apiVersion: policy.linkerd.io/v1beta1 
  2. kind: Server 
  3. metadata: 
  4.   namespace: emojivoto 
  5.   name: emoji-grpc 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: emoji-svc 
  10.   port: grpc 
  11.   proxyProtocol: gRPC 

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

  1. apiVersion: policy.linkerd.io/v1beta1 
  2. kind: Server 
  3. metadata: 
  4.   namespace: emojivoto 
  5.   name: backend-services 
  6. spec: 
  7.   podSelector: 
  8.     matchExpressions: 
  9.     - {key: app, operator: Invalues: [voting-svc, emoji-svc]} 
  10.     - {key: environment, operator: NotIn, values: [dev]} 
  11.   port: 8080 
  12.   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 命名空间中的所有服务帐户。

  1. apiVersion: policy.linkerd.io/v1beta1 
  2. kind: ServerAuthorization 
  3. metadata: 
  4.   namespace: emojivoto 
  5.   name: emoji-grpc 
  6. spec: 
  7.   # Allow all authenticated clients to access the (read-only) emoji service. 
  8.   server: 
  9.     selector: 
  10.       matchLabels: 
  11.         app: emoji-svc 
  12.   client: 
  13.     meshTLS: 
  14.       identities: 
  15.         - "*.emojivoto.serviceaccount.identity.linkerd.cluster.local" 

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

  1. apiVersion: policy.linkerd.io/v1beta1 
  2. kind: ServerAuthorization 
  3. metadata: 
  4.   namespace: emojivoto 
  5.   name: web-public 
  6. spec: 
  7.   server: 
  8.     name: web-http 
  9.   # Allow all clients to access the web HTTP port without regard for 
  10.   # authentication. If unauthenticated connections are permitted, there is no 
  11.   # need to describe authenticated clients. 
  12.   client: 
  13.     unauthenticated: true 
  14.     networks: 
  15.       - cidr: 0.0.0.0/0 
  16.       - cidr: ::/0 

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

  1. apiVersion: policy.linkerd.io/v1beta1 
  2. kind: ServerAuthorization 
  3. metadata: 
  4.   namespace: emojivoto 
  5.   name: prom-prometheus 
  6. spec: 
  7.   server: 
  8.     name: prom 
  9.   client: 
  10.     meshTLS: 
  11.       serviceAccounts: 
  12.         - namespace: linkerd-viz 
  13.           name: prometheus 

 

责任编辑:武晓燕 来源: 黑客下午茶
相关推荐

2022-08-21 07:17:16

LinkerdKubernetes服务网格

2021-12-08 17:54:55

架构控制平面

2021-12-11 22:21:00

服务配置文件

2021-10-31 20:56:25

Mesh ServiceAPI

2021-06-05 10:16:55

Linkerd 服务网格Kubernetes

2021-07-21 05:23:06

Linkerd Emoji.voto服务网格

2021-10-03 23:45:36

gRPC授权策略

2014-07-28 14:46:40

Service

2021-06-12 07:38:21

Linkerd 2.Service Mes微服务

2021-06-10 06:24:41

K8S Service Mesemojivoto

2020-03-04 09:27:13

Service Mes微服务架构

2021-11-08 09:11:17

云计算Service Mes云应用

2021-11-09 23:54:19

开发SMI Linkerd

2021-02-22 17:00:31

Service Mes微服务开发

2022-07-15 09:20:17

性能优化方案

2022-05-13 07:22:39

携程微服务SOA

2021-10-14 18:21:52

架构IstioService

2022-01-27 22:33:35

配置容器稳定性

2020-07-28 08:20:06

Service Mes容器化云原生

2021-06-30 13:26:07

Service MesHTTP协议 Oitsi
点赞
收藏

51CTO技术栈公众号