🌝

Istio 多集群部署(二):单一网络主从架构

Posted at — Jan 28, 2022

主从架构

主从架构指主集群安装 Istio 控制平面,从集群(remote cluster)连接主集群 Istio 控制平面。在主从架构中,从集群需要通过专门的 gateway 访问主集群上的 Istio 控制平面。简言之,如果集群内部署有 Istio 控制平面,该集群内的工作负载实例访问集群内的控制平面(主集群模式),否则访问外部 Istio 控制平面(从集群模式)。下图展示的是单网格、单网络、主从架构部署:

istio-multicluster-deployment-part2-1

部署测试

参考官方文档部署 Install Primary-Remote 即可,前期工作与上一篇类似。有两点需要注意:

1. 配置 CA 中间证书

Configure Trust 必不可少,需要正确配置。否则会出现证书问题,istio-ingressgateway 无法启动,报错如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ kubectl get po -n istio-system
NAME                                   READY   STATUS    RESTARTS   AGE
istio-ingressgateway-b68f578f6-p8j4p   0/1     Running   0          5m58s
istiod-7cd5464766-hr8t4                1/1     Running   0          6m2s


$ kubectl describe po -n istio-system istio-ingressgateway-b68f578f6-p8j4p
Events:
  Type     Reason     Age                      From               Message
  ----     ------     ----                     ----               -------
  Normal   Scheduled  9m32s                    default-scheduler  Successfully assigned istio-system/istio-ingressgateway-b68f578f6-p8j4p to cn-guangzhou.192.168.0.92
  Normal   Pulled     9m32s                    kubelet            Container image "docker.io/istio/proxyv2:1.12.2" already present on machine
  Normal   Created    9m32s                    kubelet            Created container istio-proxy
  Normal   Started    9m32s                    kubelet            Started container istio-proxy
  Warning  Unhealthy  4m30s (x156 over 9m31s)  kubelet            Readiness probe failed: Get "http://10.211.0.4:15021/healthz/ready": dial tcp 10.211.0.4:15021: connect: connection refused
1
2
3
4
$ kubectl logs -n istio-system istio-ingressgateway-b68f578f6-p8j4p
2022-01-29T11:54:18.257751Z     warning envoy config    StreamAggregatedResources gRPC config stream closed since 672s ago: 14, connection error: desc = "transport: authentication handshake failed: x509: certificate signed by unknown authority"
2022-01-29T11:54:46.065125Z     warning envoy config    StreamAggregatedResources gRPC config stream closed since 700s ago: 14, connection error: desc = "transport: authentication handshake failed: x509: certificate signed by unknown authority"
2022-01-29T11:55:00.926243Z     warning envoy config    StreamAggregatedResources gRPC config stream closed since 715s ago: 14, connection error: desc = "transport: authentication handshake failed: x509: certificate signed by unknown authority"

2. 通过 Gateway 暴露 Istio 控制平面

在主从架构中,工作负载实例间可以互相通信,但从集群工作负载代理访问主集群的 Istio 控制平面需要通过 gateway。Gateway 本质上是一个运行在网格边缘的 Envoy proxy。以下 YAML 来自 expose-istiod.yaml。注意,这里虽然在一个内网中,但暴露还是通过公网 IP 暴露。

为什么单网络 pod 间可以直接通信还要通过 Gateway 暴露 Istio 控制平面?
为了启动时有稳定的 IP 地址用于连接。如 Configure cluster2 as a remote 需要设置固定的地址参数 remotePilotAddress。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
apiVersion: networking.istio.io/v1alpha3
kind: Gateway # 描述位于服务网格边缘用于接受进出网格的连接的负载均衡器
metadata:
  name: istiod-gateway
spec:
  # 关联实现负载均衡器网关的 Pods
  selector:
    istio: eastwestgateway
  servers: # 网关上暴露的一组服务端口
    - port:
        name: tls-istiod # 端口别名
        number: 15012 # 网关上暴露的端口号
        protocol: tls # TLS 表示连接会使用 SNI 头部来指示目的地址用于路由
      tls: # TLS 选项
        mode: PASSTHROUGH # 通过 SNI 路由
      # hosts:一个或多个由此网关暴露的、服务网格内的 host。
      # VirtualService 必须绑定一个 Gateway,
      # 且 VirtualService 的 host 必须与 Gateway 的至少一个 host 匹配
      hosts:
        - "*"
    - port:
        name: tls-istiodwebhook
        number: 15017
        protocol: tls
      tls:
        mode: PASSTHROUGH          
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService # 描述路由规则
metadata:
  name: istiod-vs
spec:
  hosts: # 客户端请求服务器时使用的地址名
  - "*"
  gateways: # 关联的 gateway
  - istiod-gateway
  tls: # TLS 和 HTTPS 请求的路由规则
  - match: # 匹配规则
    - port: 15012
      sniHosts:
      - "*"
    route:
    - destination:
        host: istiod.istio-system.svc.cluster.local # 目标服务的真实地址
        port:
          number: 15012
  - match:
    - port: 15017
      sniHosts:
      - "*"
    route:
    - destination:
        host: istiod.istio-system.svc.cluster.local
        port:
          number: 443

SNI:服务器名称指示。允许服务器在相同的IP地址和TCP端口号上呈现多个证书,并且因此允许在相同的IP地址上提供多个安全(HTTPS)网站(或其他任何基于TLS的服务),而不需要所有这些站点使用相同的证书1