Kubernetes Istio网关虚拟服务路由

Kubernetes Istio网关虚拟服务路由,kubernetes,istio,Kubernetes,Istio,我正在尝试根据Book Info示例,使用Istio 1.3.0-rc.0设置一个简单的路由示例。我在EKS中尝试使用Kubernetes 1.13版。这是我的配置 apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: myapp-gateway spec: selector: istio: ingressgateway # use istio default controller ser

我正在尝试根据Book Info示例,使用Istio 1.3.0-rc.0设置一个简单的路由示例。我在EKS中尝试使用Kubernetes 1.13版。这是我的配置

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: myapp-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"

---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
  labels:
    app: myapp
spec:
  ports:
    - port: 3001
      name: http
  selector:
    app: myapp

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
      version: v1
  template:
    metadata:
      labels:
        app: myapp
        version: v1
    spec:
      containers:
        - name: myapp
          image: fake-myapp:v1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3001

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
      version: v2
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
        - name: myapp
          image: fake-myapp:v2
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3001
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: myapp-destinationrule
spec:
  host: myapp-service
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: app-virtualservice
spec:
  hosts:
    - "*"
  gateways:
    - myapp-gateway
  http:
    - match:
        - uri:
            exact: /api
      route:
        - destination:
            host: myapp-service
            subset: v2

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp-virtualservice
spec:
  hosts:
    - myapp-service
  http:
    - route:
        - destination:
            host: myapp-service
            subset: v2
---

我可以从外部负载平衡器访问我的服务,但是,我正在尝试将流量路由到VirtualServices中定义的仅子集v2

但是,我只能在部署的两个版本之间实现循环平衡

我尝试了建议将子集添加到连接了网关的VirtualService,但仍然没有成功

我还尝试过在没有运气的情况下显式设置主机名


我遗漏了什么?

以下是我对2
虚拟服务的观察

  • 在第一个VirtualService(
    app VirtualService
    )上,
    match.uri
    精确的
    ,值为
    /api
    。这意味着具有路径
    /api
    的请求将正常工作,即POST GATEWAY\u URL/api、GET GATEWAY\u URL/api。如果您有更多的扩展,例如PostGateway\uURL/api/somethingelse,那么它就不属于这个路由。请检查一下这个区域。如果这是一个问题,可以使用
    前缀
    而不是
    精确
  • 在第二个VirtualService(
    myapp VirtualService
    )上,没有指示将指定其应用的网关的
    spec.gateways
    。此外,在这个特定的实例中,
    VirtualService
    控制您的
    网关的路由。目的规则适用于
    服务
    (或特使侧车代理)

  • 请检查这些是否有帮助。

    这种行为是可以解释的。一旦您创建了指向两个不同的
    v1
    v2
    的K8s,K8s运行时将确定哪些端口正在侦听,因此每次您通过Istio mesh流量对象路径(网关->虚拟服务->目标规则->K8s服务)到达应用程序服务时根据用户空间代理,请求随机点击
    myapp-v1
    myapp-v2
    嵌套的POD,默认情况下使用循环算法启用

    您可能需要为
    v1
    v2
    部署组合两个单独的k8s服务,分别以适当的端点为目标,以避免应用程序方之间的零星流量路由,如果您希望在应用程序之间路由流量,而不是在服务之间拆分流量


    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-v1-service
      labels:
        version: v1
    spec:
      ports:
        - port: 3001
          name: http
      selector:
        version: v1
    
    apiVersion: v1
        kind: Service
        metadata:
          name: myapp-v2-service
          labels:
            version: v2
        spec:
          ports:
            - port: 3001
              name: http
          selector:
            version: v2