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} 对的映射。 |
有关更多详细信息,请参阅 Kubernetes LabelSelector reference。
- https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/label-selector/#LabelSelector
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
公众号:黑客下午茶
Linkerd Service Mesh 授权策略(Server & ServerAuthorization)的更多相关文章
- 了解 Linkerd Service Mesh 架构
从较高的层次上看,Linkerd 由一个控制平面(control plane) 和一个 数据平面(data plane) 组成. 控制平面是一组服务,提供对 Linkerd 整体的控制. 数据平面由在 ...
- Linkerd Service Mesh 服务配置文件规范
服务配置文件 为 Linkerd 提供有关服务的附加信息. 以下是可以使用服务配置文件完成的所有操作的参考. 系列 中文手册(https://linkerd.hacker-linner.com) Sp ...
- Linkerd stable-2.11.0 稳定版发布:授权策略、gRPC 重试、性能改进等!
公众号:黑客下午茶 授权策略 Linkerd 的新服务器授权策略(server authorization policy)功能使您可以细粒度控制允许哪些服务相互通信.这些策略直接建立在 Linkerd ...
- 腾讯云 K8S 集群实战 Service Mesh—Linkerd2 & Traefik2 部署 emojivoto 应用
Linkerd 是 Kubernetes 的服务网格. 它通过为您提供运行时调试(runtime debugging).可观察性(observability).可靠性(reliability)和安全性 ...
- What’s a service mesh? And why do I need one?
https://buoyant.io/2017/04/25/whats-a-service-mesh-and-why-do-i-need-one/ Update 2018-02-06: Since t ...
- 在 Intenseye,为什么我们选择 Linkerd2 作为 Service Mesh 工具(Part.1)
在 Intenseye,我们 follow(跟随) trends(趋势) & hype(最被炒作) 的技术,并在使用时应用最佳实践. 我们在用 Scala.Go.Python 等编写的 Kub ...
- Linkerd 2:5 分种厘清 Service Mesh 相关术语
API Gateway(API 网关) API gateway 位于应用程序的前面,旨在解决身份验证和授权.速率限制以及为外部消费者提供公共访问点等业务问题. 相比之下,service mesh 专注 ...
- 详细了解 Linkerd 2.10 基础功能,一起步入 Service Mesh 微服务架构时代
Linkerd 提供了许多功能,如:自动 mTLS.自动代理注入.分布式追踪.故障注入.高可用性.HTTP/2 和 gRPC 代理.负载均衡.多集群通信.重试和超时.遥测和监控.流量拆分(金丝雀.蓝/ ...
- Emoji.voto,Linkerd 服务网格(service mesh)的示例应用程序
一个微服务应用程序,允许用户为他们最喜欢的表情符号(emoji)投票,并跟踪排行榜上收到的投票.愿最好的 emoji 获胜. 该应用程序由以下 3 个服务组成: emojivoto-web:Web 前 ...
随机推荐
- silky微服务模块
目录 模块的定义和类型 在模块中注册服务 通过ServiceCollection实现服务注册 通过ContainerBuilder实现服务注册 使用模块初始化任务 使用模块释放资源 模块的依赖关系 构 ...
- Django笔记&教程 总目录
本篇博客只有目录,正文内容在目录章节链接的博客里 除目录本身外,没有链接的章节,说明内容还没开始编辑 本项目笔记仍在不断创作中,还有些内容会根据自身所学不断更新完善 本项目主要为markdwon文档, ...
- MySQL5.5.33对应的JDBC驱动包怎样使用?
双击msi文件就会自动安装,然后找到安装路径下的jar,并把它加到类路径下,如手动编译和执行时javac -classpath c:\program files\...\mysql.jar;... m ...
- rocketmq 精华
(ps:)通过本人语雀文档阅读体验更好哦--有目录 介绍 rocket mq 翻译成中文就是火箭消息队列,从名字就可以看出来,它是一个很快的消息队列... rocket mq 是 阿里巴巴研制的后面贡 ...
- 解决WSL2中Vmmem内存占用过大问题教程
Windows的linux子系统最大占用可到本机器的80%,所以必须限制一下它的性能来达到优化目的 按下Windows + R 键,输入 %UserProfile% 并运行进入用户文件夹 新建文件 . ...
- ElasticJob分布式任务调度应用v2.5.2
为何要使用分布式任务调度 **本人博客网站 **IT小神 www.itxiaoshen.com 演示项目源码地址** https://gitee.com/yongzhebuju/spring-task ...
- 定时任务注解@Scheduled
概述 要使用@ Scheduled注解,首先需要在启动类添加@ EnableScheduling,启用Spring的计划任务执行功能,这样可以在容器中的任何Spring管理的bean上检测@ Sche ...
- 【原】MDC日志链路设计
背景 我们项目中现有日志系统,采用的是slf4j+logback这套日志组件,也是Java生态里面比较常用的一个日志组件,但是随着分布式的演进,这套组件明显存在以下几个问题: 1.各种无关日志穿行其中 ...
- Codeforces 1491H - Yuezheng Ling and Dynamic Tree(分块)
Codeforces 题目传送门 & 洛谷题目传送门 *3400 的毒瘤 H 题,特意写个题解纪念一下( 首先对于这种数据结构不太好直接维护的东东可以考虑分块.然鹅我除了分块其他啥也没想到 我 ...
- 洛谷 P7718 -「EZEC-10」Equalization(差分转化+状压 dp)
洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\ ...