本文介绍如何快速地在ACMG模式下部署应用。
前提条件
已部署示例代码。具体操作,请参见准备工作。
在本操作文档中,您可能需要反复切换 Kubernetes 上下文(context)以操作数据面集群和控制面集群。为了避免误操作,请您在每次上下文切换时,务必确认当前上下文是否正确。您可以使用kubectx
简化上下文切换的操作,具体步骤,请参见kubectx。您也可以通过开启通过数据面集群KubeAPI访问Istio资源,使用数据面集群KubeAPI直接操作控制面集群。
按Namespace开启/关闭ACMG模式
通过ASM实例的kubeconfig操作控制面集群,开启ACMG模式。
kubectl label namespace default istio.io/dataplane-mode=acmg
关闭ACMG模式。
kubectl label namespace default istio.io/dataplane-mode-
步骤一:启用授权策略
将应用程序添加到ACMG模式后,您可以使用L4和L7授权策略来保护应用程序访问。例如,可以根据客户端工作负载身份控制对服务的访问。
L4授权策略
使用以下内容,创建productpage-viewer.yaml。
kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRef: kind: Service group: "" name: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep
使用ASM实例的KubeConfig,执行以下命令,部署授权策略,显式允许sleep应用服务账户调用该productpage服务。
kubectl apply -f productpage-viewer.yaml
验证授权策略是否生效。
执行以下命令:
kubectl exec deploy/sleep -- curl -s "http://productpage:9080/productpage" | grep -o "<title>.*</title>"
预期输出:
<title>Simple Bookstore App</title>
执行以下命令:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
预期输出:
RBAC: access denied
以上结果说明授权策略生效。
L7授权策略
使用以下内容创建productpage-viewer.yaml,允许sleep应用的服务账户通过GET方法访问productpage服务,但不允许执行其他操作。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRef: kind: Service group: "" name: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep to: - operation: methods: ["GET"]
使用ASM的kubeconfig,执行以下命令,部署授权策略。
kubectl apply -f productpage-viewer.yaml
验证授权策略是否生效。
执行以下命令,从sleep应用Pod使用GET方法访问productpage服务。
kubectl exec deploy/sleep -- curl -s "http://productpage:9080/productpage" | grep -o "<title>.*</title>"
预期输出:
<title>Simple Bookstore App</title>
执行以下命令,从sleep应用Pod使用DELETE方法访问produpage服务。
kubectl exec deploy/sleep -- curl -s "http://productpage:9080/productpage" -X DELETE
预期输出:
RBAC: access denied
执行以下命令,从notsleep应用Pod使用GET方法访问produpage服务。
kubectl exec deploy/notsleep -- curl -s "http://productpage:9080/productpage"
预期输出:
RBAC: access denied
可以看到,从sleep应用使用GET方法可以正常访问productpage服务,使用DELETE方法和从notsleep应用访问被拒绝,策略已经生效。
步骤二:定义L7路由规则
使用VirtualService和DestinationRule
使用以下内容,创建review-all-v1.yaml。
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
执行以下命令,部署VirtualService和DestinationRule,配置流量路由以100%的请求发送到review-v1。
kubectl apply -f reviews-all-v1.yaml
执行以下命令,验证100%的请求中是否流向reviews-v1。
kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://productpage:9080/productpage | grep reviews-v.-; done"
预期输出:
<u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u>
可以看到,所有的请求都流向了review-v1服务,VirtualService和DestinationRule已生效。
使用GatewayAPI
请确认ACK集群中已存在GatewayAPI相关的CRD,并且已开启ASM实例的GatewayAPI支持开关。具体操作,请参见确认ACK集群已存在GatewayAPI相关CRD和开启ASM实例的GatewayAPI支持开关。
使用以下内容,创建 reviews-route-all-v1.yaml。
apiVersion: v1 kind: Service metadata: name: reviews-v1 spec: ports: - port: 9080 name: http selector: app: reviews version: v1 --- apiVersion: v1 kind: Service metadata: name: reviews-v2 spec: ports: - port: 9080 name: http selector: app: reviews version: v2 --- apiVersion: v1 kind: Service metadata: name: reviews-v3 spec: ports: - port: 9080 name: http selector: app: reviews version: v3 --- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: reviews spec: parentRefs: - group: "" kind: Service name: reviews port: 9080 rules: - backendRefs: - name: reviews-v1 port: 9080
执行以下命令,部署使用GatewayAPI定义的HTTPRoute规则,限制所有访问reviews的流量都将被路由到reviews-v1。
kubectl apply -f reviews-route-all-v1.yaml
执行以下命令,验证HTTPRoute规则是否生效。
kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://productpage:9080/productpage | grep reviews-v.-; done"
预期输出:
<u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u> <u>reviews-v1-ff5787f99-t64h2</u>
可以看到,所有访问reviews的流量都将被路由到了reviews-v1,使用GatewayAPI定义的HTTPRoute规则已经生效。