• 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
    
    • 1
    • 2
    • 3

    前面的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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    具体的每个属性的含义,请参考我前面的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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    对于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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    基于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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    我们重点看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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这里对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。

  • 相关阅读:
    unity内存优化之AB包篇(微信小游戏)
    易动纷享--测试实习生视频面试
    django configparser.NoSectionError: No section: ‘Samples
    猿创征文丨赶紧进来看看!!!你可能都不清楚的三种变量和零值比较
    【Linux】10 -- Linux下的shell编程(二)
    【工具与中间件】Linux-Docker-Redis
    MessagePack 和System.Text.Json 序列化和反序列化对比
    NumPy入门文档
    Docker部署青龙面板
    上周热点回顾(12.18-12.24)
  • 原文地址:https://blog.csdn.net/a1023934860/article/details/125425531