Envoy 流量治理基础 【十一】

一、Httproute-simple-match

1.README.md

#README.md
[root@k8s-master01 httproute-simple-match]# cat README.md
# HTTP Route Simple Match Demo

### 环境说明
##### 八个Service:

- envoy:Front Proxy,地址为172.31.50.10
- 7个后端服务
  - light_blue和dark_blue:对应于Envoy中的blue集群
  - light_red和dark_red:对应于Envoy中的red集群
  - light_green和dark_green:对应Envoy中的green集群
  - gray:对应于Envoy中的gray集群

##### 使用的路由配置

```
            virtual_hosts:
            - name: vh_001
              domains: ["ilinux.io", "*.ilinux.io", "ilinux.*"]
              routes:
              - match:
                  path: "/service/blue"
                route:
                  cluster: blue
              - match:
                  safe_regex:
                    google_re2: {}
                    regex: "^/service/.*blue$"
                redirect:
                  path_redirect: "/service/blue"
              - match:
                  prefix: "/service/yellow"
                direct_response:
                  status: 200
                  body:
                    inline_string: "This page will be provided soon later.\n"
              - match:
                  prefix: "/"
                route:
                  cluster: red
            - name: vh_002
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: gray
```

### 运行和测试
1. 创建并运行容器
```
docker-compose up
```

2. 测试domain的匹配机制

   ```
   # 首先访问无法匹配到vh_001的域名
   curl -H "Host: www.magedu.com" http://172.31.50.10/service/a

   <body bgcolor="gray"><span style="color:white;font-size:4em;">
   Hello from gray (hostname: 91a424fbb509 resolvedhostname:172.31.50.5)
   </span></body>

   # 接着访问可以匹配vh_001的域名
   curl -H "Host: www.ilinux.io" http://172.31.50.10/service/a

   <body bgcolor="light_red"><span style="color:white;font-size:4em;">
   Hello from light_red (hostname: 4b6793c1f445 resolvedhostname:172.31.50.7)
   </span></body>
   ```
3. 测试路由匹配机制

   ```
   # 首先访问“/service/blue”
   curl -H "Host: www.ilinux.io" http://172.31.50.10/service/blue
   <body bgcolor="dark_blue"><span style="color:white;font-size:4em;">
   Hello from dark_blue (hostname: 96edc379cac7 resolvedhostname:172.31.50.8)
   </span></body>

   # 接着访问“/service/dark_blue”
   curl -I -H "Host: www.ilinux.io" http://172.31.50.10/service/dark_blue
   HTTP/1.1 301 Moved Permanently
   location: http://www.ilinux.io/service/blue
   date: Fri, 29 Oct 2021 03:02:59 GMT
   server: envoy
   transfer-encoding: chunked

   # 然后访问“/serevice/yellow”
   curl -H "Host: www.ilinux.io" http://172.31.50.10/service/yellow
   This page will be provided soon later.
   ```

4. 停止后清理

```
docker-compose down
```

 2.docker-compose.yaml

#docker-compose.yaml
[root@k8s-master01 httproute-simple-match]# cat docker-compose.yaml
version: '3'

