• 微服务
  • 在KubeSphere上使用Istio-ingressgateway网关

背景:

众所周知,如果要在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
1 年 后

请问下,用kubesphere默认部署的ingress,是通过nodeport暴露,无法获取真实客户端IP地址。
将服务的 externalTrafficPolicy 改为 Local 模式能够解决这个问题,但当流量路由到没有ingress-pod的节点上时,无法访问,请问这个如何解决?