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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值