0

我是 Istio 的新手,我正在使用我的简单应用程序浏览一些用例。

我在使用 VirtualBox 5.2.6 和 istio 0.6.0 的 Windows 10 Pro 上运行的 minikube 上部署了 2 个简单的服务

service1 的 v1版本和service2的 v1 & v2版本。service1 响应 /hello,service2 响应 /world。到目前为止一切正常,两个服务都在响应,并且从 service2 开始,循环运行。

现在我想应用 2 个路由规则,一个基于标头路由到 service2 的 v2,其余路由到 service2 的 v1,但是当我尝试这样做时出现错误:

Error: cannot parse proto message: YAML decoding error: destination:
  name: service2
match:
  request:
    headers:
      Foo: bar
precedence: 2
route:
- labels:
    version: v2
 json: cannot unmarshal string into Go value of type map[string]json.RawMessage

请在我的应用程序和路由规则配置下方找到。

这个配置有什么问题?

请注意,当我省略“匹配”部分时,没关系,但这当然不是我想要的。

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: service2-route
spec:
  destination:
    name: service2
  precedence: 2
  match:
    request:
      headers:
        Foo: bar
  route:
  - labels:
      version: v2
---
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: service2-default
spec:
  destination:
    name: service2
  precedence: 1
  route:
  - labels:
      version: v1
    weight: 100

和我的服务部署 yaml:

###########################################################################
# Service 1
##########################################################################
apiVersion: v1
kind: Service
metadata:
  name: service1
  labels:
    app: service1
spec:
  ports:
  - port: 8080
    name: http
  selector:
    app: service1
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: service1-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: service1
        version: v1
    spec:
      containers:
      - name: service1
        image: myrepo/sampleapp-service1:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
---
###########################################################################
# Service 2
##########################################################################
apiVersion: v1
kind: Service
metadata:
  name: service2
  labels:
    app: service2
spec:
  ports:
  - port: 8081
    name: http
  selector:
    app: service2
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: service2-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: service2
        version: v1
    spec:
      containers:
      - name: service2
        image: myrepo/sampleapp-service2:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8081
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: service2-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: service2
        version: v2
    spec:
      containers:
      - name: service2
        image: myrepo/sampleapp-service2:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8081
---
###########################################################################
# Ingress resource (gateway)
##########################################################################
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gateway
  annotations:
    kubernetes.io/ingress.class: "istio"
spec:
  rules:
  - http:
      paths:
      - path: /hello
        backend:
          serviceName: service1
          servicePort: 8080
      - path: /world
        backend:
          serviceName: service2
          servicePort: 8081
---
4

1 回答 1

2

这里的问题很简单,你要说你想怎么匹配你的header。在您的示例中,我可以假设您想要完全匹配,因此使用以下语法:

  match:
    request:
      headers:
        Foo: 
          exact: bar

在这里您可以找到更多可用选项。如果您的标题值包含任何特殊字符,我也建议使用引号。

于 2018-03-12T08:12:22.413 回答