services:
  front-envoy:
    #image: envoyproxy/envoy-alpine:v1.21-latest
    image: envoyproxy/envoy:v1.23-latest
    environment:
      - ENVOY_UID=0
      - ENVOY_GID=0
    volumes:
      - ./front-envoy.yaml:/etc/envoy/envoy.yaml
    networks:
      envoymesh:
        ipv4_address: 172.31.50.10
    expose:
      # Expose ports 80 (for general traffic) and 9901 (for the admin server)
      - "80"
      - "9901"

  light_blue:
    image: ikubernetes/servicemesh-app:latest
    networks:
      envoymesh:
        aliases:
          - light_blue
          - blue
    environment:
      - SERVICE_NAME=light_blue
    expose:
      - "80"

  dark_blue:
    image: ikubernetes/servicemesh-app:latest
    networks:
      envoymesh:
        aliases:
          - dark_blue
          - blue
    environment:
      - SERVICE_NAME=dark_blue
    expose:
      - "80"

  light_green:
    image: ikubernetes/servicemesh-app:latest
    networks:
      envoymesh:
        aliases:
          - light_green
          - green
    environment:
      - SERVICE_NAME=light_green
    expose:
      - "80"

  dark_green:
    image: ikubernetes/servicemesh-app:latest
    networks:
      envoymesh:
        aliases:
          - dark_green
          - green
    environment:
      - SERVICE_NAME=dark_green
    expose:
      - "80"

  light_red:
    image: ikubernetes/servicemesh-app:latest
    networks:
      envoymesh:
        aliases:
          - light_red
          - red
    environment:
      - SERVICE_NAME=light_red
    expose:
      - "80"

  dark_red:
    image: ikubernetes/servicemesh-app:latest
    networks:
      envoymesh:
        aliases:
          - dark_red
          - red
    environment:
      - SERVICE_NAME=dark_red
    expose:
      - "80"

  gray:
    image: ikubernetes/servicemesh-app:latest
    networks:
      envoymesh:
        aliases:
          - gray
          - grey
    environment:
      - SERVICE_NAME=gray
    expose:
      - "80"

networks:
  envoymesh:
    driver: bridge
    ipam:
      config:
        - subnet: 172.31.50.0/24
        

3. front-envoy.yaml

# front-envoy.yaml
[root@k8s-master01 httproute-simple-match]# cat front-envoy.yaml
admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
       address: 0.0.0.0
       port_value: 9901

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: vh_001
              domains: ["ilinux.io", "*.ilinux.io", "ilinux.*"]
              routes:
              - match:
                  path: "/service/blue"
                route:
                  cluster: blue
              - match:
                  safe_regex:
                    google_re2: {}
                    regex: "^/service/.*blue$"
                redirect:
                  path_redirect: "/service/blue"
              - match:
                  prefix: "/service/yellow"
                direct_response:
                  status: 200
                  body:
                    inline_string: "This page will be provided soon later.\n"
              - match:
                  prefix: "/"
                route:
                  cluster: red
            - name: vh_002
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: gray
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

  clusters:
  - name: blue
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: blue
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: blue
                port_value: 80

  - name: red
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: red
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: red
                port_value: 80

  - name: green
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: green
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: green
                port_value: 80

  - name: gray
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: gray
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: gray
                port_value: 80

4.测试

# 首先访问无法匹配到vh_001的域名
[root@k8s-master01 httproute-simple-match]# curl -H "Host: www.magedu.com" http://172.31.50.10/service/a
Hello from App behind Envoy (service gray)! hostname: 96fdba8dead0 resolved hostname: 172.31.50.5

# 接着访问可以匹配vh_001的域名
[root@k8s-master01 httproute-simple-match]#    curl -H "Host: www.ilinux.io" http://172.31.50.10/service/a
Hello from App behind Envoy (service dark_red)! hostname: ef48e0564e77 resolved hostname: 172.31.50.3
[root@k8s-master01 httproute-simple-match]#    curl -H "Host: www.ilinux.io" http://172.31.50.10/service/a
Hello from App behind Envoy (service light_red)! hostname: 4b6d80475a8a resolved hostname: 172.31.50.8

#3. 测试路由匹配机制
# 首先访问“/service/blue”
[root@k8s-master01 httproute-simple-match]#    curl -H "Host: www.ilinux.io" http://172.31.50.10/service/blue
Hello from App behind Envoy (service dark_blue)! hostname: 0f954a55e467 resolved hostname: 172.31.50.4
[root@k8s-master01 httproute-simple-match]#    curl -H "Host: www.ilinux.io" http://172.31.50.10/service/blue
Hello from App behind Envoy (service light_blue)! hostname: 8eb6d015887f resolved hostname: 172.31.50.2
[root@k8s-master01 httproute-simple-match]#    curl -H "Host: www.ilinux.io" http://172.31.50.10/service/blue
Hello from App behind Envoy (service dark_blue)! hostname: 0f954a55e467 resolved hostname: 172.31.50.4
[root@k8s-master01 httproute-simple-match]#    curl -H "Host: www.ilinux.io" http://172.31.50.10/service/blue
Hello from App behind Envoy (service light_blue)! hostname: 8eb6d015887f resolved hostname: 172.31.50.2

