入門示例
本文介紹如何快速將應(yīng)用部署到Ambient Mesh模式。
前提條件
已部署示例代碼。具體操作,請(qǐng)參見準(zhǔn)備工作。
已按照實(shí)際操作系統(tǒng)及平臺(tái),下載Istioctl服務(wù)網(wǎng)格調(diào)試工具,且istioctl版本與ASM版本一致。詳細(xì)信息,請(qǐng)參見Istio。
在本操作文檔中,您可能需要反復(fù)切換 Kubernetes 上下文(context)以操作數(shù)據(jù)面集群和控制面集群。為了避免誤操作,請(qǐng)您在每次上下文切換時(shí),務(wù)必確認(rèn)當(dāng)前上下文是否正確。您可以使用kubectx
簡(jiǎn)化上下文切換的操作,具體步驟,請(qǐng)參見kubectx。您也可以通過開啟通過數(shù)據(jù)面集群KubeAPI訪問Istio資源,使用數(shù)據(jù)面集群KubeAPI直接操作控制面集群。
步驟一:啟用授權(quán)策略
將應(yīng)用程序添加到Ambient Mesh后,您可以使用L4授權(quán)策略來保護(hù)應(yīng)用程序訪問。例如,可以根據(jù)客戶端工作負(fù)載身份控制對(duì)服務(wù)的訪問。
ASM 1.22版本的L4授權(quán)策略正在灰度中,1.21及以下版本可以正常使用。如需使用1.22版本的L4授權(quán)策略,請(qǐng)提交工單。
L4授權(quán)策略
使用以下內(nèi)容,創(chuàng)建productpage-viewer.yaml。
YAML文件用于定義授權(quán)策略,顯式允許sleep應(yīng)用和網(wǎng)關(guān)服務(wù)賬戶調(diào)用該productpage服務(wù)。
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實(shí)例對(duì)應(yīng)的KubeConfig環(huán)境下,執(zhí)行以下命令,部署授權(quán)策略。
kubectl apply -f productpage-viewer.yaml
驗(yàn)證授權(quán)策略是否生效。
執(zhí)行以下命令:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"
預(yù)期輸出:
<title>Simple Bookstore App</title>
執(zhí)行以下命令:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | 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ù)期輸出:
command terminated with exit code 56
以上結(jié)果表明授權(quán)策略生效。
L7授權(quán)策略
ASM 1.21及以下版本
使用Kubernetes Gateway API,可以為bookinfo-productpage服務(wù)賬戶部署Waypoint代理,該代理用于productpage服務(wù)。任何流向productpage服務(wù)的流量都將由該7層代理路由。
執(zhí)行以下命令,為bookinfo-productpage服務(wù)賬戶部署Waypoint代理。
istioctl x waypoint apply --service-account bookinfo-productpage
執(zhí)行以下命令,查看productpage的Waypoint代理狀態(tài)。
kubectl get gtw bookinfo-productpage -o yaml
apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: annotations: gateway.istio.io/controller-version: "5" istio.io/for-service-account: bookinfo-productpage creationTimestamp: "2023-08-10T08:35:51Z" generation: 1 name: bookinfo-productpage namespace: default resourceVersion: "7828921" uid: c085b788-a8fa-4a2c-8376-18d08689**** spec: gatewayClassName: istio-waypoint listeners: - allowedRoutes: namespaces: from: Same name: mesh port: 15008 protocol: HBONE status: conditions: - lastTransitionTime: "2023-08-10T08:35:51Z" message: Handled by Istio controller observedGeneration: 1 reason: Accepted status: "True" type: Accepted
修改AuthorizationPolicy。
將productpage-viewer.yaml文件修改為如下內(nèi)容,明確允許sleep和網(wǎng)關(guān)服務(wù)賬戶通過GET方式訪問productpage服務(wù),但不允許執(zhí)行其他操作。
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"]
執(zhí)行以下命令,重新部署AuthorizationPolicy。
kubectl apply -f productpage-viewer.yaml
驗(yàn)證授權(quán)策略是否生效。
執(zhí)行以下命令:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" -X DELETE
預(yù)期輸出:
RBAC: access denied
執(zhí)行以下命令:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/
預(yù)期輸出:
RBAC: access denied
執(zhí)行以下命令:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
預(yù)期輸出:
<title>Simple Bookstore App</title>
以上結(jié)果表明授權(quán)策略生效。
ASM 1.22及以上版本
要在Ambient模式下使用L7能力,首先需要為指定服務(wù)或工作負(fù)載啟用Waypoint代理。
如何為指定服務(wù)或工作負(fù)載啟用Waypoint代理?
為了支持更加靈活的在不同范圍內(nèi)啟用Waypoint,1.22使用了新的配置Waypoint的方法。配置主要分為兩部分:
首先您需要?jiǎng)?chuàng)建一個(gè)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
這個(gè)Gateway資源的
gatewayClassName
字段為istio-waypoint
,聲明創(chuàng)建的是Waypoint。它帶有一個(gè)特殊的label
istio.io/waypoint-for: service
,表明這個(gè)Waypoint專為Service的流量服務(wù)。除了service
之外,還支持配置:workload
(專用于Pod)以及all
(Service和Workload)。
指定哪些流量要被Waypoint代理。需要在Service、Namespace或者Pod上加上
istio.io/use-waypoint
這個(gè)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
演示
接下來,繼續(xù)在本文的環(huán)境下演示如何使用L7授權(quán)策略。
使用ACK kubeconfig,將以下Waypoint代理的內(nèi)容部署到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執(zhí)行以下命令,為productpage對(duì)應(yīng)的Service添加label,讓對(duì)應(yīng)流量被waypoint代理。
kubectl label service productpage istio.io/use-waypoint=waypoint
使用以下內(nèi)容更新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服務(wù),其余請(qǐng)求都將被拒絕。
說明如果直接apply上述授權(quán)策略失敗,請(qǐng)刪除原有授權(quán)策略后重新apply。
驗(yàn)證授權(quán)策略是否生效
使用ACK kubeconfig,執(zhí)行以下命令使用GET方法訪問productpage服務(wù)。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
預(yù)期輸出:
<title>Simple Bookstore App</title>
執(zhí)行以下命令,使用DELETE方法訪問productpage服務(wù)。
kubectl exec deploy/sleep -- curl -XDELETE -s http://productpage:9080/
預(yù)期輸出:
RBAC: access denied
執(zhí)行以下命令,使用GET方法訪問productpage服務(wù)。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/
預(yù)期輸出:
RBAC: access denied
以上結(jié)果表明授權(quán)策略生效。
步驟二:定義L7路由規(guī)則
ASM 1.21及以下版本
執(zhí)行以下命令,為reviews服務(wù)部署Waypoint代理,以便任何流向reviews服務(wù)的流量都將由Waypoint代理進(jìn)行路由。
istioctl x waypoint apply --service-account bookinfo-reviews
使用以下內(nèi)容,創(chuàng)建reviews.yaml。
配置流量路由以將90%的請(qǐng)求發(fā)送到reviews-v1,將10%的請(qǐng)求發(fā)送到reviews-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
執(zhí)行以下命令,部署DestinationRule。
kubectl apply -f reviews.yaml
執(zhí)行以下命令, 驗(yàn)證100個(gè)請(qǐng)求中是否約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"
預(yù)期輸出:
<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>
預(yù)期輸出表明L7路由規(guī)則生效。
ASM 1.22及以上版本
執(zhí)行以下命令,為reviews服務(wù)部署Waypoint代理,以便任何流向reviews服務(wù)的流量都將由Waypoint代理進(jìn)行路由。
kubectl label service reviews istio.io/use-waypoint=waypoint
使用以下內(nèi)容,為review服務(wù)創(chuàng)建流量規(guī)則,加個(gè)90%的請(qǐng)求發(fā)送給review v1,10%的請(qǐng)求發(fā)送給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
執(zhí)行以下命令, 驗(yàn)證100個(gè)請(qǐng)求中是否約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"
預(yù)期輸出:
<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>
預(yù)期輸出表明L7路由規(guī)則生效。
步驟三:清理資源
執(zhí)行以下命令,清理本文創(chuàng)建的資源對(duì)象。
istioctl x waypoint delete --service-account bookinfo-productpage
istioctl x waypoint delete --service-account bookinfo-reviews
kubectl delete authorizationpolicy productpage-viewer