本文介绍如何快速将应用部署到Ambient Mesh模式。
前提条件
在本操作文档中,您可能需要反复切换 Kubernetes 上下文(context)以操作数据面集群和控制面集群。为了避免误操作,请您在每次上下文切换时,务必确认当前上下文是否正确。您可以使用kubectx
简化上下文切换的操作,具体步骤,请参见kubectx。您也可以通过开启通过数据面集群KubeAPI访问Istio资源,使用数据面集群KubeAPI直接操作控制面集群。
步骤一:启用授权策略
将应用程序添加到Ambient Mesh后,您可以使用L4授权策略来保护应用程序访问。例如,可以根据客户端工作负载身份控制对服务的访问。
ASM 1.22版本的L4授权策略正在灰度中,1.21及以下版本可以正常使用。如需使用1.22版本的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授权策略
ASM 1.21及以下版本
使用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>
以上结果表明授权策略生效。
ASM 1.22及以上版本
要在Ambient模式下使用L7能力,首先需要为指定服务或工作负载启用Waypoint代理。
如何为指定服务或工作负载启用Waypoint代理?
为了支持更加灵活的在不同范围内启用Waypoint,1.22使用了新的配置Waypoint的方法。配置主要分为两部分:
首先您需要创建一个Waypoint代理,在Waypoint上通过label指定要生效的流量。
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: labels: istio.io/waypoint-for: service name: waypoint namespace: default spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONE
这个Gateway资源的
gatewayClassName
字段为istio-waypoint
,声明创建的是Waypoint。它带有一个特殊的label
istio.io/waypoint-for: service
,表明这个Waypoint专为Service的流量服务。除了service
之外,还支持配置:workload
(专用于Pod)以及all
(Service和Workload)。
指定哪些流量要被Waypoint代理。需要在Service、Namespace或者Pod上加上
istio.io/use-waypoint
这个label,label的值是要使用的Waypoint代理名称。apiVersion: v1 kind: Service metadata: labels: app: httpbin service: httpbin istio.io/use-waypoint: waypoint name: httpbin namespace: default spec: ports: - name: http port: 8000 protocol: TCP targetPort: 80 selector: app: httpbin type: ClusterIP
演示
接下来,继续在本文的环境下演示如何使用L7授权策略。
使用ACK kubeconfig,将以下Waypoint代理的内容部署到default命名空间。
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: labels: istio.io/waypoint-for: service name: waypoint namespace: default spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONE
使用ACK集群kubeconfig执行以下命令,为productpage对应的Service添加label,让对应流量被waypoint代理。
kubectl label service productpage istio.io/use-waypoint=waypoint
使用以下内容更新AuthorizationPolicy。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep to: - operation: methods: ["GET"]
明确指出只允许slepp使用GET访问productpage服务,其余请求都将被拒绝。
说明如果直接apply上述授权策略失败,请删除原有授权策略后重新apply。
验证授权策略是否生效
使用ACK kubeconfig,执行以下命令使用GET方法访问productpage服务。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
预期输出:
<title>Simple Bookstore App</title>
执行以下命令,使用DELETE方法访问productpage服务。
kubectl exec deploy/sleep -- curl -XDELETE -s http://productpage:9080/
预期输出:
RBAC: access denied
执行以下命令,使用GET方法访问productpage服务。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/
预期输出:
RBAC: access denied
以上结果表明授权策略生效。
步骤二:定义L7路由规则
ASM 1.21及以下版本
执行以下命令,为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路由规则生效。
ASM 1.22及以上版本
执行以下命令,为reviews服务部署Waypoint代理,以便任何流向reviews服务的流量都将由Waypoint代理进行路由。
kubectl label service reviews istio.io/use-waypoint=waypoint
使用以下内容,为review服务创建流量规则,加个90%的请求发送给review v1,10%的请求发送给review v2.
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews trafficPolicy: loadBalancer: simple: RANDOM subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 90 - destination: host: reviews subset: v2 weight: 10
执行以下命令, 验证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