Envoy mesh 教程

本文是在 Kubernetes 集群中,使用 Envoy 来做 mesh,来为一个简单的使用 Python 编写的 Flask 应用程序做反向代理和负载均衡。

:本教程中的示例来自 envoy-steps,本文中使用的所有的代码和 YAML 配置见 envoy-tutorial

Envoy Mesh架构图

前提条件

使用 kubernetes-vagrant-centos-cluster 部署 kubernetes 集群,只要启动集群并安装了 CoreDNS 即可,无须安装其他插件。

部署应用

我们首先将应用部署到 Kubernetes 中。

部署 postgres 数据库。

创建 usersvc 镜像。

部署 usersvc。

查看 uservc 的 ClusterIP 地址。

进到 node1 中访问该服务,因为我们要访问的是 ClusterIP,在我们自己的电脑上是无法直接访问的,所以进到虚拟机中操作。

尝试添加一个名为 Alice 的用户。

将会看到类似如下的输出。

尝试再添加一个名为 Bob 的用户。

将会看到类似如下的输出。

当应用部署完毕后,我们该部署 edge envoy 了。

部署 edge envoy

部署 edge envoy 的方式很简单,执行下面的命令。

现在访问 edge envoy 是就可以路由到 usersvc 上的,当然直接访问 usersvc 也是可以的。

我们看下 edge-envoy 的 envoy 配置文件定义。

客户端访问 edge-envoyClusterIP:8000/user/health 就可以检查节点的健康状况。

部署 usersvc2

删除原来的 usersvc,部署第二版 usersvc2,它与原来的 usersvc 唯一不同的地方是在 entrypoint 中集成了 envoy,查看 Dockerfile 中指定的 entrypoint.sh 的内容便可知。

首先删除老的 usersvc

使用下面的命令部署 usersvc2,它仍然使用 usersvc 这个 service 名称。

Envoy 以 out-of-process 的方式运行,对应用进程没有侵入性,也可以使用 sidecar 的方式运行,让 envoy 与 应用容器运行在同一个 pod 中。

增加 usersvc2 的实例个数。

此时我们有 3 个 usersvc 实例,现在通过 edge-envoyClusterIP:8000/user/health 检查节点的健康状况时,是不是会轮询的访问到后端的的 usersvc2 的实例呢?

我们当初在 edge-nodeenvoy.json 中配置过 cluster 的,其中指定了 lb_typeround_robin

而且该 serivce_name 也可以被 DNS 正确解析。

答案是否定的。

虽然通过 DNS 可以正确的解析出 serivce 的 ClusterIP,但是负载均衡不再通过 kube-proxy 实现,所以不论我们访问多少次 edge-envoy 永远只能访问到一个固定的后端 usersvc

服务发现服务 - SDS

Kubernetes 中的 DNS 可以发现所有 serivce 的 ClusterIP,但是 DNS 中不包括所有 endpoint 地址,我们需要一个 SDS(服务发现服务)来发现服务的所有的 endpoint,我们将修改 lb_type,使用 sds 替代 strict_dns

执行下面的命令部署 SDS。

因为在添加了 SDS 之后需要修改 edge-envoy 中的 envoy.josn 配置,在 clusters 字段中增加 sds 信息,我们将所有的配置都写好了,重新打包成了镜像,我们需要先删除之前部署的 edge-envoy

部署新的 edge-envoy2

连续访问 usersvc 12 次看看输出结果如何。

我们可以看到类似如下的输出:

再查看下 usersvc 服务的所有 pod 的 IP 地址。

我们看到 round-robin 负载均衡生效了。

参考

最后更新于