Istio(1.0)内部ReplicaSet路由-在Kubernetes部署中支持Pod之间的流量

时间:2018-10-22 08:20:20

标签: 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。

尽管我们的问题是由相当具体的需求驱动的,但该主题还是通用的。我们如何使Pod在副本集中彼此通信?

示例:作为展示,我们部署了演示应用程序https://github.com/jgroups-extras/jgroups-kubernetes。相关的东西是:

apiVersion: v1
items:
- apiVersion: extensions/v1beta1
  kind: Deployment
  metadata:
    name: ispn-perf-test
    namespace: my-non-istio-namespace
  spec:
    replicas: 3
< -- edited for brevity -- >

没有Istio 的情况下运行,这三个Pod会彼此找到并形成集群。在 my-istio-namespace 中与Istio部署相同的 并添加基本的服务定义:

kind: Service
apiVersion: v1
metadata:
  name: ispn-perf-test-service
  namespace: my-istio-namespace
spec:
  selector:
    run : ispn-perf-test
  ports:
  - protocol: TCP
    port: 7800
    targetPort: 7800
    name: "one"
  - protocol: TCP
    port: 7900
    targetPort: 7900
    name: "two"
  - protocol: TCP
    port: 9000
    targetPort: 9000
    name: "three"

请注意,下面的输出很宽-您可能需要向右滚动以获取IP

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

https://istio.io/help/ops/traffic-management/proxy-cmd/#deep-dive-into-envoy-configuration的指导下,让我们窥探其中一个吊舱的最终Envoy conf:

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 -- >

Istio文档将上述侦听器描述为

  

从以下位置接收相关IP:PORT对的出站非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 ,无法访问两个“同级” pod。

Istio今天可以支持吗?然后如何?

1 个答案:

答案 0 :(得分:1)

您是正确的,HTTP路由仅支持通过服务名称或服务VIP进行本地访问或远程访问。

也就是说,对于上面的特定示例,在服务端口分别命名为“一个”,“两个”,“三个”的情况下,路由将是纯TCP,如here所述。因此,您的示例应该可以工作。豆荚ispn-perf-test-558666c5c6-g9jb5可以在10.44.4.63上到达自身,其他豆荚在10.44.4.64和10.44.3.22上到达。

如果将端口重命名为“ http-one”,“ http-two”和“ http-three”,则将启动HTTP路由,并且RDS配置会将远程调用限制为使用公认服务域的远程调用。 / p>

要查看RDF配置的区别,请在端口名为“一个”并将端口更改为“ http-one”时查看以下命令的输出。

istioctl proxy-config routes ispn-perf-test-558666c5c6-g9jb5 -n my-istio-namespace  --name 7800 -o json

使用名为“ one”的端口时,它将不返回任何路由,因此将应用TCP路由,但是在“ http-one”情况下,将限制路由。

我不知道在HTTP情况下是否可以将其他远程Pod IP地址添加到RDS域。我建议打开一个Istio问题,看看是否有可能。