k8s~envoy的部署

打印 上一主题 下一主题

主题 1048|帖子 1048|积分 3144

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
参考文档
envoy与后端应用关系图

当在Kubernetes中使用Envoy作为边缘代理时,通常会将Envoy部署为一个Sidecar容器,与后端服务共同运行在同一个Pod中。以下是一个简单的关系图示意:
  1.   +----------------------+
  2.   |       Kubernetes     |
  3.   |        Cluster       |
  4.   +----------|-----------+
  5.              |
  6.              |
  7.   +----------v-----------+
  8.   |                      |
  9.   |        Pod           |
  10.   |                      |
  11.   | +------------------+ |
  12.   | |      Envoy       | |
  13.   | +------------------+ |
  14.   | |   Sidecar Proxy  | |
  15.   | +--------|---------+ |
  16.   |          |           |
  17.   | +--------v---------+ |
  18.   | |   Backend App   | |
  19.   | +------------------+ |
  20.   |                      |
  21.   +----------------------+
复制代码
在这个示意图中,我们有一个运行在Kubernetes中的Pod,其中包含了Envoy和后端服务两个容器。Envoy作为Sidecar代理与后端服务一起运行,负责处理流量转发、负载均衡、安全策略等功能。后端服务则是实际提供业务功能的应用程序。
这种部署模式可以让Envoy直接与后端服务通信,而不需要对后端服务本身进行任何修改。同时,由于Envoy作为Sidecar容器与后端服务共享相同的网络命名空间,因此它可以轻松地监控和管理后端服务的流量。
构建envoy

在 Kubernetes 中使用 Envoy 作为负载均衡器通常涉及以下步骤:

  • 创建 Envoy 部署: 首先,你需要在 Kubernetes 中创建一个 Envoy 的 Deployment,这将运行 Envoy 代理的实例。你可以使用 YAML 文件定义 Deployment,确保在容器规范中将 Envoy 作为容器运行。
    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4.   name: envoy-deployment
    5. spec:
    6.   replicas: 1
    7.   selector:
    8.     matchLabels:
    9.       app: envoy
    10.   template:
    11.     metadata:
    12.       labels:
    13.         app: envoy
    14.     spec:
    15.       containers:
    16.           - name: envoy
    17.             image: envoyproxy/envoy
    18.             ports:
    19.              - name: http
    20.                containerPort: 80 #envoy路由的端口
    21.              - name: envoy-admin
    22.                containerPort: 9901 #envoy后台管理系统端口
    23.             volumeMounts:
    24.              - name: envoy-config-101
    25.                mountPath: "/etc/envoy"
    26.                readOnly: true
    27.       volumes:
    28.        - name: envoy-config-101
    29.          configMap:
    30.            name: envoy-config-101
    31.            
    复制代码
  • 创建 Envoy 服务: 为 Envoy 创建一个 Kubernetes Service,以便其他应用程序可以通过该 Service 连接到 Envoy 负载均衡器。这通常是一个 ClusterIP Service。
    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4.   name: envoy-service
    5. spec:
    6.   selector:
    7.     app: envoy
    8.   type: NodePort
    9.   ports:
    10.   - protocol: TCP
    11.     port: 9901
    12.     name: http
    13.   - protocol: TCP
    14.     port: 80
    15.     name: admin
    复制代码
  • 配置 Envoy: 你需要提供 Envoy 配置文件,以定义路由、后端服务和其他负载均衡规则。通常,你会使用 ConfigMap 来存储 Envoy 配置。
  • Sidecar 模式: 另一种常见的做法是将 Envoy 作为应用容器的 Sidecar 容器部署,这使得每个应用容器都有一个附加的 Envoy 容器,用于处理负载均衡。
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4.   name: my-pod
    5. spec:
    6.   containers:
    7.   - name: my-app
    8.     image: my-app-image
    9.     ports:
    10.     - containerPort: 8080
    11.   - name: envoy
    12.     image: envoyproxy/envoy
    13.     ports:
    14.     - containerPort: 80
    复制代码
  • 配置服务发现: 为了让 Envoy 知道要负载均衡的后端服务,你需要配置服务发现。这通常包括使用 Kubernetes 的服务名和端口。


  • 注意envoy景象的版本对应的端口可能不同

    • envoyproxy/envoy:v1.21-latest,对应10000端口
    • envoyproxy/envoy 对应80端口

  • envoy.yaml代码如下
  1. admin:
  2.   access_log_path: /tmp/admin_access.log
  3.   address:
  4.     socket_address: { address: 0.0.0.0, port_value: 9901 } #envoy后台系统的端口
  5. static_resources:
  6.   listeners:
  7.   - name: listener_0
  8.     address:
  9.       socket_address: { address: 0.0.0.0, port_value: 80 } #envoy路由的端口
  10.     filter_chains:
  11.     - filters:
  12.       - name: envoy.http_connection_manager
  13.         config:
  14.           stat_prefix: ingress_http
  15.           route_config:
  16.             name: local_route
  17.             virtual_hosts:
  18.             - name: local_service
  19.               domains: ["*"]
  20.               routes:
  21.               - match: { prefix: "/" }
  22.                 route: {cluster: myapp_cluster, timeout: 60s }
  23.           http_filters:
  24.           - name: envoy.router
  25.   clusters:
  26.   - name: myapp_cluster
  27.     connect_timeout: 0.25s
  28.     type: STRICT_DNS
  29.     dns_lookup_family: V4_ONLY
  30.     lb_policy: LEAST_REQUEST
  31.     hosts: #具体应用myapp的地址和端口
  32.     - socket_address:
  33.         address: 192.168.1.3
  34.         port_value: 30021
  35.     - socket_address:
  36.         address: 192.168.1.4
  37.         port_value: 30022
  38.     # 健康检查配置,以下配置之后,会把不在httpstatus不在200~399之间的服务离线,不让它请求流量
  39.     health_checks:
  40.       - timeout: 1s
  41.         interval: 10s
  42.         unhealthy_threshold: 3
  43.         healthy_threshold: 2
  44.         http_health_check:
  45.           path: "/"
  46.           expected_statuses:
  47.             start: 200
  48.             end: 399
