Istio 入门(七):出入口网关 您所在的位置:网站首页 网关入口网址 Istio 入门(七):出入口网关

Istio 入门(七):出入口网关

2024-06-29 22:34| 来源: 网络整理| 查看: 265

本教程已加入 Istio 系列:https://istio.whuanle.cn

5,出入口网关

Istio 可以管理集群的出入口流量,当客户端访问集群内的应用时, Istio 可以将经过 istio-ingressgateway 的流量实现负载均衡和熔断等一系列功能。

可是,如果集群内的一个应用要访问 google.com ,那么我们可以给内部所有请求了 google.com 的流量设置负载均衡吗?答案是可以,Istio 提供了 istio-egressgateway 实现这种功能。因为 Pod 中的容器要访问网络时,会被 Envoy 拦截,Envoy 可以很容易地分析这些请求,然后通过一系列手段影响着请求的行为。

在本章中,将会简单说一下 istio-ingressgateway 和 istio-egressgateway。

istio-ingressgateway

入口网关指的是从外部经过 istio-ingressgateway 流入集群的流量,需要创建 Gateway 绑定流量。

关于 istio-ingressgateway 经过前面几章的学习,大家应该不陌生了。

istio-ingressgateway 由 Pod 和 Service 组成。 istio-ingressgateway 本身就是一个网关应用,你可以把它当作 Nginx、Apisix、Kong ,你可以从各种各种网关应用中找到与 istio-ingressgateway 类似的概念。

image-20230526194223740image-20230526194223740image-20230526194154234image-20230526194154234

作为一个应用,它需要对外开放一些端口,只有当流量经过这些端口时, istio-ingressgateway 才会起作用。为了在 Kubernetes 中暴露端口, istio-ingressgateway 还有一个 Service 对象。

image-20230526194139225image-20230526194139225

有了 istio-ingressgateway 之后,我们可以通过 Istio Gateway 监控一些域名或IP,然后暴露集群内部的服务 。

Gateway 的概念跟 Nginx 有很多相似之处。

比如从配置上看, Gateway 跟 Nginx 如果要监控某个入口流量,它们的配置如下:

Nginx:

代码语言:javascript复制server { listen 80; server_name example.org www.example.org; #... }

Gateway:

代码语言:javascript复制 servers: - port: number: 80 name: http protocol: HTTP hosts: - example.org - www.example.org

这些配置指定了 Gateway 和 Nginx 只监控哪些流量。

紧接着,监控到指定入口的流量之后,需要将流量转发到集群内的应用中。

Nginx 可以直接在同一个配置文件里面设置:

代码语言:javascript复制server { listen 80; server_name example.org www.example.org; #... } location /some/path/ { proxy_pass http:/bookinfo:9080/; }

而 Gateway 需要使用 VirtualService 指定流量转发到哪里,并且 VirtualService 还可以进一步筛选入口地址。

代码语言:javascript复制spec: hosts: - "www.example.org" gateways: # 绑定 Gateway - mygateway http: route: - destination: host: bookinfo port: number: 9080

所以总结起来,Istio 的做法是 Gateway 监控入口流量,通过 VirtualService 设置流量进入的策略,并指向 Service。而 DestinationRule 则定义了流量流向 Pod 的策略。

部署服务

下面我们将使用 httpbin 服务作为示例,如何一步步配置在外部访问 httpbin 服务。

首先部署一个 httpbin 服务,这个 httpbin 服务很简单,包含了 Service 和 Deployment 。

httpbin.yaml

代码语言:javascript复制apiVersion: v1 kind: ServiceAccount metadata: name: httpbin --- apiVersion: v1 kind: Service metadata: name: httpbin labels: app: httpbin service: httpbin spec: ports: - name: http port: 8000 targetPort: 80 selector: app: httpbin --- apiVersion: apps/v1 kind: Deployment metadata: name: httpbin spec: replicas: 1 selector: matchLabels: app: httpbin version: v1 template: metadata: labels: app: httpbin version: v1 spec: serviceAccountName: httpbin containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin ports: - containerPort: 80代码语言:javascript复制kubectl -n bookinfo apply -f httpbin.yaml配置 Gateway

然后创建一个 Gateway ,指定监听哪些入口流量。

httpbin_gw.yaml

代码语言:javascript复制apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: httpbin-gateway spec: selector: istio: ingressgateway # use Istio default gateway implementation servers: - port: number: 80 name: http protocol: HTTP hosts: - "httpbin.s1.whuanle.cn" - "*"

这一步为了大家能够通过域名更加直观地了解 Gateway,大家可以修改 httpbin.s1.whuanle.cn 替换为自己的域名。 然后在自己的电脑中打开 C:\Windows\System32\drivers\etc\hosts 增加一条记录 ,将 IP 指向自己的服务器。

image-20230515193213923image-20230515193213923代码语言:javascript复制kubectl -n bookinfo apply -f httpbin_gw.yaml

现在,我们已经让 istio-ingressgateway 帮我们关注 httpbin.s1.whuanle.cn 这个地址,如果有人访问了 httpbin.s1.whuanle.cn,那么这个流量将会流入到 httpbin-gateway。

image-20230515190518804image-20230515190518804

接下来我们将要为 Gateway 配置服务地址,并配置外部允许访问的地址后缀。

配置 VistualService:

代码语言:javascript复制apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: httpbin spec: hosts: - "*" gateways: - httpbin-gateway http: - match: - uri: prefix: /status - uri: prefix: /delay route: - destination: port: number: 8000 host: httpbin

当 Gateway 和 VirtualService 端口只有一个时,不需要配置端口绑定。

代码语言:javascript复制kubectl -n bookinfo apply -f httpbin_vs.yaml

找到 istio-ingressgateway 对外暴露的端口。

代码语言:javascript复制kubectl get svc istio-ingressgateway -n istio-system16832877856741683287785674

httpbin 是一个 http 测试程序,我们可以通过使用 /status/{状态码} 获取对应的 http 请求状态。

例如:

image-20230505200437890image-20230505200437890image-20230505200444999image-20230505200444999image-20230515193314909image-20230515193314909image-20230515193301641image-20230515193301641

如果我们不希望这个服务被外界访问到,我们可以先把 /status 删除。

代码语言:javascript复制kubectl apply -f -


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有