当前位置: 首页 > news >正文

【云原生 | Kubernetes 系列】--Envoy Tcp请求静态配置

Envoy Tcp请求静态配置

1 准备工作

准备工作包括:

  1. docker-compose环境准备
  2. yaml及docker-compse配置文件获取(来自github/ikubernetes)
# apt install docker-compose -y
# docker pull envoyproxy/envoy-alpine:v1.21.5
# mkdir /apps/envoy -p
# cd /apps/envoy
# git clone https://github.com/ikubernetes/servicemesh_in_practise.git
# cd servicemesh_in_practise/
# ls
admin-interface     eds-filesystem  envoy.echo               http-egress   LICENSE                 security  tls-front-proxy
cds-eds-filesystem  eds-grpc        front-proxy              http-ingress  monitoring-and-tracing  tcpproxy
cluster-manager     eds-rest        http-connection-manager  lds-cds-grpc  README.md               template
# git checkout develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
# ls
Cluster-Manager        Envoy-Basics  HTTP-Connection-Manager  Monitoring-and-Tracing  Security
Dynamic-Configuration  Envoy-Mesh    LICENSE                  README.md               template
# cd Envoy-Basics/tcp-front-proxy/

2 docker-compose配置

docker-compose定义了3个容器

  1. 业务容器webserver01 IP地址172.31.1.11
  2. 业务容器webserver02 IP地址172.31.1.12
  3. envoy容器 IP地址172.31.1.2
  4. 定义envoymesh的网桥
/apps/envoy/servicemesh_in_practise/Envoy-Basics/tcp-front-proxy# cat docker-compose.yaml 
version: '3.3'
services:
  envoy:
    image: envoyproxy/envoy-alpine:v1.21.5
    volumes:
    - ./envoy.yaml:/etc/envoy/envoy.yaml
    networks:
      envoymesh:
        ipv4_address: 172.31.1.2
        aliases:
        - front-proxy
    depends_on:
    - webserver01
    - webserver02

  webserver01:
    image: ikubernetes/demoapp:v1.0
    environment:
      - PORT=8080
    hostname: webserver01
    networks:
      envoymesh:
        ipv4_address: 172.31.1.11
        aliases:
        - webserver01

  webserver02:
    image: ikubernetes/demoapp:v1.0
    environment:
      - PORT=8080
    hostname: webserver02
    networks:
      envoymesh:
        ipv4_address: 172.31.1.12
        aliases:
        - webserver02

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

3 envoy.yaml配置

envoy.yaml中定义:

  1. 使用的是静态配置static_resources
  2. 监听器监听 0.0.0.0:80 端口
  3. 监听器接收到请求转发给filter_chains,filter_chains串联了tcp_proxy过滤器对请求进行解码,代理给local_cluster
  4. clusters中定义了local_cluster,其中包含2个Endpoint,172.31.1.11:8080 和172.31.1.12:8080
static_resources:
  listeners:
    name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.tcp_proxy
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
          stat_prefix: tcp
          cluster: local_cluster

  clusters:
  - name: local_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: local_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 172.31.1.11, port_value: 8080 }
        - endpoint:
            address:
              socket_address: { address: 172.31.1.12, port_value: 8080 }

4 部署并测试访问

启动docker-compose后,客户端访问172.31.1.2查看转发效果

# docker-compose up
## 客户端上执行
# curl 172.31.1.2
iKubernetes demoapp v1.0 !! ClientIP: 172.31.1.2, ServerName: webserver01, ServerIP: 172.31.1.11!
# curl 172.31.1.2
iKubernetes demoapp v1.0 !! ClientIP: 172.31.1.2, ServerName: webserver02, ServerIP: 172.31.1.12!
# curl 172.31.1.2
iKubernetes demoapp v1.0 !! ClientIP: 172.31.1.2, ServerName: webserver02, ServerIP: 172.31.1.12!
# curl 172.31.1.2
iKubernetes demoapp v1.0 !! ClientIP: 172.31.1.2, ServerName: webserver01, ServerIP: 172.31.1.11!
## docker-compose服务器上可以看到请求的记录
envoy_1        | [2022-09-23 06:36:33.256][1][info][main] [source/server/server.cc:868] starting main dispatch loop
webserver01_1  | 172.31.1.2 - - [23/Sep/2022 06:38:19] "GET / HTTP/1.1" 200 -
webserver02_1  | 172.31.1.2 - - [23/Sep/2022 06:38:20] "GET / HTTP/1.1" 200 -
webserver02_1  | 172.31.1.2 - - [23/Sep/2022 06:38:21] "GET / HTTP/1.1" 200 -
webserver01_1  | 172.31.1.2 - - [23/Sep/2022 06:38:21] "GET / HTTP/1.1" 200 -
## 测试完清理环境
# docker-compose down

5 访问流程梳理

  1. 当客户端访问172.31.1.2:80(docker-compose中的envoy容器),请求被转发到front-proxy的Listener上的80端口(listener中socket_address定义)
  2. 由filter chains定义的tcp_proxy过滤器对请求进行解码,将传输层报文通过tcp_proxy(typed_config中定义)解码到Clusters中的local_cluster
  3. Cluster使用轮询算法将请求转发到后端的Endpoint(clusters中socket_address字段定义)上.

请添加图片描述

相关文章:

  • 【牛客 - 剑指offer】JZ61 扑克牌顺子 两种方案 Java实现
  • 写对比学习损失函数有感(关于速度差异、出现nan的情况)
  • Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day03】——Java高级篇
  • SHRM-人力资源必备的顶流证书
  • 【软件测试】软件测试的相关概念(面试常考)
  • 极光推送厂商通道(小米、华为)对接/问题排查
  • c#开发和学习(基础)
  • java agent简介
  • redis源码实践手册
  • 时间复杂度和空间复杂度❀数据结构
  • Mybatis知识总结二
  • SpringBoot之基础Web开发
  • 作为BAT大厂面试官,谈谈大厂技术面试
  • 半盖半露设计、等大设计——PCB代工厂的常见设计
  • 多线程之三(【多线程案例】单例模式+阻塞式队列+定时器+线程池)
  • #Java异常处理
  • 《Java编程思想》读书笔记-对象导论
  • Android单元测试 - 几个重要问题
  • Android框架之Volley
  • Javascript设计模式学习之Observer(观察者)模式
  • Java的Interrupt与线程中断
  • Linux gpio口使用方法
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Markdown 语法简单说明
  • mockjs让前端开发独立于后端
  • OSS Web直传 (文件图片)
  • 前端面试之CSS3新特性
  • 我是如何设计 Upload 上传组件的
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​io --- 处理流的核心工具​
  • # centos7下FFmpeg环境部署记录
  • #pragma multi_compile #pragma shader_feature
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (2.2w字)前端单元测试之Jest详解篇
  • (Matlab)使用竞争神经网络实现数据聚类
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (论文阅读30/100)Convolutional Pose Machines
  • (已解决)什么是vue导航守卫
  • (转)http-server应用
  • (转)项目管理杂谈-我所期望的新人
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • /var/log/cvslog 太大
  • @NestedConfigurationProperty 注解用法
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [2023-年度总结]凡是过往,皆为序章
  • [AIGC] Spring Interceptor 拦截器详解
  • [Django 0-1] Core.Checks 模块
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件
  • [git]git命令如何取消先前的配置