envoy-集群管理之熔断与连接池


root@ceph-teamplate:~/circuit_breaker# cat docker-compose.yaml 
version: '3.3'
services:
  envoy:
    image: envoyproxy/envoy-alpine:v1.11.1
    volumes:
    - ./front-envoy.yaml:/etc/envoy/envoy.yaml
    networks:
      - envoymesh
    expose:
      - "80"
      - "9901"

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

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

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

  service_gray:
    image: ikubernetes/servicemesh-app:latest
    volumes:
    - ./envoy.yaml:/etc/envoy/envoy.yaml
    networks:
      envoymesh:
        aliases:
        - service_gray
        - myservice
    environment:
      - SERVICE_NAME=gray
    expose:
    - "80"

  service_black:
    image: ikubernetes/servicemesh-app:latest
    volumes:
    - ./envoy.yaml:/etc/envoy/envoy.yaml
    networks:
      envoymesh:
        aliases:
        - service_black
        - myservice
    environment:
      - SERVICE_NAME=black
    expose:
    - "80"

networks:
  envoymesh: {}

root@ceph-teamplate:~/circuit_breaker# cat front-envoy.yaml 
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901
 
static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    name: listener_http
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/service/colorless"
                route:
                  cluster: webcluster2
              - match:
                  prefix: "/"
                route:
                  cluster: webcluster1
          http_filters:
          - name: envoy.router
 
  clusters:
  - name: webcluster1
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: webcluster1
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: colored
                port_value: 80
    circuit_breakers:
      thresholds:         
        max_connections: 1
        max_pending_requests: 1
        max_retries: 3
 
  - name: webcluster2
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: webcluster2
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: myservice
                port_value: 80
    outlier_detection:
      interval: "1s"
      consecutive_5xx: "3"
      consecutive_gateway_failure: "3"
      base_ejection_time: "10s"
      enforcing_consecutive_gateway_failure: "100"
      max_ejection_percent: "30"
      success_rate_minimum_hosts: "2"

root@ceph-teamplate:~/circuit_breaker# cat envoy.yaml 
static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    name: listener_http
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: service
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: localservice
          http_filters:
          - name: envoy.router
            typed_config: {}
 
  clusters:
  - name: localservice
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: localservice
      endpoints:
        lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 8080
    circuit_breakers:
      thresholds:         
        max_connections: 1
        max_pending_requests: 1
        max_retries: 2
 
curl 172.23.0.3:80/service/colorless

https://github.com/fortio/fortio
curl -L https://github.com/fortio/fortio/releases/download/v1.17.0/fortio-linux_x64-1.17.0.tgz \
 | sudo tar -C / -xvzpf -
# or the debian package
wget https://github.com/fortio/fortio/releases/download/v1.17.0/fortio_1.17.0_amd64.deb
dpkg -i fortio_1.17.0-1_amd64.deb
# or the rpm
rpm -i https://github.com/fortio/fortio/releases/download/v1.17.0/fortio-1.17.0-1.x86_64.rpm

fortio  load -c 4 -qps 0 -n 100 -loglevel Warning http://172.23.0.3:80/service/colored
Code 200 : 97 (97.0 %)
Code 503 : 3 (3.0 %)
root@ceph-teamplate:~/circuit_breaker# fortio  load -c 4 -qps 0 -n 100 -loglevel Warning http://172.23.0.3:80/service/colorless
Code 200 : 95 (95.0 %)
Code 503 : 5 (5.0 %)
 
root@ceph-teamplate:~/circuit_breaker# curl -s 172.23.0.3:9901/stats | grep cluster.webcluster1
cluster.webcluster1.external.upstream_rq_200: 1226
cluster.webcluster1.external.upstream_rq_2xx: 1226
cluster.webcluster1.external.upstream_rq_404: 2
cluster.webcluster1.external.upstream_rq_4xx: 2
cluster.webcluster1.external.upstream_rq_503: 30
cluster.webcluster1.external.upstream_rq_5xx: 30

相关