欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

istio:MTLS导致 bookinfo 访问不通

程序员文章站 2022-06-17 13:06:12
...

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

istio:MTLS导致 bookinfo 访问不通
部署规则之前都是可以访问的,随机访问 rating的 V1,V2,V3版本 ,部署之后 就出现如上图所示。
这个报错在 istio service mesh里面还是很常见的,503 ,找不到具体的访问端点。
问题分析
看了一天多的官方文档,找到了思路,原来是 MTLS的问题, 我的istio集群在安装的时候 默认是开启 MTLS的
怎么确认集群开启了 mesh-scope级别的MTLS?
istio:MTLS导致 bookinfo 访问不通
现在问题已经很明确了, 我当时部署的DestinationRule 是不包含MTLS策略的,所以 在virtualservice定义之后 ,后端的端点由于 没有认证服务端,所以路由不过去 ,导致 503
如果未指定相互TLS模式,对等方将无法使用传输身份验证,并且ISTIO将拒绝绑定到SideCar的相互TLS连接
什么是MTLS
MTLS 是自签名双向认证
原理大致如图
istio:MTLS导致 bookinfo 访问不通
istio的认证体系
istio:MTLS导致 bookinfo 访问不通
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
istio:MTLS导致 bookinfo 访问不通
istio:MTLS导致 bookinfo 访问不通
istio:MTLS导致 bookinfo 访问不通
访问试试效果
istio:MTLS导致 bookinfo 访问不通
方法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