[英]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.