复制代码

  • kubectl create configmap envoy-config-101 --from-file=envoy.yaml

  • 监控和健康检查: 可以配置 Envoy 以执行健康检查,并监控后端服务的可用性。这有助于确保只有健康的实例接收流量。
  • 部署应用: 最后,将你的应用部署到 Kubernetes 集群,并确保它们使用 Envoy 服务进行负载均衡。
这是一个高级概述,实际配置和部署取决于你的具体需求和环境。你可能需要创建适合你应用程序的 Envoy 配置文件,定义路由规则,配置健康检查等。同时,Envoy 提供了丰富的文档,可以帮助你深入了解如何在 Kubernetes 中使用它作为负载均衡器。
envoy健康检查配置

Envoy可以使用健康检查来确定服务实例的可用性,如果服务实例被标记为不健康,Envoy将停止将流量路由到该实例。以下是如何配置Envoy来执行健康检查的一般步骤:

  • 定义健康检查配置:
    在Envoy的配置文件中,你需要定义健康检查的配置。通常,这是通过cluster配置完成的,其中包括health_checks字段。
  1. static_resources:
  2.   clusters:
  3.     - name: my_service
  4.       connect_timeout: 0.25s
  5.       type: STATIC
  6.       hosts:
  7.         - socket_address:
  8.             address: 192.168.1.3
  9.             port_value: 30021
  10.         - socket_address:
  11.             address: 192.168.1.4
  12.             port_value: 8080
  13.       health_checks:
  14.           - timeout: 1s
  15.             interval: 10s
  16.             unhealthy_threshold: 3
  17.             healthy_threshold: 2
  18.             http_health_check:
  19.               path: "/"
  20.               expected_statuses:
  21.                 start: 200
  22.                 end: 399
复制代码
在上述示例中,我们为名为my_service的集群定义了健康检查。它将定期发送HTTP请求检查每个服务实例的健康状况。

  • 指定健康检查协议:
    你可以根据需要选择适当的健康检查协议,如HTTP、TCP或gRPC。在上述示例中,我们使用了HTTP健康检查。
  • 定义健康检查路径和间隔:
    在健康检查配置中,你需要指定要发送的健康检查请求路径和检查的时间间隔。这些参数可以根据你的需求进行配置。
  • 处理失败:
    如果健康检查失败,Envoy将标记服务实例为不健康,并停止将流量路由到该实例。你可以配置失败的阈值、重试次数等参数。
  • 监控和日志:
    你可以使用监控和日志工具来监视健康检查的结果,以便了解服务实例的状态和健康情况。
通过这些配置,Envoy将根据健康检查的结果自动管理流量路由,确保不健康的服务实例不再接收流量,从而提高系统的稳定性和可用性。
hosts和load_assignment的使用场景

在Envoy的配置中,hosts 和 load_assignment 是两个不同的部分,用于定义集群的成员和它们的负载分配。
hosts