# 接着访问“/service/dark_blue”
[root@k8s-master01 httproute-simple-match]#    curl -I -H "Host: www.ilinux.io" http://172.31.50.10/service/dark_blue
HTTP/1.1 301 Moved Permanently
location: http://www.ilinux.io/service/blue
date: Wed, 21 Feb 2024 08:14:55 GMT
server: envoy
transfer-encoding: chunked

[root@k8s-master01 httproute-simple-match]#    curl -I -H "Host: www.ilinux.io" http://172.31.50.10/service/dark_blue
HTTP/1.1 301 Moved Permanently
location: http://www.ilinux.io/service/blue
date: Wed, 21 Feb 2024 08:14:56 GMT
server: envoy
transfer-encoding: chunked

# 然后访问“/serevice/yellow”
[root@k8s-master01 httproute-simple-match]#    curl -H "Host: www.ilinux.io" http://172.31.50.10/service/yellow
This page will be provided soon later.
[root@k8s-master01 httproute-simple-match]#    curl -H "Host: www.ilinux.io" http://172.31.50.10/service/yellow
This page will be provided soon later.

 二、Httproute-headers-match

1.README.md

[root@k8s-master01 httproute-headers-match]# cat README.md
# HTTP Route Headers Match Demo

### 环境说明
#### 六个Service:

- envoy:Front Proxy,地址为172.31.52.10
- 5个后端服务
  - demoapp-v1.0-1和demoapp-v1.0-2:对应于Envoy中的demoappv10集群
  - demoapp-v1.1-1和demoapp-v1.1-2:对应于Envoy中的demoappv11集群
  - demoapp-v1.2-1:对应于Envoy中的demoappv12集群

#### 使用的路由配置

```
            virtual_hosts:
            - name: vh_001
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                  headers:
                  - name: X-Canary
                    exact_match: "true"
                route:
                  cluster: demoappv12
              - match:
                  prefix: "/"
                  query_parameters:
                  - name: "username"
                    string_match:
                      prefix: "vip_"
                route:
                  cluster: demoappv11
              - match:
                  prefix: "/"
                route:
                  cluster: demoappv10
```

### 运行和测试
1. 创建并运行容器
```
docker-compose up
```

2. 发起无附加条件的请求

   ```
   # 不使用任何独特的访问条件
   curl 172.31.52.10/hostname
   ServerName: demoapp-v1.0-1

   curl 172.31.52.10/hostname
   ServerName: demoapp-v1.0-2
   ```

3. 测试使用“X-Canary: true”村头的请求

   ```
   # 使用特定的标头发起请求
   curl -H "X-Canary: true" 172.31.52.10/hostname
   ServerName: demoapp-v1.2-1
   ```

4. 测试使用特定的查询条件

   ```
   # 在请求中使用特定的查询条件
   curl 172.31.52.10/hostname?username=vip_mageedu
   ServerName: demoapp-v1.1-1

   curl 172.31.52.10/hostname?username=vip_ilinux
   ServerName: demoapp-v1.1-2
   ```

5. 停止后清理

```
docker-compose down
```

2.docker-compose.yaml

[root@k8s-master01 httproute-headers-match]# cat docker-compose.yaml
version: '3'

