如何使用 Istio 创建内部网关?



目前,我们成功地将 Istio 设置为创建几个入口网关,如 api.example.com 和 app.example.com,这些网关使用目的地规则等将流量路由到各种服务。除此之外,我们很乐意将 Istio 的功能用于仅限内部的 API,但我们不确定如何设置这样的东西。是否可以使用 Istio 的网关和虚拟服务 CRD 在不退出集群的情况下路由流量?如果是这样,我们将如何设置它?

Istio 网关用于进入集群的流量或离开集群的流量。对于群集内的流量,不应使用入口/出口网关。如果您在集群中配置 Istio 来创建服务网格,那么您将获得所有这些好处,因为 Istio 将为集群内的所有服务注入一个挎斗特使。正是这种边车提供了网格的所有优点。当您使用入口或出口网关时,您实际上是在使用部署为入口或出口 gatway 的挎斗。您可以在没有网关的情况下使用虚拟服务、目标规则、服务条目、挎斗等,因为此时您将使用与应用程序 Pod 一起部署的挎斗。

下面是虚拟服务的示例:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v3

虚拟服务主机名可以是 IP 地址、DNS 名称,也可以是隐式或显式解析为完全限定域名 (FQDN( 的短名称(例如 Kubernetes 服务短名称(,具体取决于平台。您还可以使用通配符 ("*"( 前缀,以便为所有匹配的服务创建一组路由规则。虚拟服务主机实际上不必是 Istio 服务注册表的一部分,它们只是虚拟目的地。这使您可以对网格内没有可路由条目的虚拟主机的流量进行建模

我会在Arghya Sadhu的回答中添加一些东西。

我认为我在另一篇文章中的示例可以回答您的问题,特别是虚拟服务网关和主机。此示例需要额外的目标规则,因为我们有子集,这些子集在此处标记到nginx的正确子集的路由,并且它们在目标规则中定义。

因此,作为一个例子,我会调用诸如内部网关/a或内部网关/b之类的东西,它们将被路由到服务A或B

我做了这样的东西

2 个 nginx pod -> 2 个服务 -> 个虚拟服务

部署1

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx1
spec:
selector:
matchLabels:
run: nginx1
replicas: 1
template:
metadata:
labels:
run: nginx1
app: frontend
spec:
containers:
- name: nginx1
image: nginx
ports:
- containerPort: 80
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello nginx1 > /usr/share/nginx/html/index.html"]

部署2

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx2
spec:
selector:
matchLabels:
run: nginx2
replicas: 1
template:
metadata:
labels:
run: nginx2
app: frontend2
spec:
containers:
- name: nginx2
image: nginx
ports:
- containerPort: 80
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello nginx2 > /usr/share/nginx/html/index.html"]

服务1

apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: frontend
spec:
ports:
- port: 80
protocol: TCP
selector:
app: frontend

服务2

apiVersion: v1
kind: Service
metadata:
name: nginx2
labels:
app: frontend2
spec:
ports:
- port: 80
protocol: TCP
selector:
app: frontend2

虚拟服务

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginxvirt
spec:
hosts:
- nginx.default.svc.cluster.local
- nginx2.default.svc.cluster.local
http:
- name: a
match:
- uri:
prefix: /a
rewrite:
uri: /
route:
- destination:
host: nginx.default.svc.cluster.local
port:
number: 80
- name: b
match:
- uri:
prefix: /b
rewrite:
uri: /
route:
- destination:
host: nginx2.default.svc.cluster.local
port:
number: 80

上述虚拟服务仅在网状网关内部工作。

您有 2 个匹配项用于2 个 nginx 服务。

root@ubu1:/# curl nginx/a
Hello nginx1
root@ubu1:/# curl nginx/b
Hello nginx2

我建议检查 istio 文档并阅读以下内容:

  • 网关

  • 虚拟服务

  • 目标规则

和 istio 示例:

  • 图书信息

  • httpbin

所以我可以编造一个实际上不存在的DNS名称或IP地址

我想你误会了,它一定存在,但不在网格中。例如,一些不在网格中的数据库,但您仍然可以使用,例如服务入口将其连接到网格。

在 istio 文档和整个外部服务文档中有维基百科的例子。

我希望它能帮助你。如果您还有其他问题,请告诉我。

最新更新