当前位置: 首页 > 知识库问答 >
问题:

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

楚洋
2023-03-14

Istio如何支持同一服务(或ReplicaSet更具体地说)中的pod之间基于IP的路由?

我们希望部署一个带有副本的 Tomcat 应用程序

尽管我们的问题是由相当具体的需求驱动的,但主题是通用的。我们如何使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-namesspace中使用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的指导下,让我们来看看其中一个pod的结果Envoy配置:

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文档将上述侦听器描述为:

从侦听器 0.0.0.0_15001 接收相关 IP:端口对的出站非 HTTP 流量

这一切都是有道理的。pod ispn-perf-test-558666c5c6-g9jb5可以通过10.41.13.74在10.44.4.63和服务上到达自己。但是...如果pod将数据包发送到10.44.4.64或10.44.3.22?这些IP不存在于侦听器中,因此ispn-perf-test-558666c5c6-g9jb5无法访问两个“兄弟”pod。

Istio今天能支持这一点吗——然后如何支持?

共有1个答案

闾丘高峰
2023-03-14

你是对的,HTTP路由只支持通过服务名或服务VIP的本地访问或远程访问。

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

如果将端口重命名为“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

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

我不知道在HTTP的情况下,是否有办法向RDS域添加额外的远程pod IP地址。我建议开一期Istio,看看有没有可能。

 类似资料:
  • 这里我可能错了,当我在VM上运行这个python文件时,它可以创建一个新的bucket,而不需要凭据或服务帐户。 如果我将相同的代码Dockere化到flask应用程序中,并将其部署在集群上,那么它是否仍将采用默认的google凭据?我想知道在kubernetes集群上这样做的最佳实践。

  • 那么-有什么不同,我应该在什么时候使用它们?

  • 本系列文档介绍使用二进制部署最新 kubernetes v1.6.2 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群。 在部署的过程中,将详细列出各组件的启动参数,它们的含义和可能遇到的问题。 部署完成后,你将理解系统各组件的交互原理,进而能快速解决实际问题。 所以本文档主要适合于那些有一定 kubernetes 基础,想通过一步步部署的方式来学习和了解系统配置、运行原理的人。

  • 本系列文档介绍使用二进制部署最新 kubernetes v1.6.2 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群。

  • 我最近开始熟悉Kubernetes,然而,虽然我确实得到了概念,但我有一些问题无法通过Kubernete的概念和文档清楚地回答,还有一些我想确认的理解。 “pod模型包含一个或多个相对紧密耦合的应用程序容器”。对于何时将容器部署在同一吊舱内,而不是单独的吊舱内,是否有任何明确的标准? “Pods是可以在Kubernetes中创建和管理的最小的可部署计算单元”-Pods,Kuberenets文档。这

  • null 我的问题是: 是否需要创建文件,然后在文件中引用它们,或者部署文件也可以嵌入pod定义? K8S文档似乎暗示的部分相当于定义一个pod。那是正确的吗?如果我想声明性地描述多pod部署呢?是否需要多个deployment.yml文件?