簡體   English   中英

兩個pod之間的istio路由

[英]istio routing between two pods

試圖進入kubernetes istio,但似乎我缺少一些基本面,或者我正在做的事情回到前面。 我在kubernetes方面很有經驗,但istio和它的虛擬服務讓我感到困惑。

我創建了2個部署(helloworld-v1 / helloworld-v2)。 兩者都有相同的圖像,唯一不同的是環境變量 - 輸出版本:“v1”或版本:“v2”。 我正在使用我寫的一個小測試容器,它基本上返回我進入應用程序的標頭。 名為“helloworld”的kubernetes服務可以同時達到。

我創建了一個Virtualservice和一個Destinationrule

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: helloworld
spec:
  hosts:
  - helloworld
http:
  - route:
     - destination:
       host: helloworld
       subset: v1
     weight: 90
     - destination:
       host: helloworld
       subset: v2
     weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: helloworld
spec:
  host: helloworld
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

根據文檔不提及任何網關應該使用內部“網格”之一。 Sidecar容器成功連接:

kubectl -n demo get all
NAME                                 READY     STATUS    RESTARTS   AGE
pod/curl-6657486bc6-w9x7d            2/2       Running   0          3h
pod/helloworld-v1-d4dbb89bd-mjw64    2/2       Running   0          6h
pod/helloworld-v2-6c86dfd5b6-ggkfk   2/2       Running   0          6h

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/helloworld   ClusterIP   10.43.184.153   <none>        80/TCP     6h

NAME                            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/curl            1         1         1            1           3h
deployment.apps/helloworld-v1   1         1         1            1           6h
deployment.apps/helloworld-v2   1         1         1            1           6h

NAME                                       DESIRED   CURRENT   READY     AGE
replicaset.apps/curl-6657486bc6            1         1         1         3h
replicaset.apps/helloworld-v1-d4dbb89bd    1         1         1         6h
replicaset.apps/helloworld-v2-6c86dfd5b6   1         1         1         6h

當我從“外部”(istio-ingressgateway)訪問應用程序時,一切正常,v2被調用一次,v1 9次被調用九次:

curl --silent -H 'host: helloworld' http://localhost
{"host":"helloworld","user-agent":"curl/7.47.0","accept":"*/*","x-forwarded-for":"10.42.0.0","x-forwarded-proto":"http","x-envoy-internal":"true","x-request-id":"a6a2d903-360f-91a0-b96e-6458d9b00c28","x-envoy-decorator-operation":"helloworld:80/*","x-b3-traceid":"e36ef1ba2229177e","x-b3-spanid":"e36ef1ba2229177e","x-b3-sampled":"1","x-istio-attributes":"Cj0KF2Rlc3RpbmF0aW9uLnNlcnZpY2UudWlkEiISIGlzdGlvOi8vZGVtby9zZXJ2aWNlcy9oZWxsb3dvcmxkCj8KGGRlc3RpbmF0aW9uLnNlcnZpY2UuaG9zdBIjEiFoZWxsb3dvcmxkLmRlbW8uc3ZjLmNsdXN0ZXIubG9jYWwKJwodZGVzdGluYXRpb24uc2VydmljZS5uYW1lc3BhY2USBhIEZGVtbwooChhkZXN0aW5hdGlvbi5zZXJ2aWNlLm5hbWUSDBIKaGVsbG93b3JsZAo6ChNkZXN0aW5hdGlvbi5zZXJ2aWNlEiMSIWhlbGxvd29ybGQuZGVtby5zdmMuY2x1c3Rlci5sb2NhbApPCgpzb3VyY2UudWlkEkESP2t1YmVybmV0ZXM6Ly9pc3Rpby1pbmdyZXNzZ2F0ZXdheS01Y2NiODc3NmRjLXRyeDhsLmlzdGlvLXN5c3RlbQ==","content-length":"0","version":"v1"}
"version": "v1",
"version": "v1",
"version": "v2",
"version": "v1",
"version": "v1",
"version": "v1",
"version": "v1",
"version": "v1",
"version": "v1",

但是,一旦我從一個吊艙內進行卷曲(在這種情況下只是byrnedo / alpine-curl)對服務的事情開始變得混亂:

curl --silent -H 'host: helloworld' http://helloworld.demo.svc.cluster.local
{"host":"helloworld","user-agent":"curl/7.61.0","accept":"*/*","version":"v1"}
"version":"v2"
"version":"v2"
"version":"v1"
"version":"v1"
"version":"v2"
"version":"v2"
"version":"v1"
"version":"v2“
"version":"v1"

不僅我錯過了所有的istio屬性(我在服務通信中理解這一點,因為我理解它們是在請求首次通過網關進入網格時設置的),但我的余額看起來像默認50:50 kubernetes服務的平衡。

我需要做些什么才能在服務間通信上實現相同的1:9平衡? 我是否必須創建第二個“內部”網關來代替服務fqdn? 我錯過了一個定義嗎? 應該從pod中調用服務fqdn尊重虛擬服務路由嗎?

使用的istio版本是1.0.1,使用kubernetes版本v1.11.1。

UPDATE按照建議部署了睡眠窗口(這次不依賴於演示命名空間的自動注入),而是按照睡眠示例中的描述手動完成

kubectl -n demo get deployment sleep -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS          IMAGES                                     SELECTOR
sleep     1         1         1            1           2m        
sleep,istio-proxy   tutum/curl,docker.io/istio/proxyv2:1.0.1   app=sleep

還將Virtualservice更改為0/100以查看它是否乍一看。 不幸的是,這並沒有太大變化:

export SLEEP_POD=$(kubectl get -n demo pod -l app=sleep -o jsonpath={.items..metadata.name})
kubectl -n demo exec -it $SLEEP_POD -c sleep curl http://helloworld
{"user- agent":"curl/7.35.0","host":"helloworld","accept":"*/*","version":"v2"}
kubectl -n demo exec -it $SLEEP_POD -c sleep curl http://helloworld
{"user-agent":"curl/7.35.0","host":"helloworld","accept":"*/*","version":"v1"}
kubectl -n demo exec -it $SLEEP_POD -c sleep curl http://helloworld
{"user-agent":"curl/7.35.0","host":"helloworld","accept":"*/*","version":"v2"}
kubectl -n demo exec -it $SLEEP_POD -c sleep curl http://helloworld
{"user-agent":"curl/7.35.0","host":"helloworld","accept":"*/*","version":"v1"}
kubectl -n demo exec -it $SLEEP_POD -c sleep curl http://helloworld
{"user-agent":"curl/7.35.0","host":"helloworld","accept":"*/*","version":"v2"

找到解決方案,其中一個先決條件(我忘了)是正確的路由需要命名端口:@see https://istio.io/docs/setup/kubernetes/spec-requirements/

錯誤:

spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 3000

對:

spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 3000

使用名稱http后,一切都像魅力

路由規則在客戶端進行評估,因此您需要確保運行curl的pod有一個Istio sidecar連接到它。 如果它只是直接調用服務,則無法評估您設置的90-10規則,而是直接進入默認的kube循環路由。

Istio 睡眠樣本是一個很好的用作測試客戶端pod的樣本

暫無
暫無

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

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