Loading
close

边缘网关

time 更新时间:2024-02-05 14:41:14

本章介绍在服务网格中,如何配置入向和出向的边缘网关功能。

操作场景

在实际使用中,服务经常会有南北向流量的需求,如服务需要对外暴露,接收外部请求(入向流量),并且需要向外部服务发起请求(出向流量)。

部署服务

部署v1和v2版本的deployment以及对应的service至集群

apiVersion: apps/v1
kind: Deployment
metadata:
  name: product-v2
  namespace: base
  labels:
    app: product
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: product
      version: v2
  template:
    metadata:
      labels:
        app: product
        version: v2
    spec:
      containers:
        - name: product
          image: nginx:1.25-alpine
          ports:
            - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: product-v1
  namespace: base
spec:
  replicas: 1
  selector:
    matchLabels:
      app: product
      version: v1
  template:
    metadata:
      labels:
        app: product
        version: v1
    spec:
      containers:
        - name: product
          image: nginx:1.25-alpine
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: product
  name: product
  namespace: base
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: product
  type: ClusterIP

绑定ingress(入向)

前提:istio-ingressgateway服务具有外部IP,能够被集群外访问。
通过Gateway定义服务对外暴露的域名:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: product-gateway
  namespace: base
spec:
  selector:
    istio: istio-ingressgateway
  servers:
  - hosts:
    - www.product.com
    port:
      name: http
      number: 80
      protocol: HTTP

如上所示,对外暴露的域名为www.product.com
使用VirtualService绑定Gateway,将流量导到product服务:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: product-vs
  namespace: base
spec:
  gateways:
  - product-gateway
  - mesh
  hosts:
  - www.product.com
  - product
  http:
  - route:
    - destination:
        host: product
        port:
          number: 80

上述配置中通过gateways字段指定product服务同时接收来自网关(product-gateway)和网格内部(mesh)的http请求,外部域名为www.product.com,内部域名为product(k8s服务名)。

将配置部署到集群,即可实现product服务对集群外暴露。

绑定egress(出向)

前提:EKS的coredns中配置了外部dns,能够解析外部域名。

product服务需要访问集群外网站,假设为www.baidu.com,为了统一出口,外部访问均通过egress统一处理,可以通过Gateway将www.baidu.com绑定到istio-egressgateway :

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: product-egressgateway
  namespace: base
spec:
  selector:
    istio: istio-egressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - www.baidu.com

使用VirtualService定义访问路由:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: product-vs-out
  namespace: base
spec:
  hosts:
  - www.baidu.com
  gateways: 
  - product-egressgateway
  - mesh
  http:
  - match:
    - gateways:
      - mesh
      port: 80
    route:
    - destination:
        host: istio-egressgateway.servicemesh.svc.cluster.local
        port:
          number: 80
  - match:
    - gateways:
      - product-egressgateway
      port: 80
    route:
    - destination:
        host: www.baidu.com
        port:
          number: 80

配置中将网格内(mesh)访问www.baidu.com的流量路由到了istio-egressgateway,流量到达istio-egressgateway时匹配product-egressgateway规则,通过coredns对域名进行解析,将流量路由到真实的外部后端。

注意:当前版本的meshConfig中没有开启REGISTRY_ONLY选项,故不需要额外配置ServiceEntry,后续版本如有变化,须同步新增ServiceEntry定义。

此篇文章对你是否有帮助?
没帮助
locked-file

您暂无权限访问该产品