首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VirtualService和DestinationRule Istio资源的正确命名空间

VirtualService和DestinationRule Istio资源的正确命名空间
EN

Stack Overflow用户
提问于 2021-12-30 15:11:13
回答 1查看 452关注 0票数 1

我试图理解VirtualService和DestinationRule资源与应该定义的名称空间的关系,以及它们是真正的命名空间资源,还是也可以被视为集群范围的资源。

我有以下情况:

  • 前端服务(web前端)访问后端服务(客户)。
  • 前端服务部署在前端名称空间中。
  • 后端服务(customers)部署在后端命名空间中。
  • 后端服务客户有2个版本(2个部署),一个与版本v1相关,另一个与版本v2相关。
  • clusterIP服务的默认行为是负载平衡两个部署(v1和v2)之间的请求,我的目标是创建一个DestinationRule和一个VirtualService来将通信量仅定向到部署版本v1。
  • 我想了解的是,哪个名称空间适合定义这样的DestinationRule和VirtualService资源。我应该在前端名称空间还是后端名称空间中创建必要的DestinationRule和VirtualService资源?

在前端名称空间中,我有web前端部署和相关服务,如下所示:

代码语言:javascript
复制
apiVersion: v1
kind: Namespace
metadata:
  name: frontend
  labels:
    istio-injection: enabled
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-frontend
  namespace: frontend
  labels:
    app: web-frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-frontend
  template:
    metadata:
      labels:
        app: web-frontend
        version: v1
    spec:
      containers:
        - image: gcr.io/tetratelabs/web-frontend:1.0.0
          imagePullPolicy: Always
          name: web
          ports:
            - containerPort: 8080
          env:
            - name: CUSTOMER_SERVICE_URL
              value: 'http://customers.backend.svc.cluster.local'
---
kind: Service
apiVersion: v1
metadata:
  name: web-frontend
  namespace: frontend
  labels:
    app: web-frontend
spec:
  selector:
    app: web-frontend
  type: NodePort
  ports:
    - port: 80
      name: http
      targetPort: 8080

通过定义以下网关和VirtualService资源,我公开了web前端服务,如下所示:

代码语言:javascript
复制
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway-all-hosts
  # namespace: default # Also working
  namespace: frontend
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-frontend
  # namespace: default # Also working
  namespace: frontend
spec:
  hosts:
    - "*"
  gateways:
    - gateway-all-hosts
  http:
    - route:
        - destination:
            host: web-frontend.frontend.svc.cluster.local
            port:
              number: 80

在后端命名空间中,我有客户、v1和v2部署以及相关服务,如下所示:

代码语言:javascript
复制
apiVersion: v1
kind: Namespace
metadata:
  name: backend
  labels:
    istio-injection: enabled
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: customers-v1
  namespace: backend
  labels:
    app: customers
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: customers
      version: v1
  template:
    metadata:
      labels:
        app: customers
        version: v1
    spec:
      containers:
        - image: gcr.io/tetratelabs/customers:1.0.0
          imagePullPolicy: Always
          name: svc
          ports:
            - containerPort: 3000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: customers-v2
  namespace: backend
  labels:
    app: customers
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: customers
      version: v2
  template:
    metadata:
      labels:
        app: customers
        version: v2
    spec:
      containers:
        - image: gcr.io/tetratelabs/customers:2.0.0
          imagePullPolicy: Always
          name: svc
          ports:
            - containerPort: 3000
---
kind: Service
apiVersion: v1
metadata:
  name: customers
  namespace: backend
  labels:
    app: customers
spec:
  selector:
    app: customers
  type: NodePort
  ports:
    - port: 80
      name: http
      targetPort: 3000

我创建了以下DestinationRule和VirtualService资源,仅将通信量发送到v1部署。

代码语言:javascript
复制
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: customers
  #namespace: default # Not working
  #namespace: frontend # working
  namespace: backend # working
spec:
  host: customers.backend.svc.cluster.local
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: customers
  #namespace: default # Not working
  #namespace: frontend # working
  namespace: backend # working
spec:
  hosts:
    - "customers.backend.svc.cluster.local"
  http:
  ## route  - subset: v1
  - route:
      - destination:
          host: customers.backend.svc.cluster.local
          port:
            number: 80
          subset: v1
  • 问题是为客户服务定义VR和DR资源的合适名称空间吗?
  • 从我的测试中,我发现我可以使用前端命名空间,也可以使用后端命名空间。为什么VR、DR可以创建到前端名称空间或后端命名空间中,在这两种情况下都能工作?哪一个是正确的?
  • DestinationRule和VirtualService资源是真正的名称空间资源还是可以被视为集群范围的资源?是否将代理的低级别路由规则传播到所有特使代理,而不管名称空间如何?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-31 12:57:24

在请求期间实际应用的DestinationRule需要位于目标规则查找路径上:

代码语言:javascript
复制
-> client namespace
-> service namespace
-> the configured meshconfig.rootNamespace namespace (istio-system by default)

在您的示例中,“web前端”客户机位于前端命名空间(web-frontend.frontend.svc.cluster.local)中,"customers“服务位于后端命名空间(customers.backend.svc.cluster.local)中,因此customers DestinationRule应该在以下名称空间之一中创建:前端e 110后端e 211web-frontend.frontend.svc.cluster.local。此外,请注意,不建议使用istio-system名称空间,除非目标规则实际上是适用于所有命名空间的全局配置。

为了确保应用目标规则,我们可以对istioctl proxy-config cluster Pod使用web-frontend命令:

代码语言:javascript
复制
$ istioctl proxy-config cluster web-frontend-69d6c79786-vkdv8 -n frontend | grep "customers.backend.svc.cluster.local"
SERVICE FQDN                                            PORT      SUBSET     DESTINATION RULE
customers.backend.svc.cluster.local                     80        -          customers.frontend
customers.backend.svc.cluster.local                     80        v1         customers.frontend
customers.backend.svc.cluster.local                     80        v2         customers.frontend

当在默认名称空间中创建目标规则时,它将不会在请求期间应用:

代码语言:javascript
复制
$ istioctl proxy-config cluster web-frontend-69d6c79786-vkdv8 -n frontend | grep "customers.backend.svc.cluster.local"
SERVICE FQDN                                            PORT      SUBSET    DESTINATION RULE
customers.backend.svc.cluster.local                     80        -        

有关更多信息,请参见名称空间中的控件配置共享文档。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70533424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档