基于 K8s/K3s 的 Envoy 入门

2024-03-20 16:59
文章标签 云原生 入门 k8s k3s envoy

本文主要是介绍基于 K8s/K3s 的 Envoy 入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Envoy基础

Envoy 是一个开源的边缘服务代理,也是 Istio Service Mesh 默认的数据平面,专为云原生应用程序设计。

下面我们通过一个简单的示例来介绍 Envoy 的基本使用。

1 代理配置

Envoy 使用 YAML 配置文件来控制代理的行为。在下面的步骤中,我们将使用静态配置接口来构建配置,也意味着所有设置都是预定义在配置文件中的。此外 Envoy 也支持动态配置,这样可以通过外部一些源来自动发现进行设置。

1.1 静态资源

Envoy 配置的第一行定义了正在使用的接口配置,在这里我们将配置静态 API,因此第一行应为 static_resources:

static_resources:
1.2 监听器

在配置的开始定义了监听器(Listeners)。监听器是 Envoy 监听请求的网络配置,例如 IP 地址和端口。我们这里的 Envoy 在 Docker 容器内运行,因此它需要监听 IP 地址 0.0.0.0,在这种情况下,Envoy 将在端口 10000 上进行监听。

下面是定义监听器的配置:

static_resources:listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 10000 }
1.3 过滤器

通过 Envoy 监听传入的流量,下一步是定义如何处理这些请求。每个监听器都有一组过滤器,并且不同的监听器可以具有一组不同的过滤器。

在我们这个示例中,我们将所有流量代理到 baidu.com,配置完成后我们应该能够通过请求 Envoy 的端点就可以直接看到百度的主页了,而无需更改 URL 地址。

过滤器是通过 filter_chains 来定义的,每个过滤器的目的是找到传入请求的匹配项,以使其与目标地址进行匹配:

static_resources:listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 10000 }filter_chains:- filters:- name: envoy.http_connection_managerconfig:stat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match: { prefix: "/" }route: { host_rewrite: www.baidu.com, cluster: service_baidu }http_filters:- name: envoy.router

该过滤器使用了 envoy.http_connection_manager,这是为 HTTP 连接设计的一个内置过滤器:

a. stat_prefix:为连接管理器发出统计信息时使用的一个前缀。
b. route_config:路由配置,如果虚拟主机匹配上了则检查路由。在我们这里的配置中,无论请求的主机域名是什么,route_config 都匹配所有传入的 HTTP 请求。
c. routes:如果 URL 前缀匹配,则一组路由规则定义了下一步将发生的状况。/ 表示匹配根路由。
d. host_rewrite:更改 HTTP 请求的入站 Host 头信息。
e. cluster: 将要处理请求的集群名称,下面会有相应的实现。
f. http_filters: 该过滤器允许 Envoy 在处理请求时去适应和修改请求。

1.4 集群

当请求于过滤器匹配时,该请求将会传递到集群。下面的配置就是将主机定义为访问 HTTPS 的 baidu.com 域名,如果定义了多个主机,则 Envoy 将执行轮询(Round Robin)策略。配置如下所示:

static_resources:listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 10000 }filter_chains:- filters:- name: envoy.http_connection_managerconfig:stat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match: { prefix: "/" }route: { host_rewrite: www.baidu.com, cluster: service_baidu }http_filters:- name: envoy.routerclusters:- name: service_baiduconnect_timeout: 0.25stype: LOGICAL_DNSdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINhosts: [{ socket_address: { address: www.baidu.com, port_value: 443 }}]tls_context: { sni: baidu.com }
1.5 管理

最后,还需要配置一个管理模块:

admin:access_log_path: /tmp/admin_access.logaddress:socket_address: { address: 0.0.0.0, port_value: 9901 }

上面的配置定义了 Envoy 的静态配置模板,监听器定义了 Envoy 的端口和 IP 地址,监听器具有一组过滤器来匹配传入的请求,匹配请求后,将请求转发到集群。

2 开启代理

配置完成后,可以通过 Docker 容器来启动 Envoy,将上面的配置文件通过 Volume 挂载到容器中的 /etc/envoy/envoy.yaml 文件。

然后使用以下命令启动绑定到端口 80 的 Envoy 容器:

$docker run --name=envoy -d \-p 80:10000 \-v $(pwd)/manifests/envoy.yaml:/etc/envoy/envoy.yaml \envoyproxy/envoy:latest

启动后,我们可以在本地的 80 端口上去访问应用 curl localhost 来测试代理是否成功。同样我们也可以通过在本地浏览器中访问 localhost 来查看:

可以看到请求被代理到了 baidu.com,而且应该也可以看到 URL 地址没有变化,还是 localhost.

3 管理视图

Envoy 提供了一个管理视图,可以让我们去查看配置、统计信息、日志以及其他 Envoy 内部的一些数据。

我们可以通过添加其他的资源定义来配置 admin,其中也可以定义管理视图的端口,不过需要注意该端口不要和其他监听器配置冲突。

admin:access_log_path: /tmp/admin_access.logaddress:socket_address: { address: 0.0.0.0, port_value: 9901 }

当然我们也可以通过 Docker 容器将管理端口暴露给外部用户。上面的配置就会将管理页面暴露给外部用户,当然我们这里仅仅用于演示是可以的,如果你是用于线上环境还需要做好一些安全保护措施,可以查看 Envoy 的相关文档 了解更多安全配置。

要将管理页面也暴露给外部用户,我们使用如下命令运行另外一个容器:

docker run --name=envoy-with-admin -d \-p 9901:9901 \-p 10000:10000 \-v $(pwd)/manifests/envoy.yaml:/etc/envoy/envoy.yaml \envoyproxy/envoy:latest

运行成功后,现在我们可以在浏览器里面输入 localhost:9901 来访问 Envoy 的管理页面:

这篇关于基于 K8s/K3s 的 Envoy 入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830149

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

90、k8s之secret+configMap

一、secret配置管理 配置管理: 加密配置:保存密码,token,其他敏感信息的k8s资源 应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中容器 1.1、加密配置: secret: [root@master01 ~]# kubectl get secrets ##查看加密配置[root@master01 ~]# kubectl get se

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