介绍Server和ServerAuthorization是Linkerd中的两个策略资源,用于控制对网格应用的入站访问。linkerd安装时,policyController.defaultAllowPolicy字段用于指定没有Server选择pod时的默认策略。该字段可以是以下之一:all-unauthenticated:允许所有请求。这是默认设置。all-authenticated:允许来自相同或不同集群(使用多集群)中的网格客户端的请求。cluster-authenticated:允许来自同一集群中的网格客户端的请求。cluster-unauthenticated:允许来自同一集群中的网格和非网格客户端的请求。deny:拒绝所有请求。(然后应创建策略资源以允许服务之间的特定通信)。可以通过在pod规范或其命名空间上设置注释config.linkerd.io/default-inbound-policy来覆盖此默认值。当为pod和端口配置服务器时,其默认行为是拒绝流量,并且必须创建ServerAuthorization资源以允许服务器上的流量。系列中文手册(https://hacker-linner.com)ServerServer选择与server同命名空间的一组pod上的一个端口。它通常选择pod上的单个端口,但在按名称引用端口时可能选择多个端口(例如admin-http)。虽然Server资源类似于KubernetesService,但它增加了多个Server实例不能重叠的限制:它们不能选择相同的pod/port对。Linkerd附带一个准入控制器,试图防止创建重叠服务器。当服务器选择端口时,默认情况下拒绝流量,并且必须使用ServerAuthorization来授权服务器选择的端口上的流量。SpecServer规范可能包含以下顶级字段:字段值podSelectorpodSelector选择同一命名空间中的pod。port端口名称或编号。仅考虑pod规范端口中的端口。proxyProtocol为入站连接配置协议发现。取代config.linkerd.io/opaque-portsannotation。必须是未知、HTTP/1、HTTP/2、gRPC、不透明、TLS之一。如果未设置,则默认为未知。podSelector与Kubernetes中的labelSelector字段相同。属于此选择器的所有pod都将属于Server组。podSelector对象必须恰好包含以下字段之一:字段值matchExpressionsmatchExpressions是标签选择器所需的列表。要求是AND组合。matchLabelsmatchLabels是{key,value}对的映射。有关详细信息,请参阅KubernetesLabelSelector参考。https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/label-selector/#LabelSelectorServer示例服务器选择具有特定标签的pod,使用gRPC作为代理协议。apiVersion:policy.linkerd.io/v1beta1kind:Servermetadata:namespace:emojivotoname:emoji-grpcspec:podSelector:matchLabels:app:emoji-svcport:grpcproxyProtocol:gRPC服务器在端口8080上选择具有matchExpressions、HTTP/2作为代理协议的pod.apiVersion:policy.linkerd.io/v1beta1kind:Servermetadata:namespace:emojivotoname:backend-servicesspec:podSelector:matchExpressions:-{key:app,operator:In,values:[voting-svc,emoji-svc]}-{key:environment,operator:NotIn,values:[dev]}port:8080proxyProtocol:"HTTP/2"ServerAuthorizationServerAuthorization提供了一种授权流量到一个或多个服务器的方法。SpecServerAuthorization规范必须包含以下顶级字段:字段值clientclient描述授权访问服务器的客户端。服务器服务器标识应用此授权的同一命名空间中的服务器。ServerServer对象必须包含以下字段之一:字段值名称按名称对服务器实例的引用。selector选择器选择应用此授权的同一命名空间中的服务器。selector与Kubernetes中的labelSelector字段相同。属于此选择器的所有服务器都将应用此授权。选择器对象必须恰好包含以下字段之一:字段值matchExpressionsmatchExpressions是标签选择器所需的列表。要求是AND组合。matchLabelsmatchLabels是{key,value}对的映射。clientclient对象必须包含以下字段之一:字段值meshTLSmeshTLS用于授权mesh客户端访问服务器unauthenticated布尔值,授权未经身份验证的客户端访问服务器。可选地,它还可以包含一个networks字段:字段值networks限制此授权适用的客户端IP地址。如果未设置,服务器将选择一个默认值(通常是所有IP或集群的pod网络)。meshTLSmeshTLS对象必须恰好包含以下字段之一:字段值unauthenticatedTLS一个布尔值,指示通信不需要客户端身份。这对于身份控制器很重要,身份控制器必须终止来自尚未拥有证书的客户端的TLS连接。identities授权代理身份字符串列表(通过MTLS提供)。*前缀可用于匹配域中的所有身份。*指示所有身份验证客户端均已授权的标识字符串。serviceAccounts授权客户端serviceAccounts列表(通过MTLS提供)。serviceAccountserviceAccount字段包含以下顶级字段:字段值nameServiceAccount的名称。命名空间ServiceAccount的命名空间。如果未设置,则使用授权命名空间。ServerAuthorization示例ServerAuthorization允许网格客户端使用*.emojivoto.serviceaccount.identity.linkerd.cluster.local代理身份,即emojivoto命名空间中的所有服务帐户。apiVersion:policy.linkerd.io/v1beta1kind:ServerAuthorizationmetadata:namespace:emojivotoname:emoji-grpcspec:#Allowallauthenticatedclientstoaccessthe(read-only)emojiservice.server:selector:matchLabels:app:emoji-svcclient:meshTLS:identities:-"to*。emojivo.serviceaccount.identity.linkerd.cluster.local"允许任何未经身份验证的客户端的ServerAuthorization。apiVersion:policy.linkerd.io/v1beta1kind:ServerAuthorizationmetadata:namespace:emojivotoname:web-publicspec:server:name:web-http#AllowallclientstoaccessthewebHTTPportwithoutregardfor#authentication.Ifunauthenticatedconnectionsarepermitted,thereisno#needtodescribeauthenticatedclients.client:unauthenticated:true0.r:0.-ciidworks0.-ciidworks:0/0-cidr:::/0允许具有特定服务帐户的网格客户端的ServerAuthorization。apiVersion:policy.linkerd.io/v1beta1kind:ServerAuthorizationmetadata:namespace:emojivotoname:prom-prometheusspec:server:name:promclient:meshTLS:serviceAccounts:-namespace:linkerd-vizname:prometheus
