本实验演示了如何访问Mesh之外的外部服务。
本实验将创建两个 Kubernetes 命名空间:howto-k8s-egress
和 mesh-external
。
Mesh 将只应用在命名空间 howto-k8s-egress
和其中的资源, mesh-external
不是 Mesh 的一部分。
mesh-external
将有两个服务 red
和 blue
,我们将展示从 Mesh 访问这两个外部服务的情况:
通过使用 Mesh ALLOW_ALL egress filter
通过使用Mesh DROP_ALL egress filter和virtual node暴露的blue service
$ 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-egress
文件夹,所有命令都将从这个位置运行
git clone https://github.com/aws/aws-app-mesh-examples
cd aws-app-mesh-examples/walkthroughs/howto-k8s-egress
export AWS_ACCOUNT_ID=<your_account_id>
export AWS_DEFAULT_REGION=us-west-2
./deploy.sh
1.验证创建了两个命名空间:howto-k8s-egress
(Mesh的一部分)和mesh-external
(Mesh的外部)
kubectl get ns
appmesh-system Active 10d
default Active 10d
howto-k8s-egress Active 6s
kube-node-lease Active 10d
kube-public Active 10d
kube-system Active 10d
mesh-external Active 6s
kubectl get pod,svc -n mesh-external
NAME READY STATUS RESTARTS AGE
pod/blue-5cf49bddcf-mnlrx 1/1 Running 0 2m17s
pod/red-7c595d6f8f-jj2vh 1/1 Running 0 2m17s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/blue ClusterIP 10.100.254.102 <none> 8080/TCP 2m17s
service/red ClusterIP 10.100.237.219 <none> 8080/TCP 2m17s
blue
和red
的连接。进入到front pod内部shell:FRONT_POD=$(kubectl get pod -l "app=front" -n howto-k8s-egress --output=jsonpath={.items..metadata.name})
kubectl exec -it $FRONT_POD -n howto-k8s-egress -- /bin/bash
blue
$ curl blue.mesh-external.svc.cluster.local:8080/; echo;
external: blue
尽管在网格级别有DROP_ALL
egress, 还是得到了external: blue
响应,因为我们已经在网格内部设置了一个virtual node来引用这个外部服务:
red
curl -lvv red.mesh-external.svc.cluster.local:8080/; echo;
访问外部服务red
时,您应该收到 404 响应,因为 Mesh 具有DROP_ALL
egress,并且我们没有任何引用此外部服务的virtual node.
ALLOW_ALL
出口将 v1beta2/manifest.yaml.template
中的 mesh->egressFilter
更改为 ALLOW_ALL
, 并再次部署应用程序
SKIP_IMAGES=1 ./deploy.sh
检查与外部服务blue
和red
的连接:
kubectl exec -it $FRONT_POD -n howto-k8s-egress -- /bin/bash
curl blue.mesh-external.svc.cluster.local:8080/; echo;
external: blue
curl red.mesh-external.svc.cluster.local:8080/; echo;
external: red
可以看到访问外部服务都成功响应,因为 Mesh 允许使用 ALLOW_ALL
egressFilter 连接所有外部服务。
kubectl delete -f _output/manifest.yaml