1. Blog
  2. Golang
  3. kubernetes
  4. Rust
  5. 关于作者

istio 容器云产品集成

istio 容器云产品集成

摘要

将 istio 集成至容器云产品。使得容器云上的用户能够受益于 istio 提供的服务治理等特性。

istio 部署

istio 需要在“添加集群”时一并安装。

需要往 install-operator 中增加 istio 安装。

⭐ 在 istio 安装中需要额外配置的:

istio gateway 部署

虽然 istio gateway 可以通过 istio operator CR 完成增减。但这种方式不适合容器云。

在容器云中,需要将 istio gateway 与 “容器服务->运行时->网关”集成。

“添加网关”时创建 istio gateway 类型网关。

创建完成后后端控制器根据 CR 描述创建 gateway 部署和 Gateway 资源。

Gateway 资源由 “网关配置” 控制

启用 istio 注入

参考Automatic Sidecar Injection

在应用编排中能够控制应用是否启用 istio。istio 注入使用 annotation 完成,可以注解至 namespace,deployment,pod。

对于容器云,需要在应用编排中进行更改,以控制 istio 注入。提供两种方式:

⭐ 上述操作中的第二项可以仅前端处理,第一项需要后端配合设置或者不增加该功能。

istio 还需要对 service 中的 port 以及 pod 中的 port 名称有约定,requirements

conversion.go#L47

即需要保证 service 中的 port name 或者 appProtocol(k8s 1.18+ with ServiceAppProtocol gate) 设置为正确的协议名称。

spec.ports[0].appProtocol: Forbidden: This field can be enabled with the ServiceAppProtocol feature gate

kind: Service
metadata:
  name: myservice
spec:
  ports:
    - number: 3306
      name: database
      appProtocol: mysql
    - number: 80
      name: http-web
      appProtocol: http

由于默认的 ServiceAppProtocol gate 处于 false 状态,我们使用 port.name 。

支持的名称参考:protocol-selection

⭐ 需要前端在编排 service 时,port name 设置为选择框。仅允许如下选项:

灰度发布

灰度发布使用 istio 需要涉及 CR 有 GateWay VirtualService DestinationRule

一个示例:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
    - route:
        - destination:
            host: reviews
            subset: v1
          weight: 90
        - destination:
            host: reviews
            subset: v2
          weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2

在容器云中若使用灰度发布功能时,需要:

灰度发布建立于现有 “应用编排” 功能之上。

灰度发布流程根据 VirtualService 上 spec.route 上设置的目的地大于 1 时存在。此时在应用详情内增加的“灰度发布”tab 页面可以看到灰度比例,发布进度等。

灰度发布流程:

相比于更改已经存在的资源(destinationrule,virtualservice),新建资源/删除资源比修改更好操作。

应用编排需要增加对微服务的路由(virtualservice)编排,仅编排当前应用的路由。 应用编排需要增加对微服务的网关(gateway)资源编排,确定当前路由的网关。

对现有功能的影响

可观测

⭐ istio 借助 kiali 实现网格可视化,容器云将嵌入 kiali 页面。

短域名 (service 别名)

短域名,也就是对现有的 service 增加一个对应的 serviceentry,serviceentry 使用该 service IP,仅名称有差异。类似 DNS CNAME。

⭐ 对于使用 istio 的服务,仅需要为其增加对应的 serviceentry 即可。需要编写对应的控制器。增加短域名的方式可以使用现有的方式。

可能有个改进点,别名使用的是 STRICT_DNS 而非 EDS。 由于持有两份的服务配置,可能会增加 sidecar 内存占用,可以考虑修改 istio service 注册源码,直接替换 servicename.namespace 至 servicename.custom.

跨集群通信

network-models

跨集群通信均通过外部网关中转,假设不同集群之间均为独立网络。

TODO:

外部网关

TODO: