参考

1. 定义目标与规则

  • istio 服务网格中对服务进行了进一步抽象:
    • 可以使用 Pod 标签对具体的服务进程进行分组;
    • 可以定义服务的负载均衡策略;
    • 可以为服务指定 TLS 要求;
    • 可以为服务设置连接池大小。
  • istio 中,同一服务不同组别的后端被称为 子集(Subset) ,也经常被称为 服务版本
  • 在 istio 中,建议为每个网格都设置明确的目标访问规则,在通过 istio 流量控制之后,会选择明确的子集,根据规则或在子集中规定的流量策略来进行访问,这种规则被称为 DestinationRule ,样例如下:
    cat flaskapp-destinationrule.yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: flaskapp
    spec:
      host: flaskapp.default.svc.cluster.local
      trafficPolicy:
        loadBalancer:
          simple: LEAST_CONN
      subsets:
      - name: v1
        labels:
          version: v1
        trafficPolicy:
          loadBalancer: ROUND_ROBIN
      - name: v2
        labels:
          version: v2
    
    规则需要注意的地方如下:
    • host: 必要字段,代表1个 Service 资源,或1个 ServiceEntry 定义的外部服务。
      • 建议:为防止不同命名空间服务重名,可以使用完全限定名。
    • trafficPolicy: 流量策略,在 DestinationRuleSubset 都可以定义,Subset 中的级别更高。
    • subsets: 该字段使用标签选择器定义不同的子集。

2. 定义默认路由

2.1 定义默认路由

  • 建议每个服务都创建1个默认路由,在没有特定的路由规则时,使用默认路由规则访问指定子集,一以此确保服务在默认情况下的行为稳定性,样例如下:
    cat flaskapp-default-vs.yaml 
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: flaskapp
    spec:
      hosts:
      - flaskapp.default.svc.cluster.local
      http:
      - route:
        - destination:
            host: flaskapp.default.svc.cluster.local
            subset: v1
    
  • VirtualService: istio 流量控制过程中的枢纽,负责对流量进行甄别与转发。
    • 针对主机名工作,但 hosts 字段是一个数组内容,可以针对多个主机名进行工作。
    • 可以为多种协议的流量提供服务,如 httptcptls等。
  • http 的下一级,即具体的路由规则。
    • 支持多条路由。

2.2 验证

# 应用目标规则与默认路由
kubectl apply -f flaskapp-destinationrule.yaml
kubectl apply -f flaskapp-default-vs.yaml

# 验证,可同步观察 kiali & Jaeger 等
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v1 -o jsonpath='{.items..metadata.name}') /bin/bash
bash-4.4# for i in `seq 100` ; do http --body http://flaskapp.default/env/version ; done

2.3 总结

在 istio 中部署1个业务应用时,建议:

  • 使用 app 标签表明应用身份;
  • 使用 version 标签表明应用版本;
  • 创建目标规则;
  • 创建默认路由规则,默认路由得配置清单应该成为服务网格环境下的必要部署内容。

3. 流量拆分与迁移

3.1 权重

cat flaskapp-default-vs.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: flaskapp
spec:
  hosts:
  - flaskapp.default.svc.cluster.local
  http:
  - route:
    - destination:
        host: flaskapp.default.svc.cluster.local
        subset: v1
      weight: 70
    - destination:
        host: flaskapp.default.svc.cluster.local
        subset: v2
      weight: 30
      
# 应用
kubectl apply -f flaskapp-default-vs.yaml

# 验证,可同步观察 kiali & Jaeger 等
# 因是权重的原因,验证时样本量需要大一些
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v1 -o jsonpath='{.items..metadata.name}') /bin/bash
bash-4.4# for i in `seq 100` ; do http --body http://flaskapp.default/env/version ; done | awk -F "v1" '{print NF-1}'

注意点:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  • 流量分配是有权重的,且权重总和必须是 100
  • 如果不显示声明权重,则默认值是 100

3.2 获取 istio 对象

  • kubectl getkubectl api-resources 列出当前集群支持的所有对象类型
  • Kiali --> Istio Config
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