Istio(1.0)内部复制集路由-支持Kubernetes部署中POD之间的流量
Istio如何支持同一服务(或更具体地说是ReplicaSet)中的POD之间基于IP的路由 我们希望在Istio网格中部署副本>1的Tomcat应用程序。该应用程序运行Infinispan,它使用JGroups来整理通信和集群。JGroups需要识别其集群成员,为此有KUBE_PING(用于JGroups的Kubernetes发现协议)。它将使用类似于kubectl get pods的查找来查询K8S API。集群成员可以是其他服务中的pod,也可以是同一服务/部署中的pod 尽管我们的问题是由相当具体的需求驱动的,但这个主题是通用的。我们如何使POD在副本集中相互通信 示例:作为展示,我们部署了演示应用程序。有关资料如下:Istio(1.0)内部复制集路由-支持Kubernetes部署中POD之间的流量,kubernetes,infinispan,jgroups,istio,envoyproxy,Kubernetes,Infinispan,Jgroups,Istio,Envoyproxy,Istio如何支持同一服务(或更具体地说是ReplicaSet)中的POD之间基于IP的路由 我们希望在Istio网格中部署副本>1的Tomcat应用程序。该应用程序运行Infinispan,它使用JGroups来整理通信和集群。JGroups需要识别其集群成员,为此有KUBE_PING(用于JGroups的Kubernetes发现协议)。它将使用类似于kubectl get pods的查找来查询K8S API。集群成员可以是其他服务中的pod,也可以是同一服务/部署中的pod 尽管我们的问题是
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: ispn-perf-test
namespace: my-non-istio-namespace
spec:
replicas: 3
< -- edited for brevity -- >
请注意,下面的输出很宽-您可能需要向右滚动以获取IPs
kubectl get pods -n my-istio-namespace -o wide
NAME READY STATUS RESTARTS AGE IP NODE
ispn-perf-test-558666c5c6-g9jb5 2/2 Running 0 1d 10.44.4.63 gke-main-pool-4cpu-15gb-98b104f4-v9bl
ispn-perf-test-558666c5c6-lbvqf 2/2 Running 0 1d 10.44.4.64 gke-main-pool-4cpu-15gb-98b104f4-v9bl
ispn-perf-test-558666c5c6-lhrpb 2/2 Running 0 1d 10.44.3.22 gke-main-pool-4cpu-15gb-98b104f4-x8ln
kubectl get service ispn-perf-test-service -n my-istio-namespace
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ispn-perf-test-service ClusterIP 10.41.13.74 <none> 7800/TCP,7900/TCP,9000/TCP 1d
kubectl get pods-n我的istio命名空间-o宽
名称就绪状态重新启动老化IP节点
ispn-perf-test-558666c5c6-g9jb5 2/2运行0 1d 10.44.4.63 gke-main-pool-4cpu-15gb-98b104f4-v9bl
ispn-perf-test-558666c5c6-lbvqf 2/2运行0 1d 10.44.4.64 gke-main-pool-4cpu-15gb-98b104f4-v9bl
ispn-perf-test-558666c5c6-lhrpb 2/2运行0 1d 10.44.3.22 gke-main-pool-4cpu-15gb-98b104f4-x8ln
kubectl获取服务ispn性能测试服务-n我的istio命名空间
名称类型CLUSTER-IP外部IP端口年龄
ispn性能测试服务群集IP 10.41.13.74 7800/TCP、7900/TCP、9000/TCP 1d
在下面的指导下,让我们看一下其中一个POD的结果:
istioctl proxy-config listeners ispn-perf-test-558666c5c6-g9jb5 -n my-istio-namespace
ADDRESS PORT TYPE
10.44.4.63 7900 TCP
10.44.4.63 7800 TCP
10.44.4.63 9000 TCP
10.41.13.74 7900 TCP
10.41.13.74 9000 TCP
10.41.13.74 7800 TCP
< -- edited for brevity -- >
istioctl代理配置侦听器ispn-perf-test-558666c5c6-g9jb5-n我的istio命名空间
地址端口类型
10.44.4.63 7900 TCP
10.44.4.63 7800 TCP
10.44.4.63 9000 TCP
10.41.13.74 7900 TCP
10.41.13.74 9000 TCP
10.41.13.74 7800 TCP
<--为简洁而编辑-->
Istio文档将上述侦听器描述为
从接收相关IP:端口对的出站非HTTP流量
监听器0.0.0.0_15001
这一切都是有道理的。pod ispn-perf-test-558666c5c6-g9jb5可在10.44.4.63上到达自身,并通过10.41.13.74进行维修。但是如果pod将数据包发送到10.44.4.64或10.44.3.22怎么办?这些IP在侦听器中不存在,因此请注意,ispn-perf-test-558666c5c6-g9jb5无法访问这两个“兄弟”播客
Istio今天能支持吗?那么如何支持呢?您是对的,HTTP路由只支持通过服务名称或服务VIP进行本地访问或远程访问 也就是说,对于上面的特定示例,其中服务端口名为“1”、“2”、“3”,路由将是所述的普通TCP。因此,您的示例应该有效。吊舱ispn-perf-test-558666c5c6-g9jb5可在10.44.4.63上到达自身,其他吊舱可在10.44.4.64和10.44.3.22上到达 如果将端口重命名为“http 1”、“http 2”和“http 3”,则http路由将启动,RDS配置将远程调用限制为使用可识别服务域的端口 要查看RDF配置中的差异,请在端口名为“one”和端口名更改为“httpone”时查看以下命令的输出 对于名为“one”的端口,它将不返回任何路由,因此将应用TCP路由,但在“http one”情况下,路由将受到限制
我不知道是否有办法在HTTP情况下向RDS域添加额外的远程pod IP地址。我建议打开一个Istio问题,看看是否可能。您在Istio服务网格中启用了吗?否。没有启用MTL。JGroups协议不是基于HTTP的,因此端口名中没有“HTTP-”。正如您所指出的,更改端口名会产生不同的结果。运行istioctl代理配置侦听器会生成:“0.0.0.0 7800 HTTP”。7900和9000也一样。映射到ispn性能测试服务的IP也是如此:“10.44.4.188 9000 HTTP”等等。但是我看不出非http JGroups流量将如何通过那里。找到了这个条目,它确认了所寻求的功能既不存在,也不打算存在。看起来:ServiceEntry可能是一个前进的方向。
istioctl proxy-config listeners ispn-perf-test-558666c5c6-g9jb5 -n my-istio-namespace
ADDRESS PORT TYPE
10.44.4.63 7900 TCP
10.44.4.63 7800 TCP
10.44.4.63 9000 TCP
10.41.13.74 7900 TCP
10.41.13.74 9000 TCP
10.41.13.74 7800 TCP
< -- edited for brevity -- >
istioctl proxy-config routes ispn-perf-test-558666c5c6-g9jb5 -n my-istio-namespace --name 7800 -o json