背景:
最新一直在學習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