美文网首页
Istio Ingress Gateway

Istio Ingress Gateway

作者: 程序员札记 | 来源:发表于2022-12-28 08:16 被阅读0次
    istio-gateways

    Istio 服务网格中的网关

    • 使用网关为网格来管理入站和出站流量,可以让用户指定要进入或离开网格的流量。
    • 使用网关为网格来管理入站和出站流量,可以让用户指定要进入或离开网格的流量。
    • 网关配置被用于运行在网格内独立 Envoy 代理中,而不是服务工作负载的应用 Sidecar 代理。

    Gateway 用于为 HTTP / TCP 流量配置负载均衡器,并不管该负载均衡器将在哪里运行。网格中可以存在任意数量的 Gateway,并且多个不同的 Gateway 实现可以共存。实际上,通过在配置中指定一组工作负载(Pod)标签,可以将 Gateway 配置绑定到特定的工作负载,从而允许用户通过编写简单的 Gateway Controller 来重用现成的网络设备。

    Gateway 只用于配置 L4-L6 功能(例如,对外公开的端口,TLS 配置),所有主流的 L7 代理均以统一的方式实现了这些功能。然后,通过在 Gateway 上绑定 VirtualService 的方式,可以使用标准的 Istio 规则来控制进入 Gateway 的 HTTP 和 TCP 流量。

    例如,下面这个简单的 Gateway 配置了一个 Load Balancer,以允许访问 host bookinfo.com 的 https 外部流量进入网格中:

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        app: my-ingress-gateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        hosts:
        - bookinfo.com
        tls:
          mode: SIMPLE
          serverCertificate: /tmp/tls.crt
          privateKey: /tmp/tls.key
    
    

    要为进入上面的 Gateway 的流量配置相应的路由,必须为同一个 host 定义一个 VirtualService(在下一节中描述),并使用配置中的 gateways 字段绑定到前面定义的 Gateway 上:

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
        - bookinfo.com
      gateways:
      - bookinfo-gateway # <---- bind to gateway
        http:
      - match:
        - uri:
            prefix: /reviews
        route:
        ...
    
    

    然后就可以为出口流量配置带有路由规则的虚拟服务。

    Gateway 配置信息

    Field Type Description Required
    servers Server[] 开放的服务列表
    selector map 通过这个Label来找到执行 Gateway 规则的 Envoy

    Server 配置信息

    Field Type Description Required
    port Port 服务对外监听的端口
    hosts string[] Gateway 发布的服务地址,是一个 FQDN 域名,可以支持左侧通配符来进行模糊查询
    tls TLSOptions TLS安全配置
    defaultEndpoint string 默认情况下,应将流量转发到的环回IP端点或Unix域套接字

    Port 配置信息

    Field Type Description Required
    number uint32 一个有效的端口号
    protocol string 所使用的协议,支持HTTP HTTPS GRPC HTTP2 MONGO TCP TLS.
    name string 给端口分配一个名称

    Server.TLSOptions 配置信息

    Field Type Description Required
    httpsRedirect bool 是否要做 HTTP 重定向
    mode TLSmode 在配置的外部端口上使用 TLS 服务时,可以取 PASSTHROUGH、SIMPLE、MUTUAL、AUTO_PASSTHROUGH 这 4 种模式
    serverCertificate string 服务端证书的路径。当模式是 SIMPLE 和 MUTUAL 时必须指定
    privateKey string 服务端密钥的路径。当模式是 SIMPLE 和 MUTUAL 时必须指定
    caCertificates string CA 证书路径。当模式是 MUTUAL 时指定
    credentialName string 用于唯一标识服务端证书和秘钥。Gateway 使用 credentialName从远端的凭证存储中获取证书和秘钥,而不是使用 Mount 的文件
    subjectAltNames string[] SAN 列表,SubjectAltName 允许一个证书指定多个域名
    verifyCertificateSpki string[] 授权客户端证书的SKPI的base64编码的SHA-256哈希值的可选列表
    verifyCertificateHash string[] 授权客户端证书的十六进制编码SHA-256哈希值的可选列表
    minProtocolVersion TLSProtocol TLS 协议的最小版本
    maxProtocolVersion TLSProtocol TLS 协议的最大版本
    cipherSuites string[] 指定的加密套件,默认使用 Envoy 支持的加密套件

    Server.TLSOptions.TLSmode 配置信息

    Name Description
    PASSTHROUGH 客户端提供的SNI字符串将用作VirtualService TLS路由中的匹配条件,以根据服务注册表确定目标服务
    SIMPLE 使用标准TLS语义的安全连接
    MUTUAL 通过提供服务器证书进行身份验证,使用双边TLS来保护与下游的连接
    AUTO_PASSTHROUGH 与直通模式相似,不同之处在于具有此TLS模式的服务器不需要关联的VirtualService即可从SNI值映射到注册表中的服务。目标详细信息(例如服务/子集/端口)被编码在SNI值中。代理将转发到SNI值指定的上游(Envoy)群集(一组端点)。
    ISTIO_MUTUAL 通过提供用于身份验证的服务器证书,使用相互TLS使用来自下游的安全连接

    Server.TLSOptions.TLSProtocol 配置信息

    Name Description
    TLS_AUTO 自动选择DLS版本
    TLSV1_0 TLS 1.0
    TLSV1_1 TLS 1.1
    TLSV1_2 TLS 1.2
    TLSV1_3 TLS 1.3

    Gateway配置要点

    • Gateway定义运行在网格边缘的负载均衡器,负责接收入站或出站的HTTP/TCP连接

      • 主要定义应该暴露到网格外部的端口、要使用的协议类型、以及SNI配置等
    • Gateway的定义主要通过如下两个关键字段

      • selector:Pod标签选择器,用于指定当前Gateway配置要附加到的Ingress Gateway Pod实例

        • Pod标签选择器,负责在为Istio部署的一到多个Ingress Gateway实例中完成Pod筛选

        • 仅符合选择器条件的Ingress Gateway实例才会添加该Gateway资源中定义的配置

      • server:开放的服务列表,即服务的访问入口,可通过port、hosts、defaultEndpoints和tls来定义;

        • port:服务对外发布的端口,即用于接收请求的端口;

        • hosts:Gateway发布的服务地址,通常是一个FQDN格式的域名,支持使用*通配符;

        • defaultEndpoint:默认后端;

        • tls:发布为HTTPS协议服务时与TLS相关的配置

    • 提示:Gateway资源仅定义了要暴露的访问入口,但流量接入到网格内部之后的路由机制,仍然需要由VirtualService资源进行定义;

    image

    Gateway

    1、hosts字段不接受非FQDN格式的字符串,但可以使 用“*”通配符

    2、gateway资源应该定义在目标ingressgateway Pod运行在名称空间

    image

    Gateway配置示例

    示例一

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: my-gateway
      namespace: some-config-namespace
    spec:
      selector:
        app: my-gateway-controller
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - uk.bookinfo.com
        - eu.bookinfo.com
        tls:
          httpsRedirect: true # sends 301 redirect for http requests
      - port:
          number: 443
          name: https-443
          protocol: HTTPS
        hosts:
        - uk.bookinfo.com
        - eu.bookinfo.com
        tls:
          mode: SIMPLE # enables HTTPS on this port
          serverCertificate: /etc/certs/servercert.pem
          privateKey: /etc/certs/privatekey.pem
      - port:
          number: 9443
          name: https-9443
          protocol: HTTPS
        hosts:
        - "bookinfo-namespace/*.bookinfo.com"
        tls:
          mode: SIMPLE # enables HTTPS on this port
          credentialName: bookinfo-secret # fetches certs from Kubernetes secret
      - port:
          number: 9080
          name: http-wildcard
          protocol: HTTP
        hosts:
        - "*"
      - port:
          number: 2379 # to expose internal service via external port 2379
          name: mongo
          protocol: MONGO
        hosts:
        - "*"
    
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: bookinfo-rule
      namespace: bookinfo-namespace
    spec:
      hosts:
      - reviews.prod.svc.cluster.local
      - uk.bookinfo.com
      - eu.bookinfo.com
      gateways:
      - some-config-namespace/my-gateway
      - mesh # applies to all the sidecars in the mesh
      http:
      - match:
        - headers:
            cookie:
              exact: "user=dev-123"
        route:
        - destination:
            port:
              number: 7777
            host: reviews.qa.svc.cluster.local
      - match:
        - uri:
            prefix: /reviews/
        route:
        - destination:
            port:
              number: 9080 # can be omitted if it's the only port for reviews
            host: reviews.prod.svc.cluster.local
          weight: 80
        - destination:
            host: reviews.qa.svc.cluster.local
          weight: 20
    
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: bookinfo-mongo
      namespace: bookinfo-namespace
    spec:
      hosts:
      - mongosvr.prod.svc.cluster.local # name of internal Mongo service
      gateways:
      - some-config-namespace/my-gateway # can omit the namespace if gateway is in same namespace as virtual service.
      tcp:
      - match:
        - port: 27017
        route:
        - destination:
            host: mongo.prod.svc.cluster.local
            port:
              number: 5555
    

    示例二

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: my-gateway
      namespace: some-config-namespace
    spec:
      selector:
        app: my-gateway-controller
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "ns1/*"
        - "ns2/foo.bar.com"
    

    参考文档

    https://istio.io/latest/zh/docs/reference/config/networking/gateway/

    通过例子来理解

    image.png
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata: 
      name: nginx-gw
    spec:
      selector:
        app: istio-ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - nginx.test.com
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: nginx-vs
    spec:
      hosts:
      - nginx.test.com
      gateways:
      - nginx-gw
      http:
      - route:
        - destination:
            host: nginx-svc
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-svc
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - image: 'nginx:latest'
              name: nginx-deployment
    

    通过命令访问 curl -H "Host: nginx.gateway.com" http://ingressgateway:nodeport/

    • istio-ingressgateway 就是小区的大门(唯一的大门),所有进入的流量都需要经过,
    • ingressgateway 相当于路标引导去到A B C D的一栋建筑里面,分开域名去导流,
    • virtualservice 就像到建筑里的电梯一样,按照不同的楼层进行管理路由的作用,
    • destinationrule 到达具体的楼层后按照不同的门房号 1 2 3 4 进入到真正的屋里去。

    相关文章

      网友评论

          本文标题:Istio Ingress Gateway

          本文链接:https://www.haomeiwen.com/subject/oogaqdtx.html