此示例展示了如何使用 Kubernetes deployment在 App Mesh 中管理 gRPC 路由。
$ kubectl get deployment -n appmesh-system appmesh-controller -o json | jq -r ".spec.template.spec.containers[].image" | cut -f2 -d ':'|tail -n1
安装 Docker, 用于构建示例应用的镜像。
克隆仓库并进入到 walkthroughs/howto-k8s-grpc
文件夹,所有命令都将从这个位置运行
https://github.com/aws-samples/app-mesh-workshop-greater-china
cd howto-k8s-grpc
设置环境变量:
export AWS_ACCOUNT_ID=<your_account_id>
export AWS_DEFAULT_REGION=us-west-2
VPC_ID 环境变量设置为启动 Kubernetes pod 的 VPC。 VPC 将用于使用 create-private-dns-namespace
API 创建私有 DNS 命名空间。 要查找 EKS 集群的 VPC,您可以使用 aws eks describe-cluster
。
aws eks describe-cluster --name appmeshtest | grep vpc # 根据集群名称获取vpcId
export VPC_ID=...
进行应用部署:
./deploy.sh
请注意,示例应用使用 go 模块。 如果您在部署期间无法访问 https://proxy.golang.org ,可以通过设置
GO_PROXY=direct
来覆盖 GOPROXY
GO_PROXY=direct ./deploy.sh
设置端口转发 ,将本地计算机的请求路由到**client ** pod。 本地端口由您决定,在本实验中,我们假设本地端口为 7000。
kubectl port-forward pod/client-xxxxxxxx-xxxx -n howto-k8s-grpc 7000:8080
访问本机7000端口,发现
使用以下命令来查看client应用程序日志:
kubectl logs -f client-xxxxx-xxxx -n howto-k8s-grpc app
curl /getColor
API
curl localhost:7000/getColor
你应该看到返回 no_color
。
Color client
返回的颜色可以使用 /setColor
API 进行配置。
curl -i -X POST -d "blue" localhost:7000/setColor
我们通过 -i
标志来查看响应中的任何错误信息。 你应该看到类似的返回:
HTTP/1.1 404 Not Found
Date: Fri, 27 Sep 2019 01:27:42 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 40
Connection: keep-alive
x-content-type-options: nosniff
x-envoy-upstream-service-time: 1
server: envoy
rpc error: code = Unimplemented desc =
这是因为我们当前的Mesh仅配置为路由 gRPC 方法GetColor
:
cat _output/manifest.yaml
..........
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualRouter
metadata:
name: color
namespace: howto-k8s-grpc
spec:
listeners:
- portMapping:
port: 8080
protocol: grpc
routes:
- name: route
grpcRoute:
match:
serviceName: color.ColorService
methodName: GetColor
action:
weightedTargets:
- virtualNodeRef:
name: server
weight: 1
---
删除 gRPC 路由中的 methodName
匹配条件以匹配 color.ColorService
的所有方法。
为此,请删除 v1beta2/manifest.yaml.template
中的 methodName 部分, 并重新运行部署脚本
./deploy.sh
现在尝试再次更新颜色
curl -i -X POST -d "blue" localhost:7000/setColor
你会看到返回了 HTTP/1.1 200 OK
响应, 还会在响应中看到no_color
, 但这是成功更新color后, 返回先前颜色。
验证颜色确实成功更新:
curl localhost:7000/getColor