[TOC]web
首先,对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 本机上进行验证
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 服务
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)
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 服务
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)
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去实现
Gateway的servers的port要特别注意处理好,number和name不能随便定义,name有固定格式,number是要在ingressgateway真实配置好的
VirtualService的spec下的hosts,须要指定,能够任意指定就好比能够是真实域名
VirtualService的route的destination的host,是真正要路由到cluster的服务
若是只是ingressgateway,服务能够不用Sidecar,外部请求可以访问,可是不能应用到istio的一些针对服务的路由策略和规则
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 服务端系统研发,后面会大力经过微信公众号发送优质文章"】