services:
  front-envoy:
    image: envoyproxy/envoy-alpine:v1.21-latest
    environment:
      - ENVOY_UID=0
      - ENVOY_GID=0
    volumes:
      - ./front-envoy.yaml:/etc/envoy/envoy.yaml
    networks:
      envoymesh:
        ipv4_address: 172.31.52.10
    expose:
      # Expose ports 80 (for general traffic) and 9901 (for the admin server)
      - "80"
      - "9901"

  demoapp-v1.0-1:
    image: ikubernetes/demoapp:v1.0
    hostname: demoapp-v1.0-1
    networks:
      envoymesh:
        aliases:
          - demoappv10
    expose:
      - "80"

  demoapp-v1.0-2:
    image: ikubernetes/demoapp:v1.0
    hostname: demoapp-v1.0-2
    networks:
      envoymesh:
        aliases:
          - demoappv10
    expose:
      - "80"

  demoapp-v1.1-1:
    image: ikubernetes/demoapp:v1.1
    hostname: demoapp-v1.1-1
    networks:
      envoymesh:
        aliases:
          - demoappv11
    expose:
      - "80"

  demoapp-v1.1-2:
    image: ikubernetes/demoapp:v1.1
    hostname: demoapp-v1.1-2
    networks:
      envoymesh:
        aliases:
          - demoappv11
    expose:
      - "80"

  demoapp-v1.2-1:
    image: ikubernetes/demoapp:v1.2
    hostname: demoapp-v1.2-1
    networks:
      envoymesh:
        aliases:
          - demoappv12
    expose:
      - "80"

networks:
  envoymesh:
    driver: bridge
    ipam:
      config:
        - subnet: 172.31.52.0/24

3. front-envoy.yaml

[root@k8s-master01 httproute-headers-match]# cat front-envoy.yaml
admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
       address: 0.0.0.0
       port_value: 9901

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: vh_001
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                  headers:
                  - name: X-Canary
                    exact_match: "true"
                route:
                  cluster: demoappv12
              - match:
                  prefix: "/"
                  query_parameters:
                  - name: "username"
                    string_match:
                      prefix: "vip_"
                route:
                  cluster: demoappv11
              - match:
                  prefix: "/"
                route:
                  cluster: demoappv10
          http_filters:
          - name: envoy.filters.http.router

  clusters:
  - name: demoappv10
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: demoappv10
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: demoappv10
                port_value: 80

  - name: demoappv11
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: demoappv11
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: demoappv11
                port_value: 80

  - name: demoappv12
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: demoappv12
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: demoappv12
                port_value: 80

4.测试

#发起无附加条件的请求
[root@k8s-master01 httproute-headers-match]#    curl 172.31.52.10/hostname
ServerName: demoapp-v1.0-1
[root@k8s-master01 httproute-headers-match]#    curl 172.31.52.10/hostname
ServerName: demoapp-v1.0-2

#测试使用“X-Canary: true”村头的请求
# 使用特定的标头发起请求
[root@k8s-master01 httproute-headers-match]#    curl -H "X-Canary: true" 172.31.52.10/hostname
ServerName: demoapp-v1.2-1
[root@k8s-master01 httproute-headers-match]#    curl -H "X-Canary: true" 172.31.52.10/hostname
ServerName: demoapp-v1.2-1
[root@k8s-master01 httproute-headers-match]#    curl -H "X-Canary: true" 172.31.52.10/hostname

#测试使用特定的查询条件
# 在请求中使用特定的查询条件
[root@k8s-master01 httproute-headers-match]#    curl 172.31.52.10/hostname?username=vip_mageedu
ServerName: demoapp-v1.1-1
[root@k8s-master01 httproute-headers-match]#    curl 172.31.52.10/hostname?username=vip_mageedu
ServerName: demoapp-v1.1-2
[root@k8s-master01 httproute-headers-match]#    curl 172.31.52.10/hostname?username=vip_mageedu
ServerName: demoapp-v1.1-2
[root@k8s-master01 httproute-headers-match]#    curl 172.31.52.10/hostname?username=vip_mageedu
ServerName: demoapp-v1.1-1

 

posted @ 2024-02-21 16:07  しみずよしだ  阅读(49)  评论(0)    收藏  举报