hosts 部分用于直接指定集群的成员(后端服务的 IP 地址和端口)。
你需要显式地列出每个后端服务的 IP 地址和端口。
这是一种静态定义方式,通常用于管理一组已知的后端服务,其中的成员不会经常变化。

  • 示例:
  1. hosts:
  2.   - socket_address:
  3.       address: 192.168.1.1
  4.       port_value: 8080
  5.   - socket_address:
  6.       address: 192.168.1.2
  7.       port_value: 8080
复制代码
load_assignment

load_assignment 部分用于更动态地定义集群的成员,通常与服务发现系统集成,如Consul、etcd、ZooKeeper等。
它不需要显式列出每个后端服务,而是通过服务发现来动态获取成员信息。
这是一种灵活的方式,适用于环境中服务实例的动态变化,因为它能够自动感知新的服务实例并将它们添加到集群。

  • 示例:
  1.     load_assignment:
  2.       cluster_name: my_cluster
  3.       endpoints:
  4.         - lb_endpoints:
  5.             - endpoint:
  6.                 address:
  7.                   socket_address:
  8.                     address: my-service.example.com
  9.                     port_value: 8080
  10.             - endpoint:
  11.                 address:
  12.                   socket_address:
  13.                     address: my-service2.example.com
  14.                     port_value: 8080
复制代码
总之,hosts 是一种手动定义后端服务的静态方式,而 load_assignment 则适用于与服务发现系统集成,以便更动态地管理集群成员。选择哪种方式取决于你的环境和需求。
cluster.type配置项

在 Envoy 中,clusters 是用于定义与后端服务通信的配置部分。clusters 可以采用不同的类型,包括 STRICT_DNS 和 static:

  • STRICT_DNS:

    • STRICT_DNS 是一种 Cluster 类型,它允许 Envoy 根据 DNS 查询来动态地解析后端服务的主机名。
    • 这意味着你可以使用主机名来配置后端服务,而不需要为每个后端服务器指定静态 IP 地址或端口。
    • Envoy将根据DNS查询的结果动态更新后端服务器的地址。

  • static:

    • static 是另一种 Cluster 类型,它允许你明确地定义后端服务的 IP 地址和端口。
    • 这意味着你需要手动指定后端服务器的详细信息,包括 IP 地址和端口。
    • 这种配置适用于静态集群,其中后端服务器的地址不会经常更改。

选择使用哪种 Cluster 类型取决于你的应用需求。如果你的后端服务的 IP 地址可能会发生变化,或者你想要动态地扩展或缩减后端服务,那么STRICT_DNS 是一个不错的选择。而如果你的后端服务是静态的,并且你愿意手动配置它们的 IP 地址和端口,那么 static 可能更适合。
总之,Cluster 配置允许你有效地管理 Envoy 与后端服务之间的通信,无论是通过 DNS 动态解析还是通过静态配置。
clusters.lb_policy配置项

在 Envoy 的 Cluster 配置中,lb_policy 是负载均衡策略的设置,用于决定如何分发请求给后端服务的成员。以下是一些可能的 lb_policy 选项以及它们的含义:

  • round_robin(默认值):

    • 这是最常见的负载均衡策略。
    • 它按照顺序逐个将请求分发给后端服务的成员,确保每个成员都接收到大致相等数量的请求。

  • least_request

    • 这个策略会将请求分发给当前具有最少请求的后端服务成员。
    • 这对于负载不均衡的情况非常有用,可以确保将请求发送到负载较低的服务器。

  • ring_hash

    • 这个策略使用哈希函数来将请求映射到后端服务器。
    • 这可以确保特定的请求将一致地路由到相同的后端服务器,适用于会话保持等情况。

  • random

    • 这个策略会随机地选择后端服务器来处理请求。
    • 这种策略在某些特定的场景下可能有用,但通常不太常见。

  • original_dst

    • 这个策略基于请求中的原始目标地址来路由请求。
    • 它适用于代理透明性或 L4/L3 代理的情况,通常在 TCP/UDP 代理中使用。

选择合适的负载均衡策略取决于你的应用需求和后端服务的特性。例如,如果后端服务的负载不均衡,你可以选择least_request。如果需要会话保持,可以使用ring_hash。通常情况下,round_robin 是一种简单且有效的策略,适用于多数情况。
注意,具体的负载均衡策略的可用性可能取决于 Envoy 版本,所以确保查阅与你所使用的 Envoy 版本相关的文档以获取详细信息。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表