# destionrule

## DestinationRule

DestinationRule定义了在路由发生后应用于服务流量的策略.这些规则指定负载均衡的配置,Sidecar的连接池大小以及离群值检测设置,以从负载均衡池中检测和清除不正常的主机.例如,ratings服务的简单负载均衡策略如下所示:

```yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN
```

可以通过定义命名子集并覆盖服务级别上指定的设置来指定特定于版本的策略。以下规则将为名为testversion使用version:v3)标签的的子集使用轮训负载均衡算法,在明确指定该子集之前,对应的配置不会生效

```
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN
  subsets:
  - name: testversion
    labels:
      version: v3
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN
```

## LoadBalancerSettings

```
apiVersion: networking.istio.io/v1beta1
 kind: DestinationRule
 metadata:
   name: bookinfo-ratings
 spec:
   host: ratings.prod.svc.cluster.local
   trafficPolicy:
     loadBalancer:
       consistentHash:
         httpCookie:
           name: user
           ttl: 0s
```

* consistentHash
* simple
  * LoadBalancerSettings\_ROUND\_ROBIN
  * LoadBalancerSettings\_LEAST\_CONN
  * LoadBalancerSettings\_RANDOM
  * LoadBalancerSettings\_PASSTHROUGH

## ConnectionPoolSettings

上游主机的连接池设置。这些设置适用于上游服务中的每个主机。连接池设置可以应用于TCP级别,也可以应用于HTTP级别。

例如,下面的规则集设置了名为myredissrv服务连接到redis,限制100个连接,超时时间30ms

```
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: bookinfo-redis
spec:
  host: myredissrv.prod.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
        connectTimeout: 30ms
        tcpKeepalive:
          time: 7200s
          interval: 75s
```

## OutlierDetection

断路器实现,用于跟踪上游服务中每个单独主机的状态.适用于HTTP和TCP服务.对于HTTP服务,在预定的时间段内,将从池中弹出持续返回5xx错误以进行API调用的主机.对于TCP服务,在测量连续错误metric时,与给定主机的连接超时或连接失败将计为错误。

以下规则将连接池大小设置为100个HTTP1连接,并且与reviews服务的连接数不超过10个请求/连接.此外,它设置了1000个并发HTTP2请求的限制,并将上游主机配置为每5分钟进行一次扫描,以便任何连续7次出现502、503或504错误代码而失败的主机都将弹出15分钟。

```
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: reviews-cb-policy
spec:
  host: reviews.prod.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        http2MaxRequests: 1000
        maxRequestsPerConnection: 10
    outlierDetection:
      consecutiveErrors: 7
      interval: 5m
      baseEjectionTime: 15m
```

## ClientTLSSettings

上游连接的SSL/TLS相关设置。这些设置是HTTP和TCP上游通用的。

例如,以下规则将客户端配置为使用双向TLS来连接到上游数据库集群。

```
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: db-mtls
spec:
  host: mydbserver.prod.svc.cluster.local
  trafficPolicy:
    tls:
      mode: MUTUAL
      clientCertificate: /etc/certs/myclientcert.pem
      privateKey: /etc/certs/client_private_key.pem
      caCertificates: /etc/certs/rootcacerts.pem
```

以下规则将客户端配置为在与域匹配\*.foo.com的外部服务进行对话时使用TLS。

```
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: tls-foo
spec:
  host: "*.foo.com"
  trafficPolicy:
    tls:
      mode: SIMPLE
```

以下规则将客户端配置为在与评级服务对话时使用Istio双向TLS。

```
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: ratings-istio-mtls
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
```

## LocalityLoadBalancerSetting

本地加权负载均衡使管理员可以根据流量起源和终止的位置来控制流量到端点的分配.这些地点是使用任意标签指定的,这些标签以{region}/{zone}/{sub-zone}形式指定地点的层次结构.以下示例显示如何在网格范围内设置局部权重。

给定一个包含工作负载的网格,并将其服务部署到"us-west/zone1/"和"us-west/ zone2 /".此示例指定当访问服务的流量源自" us-west/zone1/"中的工作负载时,80％的流量将发送到" us-west/zone1/"中的端点,即相同的区域,其余 20％将到达" us-west/zone2 /"中的端点.此设置旨在帮助将流量路由到同一位置的端点.为源自" us-west/zone2 /"的流量指定了类似的设置。

```
  distribute:
    - from: us-west/zone1/*
      to:
        "us-west/zone1/*": 80
        "us-west/zone2/*": 20
    - from: us-west/zone2/*
      to:
        "us-west/zone1/*": 20
        "us-west/zone2/*": 80
```

如果运营商的目标不是要在区域和区域之间分配负载,而是要限制故障转移的区域性以满足其他运营要求,则运营商可以设置"故障转移"策略,而不是"分配"策略。

下面的示例为区域设置区域故障转移策略.假设服务驻留在us-east,us-west和eu-west内的区域中,此示例指定当us-east中的端点变得不健康时,流量应故障转移到eu-west内任何区域或子区域中的端点,并且类似地, 西部应该故障转移到美国东部。

```
 failover:
   - from: us-east
     to: eu-west
   - from: us-west
     to: us-east
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://rocdu.gitbook.io/deep-understanding-of-istio/3/2.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
