环境更新

经测试上一篇文章中使用的版本istiokiali插件无法识别ServiceEntry配置,如果按上篇文章安装相同的版本请更新版本

删除旧版本下载最新版本,参照kubectl, kind 安装, istio安装

名称版本
kubectl1.30.2
kind0.23.0
istioctl1.22.2

示例

服务网格

Istio1.1版本后支持自定义资源, 1.5之后版本使用apiVersion: networking.istio.io/v1, 1.5及以前版本使用 apiVersion: networking.istio.io/v1alpha3

# 启动服务后通过接口示例多次请求接口查看网格
$ istioctl dashboard kiali

image-20240718163815950

image-20240718163614034

image-20240718164019473

image-20240718163713998

出站设置

配置说明

使用 ServiceEntry 需要注意 Istio 兼容的api版本 networking.istio.io/v1alpha3networking.istio.io/v1beta1

  • apiVersion: 需要注意 Istio 兼容的api版本 networking.istio.io/v1alpha3networking.istio.io/v1beta1
  • kind: 资源类型固定 ServiceEntry
  • metadata: 资源元数据
  • endpoints: 用于直接指定服务的端点地址, 具体内容:

    • address: 网络地址可食用域名
    • ports: 端口列表
    • labels: 标签
    • weight: 负载权重
  • spec: 具体内容:

    • hosts: 服务主机名
    • addresses: 服务ip地址
    • ports: 端口协议,具体内容:

      • number: 服务使用端口号
      • namae: 服务名称
      • protocol: 协议, 包含 HTTP, HTTPS, HTTP2, GRPC, MONGO, TCP, TLS
    • resolution: 解析模式,

      • NONE: 明确为IP模式,
      • STATIC: 指明IP与端口,不需要使用DNS解析
      • DNS: 使用DNS解析

        • 设置endpoints,则代理会使用endpoints中的信息来解析目标IP,但hosts中的DNS名称仍然可以用于路由决策
        • 未设置endpoints,代理就会使用在hosts中指定的DNS地址进行解析
      • DNS_ROUND_ROBIN: 解析服务时自动地在返回的多个IP地址之间进行轮询,以实现负载均衡。并非所有版本支持
    • location: 指定网格位置

      • MESH_EXTERNAL: 外部网格
      • MESH_INTERNAL: 内部网格

示例配置

ServiceEntry定义集群外部服务访问, 示例只展示了mysql和redis的配置,详见gateway1.0

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: mysql
spec:
  hosts:
    - server-mysql.qvbilam.xin
  addresses:
    - 82.157.232.70
  ports:
    - number: 3306
      name: mysql
      protocol: TCP
  location: MESH_EXTERNAL
  resolution: DNS

---
# redis
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: redis
spec:
  hosts:
    - server-redis.qvbilam.xin
  addresses:
    - 82.157.232.70
  ports:
    - number: 6379
      name: redis
      protocol: TCP
  location: MESH_EXTERNAL
  resolution: DNS

效果展示

image-20240730175547653

入站设置

配置说明

Gateway

负责处理进入和离开服务网格的流量。Gateway 本质上是一个负载均衡器,用于将外部流量路由到服务网格内部的服务,并允许内部服务安全地访问外部服务。

  • kind: 资源类型固定 Gateway
  • spec: 具体配置:

    • selector: 指定网关 pod 名称, 通常配置为入口网关 ingressgateway
    • servers: 定义多个服务协议,端口,地址

VirtualService

流量义服务间的流量路由规则

  • kind: 资源类型固定 VirtualService
  • spec: 具体配置:

    • hosts: 适用的服务名列表
    • gateways: 适用的网关列表
    • http: 请求协议,可以是 http, tcp, tls

      • match: 匹配条件, 可以通过 ignoreUriCase标志启用不区分大小写的匹配

        • exact: 用于精确字符串匹配
        • prefix: 用于基于前缀的匹配
        • regex: 用于 RE2 样式)基于正则表达式的匹配
      • route: 满足匹配条件的目标服务

        • destination: 控制不同版本接受流量比
      • timeout: 请求超时时间
      • headers: 请求头操作
      • redirect: 可选redirect, rewrite, retry, mirror, faultInjection, corsPolicy等 ,用于实现更复杂的流量管理功能,如重定向、重写、重试、流量镜像、故障注入和跨域资源共享

配置示例

定义 Gateway 资源指明网格外部流量进入的方式

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: qvbilam-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

定义 VirtualService 路由规则, 绑定 gateway, 下列配置示例为部分服务配置, 详见gateway1.0

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: qvbilam-gateway
spec:
  hosts:
    - "*"
  gateways:
    - qvbilam-gateway
  http:
    # user, 省略其他服务配置
    - match:
        - uri:
            prefix: /user
        - uri:
            prefix: /account
      route:
        - destination:
            port:
              number: 9701
            host: user-web-server

效果展示

image-20240801173411423

image-20240801173657122

Last modification:August 9th, 2024 at 01:05 pm