基于HTTP Header的路由和路由优先级

总览

本实验将介绍如何使用标头(HTTP Headers)进行路由。

前提条件

  1. 完成上一节appmesh在EKS上的部署

  2. v1beta2 示例 manifest 需要 aws-app-mesh-controller-for-k8s 版本 >=v1.0.0 . 运行下面的命令检查你运行的controller版本.

    $ kubectl get deployment -n appmesh-system appmesh-controller -o json | jq -r ".spec.template.spec.containers[].image" | cut -f2 -d ':'|tail -n1
    

如果你 aws-app-mesh-controller-for-k8s 版本是 v0.3.0 ,你可以使用 v1beta1 示例 manifest

  1. 安装并运行Docker,示例需要构建演示应用的Docker image

    sudo yum install docker -y
    sudo usermod -aG docker ${USER}
    sudo chmod 666 /var/run/docker.sock
    sudo service docker start
    

部署

  1. 进入上一节git仓库的howto-k8s-http-headers文件夹,所有的命令都是在此文件夹下运行。

  2. 你的 account id:

    export AWS_ACCOUNT_ID=<your_account_id>

  3. Region e.g. us-west-2

    export AWS_DEFAULT_REGION=us-west-2

  4. (可选项) 指定 Envoy Image 版本 如果要使用与默认版本 不同的Envoy 容器镜像,运行 helm upgrade 去覆盖 sidecar.image.repositorysidecar.image.tag 字段。

  5. 部署

    ./deploy.sh
    

使用 curl 测试

在manifest.yaml.template的VirtualRouter部分,能看到VirtualRouter根据http header的color_header字段,将请求转发到不同的VirtualNode:

apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualRouter
metadata:
  namespace: ${APP_NAMESPACE}
  name: color
spec:
  listeners:
    - portMapping:
        port: 8080
        protocol: http
  routes:
    - name: color-route-blue
      priority: 10
      httpRoute:
        match:
          prefix: /
          headers:
            - name: color_header
              match:
                exact: blue
        action:
          weightedTargets:
            - virtualNodeRef:
                name: blue
              weight: 1
    - name: color-route-green
      priority: 20
      httpRoute:
        match:
          prefix: /
          headers:
            - name: color_header
              match:
                regex: ".*green.*"
        action:
          weightedTargets:
            - virtualNodeRef:
                name: green
              weight: 1
      ......

在集群里添加一个请求者:

kubectl run -it curler --image=curlimages/curl /bin/sh

在请求者里运行命令测试.

请求 blue :

curl -H "color_header: blue" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

请求 red :

curl -H "color_header: red" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

请求 green (color_header 中带有’green’字符串) :

curl -H "color_header: requesting.green.color" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

请求 yellow (color_header 存在无法识别的值) :

curl -H "color_header: rainbow" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

请求 white (不携带color_header) :

curl front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

返回结果符合VirtualRouter中定义的规则:

image-20211217153113826