istio:MTLS導致 bookinfo 訪問不通

背景:
最新一直在學習istio相關知識 ,book info作爲官方的第一個case,我在部署了 流量規則之後就訪問不通了
我部署的兩個規則文件
destination-rule-all.yaml

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  host: productpage
  subsets:
  - name: v1
    labels:
      version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v2-mysql
    labels:
      version: v2-mysql
  - name: v2-mysql-vm
    labels:
      version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: details
spec:
  host: details
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---

virtual-service-all-v1.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1
---

在這裏插入圖片描述
部署規則之前都是可以訪問的,隨機訪問 rating的 V1,V2,V3版本 ,部署之後 就出現如上圖所示。
這個報錯在 istio service mesh裏面還是很常見的,503 ,找不到具體的訪問端點。
問題分析
看了一天多的官方文檔,找到了思路,原來是 MTLS的問題, 我的istio集羣在安裝的時候 默認是開啓 MTLS的
怎麼確認集羣開啓了 mesh-scope級別的MTLS?
在這裏插入圖片描述
現在問題已經很明確了, 我當時部署的DestinationRule 是不包含MTLS策略的,所以 在virtualservice定義之後 ,後端的端點由於 沒有認證服務端,所以路由不過去 ,導致 503
如果未指定相互TLS模式,對等方將無法使用傳輸身份驗證,並且ISTIO將拒絕綁定到SideCar的相互TLS連接
什麼是MTLS
MTLS 是自簽名雙向認證
原理大致如圖
在這裏插入圖片描述
istio的認證體系
在這裏插入圖片描述
istio MTLS認證流程
ISTIO隧道服務通過客戶端和服務器端envoy代理來進行通信服務。對於客戶端調用具有相互TLS身份驗證的服務器:

istio將出站流量從客戶端路由到客戶端的本地sidecar envoy。

客戶端envoy開始與服務器端envoy進行相互TLS握手。在握手過程中,客戶端envoy還執行安全命名檢查,以驗證服務器證書中提供的服務帳戶是否被授權運行目標服務。

客戶端envoy和服務器端envoy建立相互的tls連接,istio將通信從客戶端envoy轉發到服務器端envoy。

授權後,服務器端envoy通過本地TCP連接將流量轉發給服務器服務
istio 中如何使用MTLS
具體參考官文 : Policies and Security
istio中 有三種級別的MTLS ,
mesh-scope級別的

apiVersion: "authentication.istio.io/v1alpha1"
kind: "MeshPolicy"
metadata:
  name: "default"
spec:
  peers:
  - mtls: {}

namespace-scope級別

apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
  name: "default"
  namespace: "ns1"
spec:
  peers:
  - mtls: {}

針對具體service級別

apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
  name: "reviews"
spec:
  targets:
  - name: reviews
  peers:
  - mtls: {}


傳輸身份驗證

peers:部分定義策略中傳輸身份驗證支持的身份驗證方法和相關參數。節可以列出多個方法,只有滿足一個方法才能通過身份驗證。但是,從ISTIO 0.7版本開始,當前支持的唯一傳輸身份驗證方法是相互TLS。

以下示例顯示對等方:使用相互TLS啓用傳輸身份驗證部分。

peers:
  - mtls: {}

相互TLS設置有一個可選的模式參數,用於定義對等傳輸身份驗證的嚴格性。這些模式記錄在身份驗證策略參考文檔中。

默認的相互TLS模式是嚴格的。因此,mode:strict等同於以下所有內容:

- mtls: {}
- mtls:
- mtls: null

如果未指定相互TLS模式,對等方將無法使用傳輸身份驗證,並且ISTIO將拒絕綁定到SideCar的相互TLS連接。在應用層,服務仍然可以處理它們自己的相互tls會話。
解決辦法:
方法1. 刪除 mesh-scope級別的MTLS
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
訪問試試效果
在這裏插入圖片描述
方法2.
部署符合MTLS規則的 DestinationRule

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  host: productpage
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
  subsets:
  - name: v1
    labels:
      version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v2-mysql
    labels:
      version: v2-mysql
  - name: v2-mysql-vm
    labels:
      version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: details
spec:
  host: details
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---

訪問測試也是通過的。

參考文檔:
Mutual TLS Deep-Dive
Authentication Policy
Policies and Security

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章