gpt4 book ai didi

kubernetes - Istio (1.0) 内部 ReplicaSet 路由 - 支持 Kubernetes Deployment 中 pod 之间的流量

转载 作者:行者123 更新时间:2023-12-04 00:03:19 25 4
gpt4 key购买 nike

Istio 如何支持同一 Service(或者更具体的 ReplicaSet)中的 Pod 之间基于 IP 的路由?

我们想在 Istio 网格中部署副本 > 1 的 Tomcat 应用程序。该应用程序运行 Infinispan,它使用 JGroups 来整理通信和集群。 JGroups 需要识别其集群成员,为此目的有 KUBE_PING(用于 JGroups 的 Kubernetes 发现协议(protocol))。它将通过类似于 kubectl get pods 的查找来查询 K8S API。集群成员既可以是其他服务中的 pod,也可以是同一 Service/Deployment 中的 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 会相互发现并组成集群。部署相同的 与 Istio 在 my-istio-namespace 中并添加一个基本的服务定义:
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 指导,让我们看看其中一个 Pod 的 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 文档将上述监听器描述为

Receives outbound non-HTTP traffic for relevant IP:PORT pair from listener 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 今天可以支持这一点 - 那么如何支持呢?

最佳答案

没错,HTTP 路由只支持通过服务名或服务 VIP 进行本地访问或远程访问。

也就是说,对于上面的特定示例,服务端口被命名为“一”、“二”、“三”,路由将是纯 TCP,如 here 所述。 .因此,您的示例应该有效。 pod ispn-perf-test-558666c5c6-g9jb5 可以在 10.44.4.63 上访问自己,而其他 pod 可以在 10.44.4.64 和 10.44.3.22 上访问。

如果您将端口重命名为“http-one”、“http-two”和“http-three”,则 HTTP 路由将启动,RDS 配置会将远程调用限制为使用可识别服务域的调用。

要查看 RDF 配置中的差异,请查看以下命令在端口命名为“one”以及将其更改为“http-one”时的输出。

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

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

我不知道是否有办法在 HTTP 案例中向 RDS 域添加额外的远程 Pod IP 地址。我建议打开一个 Istio 问题,看看是否可行。

关于kubernetes - Istio (1.0) 内部 ReplicaSet 路由 - 支持 Kubernetes Deployment 中 pod 之间的流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52925018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com