第三十章 九析带你轻松完爆 Istio - 网关 gateway 实例

系列文章:


总目录索引:九析带你轻松完爆 istio 服务网格系列教程

目录

1 前言

2 邀约

3 Istio 网关介绍

4 Istio 网关实例资源

    4.1 k8s 服务资源

    4.2 k8s deployment 资源

    4.3 Istio virtual service 资源

    4.4 Istio gateway 资源

5 istio-ingressgateway 配置

    5.1 修改 istio-ingressgateway 服务类型

    5.2 修改 istio-ingressgateway 网络命名空间配置

        5.2.1 开启 istio-ingressgateway 容器 80、443 端口

        5.2.2 将容器网络空间绑定宿主机网络空间

6 部署 Istio 资源

7 访问 istio 网关

8 总结


1 前言

        如果你对博客有任何疑问,请告诉我。

1.png


2 邀约

        你可以从 b 站搜索 “九析”,获取免费的、更生动的视频资料:

clipboard2.png


3 Istio 网关介绍

        在前面的 Istio 系列文章中轻松完爆了 Virtual Service、Destination Rule 等,同时也介绍了网格的概念(Service Mesh,资源被 Istio 注入,在 Pod 中创建并运行了一个 Istio-proxy 容器,该容器内部运行 Envoy 代理)。在本小节将轻松完爆 Istio 网关(gateway)。

        Istio 使用网关来管理网格边缘流量(即:入站和出站流量),明确地说是 istio-ingressgateway 管理网格的入口流量,istio-egressgateway 管理网格的出口流量。在以前的章节中,我们了解网格的流量只所以可被管理,是因为资源被 istio 注入后在 Pod 中创建并运行了 istio-proxy 容器的缘故。而网关流量管理的本质也基于同样道理,唯一不同的是 istio-ingressgateway 和 istio-egressgateway 运行时就是一个 istio-proxy 容器,即独立的 Envoy 代理,而不是与 pod 一起运行的 sidecar Envoy 代理。

        与其他控制进入系统的流量机制(例如:K8S Ingress API )不同,Istio 网关充分利用了 Istio 流量路由的功能和灵活性。因为 Istio 的网关资源仅配置 4-6 层负载平衡属性,例如要公开的 port 和 tls 设置等,而将 L7 层(即应用层)流量路由使用 Istio 虚拟服务(virtual service)绑定网关来实现,这样的一番神操作就可以像管理 Istio 网格中的任何其他数据平面流量一样,来管理网关流量。

        k8s ingress 资源如下图所示:

spacer.gifclipboard3.png

        由上图可知,在 Ingress 层直接就实现了流量管理。

        istio gateway 资源如下图所示:

spacer.gifclipboard4.png

        由上图可知,istio gateway 并不像 k8s ingress 一样直接在网关层实现流量路由,而是通过 virtual service 绑定到网关的机制实现流量路由,这样的方式就像将 virtual service 跟 gateway 解耦一样,大家各司其职。gateway 的作用就是分流,而 virtual service 的作用就是将分流来的流量进行管理。

        virtual service 资源如下图所示:

spacer.gifclipboard5.png


4 Istio 网关实例资源

        该实例需要如下四个资源文件,前两个资源是 Istio 专有的,后两个是 k8s 层面的:

jiuxi-gw.yaml # 网关资源

jiuxi-vs.yaml # 虚拟服务资源

jiuxi-svc.yaml # k8s 服务资源

jiuxi-deploy.yaml # k8s deployment 资源

4.1 k8s 服务资源

spacer.gifclipboard6.png

4.2 k8s deployment 资源

spacer.gifclipboard7.png

4.3 Istio virtual service 资源

spacer.gifclipboard8.png

4.4 Istio gateway 资源

spacer.gifclipboard9.png

        自此,整个网关运行需要的资源文件已经编写完毕。


5 istio-ingressgateway 配置

5.1 修改 istio-ingressgateway 服务类型

        默认情况下,istio-ingressgateway 的 k8s 服务类型是 LoadBalancer,因为 LoadBalancer 服务类型一般针对的是云服务商,所以使用基于 NodePort 的 k8s 服务方式。

        使用如下命令修改 istio-ingressgateway 服务类型:

kubectl patch svc -n istio-system istio-ingressgateway -p '{"spec": {"type": "NodePort"}}'

5.2 修改 istio-ingressgateway 网络命名空间配置

5.2.1 开启 istio-ingressgateway 容器 80、443 端口

        使用 kubectl edit deployment -n istio-system istio-ingressgateway 指令编辑资源配置,添加 istio-proxy 容器对外服务端口 80 和 443,截图如下所示:

spacer.gifclipboard10.png

5.2.2 将容器网络空间绑定宿主机网络空间

        执行此步是因为 istio gateway 资源指定名为 jiuxi-gw 的 host 端口为 80,而上面 istio-ingressgateway 的 NodePort 服务端口默认只能处于 30000 ~ 32767 之间,所以基于“jiuxi-gw:NodePort”方式是无法访问到 istio gateway 的。如果要直接通过 istio gateway 访问,需要开放 istio-ingressgateway pod 的 hostNetwork 配置项:

        使用 kubectl edit deployment -n istio-system istio-ingressgateway 指令编辑资源配置:

spacer.gifclipboard11.png

        修改完毕后,执行如下命令查看 istio-ingressgateway pod 所在宿主机 IP:

spacer.gifclipboard12.png

        ssh 登录宿主机 IP(本人是 10.110.101.203),执行如下指令验证是否宿主机开启了 80 端口:

spacer.gifclipboard13.png


6 部署 Istio 资源

        执行如下语句部署前面创建的 4 个 Istio 资源:

kubectl apply -f .

        执行结果如下图所示:

spacer.gifclipboard14.png


7 访问 istio 网关

        随便找一台虚拟机,编辑 /etc/hosts 文件,添加 istio-ingressgateway pod 所在主机映射:

spacer.gifclipboard15.png

        映射内容如下:

10.110.101.203 jiuxi.gw.org

        使用 curl 命令行访问 jiuxi.gw.org,发现基于 gateway 的流量管理已经生效(即:负载均衡权重为 50 - 50)。


8 总结

        在 istio 中,有关 istio-ingressgateway、gateway、virtual service 和 destination rule 之间的关系很容易让大家引起混淆。其实你不妨这么来理解:

        istio-ingressgateway 作用就像飞机场的出口,这里承载了所有的流量;gateway 作用就像旅行社,起到了分流的作用;virtual service 指旅行社的导游,起到了对分流后的流量进行管理和路由的作用;而 destination rule 就像导游指派的大巴一样,将 vs 的流量路由到真正的地方去。

        自此,九析带你们轻松完爆了 Istio 的 gateway。

猜你喜欢

转载自blog.51cto.com/14625168/2496291