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

两个吊舱之间的istio路由

毕泽宇
2023-03-14

试图在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",

但是,一旦我从pod内部(在这种情况下只是byrnedo/alpine-curl)对服务进行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属性(我了解在服务到服务的通信中,因为据我了解,它们是在请求首次通过网关进入网格时设置的),而且对我来说,余额看起来像是kubernetes服务的默认50:50余额。

我需要做什么才能在服务间通信中实现相同的1:9平衡?我是否必须创建第二个“内部”网关来使用服务fqdn?我错过了一个定义吗?从pod内调用服务fqdn是否应尊重virtualservice路由?

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

UPDATE按照建议部署了sleep pod(这次不依赖于demo命名空间的自动注入),而是按照sleep示例中的描述手动部署

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"

共有2个答案

微生乐
2023-03-14

路由规则是在客户端评估的,所以您需要确保运行curl的pod有一个Istio sidecar与之相连。如果它只是直接调用服务,它就不能评估您设置的90-10规则,而是只能使用默认的kube循环路由。

Istio睡眠示例是一个很好的测试客户端pod。

慕容嘉熙
2023-03-14

找到解决方案,先决条件之一(我忘了)是正确的路由需要命名端口:@seehttps://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后,一切都像一个符咒

 类似资料:
  • 我们正在使用Docker 1.19运行库伯内特斯(1.18) Container是一个基于Java13的Spring启动应用程序(使用基本图像作为openjdk: 13-alpin),下面是内存设置。 豆荚: 内存-最小448M,最大2500M cpu-最小值0.1 容器: Xms:256M,Xmx:512M 当流量发送更长时间时,容器会突然重新启动;在Prometheus中,我可以看到Pod内存

  • 问题内容: 我正在使用networkx处理图。我有一个很大的图(其中有近200个节点),我尝试查找两个节点之间的所有可能路径。但是,据我了解,networkx只能找到最短的路径。如何不仅获得最短路径,还获得所有可能路径? UPD:路径只能包含每个节点一次。 UPD2:我需要类似find_all_paths()函数的功能,在此进行描述:python.org/doc/essays/graphs.htm

  • 我已经在节点(node1)上的pod(pod1)上部署了一个Spring Boot应用程序。我还在不同节点(node2)上的另一个pod(pod2)上部署了JMeter。我试图从POD2执行自动负载测试。为了执行负载测试,我要求为每个测试用例重新启动pod1。如何从POD2重新启动pod1?

  • 当我将触发helm install命令时,helm将读取所有的yml,因此将尝试一次部署所有的pods,这是我不想要的。我希望我的工作首先成功,然后只有其他的吊舱应该开始部署。当作业正在运行时,所有其他POD都应该等待或不应该启动,因为它们都依赖于作业的成功。 我怎样才能用Helm完成这个案子。请建议。我如何让其他豆荚等待,让他们知道工作已经成功地完成了。

  • kubernetes吊舱日志的绝对路径是什么? 当我尝试时,我可以看到吊舱日志。我想知道运行pod的日志文件路径。 kubectl原木npapp-0r9jw 在哪里可以看到绝对日志文件路径?

  • 这里的练习是:我需要编写一个递归方法,它可以得到N*N大小的正整数矩阵,起始单元格行和列索引以及结束单元格行和列索引,并且该方法需要返回从起始单元格到结束单元格的可能路径数,这些约束条件是:a.你可以从当前位置移动到左单元格、右单元格、上单元格或下单元格。b.你不能越过主对角线,但是你可以转到对角线上的单元格(但不能越过它)。路由中的每个单元格只出现一次。d.矩阵需要像原始矩阵一样,末尾有原始单元