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
相同的命名空间中的一组 pod
上选择一个端口。
它通常选择 pod
上的单个端口,但在按名称引用端口时它可能会选择多个端口(例如 admin-http
)。
虽然 Server
资源类似于 Kubernetes 的 Service
,
但它增加了多个 Server
实例不能重叠的限制:它们不能选择相同的 pod/port
对。
Linkerd
附带了一个 admission controller
,试图防止创建重叠的 server
。
当服务器选择一个端口时,默认情况下会拒绝流量,
并且必须使用 ServerAuthorization
来授权 Server
选择的端口上的流量。
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
。
这与 Kubernetes 中的 labelSelector 字段相同。
属于此选择器的所有 pod
都将属于 Server
组。podSelector
对象必须恰好包含以下字段之一:
field
value
matchExpressions
matchExpressions
是 label selector
要求的列表。要求是 AND
组合。
matchLabels
matchLabels
是 {key,value}
对的映射。
有关更多详细信息,请参阅 Kubernetes LabelSelector reference。
一个 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
提供了一种向一个或多个 Server
授权流量的方法。
ServerAuthorization spec
必须包含以下顶级字段:
field
value
client
client
描述授权访问 server
的客户端。
server
server
在此授权适用的同一命名空间中标识 Servers
。
Server
对象必须包含以下字段之一:
field
value
name
按名称引用 Server
实例。
selector
selector
选择在同一命名空间中应用此授权的 server
。
这与 Kubernetes 中的 labelSelector 字段相同。
属于此选择器的所有服务器都将应用此授权。
selector
对象必须恰好包含以下字段之一:
field
value
matchExpressions
matchExpressions 是标签选择器要求的列表。 要求是 AND
组合。
matchLabels
matchLabels 是 {key,value} 对的映射。
client
对象必须包含以下字段之一:
field
value
meshTLS
meshTLS
用于授权 mesh
客户端访问服务器
unauthenticated
授权未经身份验证的客户端访问服务器的布尔值。
或者,它还可以包含 networks
字段:
field
value
networks
限制此授权适用的客户端 IP
地址。 如果未设置,服务器将选择默认值(通常为所有 IP
或集群的 pod
网络)。
meshTLS
对象必须恰好包含以下字段之一:
field
value
unauthenticatedTLS
一个布尔值,表示通信不需要客户端身份。这对于身份控制器非常重要,它必须终止来自尚未拥有证书的客户端的 TLS 连接。
identities
授权的代理身份字符串列表(通过 MTLS 提供)。*
前缀可用于匹配域中的所有身份。*
标识字符串表示所有身份验证客户端都已授权。
serviceAccounts
授权客户端 serviceAccount
的列表(通过 MTLS
提供)。
serviceAccount
字段包含以下顶级字段:
field
value
name
ServiceAccount
的名称。
namespace
ServiceAccount
的命名空间。如果未设置,则使用授权的命名空间。
一个 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
公众号:黑客下午茶
手机扫一扫
移动阅读更方便
你可能感兴趣的文章