ZzackzhangK零SK壹S
- 已编辑
背景:
众所周知,如果要在KubeSphere上使用微服务,需要开启网关的"微服务治理"开关。这个开关开启后,本质上是给网关的Pod注入Envoy Sidecar。如果在这个项目下面有普通的一些服务,这些服务并未注入Sidecar。那么在使用这个网关的时候,流量都会经过Envoy sidecar转发一次。而对于这些服务来讲,这一层的流量转发是不必要的。
此时有个问题:网关是否注入envoy sidecar受后端注入envoy sidecar的限制。能否做到网关的独立呢?
答案是肯定的。
使用Ingress来代理Gateway,但是使用istio-ingressgateway来充当controller
其实不管后端负载是否注入envoy sidecar,都可以统一使用istio-ingressgateway。
对于习惯使用了Ingress的用户,可以不用去理解Istio Gateway概念,但是可以使用Istion Ingressgateway功能。
默认的Nginx Ingress控制器本身是使用一个nginx提供负载均衡的功能,Ingress及其annotation来修改nginx的配置文件,如Rewrite app-root/target/Host等
使用Istio ingressgateway,其实就是将nginx换成envoy,原理不变。
使用Httpbin负载
kubectl -n test-gateway create deploy httpbin --image kennethreitz/httpbin --port 80
kubectl -n test-gateway expose deploy httpbin --port 8080 --target-port 80
暴露istio-ingressgateway为NodePort或是使用LB,使用外部流量进入。获取ingress IP PORT
# kubectl -n istio-system get svc | grep istio-ingress
istio-ingressgateway NodePort 10.233.39.106 <none> 15021:31646/TCP,80:30084/TCP,443:32740/TCP,15443:30534/TCP 18d
创建Ingress,指定使用Istio:
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: istio # 指定使用Istio ingressgateway
name: http-ingress
namespace: test-gateway
spec:
rules:
- host: zackzhangkai.github.io
http:
paths:
- path: /status/* # 匹配HTTP PATH
backend:
serviceName: httpbin
servicePort: 8080
EOF
未加Host,Ingress规则匹配不成功
[root@ssa3 ~]# curl -I http://192.168.0.13:30084/status/200
HTTP/1.1 404 Not Found
date: Mon, 08 Feb 2021 09:44:49 GMT
server: istio-envoy
transfer-encoding: chunked
加上Host,Ingress规则生效
[root@ssa3 ~]# curl -I http://192.168.0.13:30084/status/200 -Hhost:zackzhangkai.github.io
HTTP/1.1 200 OK
server: istio-envoy
date: Mon, 08 Feb 2021 09:45:01 GMT
content-type: text/html; charset=utf-8
access-control-allow-origin: *
access-control-allow-credentials: true
content-length: 0
x-envoy-upstream-service-time: 26