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
下一篇: php批量修改文件后缀