入門示例
本文介紹如何快速地在ACMG模式下部署應(yīng)用。
前提條件
已部署示例代碼。具體操作,請(qǐng)參見(jiàn)準(zhǔn)備工作。
在本操作文檔中,您可能需要反復(fù)切換 Kubernetes 上下文(context)以操作數(shù)據(jù)面集群和控制面集群。為了避免誤操作,請(qǐng)您在每次上下文切換時(shí),務(wù)必確認(rèn)當(dāng)前上下文是否正確。您可以使用kubectx
簡(jiǎn)化上下文切換的操作,具體步驟,請(qǐng)參見(jiàn)kubectx。您也可以通過(guò)開(kāi)啟通過(guò)數(shù)據(jù)面集群KubeAPI訪問(wèn)Istio資源,使用數(shù)據(jù)面集群KubeAPI直接操作控制面集群。
按Namespace開(kāi)啟/關(guān)閉ACMG模式
通過(guò)ASM實(shí)例的kubeconfig操作控制面集群,開(kāi)啟ACMG模式。
kubectl label namespace default istio.io/dataplane-mode=acmg
關(guān)閉ACMG模式。
kubectl label namespace default istio.io/dataplane-mode-
步驟一:?jiǎn)⒂檬跈?quán)策略
將應(yīng)用程序添加到ACMG模式后,您可以使用L4和L7授權(quán)策略來(lái)保護(hù)應(yīng)用程序訪問(wèn)。例如,可以根據(jù)客戶端工作負(fù)載身份控制對(duì)服務(wù)的訪問(wèn)。
L4授權(quán)策略
使用以下內(nèi)容,創(chuàng)建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實(shí)例的KubeConfig,執(zhí)行以下命令,部署授權(quán)策略,顯式允許sleep應(yīng)用服務(wù)賬戶調(diào)用該productpage服務(wù)。
kubectl apply -f productpage-viewer.yaml
驗(yàn)證授權(quán)策略是否生效。
執(zhí)行以下命令:
kubectl exec deploy/sleep -- curl -s "http://productpage:9080/productpage" | grep -o "<title>.*</title>"
預(yù)期輸出:
<title>Simple Bookstore App</title>
執(zhí)行以下命令:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
預(yù)期輸出:
RBAC: access denied
以上結(jié)果說(shuō)明授權(quán)策略生效。
L7授權(quán)策略
使用以下內(nèi)容創(chuàng)建productpage-viewer.yaml,允許sleep應(yīng)用的服務(wù)賬戶通過(guò)GET方法訪問(wèn)productpage服務(wù),但不允許執(zhí)行其他操作。
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,執(zhí)行以下命令,部署授權(quán)策略。
kubectl apply -f productpage-viewer.yaml
驗(yàn)證授權(quán)策略是否生效。
執(zhí)行以下命令,從sleep應(yīng)用Pod使用GET方法訪問(wèn)productpage服務(wù)。
kubectl exec deploy/sleep -- curl -s "http://productpage:9080/productpage" | grep -o "<title>.*</title>"
預(yù)期輸出:
<title>Simple Bookstore App</title>
執(zhí)行以下命令,從sleep應(yīng)用Pod使用DELETE方法訪問(wèn)produpage服務(wù)。
kubectl exec deploy/sleep -- curl -s "http://productpage:9080/productpage" -X DELETE
預(yù)期輸出:
RBAC: access denied
執(zhí)行以下命令,從notsleep應(yīng)用Pod使用GET方法訪問(wèn)produpage服務(wù)。
kubectl exec deploy/notsleep -- curl -s "http://productpage:9080/productpage"
預(yù)期輸出:
RBAC: access denied
可以看到,從sleep應(yīng)用使用GET方法可以正常訪問(wèn)productpage服務(wù),使用DELETE方法和從notsleep應(yīng)用訪問(wèn)被拒絕,策略已經(jīng)生效。
步驟二:定義L7路由規(guī)則
使用VirtualService和DestinationRule
使用以下內(nèi)容,創(chuàng)建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
執(zhí)行以下命令,部署VirtualService和DestinationRule,配置流量路由以100%的請(qǐng)求發(fā)送到review-v1。
kubectl apply -f reviews-all-v1.yaml
執(zhí)行以下命令,驗(yàn)證100%的請(qǐng)求中是否流向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"
預(yù)期輸出:
<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>
可以看到,所有的請(qǐng)求都流向了review-v1服務(wù),VirtualService和DestinationRule已生效。
使用GatewayAPI
請(qǐng)確認(rèn)ACK集群中已存在GatewayAPI相關(guān)的CRD,并且已開(kāi)啟ASM實(shí)例的GatewayAPI支持開(kāi)關(guān)。具體操作,請(qǐng)參見(jiàn)確認(rèn)ACK集群已存在GatewayAPI相關(guān)CRD和開(kāi)啟ASM實(shí)例的GatewayAPI支持開(kāi)關(guān)。
使用以下內(nèi)容,創(chuàng)建 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
執(zhí)行以下命令,部署使用GatewayAPI定義的HTTPRoute規(guī)則,限制所有訪問(wèn)reviews的流量都將被路由到reviews-v1。
kubectl apply -f reviews-route-all-v1.yaml
執(zhí)行以下命令,驗(yàn)證HTTPRoute規(guī)則是否生效。
kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://productpage:9080/productpage | grep reviews-v.-; done"
預(yù)期輸出:
<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>
可以看到,所有訪問(wèn)reviews的流量都將被路由到了reviews-v1,使用GatewayAPI定義的HTTPRoute規(guī)則已經(jīng)生效。