本实验将介绍如何使用标头(HTTP Headers)进行路由。
完成上一节appmesh在EKS上的部署
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
安装并运行Docker,示例需要构建演示应用的Docker image
sudo yum install docker -y
sudo usermod -aG docker ${USER}
sudo chmod 666 /var/run/docker.sock
sudo service docker start
进入上一节git仓库的howto-k8s-http-headers
文件夹,所有的命令都是在此文件夹下运行。
你的 account id:
export AWS_ACCOUNT_ID=<your_account_id>
Region e.g. us-west-2
export AWS_DEFAULT_REGION=us-west-2
(可选项) 指定 Envoy Image 版本 如果要使用与默认版本
不同的Envoy 容器镜像,运行 helm upgrade
去覆盖 sidecar.image.repository
和 sidecar.image.tag
字段。
部署
./deploy.sh
在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中定义的规则: