本文介绍如何快速将应用部署到Ambient Mesh模式。
前提条件
已创建符合以下条件的Kubernetes集群。更多信息,请参见使用限制。
网络插件:从ASM 1.21版本开始, 兼容支持Terway和Flannel网络插件,kube-proxy代理支持iptables和IPVS模式。 同时, 支持Terway插件下的IPvlan模式以及NetworkPolicy能力。
操作系统:支持Alibaba Cloud Linux 2和Alibaba Cloud Linux 3。
如果需要在ACK Serverless集群、 Edge集群、注册集群中使用Ambient Mesh模式, 请提交工单获得技术支持。
已创建启用Ambient Mesh模式的ASM实例。
在创建服务网格页面的数据面模式区域,选中启用Ambient Mesh模式,其他配置项请按照实际情况进行配置。具体操作,请参见创建ASM实例。
已为ASM实例添加ACK集群。具体操作,请参见添加集群到ASM实例。
已创建入口网关。具体操作,请参见创建入口网关。
已按照实际操作系统及平台,下载Istioctl服务网格调试工具。详细信息,请参见Istio。
在本操作文档中,您可能需要反复切换 Kubernetes 上下文(context)以操作数据面集群和控制面集群。为了避免误操作,请您在每次上下文切换时,务必确认当前上下文是否正确。您可以使用kubectx
简化上下文切换的操作,具体步骤,请参见kubectx。您也可以通过开启通过数据面集群KubeAPI访问Istio资源,使用数据面集群KubeAPI直接操作控制面集群。
步骤一:部署示例应用
本文使用bookinfo作为示例应用。更多信息,请参见在ASM实例关联的集群中部署应用。
在ACK集群中部署示例应用
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在全局命名空间页面的数据面模式列,单击default命名空间对应的切换为Ambient Mesh模式,然后在确认对话框,单击确定。
部署Bookinfo应用。
使用以下内容创建bookinfo.yaml。
执行以下命令,在default命名空间中部署该示例应用。
kubectl apply -f bookinfo.yaml
部署Sleep应用。
使用以下内容创建sleep.yaml。
执行以下命令,在default命名空间中部署该示例应用。
kubectl apply -f sleep.yaml
部署Notsleep应用。
使用以下内容创建notsleep.yaml。
执行以下命令,在default命名空间中部署该示例应用。
kubectl apply -f notsleep.yaml
在ASM实例中部署网格资源
使用以下内容,创建bookinfo-gateway.yaml文件。
YAML文件用于创建网关规则Gateway对象和虚拟服务VirtualService对象。
在ASM实例对应的KubeConfig环境下,执行以下命令,部署网格资源。
kubectl apply -f bookinfo-gateway.yaml
验证基本功能
执行以下命令,设置入口网关的环境变量。
export GATEWAY_HOST=istio-ingressgateway.istio-system export GATEWAY_SERVICE_ACCOUNT=ns/istio-system/sa/istio-ingressgateway
测试bookinfo应用程序,查看在有无网关的情况下能否正常运行。
执行以下命令:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"
预期输出:
<title>Simple Bookstore App</title>
执行以下命令:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
预期输出:
<title>Simple Bookstore App</title>
执行以下命令:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
预期输出:
<title>Simple Bookstore App</title>
以上结果表明在有无网关下的情况下,bookinfo应用程序均可以正常运行。
步骤二:启用授权策略
将应用程序添加到Ambient Mesh后,您可以使用L4授权策略来保护应用程序访问。例如,可以根据客户端工作负载身份控制对服务的访问。
L4授权策略
使用以下内容,创建productpage-viewer.yaml。
YAML文件用于定义授权策略,显式允许sleep应用和网关服务账户调用该productpage服务。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep - cluster.local/ns/istio-system/sa/istio-ingressgateway
在ASM实例对应的KubeConfig环境下,执行以下命令,部署授权策略。
kubectl apply -f productpage-viewer.yaml
验证授权策略是否生效。
执行以下命令:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"
预期输出:
<title>Simple Bookstore App</title>
执行以下命令:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
预期输出:
<title>Simple Bookstore App</title>
执行以下命令:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
预期输出:
command terminated with exit code 56
以上结果表明授权策略生效。
L7授权策略
使用Kubernetes Gateway API,可以为bookinfo-productpage服务账户部署Waypoint代理,该代理用于productpage服务。任何流向productpage服务的流量都将由该7层代理路由。
执行以下命令,为bookinfo-productpage服务账户部署Waypoint代理。
istioctl x waypoint apply --service-account bookinfo-productpage
执行以下命令,查看productpage的Waypoint代理状态。
kubectl get gtw bookinfo-productpage -o yaml
修改AuthorizationPolicy。
将productpage-viewer.yaml文件修改为如下内容,明确允许sleep和网关服务账户通过GET方式访问productpage服务,但不允许执行其他操作。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep - cluster.local/ns/istio-system/sa/istio-ingressgateway to: - operation: methods: ["GET"]
执行以下命令,重新部署AuthorizationPolicy。
kubectl apply -f productpage-viewer.yaml
验证授权策略是否生效。
执行以下命令:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" -X DELETE
预期输出:
RBAC: access denied
执行以下命令:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/
预期输出:
RBAC: access denied
执行以下命令:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
预期输出:
<title>Simple Bookstore App</title>
以上结果表明授权策略生效。
步骤三:定义L7路由规则
执行以下命令,为reviews服务部署Waypoint代理,以便任何流向reviews服务的流量都将由Waypoint代理进行路由。
istioctl x waypoint apply --service-account bookinfo-reviews
使用以下内容,创建reviews.yaml。
配置流量路由以将90%的请求发送到reviews-v1,将10%的请求发送到reviews-v2。
执行以下命令,部署DestinationRule。
kubectl apply -f reviews.yaml
执行以下命令, 验证100个请求中是否约10%的流量流向reviews-v2。
kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://$GATEWAY_HOST/productpage | grep reviews-v.-; done"
预期输出:
<u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v2-5d99885bc9-qb5cv</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u>
预期输出表明L7路由规则生效。
步骤四:清理资源
执行以下命令,清理本文创建的资源对象。
istioctl x waypoint delete --service-account bookinfo-productpage
istioctl x waypoint delete --service-account bookinfo-reviews
kubectl delete authorizationpolicy productpage-viewer