istio系列:番外一 外网到内网访问配置实例

由于istio使用envoy进行流量转发、控制的操作,服务A访问服务B时,A将数据发出,Envoy拦截然后根据规则进行转发到B服务,B服务上的Envoy拦截判断然后发送给B。从这里我们可以看到Envoy在通讯中起到了巨大的作用,但是我们想象一下如果一个服务没有Envoy那又该怎么样与有Envoy的服务进行通讯那?

在istio中,给我们创建了两个服务,IngressGateway与EgressGateway,这两个服务就是用来完成外部到内部、内部到外部访问的功能。

接下来让我们讲解一下IngressGateway外部到内部的访问实例。
请求流程配置图

1.配置Host

由于我们使用Web实例实现外部到内部的访问,所以这里我们需要对主机host进行配置。

vim /etc/hosts
添加上
10.1.180.207 jiofenaivni.com

前面的IP地址,就是ingressGateway 的serviceIP地址,我们可以通过kubectl get svc -n istio-system 查找到。后面就是我们要访问的域名(该域名没有任何含义就是随便输入的)

2.Gateway

配置完成host后,让我们创建一个gateway.yaml文件创建gateway资源

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: nginx-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "jiofenaivni.com"

具体的每个属性的含义,请参考我前面的isito系列文章。

其中spec.servers.port.number 设置监听的端口号,这里设置80,在访问的时候我们只需要通过域名进行通讯而不需要添加80端口了。

spec.servers.hosts 这里需要添加上我们要访问的域名地址,这个作用是绑定请求的域名地址

3.Virtual Service

创建完成网关后,已经可以将外部流量获取到,但是还不能进行路由转发操作,这就需要virtual service出场了

对于目标地址、我们不仅可以使用istio里的服务地址,还可以使用k8s原生svc资源

基于原生k8s service进行访问

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - jiofenaivni.com
  - nginx-svc
  gateways:
  - nginx-gateway
  - mesh
  http:
  - route:
    - destination:
        host: nginx-svc
        port:
          number: 8081

对于spec.hosts就是对请求地址进行匹配,如果是啧使用该路由规则。这里我们可以看到添加了我们需要的域名

gateways显示配置了需要使用的gateways、我们看到下面多出了一个mesh,这个的含义是该路由规则不仅使用与内外网、还适用于内与内的网络。

http.route.destination.host这里我们设置的是k8s原生的service下面是service的yaml,下面的port就是serivce暴露出来的port

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  selector:
      name: test-nginx
  ports:
  - name: http
    port: 8081
    protocol: TCP
    targetPort: 80

基于DestinationRule的配置

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - jiofenaivni.com
  - nginx-svc
  gateways:
  - nginx-gateway
  - mesh
  http:
  - route:
    - destination:
        host: nginx-svc
        subset: v1

我们重点看http.route.destination.subset,该值绑定了DestinationRule,当请求被路由到达主机后,就会使用绑定的DestinationRule里的配置进行操作,比如负载均衡等。

下面是DestinationRule的配置

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: nginx-desrule
spec:
  host: nginx-svc
  subsets:
  - name: v1
    labels:
      version: v1

这里对svc是nginx-svc的所有pod进行绑定,然后根据pod中的labes.version=v1进行过滤。

当流量传来后(已经过滤完)根据负载均衡、连接池等配置对流量进行操作。

virtual serivce与DestinationRule他俩是什么关系那?为什么virtual serivce中有subset,而DestinationRule也有subset字段那?

首先virtual service提供了路由、请求过滤的功能,那么我们就可以猜想一下,virtual service是在请求刚进入内网的阶段触发的规则,这时候应该选择适合的POD,而subsets也是选择pod的一种,这种与label标签过滤类似。

DestinationRule提供了、负载均衡,连接池等配置,该配置不过滤POD只是将请求分散开来,所以我们可以明白它应该是工作在virtual service阶段的后面。

其实virtual service中的subsets配置就是用到DestinationRule里的subsets。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值