多个web服务接入共享ingressgateway

[TOC]web

多个web服务接入共享ingressgateway

背景

共享ingressgateway

首先,对ingressgateway而言,目前业界一致的作法就是共享ingressgateway,这个对于前期来看,也是足够了,只是须要保证ingressgateway不能单点,而且ingressgateway能够部署多个进行负载均衡。后端

所以,一个ingressgateway就须要支撑不一样的业务接入,对于ingressgateway来讲,Gateway资源配置为同一个端口,同一种协议,而后只要对应的VirtualService中配置不一样的hosts,最后经过VirtualService的hosts路由到不一样的服务就能解决。api

外部统一的入口访问,指定不一样hosts,而后VirtualService会有不一样的路由规则,不冲突~bash

统一域名访问

另一块在于统一的域名姿式访问,在K8S内部,建立Service的时候会默认给kube-DNS里面添加一条记录,而后能够经过服务名在Pod里面访问其余服务。服务器

可是若是但愿可以自定义域名,保持接入容器、接入istio和没有接入istio都有着一样的访问姿式的话,就须要可以自定义域名,固然,这个自定义域名必须首先可以解析,kube-DNS能够配置私有DNS和上游域名服务器,而且咱们本身在K8S集群中针对这块DNS有作相关优化微信

现有K8S集群中,建立service的时候给定的这个默认的自定义域名,会写到机房的bind9中,也同时会写到咱们外部的DNS解析服务器中,这样,这个域名就能够在集群内和集群外都可以解析访问。这个域最终会解析到LVS上,而后LVX下面就是ingress,也就是七层的负载均衡器,而后经过七层进行路由。app

若是是其余特殊的自定义域名,那么须要运维手动配置,也是经过dnsPod和bind9,而后最后仍是解析LVS上,而后进行7层路由负载均衡

接入Istio后,要想仍是保持原有统一域名的访问方式,那么这个自定义域名,一样须要解析,而且解析到LVS,LVS下面就是istio的ingress gateway,而后经过host进行路由。所以client请求http处理的时候,须要携带Host用来进行路由。运维

这一点上,和K8S现有的域名管理姿式保持一致,只是自定义域名解析的LVS不一样,一个LB的LVS,一个istio ingressgateway的LVS。curl

而后再一点就是在istio中,须要经过是VirtualService来配置路由,路由的区分是要经过hosts来区分

方案&实操

在MAC 本机上进行验证

ingressgateway

kubectl get svc -n istio-system  |grep istio-ingressgateway 

istio-ingressgateway       NodePort    10.233.13.102   <none>        80:31380/TCP,443:31390/TCP,8081:31381/TCP,31499:31499/TCP,31400:31400/TCP,15011:32636/TCP,8060:32041/TCP,15030:31210/TCP,15031:32538/TCP   25d
复制代码

对于服务一:

hello-web 服务

1,服务一的部署配置以下:

apiVersion: v1
kind: Service
metadata:
  name: hello-web
  labels:
    app: hello-web
spec:
  ports:
  - name: http-web
    port: 12345
  selector:
    app: hello-web
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-web-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-web
        version: v1
    spec:
      containers:
      - name: hello-web
        image: wudebao5220150/webserver:1.0.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 12345
---
复制代码

kubectl apply -f <(istioctl kube-inject -f hello-web.yaml)

2,网关和路由的配置以下:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: hello-web-gateway
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*.hello-web.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: hello-web
spec:
  hosts:
  - "www.hello-web.com"
  gateways:
  - hello-web-gateway
  http:
  - match:
    - uri:
        exact: /hello
    route:
    - destination:
        port:
          number: 12345
        host: hello-web
复制代码

kubectl apply -f hello-web-gateway.yaml

hosts为www.hello-web.com的请求,会路由到指定的http的match上。这里是入口,入口以后的路由,经过hosts进行区分,而后具体到下游Cluster的详尽规则由http的match去实现

对于服务二:

wudebao-web 服务

1,服务二的部署配置以下:

apiVersion: v1
kind: Service
metadata:
  name: wudebao-web
  labels:
    app: wudebao-web
spec:
  ports:
  - name: http-web
    port: 54321
  selector:
    app: wudebao-web
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: wudebao-web
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: wudebao-web
        version: v1
    spec:
      containers:
      - name: wudebao-web
        image: wudebao5220150/webserver-v2:1.0.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 54321
复制代码

kubectl apply -f <(istioctl kube-inject -f wudebao-web.yaml)

2,网关和路由的配置以下:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: wudebao-web-gateway
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*.wudebao-web.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: wudebao-web
spec:
  hosts:
  - "www.wudebao-web.com"
  gateways:
  - wudebao-web-gateway
  http:
  - match:
    - uri:
        exact: /wudebao
    route:
    - destination:
        port:
          number: 54321
        host: wudebao-web
复制代码

kubectl apply -f wudebao-web-gateway.yaml

hosts为www.wwudebao-web.com的请求,会路由到指定的http的match上。这里是入口,入口以后的路由,经过hosts进行区分,而后具体到下游Cluster的详尽规则由http的match去实现

关键点说明:

  1. Gateway的servers的port要特别注意处理好,number和name不能随便定义,name有固定格式,number是要在ingressgateway真实配置好的

  2. VirtualService的spec下的hosts,须要指定,能够任意指定就好比能够是真实域名

    • 这个host设置为和访问的域名同样,而后client进行http请求的时候带上host,而后就能够经过host路由
    • 同时须要可以保证k8s可以解析这个自定义域名
  3. VirtualService的route的destination的host,是真正要路由到cluster的服务

    • 通常能够直接采用服务名,若是是同一个namespace下
    • 最好FQDN,写上彻底限定域名
  4. 若是只是ingressgateway,服务能够不用Sidecar,外部请求可以访问,可是不能应用到istio的一些针对服务的路由策略和规则

    • 所以,部署的时候,仍是得Sidecar注入envoy代理才行

最终访问:

IP:Port同样,Host和URI不一样,经过Host路由到不一样的Service上:

curl 172.31.36.68:31380/hello -H "Host: www.hello-web.com"  -v

curl 172.31.36.68:31380/wudebao -H "Host: www.wudebao-web.com"  -v

复制代码

这样同时知足多个web服务的接入请求,不一样host路由到了不一样的后端服务

【"欢迎关注个人微信公众号:Linux 服务端系统研发,后面会大力经过微信公众号发送优质文章"】

个人微信公众号
相关文章
相关标签/搜索