本章介绍在服务网格中,如何配置入向和出向的边缘网关功能。
操作场景
在实际使用中,服务经常会有南北向流量的需求,如服务需要对外暴露,接收外部请求(入向流量),并且需要向外部服务发起请求(出向流量)。
部署服务
部署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定义。