本文介紹如何快速將應用部署到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的Cellular Data Package。除了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