簡介
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
公眾號:黑客下午茶