簡體   English   中英

Istio(1.0)內部ReplicaSet路由 - 支持Kubernetes部署中的pod之間的流量

[英]Istio (1.0) intra ReplicaSet routing - support traffic between pods in a Kubernetes Deployment

Istio如何在同一服務中的pod之間支持基於IP的路由(或者ReplicaSet更具體)?

我們想在Istio網格中部署一個復制> 1的Tomcat應用程序。 該應用程序運行Infinispan,它使用JGroups來整理通信和群集。 JGroups需要識別其集群成員,為此目的,有KUBE_PING(JGroups的Kubernetes發現協議)。 它將使用與kubectl get pods相當的查找來咨詢K8S API。 群集成員可以是其他服務中的pod和同一Service / Deployment中的pod。

盡管我們的問題是由相當具體的需求驅動的,但主題是通用的。 我們如何讓pods在副本集中相互通信?

示例:作為展示,我們部署了演示應用程序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一樣在我-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 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 doc將上面的聽眾描述為

從偵聽器0.0.0.0_15001接收相關IP:PORT對的出站非HTTP流量

這一切都有道理。 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是不可達的。

Can Istio今天可以支持這個 - 那怎么樣?

您是對的,HTTP路由僅支持服務名稱或服務VIP的本地訪問或遠程訪問。

這就是說,你的具體的例子,如上所述,在服務端口被命名為“一”,“二”,“三”,如描述的路由將是純TCP 這里 因此,您的示例應該有效。 pod ispn-perf-test-558666c5c6-g9jb5可以在10.44.4.63和其他pod上達到10.44.4.64和10.44.3.22。

如果將端口重命名為“http-one”,“http-two”和“http-3”,則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問題,看看是否可能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM