全部產品
Search
文件中心

Alibaba Cloud Service Mesh:入門樣本

更新時間:Sep 04, 2024

本文介紹如何快速將應用部署到Ambient Mesh模式。

前提條件

  • 已部署範例程式碼。具體操作,請參見準備工作

  • 已按照實際作業系統及平台,下載Istioctl服務網格調試工具,且istioctl版本與ASM版本一致。詳細資料,請參見Istio

重要

在本操作文檔中,您可能需要反覆切換 Kubernetes 上下文(context)以操作資料面叢集和控制面叢集。為了避免誤操作,請您在每次環境切換時,務必確認當前上下文是否正確。您可以使用kubectx簡化環境切換的操作,具體步驟,請參見kubectx。您也可以通過開啟通過資料面叢集KubeAPI訪問Istio資源,使用資料面叢集KubeAPI直接操作控制面叢集。

步驟一:啟用授權策略

將應用程式添加到Ambient Mesh後,您可以使用L4授權策略來保護應用程式訪問。例如,可以根據用戶端工作負載身份控制對服務的訪問。

說明

ASM 1.22版本的L4授權策略正在灰階中,1.21及以下版本可以正常使用。如需使用1.22版本的L4授權策略,請提交工單

L4授權策略

  1. 使用以下內容,建立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
  2. 在ASM執行個體對應的KubeConfig環境下,執行以下命令,部署授權策略。

    kubectl apply -f productpage-viewer.yaml
  3. 驗證授權策略是否生效。

    1. 執行以下命令:

      kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"

      預期輸出:

      <title>Simple Bookstore App</title>
    2. 執行以下命令:

      kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"

      預期輸出:

      <title>Simple Bookstore App</title>
    3. 執行以下命令:

      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層代理路由。

  1. 執行以下命令,為bookinfo-productpage服務賬戶部署Waypoint代理。

    istioctl x waypoint apply --service-account bookinfo-productpage
  2. 執行以下命令,查看productpage的Waypoint代理程式狀態。

    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
  3. 修改AuthorizationPolicy。

    1. 將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"]
    2. 執行以下命令,重新部署AuthorizationPolicy。

      kubectl apply -f productpage-viewer.yaml
  4. 驗證授權策略是否生效。

    1. 執行以下命令:

      kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" -X DELETE

      預期輸出:

       RBAC: access denied                                                                                                       
    2. 執行以下命令:

      kubectl exec deploy/notsleep -- curl -s http://productpage:9080/

      預期輸出:

        RBAC: access denied
    3. 執行以下命令:

      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的方法。配置主要分為兩部分:

  1. 首先您需要建立一個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
    1. 這個Gateway資源的gatewayClassName欄位為istio-waypoint,聲明建立的是Waypoint。

    2. 它帶有一個特殊的labelistio.io/waypoint-for: service,表明這個Waypoint專為Service的Cellular Data Package。除了service之外,還支援配置:workload(專用於Pod)以及all(Service和Workload)。

  2. 指定哪些流量要被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授權策略。

  1. 使用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
  2. 使用ACK叢集kubeconfig執行以下命令,為productpage對應的Service添加label,讓對應流量被waypoint代理。

    kubectl label service productpage istio.io/use-waypoint=waypoint
  3. 使用以下內容更新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。

  4. 驗證授權策略是否生效

    1. 使用ACK kubeconfig,執行以下命令使用GET方法訪問productpage服務。

      kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"

      預期輸出:

      <title>Simple Bookstore App</title>
    2. 執行以下命令,使用DELETE方法訪問productpage服務。

      kubectl exec deploy/sleep -- curl -XDELETE -s http://productpage:9080/

      預期輸出:

      RBAC: access denied
    3. 執行以下命令,使用GET方法訪問productpage服務。

      kubectl exec deploy/notsleep -- curl -s http://productpage:9080/

      預期輸出:

      RBAC: access denied

    以上結果表明授權策略生效。

步驟二:定義L7路由規則

ASM 1.21及以下版本

  1. 執行以下命令,為reviews服務部署Waypoint代理,以便任何流向reviews服務的流量都將由Waypoint代理進行路由。

    istioctl x waypoint apply --service-account bookinfo-reviews
  2. 使用以下內容,建立reviews.yaml。

    配置流量路由以將90%的請求發送到reviews-v1,將10%的請求發送到reviews-v2。

    展開查看reviews.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
          weight: 90
        - destination:
            host: reviews
            subset: v2
          weight: 10
    
  3. 執行以下命令,部署DestinationRule。

    kubectl apply -f reviews.yaml
  4. 執行以下命令, 驗證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及以上版本

  1. 執行以下命令,為reviews服務部署Waypoint代理,以便任何流向reviews服務的流量都將由Waypoint代理進行路由。

    kubectl label service reviews istio.io/use-waypoint=waypoint
  2. 使用以下內容,為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
  3. 執行以下命令, 驗證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