What is Istio?

1. Is a service mesh, implement network mechanism

  • service mesh 基本上是透過在 Pod 上面做 Sidecar
  • 網路相關的工作剝離出來,讓工程師可以專注在開發上
  • 而網路的控管像是 Gatewway,經過 pod 的 request 都是經由 Sidecar 轉發給 pod

2. Integrate with many observability tools

  • 不只可以做網路,還可以整合各種第三方的觀察工具
  • (e.g. Prometheus, Kiali, Grafana, etc.)。

3. Handle microservice challenges

  • 在 microservice 架構下當 service/pod 一多,要去管控各個 service 間的網路連線是非常頭痛的
  • 但是透過Istio可以負責解決網路的事情,並由control plane統一管理和設定。

可以從上方看到,每個Pod裡面有兩個container,一個是Service另一個是Proxy,而Istio主要就是透過Control Plane來控制Proxy進行網路流量的操控與設定。

注意:Sidecar不是只負責把網路相關的工作剝離,Sidecar是一種附加在Pod內的容器,用於提供額外的功能或服務,與主要應用容器共同運行並共享相同的生命周期。像是如果要收集pod的log,通常就會需要fluentd的Sidecar共享pod的產生log的資料夾,把log傳送給elasticSearch。

Istio 的主要核心

Istio 主要有兩個核心元件:

  1. Envoy: 就在Proxy旁邊
    • 目的:Istio使用Envoy Agent作為與data plane交互的Istio元件,被部署為服務的Sidecar。主要協調Service Mesh中所有服務進去和出去的流量
    • 功能:動態的service discover, load balance, TLS, Http/2和gRPC agent, health check, 金絲雀發布 等等。
    • 貢獻:可以允許Istio執行決策並且提取豐富的數據,並發送數據到監控系統中提供整個Mesh的行為信息。
  2. Istiod: 就在Control Plane
    • 目的:提供service discover, 配置和憑證管理負責實現強大的服務隊服務的用戶認證,可以用來升級服務網格中未加密的流量,對不穩定的layer 3 (network)或是 layer 4 (Transport layer, TCP)來執行策略。

Istio 如何做到安全?

  • Control Plane 可以看到 Istiod 負責:
    • 憑證與授權管理
    • 網路設定
    • 授權政策設定

使用Istio有以下特色

  1. Secure by default : 透過Sidecar的方式應用程式代碼和基礎設施不需更改。
  2. Defense in depth:與現有安全系統集成以提供多層防禦。
  3. Zero-trust network:在不受信任的網路上建構安全解決方案。
  4. Secure Endpoints, Communication, Platform, Data
  5. Do Identity, Policy, AAA, Encryption

Istio 的安全元件

  1. CA:用於密鑰和憑證管理的頒發機構CA。
  2. 配置API服務器:把認證策略, 授權策略, 安全命名分發給agent。
  3. Sidecar和邊緣agent作為PEP:保護客戶端和服務之間的通信安全。而PEP用Envoy實現。
  4. 一組Envoy Agent Extension:用於監控和審計。

Istio 身份和憑證管理

注意:以下內容的istio-agent是指Sidecar容器中的pilot-agent process。

  1. Istio-agent 在啟動時,創建pk 和 CSR 並且把 CSR和憑證送到 istiod 簽名。
  2. Istiod CA 驗證CSR裡面的憑證,在成功驗證後簽署CSR以生成證書。
  3. 當工作附載啟動時,Envoy 通過 Secret Discover Service (SDS) API 向同容器內的 istio-agent 發送憑證和pk請求。
  4. Istio-agent透過Envoy SDS API 將從 istiod 收到的證書和密鑰發送給Envoy。
  5. Istio-agent 監控工作負載憑證的過期時間,會定期重複做憑證和pk的輪換。

Istio 的政策授權

畢竟Istio的重點在控制Pod服務的網路流量,因此要對於特定情況的流量應該作接受還是拒絕,仍然要政策的設置與規則引擎的判斷。Istio有提供政策的設置,若要建立授權策略需要創建 AuthorizationPolicy 的自定義資源。一個授權策略包含:

  • Selector 選擇器:用來指定策略的執行目標。
  • Action 操作:指定允許還是拒絕請求。
  • Rules 規則集:指定何時觸發動作。
    • From:指定請求的來源
    • To:指定請求的操作
    • When:指定規則所需的條件

以下是策略設定的範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: httpbin
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
version: v1
action: ALLOW
rules:
// 允許兩個來源:服務帳戶 cluster.local/ns/default/sa/sleep 和命名空間dev
- from:
- source:
principals: ["cluster.local/ns/default/sa/sleep"]
- source:
namespaces: ["dev"]

// 可以對 namespace: foo 中帶有標籤 app: httpbin version:v1 進行GET動作
to:
- operation:
methods: ["GET"]

// 使用有效的JWT Token發送請求時
when:
- key: request.auth.claims[iss]
values: ["https://accounts.google.com"]

Istio 的政策驗證流程

  • 在對Server端的Envoy Agent進入流量實施訪問控制,
  • 每個Envoy Agent會運行一個授權的引擎,該引擎會根據當前的策略,評估上下文。
  • 然後返回授權結果Allow或Deny。
  • 而策略是使用.yaml文件指定Istio授權策略。
  • 如果沒有相關的授權策略,Istio允許所有請求。
  • 支援Custom操作,可以根據需求設定策略執行不同的操作。
  • 檢查順序的匹配規則是:Custom > Deny > Allow,會先檢查是否有策略的操作被應用,檢查策略的規則是否滿足。如果其中一層的不匹配就執行到下一層(可以參考下圖)。

參考資料