天天看點

Linkerd Service Mesh 授權政策(Server & ServerAuthorization)

<code>Server</code> 和 <code>ServerAuthorization</code> 是 <code>Linkerd</code> 中的兩種政策資源,

用于控制對 <code>mesh</code> 應用程式的入站通路。

在 <code>linkerd</code> 安裝期間,<code>policyController.defaultAllowPolicy</code> 字段用于指定當沒有

<code>Server</code> 選擇 <code>pod</code> 時的預設政策。此字段可以是以下之一:

<code>all-unauthenticated</code>: 允許所有請求。這是預設設定。

<code>all-authenticated</code>: 允許來自相同或不同叢集(使用 <code>multi-cluster</code>)中的 <code>mesh</code> 用戶端的請求。

<code>cluster-authenticated</code>: 允許來自同一叢集中的 <code>mesh</code> 用戶端的請求。

<code>cluster-unauthenticated</code>: 允許來自同一叢集中的 <code>mesh</code> 和非 <code>mesh</code> 用戶端的請求。

<code>deny</code>: 所有請求都被拒絕。(然後應建立 <code>Policy</code> 資源以允許服務之間的特定通信)。

可以通過在 <code>pod spec</code> 或其命名空間上設定注釋 <code>config.linkerd.io/default-inbound-policy</code> 來覆寫此預設值。

為 <code>pod &amp; port</code> 配置 <code>Server</code> 後,其預設行為是 deny 流量,

并且必須建立 <code>ServerAuthorization</code> 資源以允許 <code>Server</code> 上的流量。

中文手冊(https://hacker-linner.com)

<code>Server</code> 在與 <code>server</code> 相同的命名空間中的一組 <code>pod</code> 上選擇一個端口。

它通常選擇 <code>pod</code> 上的單個端口,但在按名稱引用端口時它可能會選擇多個端口(例如 <code>admin-http</code>)。

雖然 <code>Server</code> 資源類似于 Kubernetes 的 <code>Service</code>,

但它增加了多個 <code>Server</code> 執行個體不能重疊的限制:它們不能選擇相同的 <code>pod/port</code> 對。

<code>Linkerd</code> 附帶了一個 <code>admission controller</code>,試圖防止建立重疊的 <code>server</code>。

當伺服器選擇一個端口時,預設情況下會拒絕流量,

并且必須使用 <code>ServerAuthorization</code> 來授權 <code>Server</code> 選擇的端口上的流量。

<code>Server</code> spec 可能包含以下頂級字段:

field

value

<code>podSelector</code>

<code>podSelector</code> 選擇相同命名空間中的 <code>pod</code>。

<code>port</code>

端口名稱或編号。僅考慮 <code>pod spec</code> 的 <code>ports</code> 中的端口。

<code>proxyProtocol</code>

為入站連接配接配置協定發現。取代 <code>config.linkerd.io/opaque-ports</code> annotation。必須是 <code>unknown</code>、<code>HTTP/1</code>、<code>HTTP/2</code>、<code>gRPC</code>、<code>opaque</code>、<code>TLS</code> 之一。 如果未設定,則預設為 <code>unknown</code>。

這與 Kubernetes 中的 labelSelector 字段相同。

屬于此選擇器的所有 <code>pod</code> 都将屬于 <code>Server</code> 組。<code>podSelector</code> 對象必須恰好包含以下字段之一:

<code>matchExpressions</code>

<code>matchExpressions</code> 是 <code>label selector</code> 要求的清單。要求是 <code>AND</code> 組合。

<code>matchLabels</code>

<code>matchLabels</code> 是 <code>{key,value}</code> 對的映射。

有關更多詳細資訊,請參閱 Kubernetes LabelSelector reference。

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

一個 <code>Server</code> 選擇具有特定标簽的 <code>pod</code>,使用 <code>gRPC</code> 作為 <code>proxyProtocol</code>。

一個 <code>Server</code> 選擇帶有 <code>matchExpressions</code> 的 <code>pod</code>,<code>HTTP/2</code> 作為 <code>proxyProtocol</code>,在端口 <code>8080</code> 上。

<code>ServerAuthorization</code> 提供了一種向一個或多個 <code>Server</code> 授權流量的方法。

<code>ServerAuthorization spec</code> 必須包含以下頂級字段:

<code>client</code>

<code>client</code> 描述授權通路 <code>server</code> 的用戶端。

<code>server</code>

<code>server</code> 在此授權适用的同一命名空間中辨別 <code>Servers</code>。

<code>Server</code> 對象必須包含以下字段之一:

<code>name</code>

按名稱引用 <code>Server</code> 執行個體。

<code>selector</code>

<code>selector</code> 選擇在同一命名空間中應用此授權的 <code>server</code>。

屬于此選擇器的所有伺服器都将應用此授權。

<code>selector</code> 對象必須恰好包含以下字段之一:

matchExpressions 是标簽選擇器要求的清單。 要求是 <code>AND</code> 組合。

matchLabels 是 {key,value} 對的映射。

<code>client</code> 對象必須包含以下字段之一:

<code>meshTLS</code>

<code>meshTLS</code> 用于授權 <code>mesh</code> 用戶端通路伺服器

<code>unauthenticated</code>

授權未經身份驗證的用戶端通路伺服器的布爾值。

或者,它還可以包含 <code>networks</code> 字段:

<code>networks</code>

限制此授權适用的用戶端 <code>IP</code> 位址。 如果未設定,伺服器将選擇預設值(通常為所有 <code>IP</code> 或叢集的 <code>pod</code> 網絡)。

<code>meshTLS</code> 對象必須恰好包含以下字段之一:

<code>unauthenticatedTLS</code>

一個布爾值,表示通信不需要用戶端身份。這對于身份控制器非常重要,它必須終止來自尚未擁有證書的用戶端的 TLS 連接配接。

<code>identities</code>

授權的代理身份字元串清單(通過 MTLS 提供)。<code>*</code> 字首可用于比對域中的所有身份。<code>*</code> 辨別字元串表示所有身份驗證用戶端都已授權。

<code>serviceAccounts</code>

授權用戶端 <code>serviceAccount</code> 的清單(通過 <code>MTLS</code> 提供)。

<code>serviceAccount</code> 字段包含以下頂級字段:

<code>ServiceAccount</code> 的名稱。

<code>namespace</code>

<code>ServiceAccount</code> 的命名空間。如果未設定,則使用授權的命名空間。

一個 <code>ServerAuthorization</code> 允許 <code>mesh</code>

用戶端使用 <code>*.emojivoto.serviceaccount.identity.linkerd.cluster.local</code> 代理身份,

即 <code>emojivoto</code> 命名空間中的所有服務帳戶。

一個允許任何未經身份驗證的用戶端的 <code>ServerAuthorization</code>。

一個允許具有特定服務帳戶的 <code>mesh</code> 用戶端的 <code>ServerAuthorization</code>。