前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linkerd Service Mesh 授权策略(Server & ServerAuthorization)

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

作者头像
为少
发布2021-12-13 12:48:11
3760
发布2021-12-13 12:48:11
举报
文章被收录于专栏:黑客下午茶

简介

ServerServerAuthorizationLinkerd 中的两种策略资源, 用于控制对 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 可能包含以下顶级字段:

代码语言:javascript
复制
podSelector 选择相同命名空间中的 pod。

podSelector

这与 Kubernetes 中的 labelSelector 字段相同。属于此选择器的所有 pod 都将属于 Server 组。podSelector 对象必须恰好包含以下字段之一:

代码语言:javascript
复制
matchExpressions 是 label selector 要求的列表。要求是 AND 组合。

有关更多详细信息,请参阅 Kubernetes LabelSelector reference。

  • https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/label-selector/#LabelSelector

Server 示例

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

代码语言:javascript
复制
apiVersion: policy.linkerd.io/v1beta1
kind: Server
metadata:
  namespace: emojivoto
  name: emoji-grpc
spec:
  podSelector:
    matchLabels:
      app: emoji-svc
  port: grpc
  proxyProtocol: gRPC

一个 Server 选择带有 matchExpressionspodHTTP/2 作为 proxyProtocol,在端口 8080 上。

代码语言:javascript
复制
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 必须包含以下顶级字段:

代码语言:javascript
复制
client 描述授权访问 server 的客户端。

Server

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

代码语言:javascript
复制
按名称引用 Server 实例。

selector

这与 Kubernetes 中的 labelSelector 字段相同。属于此选择器的所有服务器都将应用此授权。 selector 对象必须恰好包含以下字段之一:

代码语言:javascript
复制
matchExpressions 是标签选择器要求的列表。要求是 AND 组合。

client

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

代码语言:javascript
复制
meshTLS 用于授权 mesh 客户端访问服务器

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

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

meshTLS

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

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

serviceAccount

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

代码语言:javascript
复制
ServiceAccount 的名称。

ServerAuthorization 示例

一个 ServerAuthorization 允许 mesh 客户端使用 *.emojivoto.serviceaccount.identity.linkerd.cluster.local 代理身份, 即 emojivoto 命名空间中的所有服务帐户。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑客下午茶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 系列
  • Server
    • Spec
      • podSelector
        • Server 示例
        • ServerAuthorization
          • Spec
            • Server
              • selector
                • client
                  • meshTLS
                    • serviceAccount
                      • ServerAuthorization 示例
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档