全部產品
Search
文件中心

Alibaba Cloud Service Mesh:部署應用程式範例並開啟ambient實現加密通訊

更新時間:Jul 17, 2025

為ASM執行個體添加入口網關後,您可以部署應用到該執行個體關聯的叢集。本文介紹如何將Bookinfo書評應用部署到ASM執行個體關聯的ACK叢集

應用說明

本文所使用應用樣本是一個名為Bookinfo的書評應用。微服務架構如下圖所示:

該應用由以下4個微服務構成:

  • Productpage:該微服務會調用Details和Reviews兩個微服務,用來產生頁面。

  • Details:該微服務包含了書籍的資訊。

  • Reviews:該微服務包含了書籍相關的評論,同時會調用Ratings微服務。

  • Ratings:該微服務包含了由書籍評價組成的評級資訊。

Reviews微服務有3個版本:

  • v1版本不會調用Ratings服務。

  • v2版本會調用Ratings服務,並使用1到5個黑色星形表徵圖來顯示評分資訊。

  • v3版本會調用Ratings服務,並使用1到5個紅色星形表徵圖來顯示評分資訊。

前提條件

部署Bookinfo應用程式

  1. 使用以下內容建立bookinfo.yaml。

    展開查看YAML內容

    apiVersion: v1
    kind: Service
    metadata:
      name: details
      labels:
        app: details
        service: details
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: details
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-details
      labels:
        account: details
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: details-v1
      labels:
        app: details
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: details
          version: v1
      template:
        metadata:
          labels:
            app: details
            version: v1
        spec:
          serviceAccountName: bookinfo-details
          containers:
          - name: details
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-details-v1:1.20.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    ##################################################################################################
    # Ratings service
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: ratings
      labels:
        app: ratings
        service: ratings
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: ratings
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-ratings
      labels:
        account: ratings
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ratings-v1
      labels:
        app: ratings
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ratings
          version: v1
      template:
        metadata:
          labels:
            app: ratings
            version: v1
        spec:
          serviceAccountName: bookinfo-ratings
          containers:
          - name: ratings
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-ratings-v1:1.20.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    ##################################################################################################
    # Reviews service
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews
      labels:
        app: reviews
        service: reviews
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-reviews
      labels:
        account: reviews
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v1
      labels:
        app: reviews
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v1
      template:
        metadata:
          labels:
            app: reviews
            version: v1
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v1:1.20.1
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-v1
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
        version: v1
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v2
      labels:
        app: reviews
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v2
      template:
        metadata:
          labels:
            app: reviews
            version: v2
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v2:1.20.1
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-v2
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
        version: v2
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v3
      labels:
        app: reviews
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v3
      template:
        metadata:
          labels:
            app: reviews
            version: v3
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v3:1.20.1
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-v3
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
        version: v3
    ---
    ##################################################################################################
    # Productpage services
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: productpage
      labels:
        app: productpage
        service: productpage
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: productpage
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-productpage
      labels:
        account: productpage
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: productpage-v1
      labels:
        app: productpage
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: productpage
          version: v1
      template:
        metadata:
          annotations:
            prometheus.io/scrape: "true"
            prometheus.io/port: "9080"
            prometheus.io/path: "/metrics"
          labels:
            app: productpage
            version: v1
        spec:
          serviceAccountName: bookinfo-productpage
          containers:
          - name: productpage
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-productpage-v1:1.20.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
          volumes:
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: productpage-v1
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: productpage
        version: v1
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ratings-v1
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: ratings
        version: v1
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: details-v1
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: details
        version: v1
  2. 執行以下命令,在default命名空間中部署該樣本應用。

    kubectl apply -f  bookinfo.yaml

部署並配置入口網關

  1. 建立bookinfo-gateway.yaml。

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: bookinfo-gateway
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
            - '*'
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-demo
      namespace: default
    spec:
      hosts:
        - '*'
      http:
        - name: gw-to-productage
          match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                exact: /login
            - uri:
                exact: /logout
            - uri:
                prefix: /api/v1/products
          route:
            - destination:
                host: productpage
                port:
                  number: 9080
      gateways:
        - bookinfo-gateway
  2. 部署入口網關。

    kubectl apply -f bookinfo-gateway.yaml

訪問應用程式

您將通過剛剛配置的網關串連到 Bookinfo productpage 服務。 

  1. 擷取網關IP地址。

    echo $(kubectl -n istio-system get istiogateway ingressgateway -o jsonpath="{.status.GatewayAddress[0]}")
  2. 在瀏覽器中訪問http://{入口網關的IP地址}/productpage查看Bookinfo應用。

    image

    多次重新整理頁面,您可以看到Book Reviews下的ratings發生變化,分別對應reviews應用的v1、v2和v3版本。

為Bookinfo開啟Ambient模式

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網格執行個體 > 全域命名空間

  3. 單擊default命名空間資料面模式列下的切換為Ambient Mesh模式

    您隨時可以在全域命名空間頁面將命名空間的資料面模式切換回Sidecar模式。
  4. 在瀏覽器中訪問http://{入口網關的IP地址}/productpage查看Bookinfo應用。可以看到業務仍然可以正常訪問,區別在於此時的Bookinfo的應用Pod之間全部開啟了mTLS加密。

查看網格拓撲

  1. 開啟監控指標採集。

    1. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇可觀測管理中心 > 監控指標

    2. 單擊將監控指標採集到阿里雲可觀測監控Prometheus版,在確認彈框中勾選叢集名稱,單擊確定

      若您使用的是自建Prometheus,本步驟可以跳過。
  2. 開啟網格拓撲。

    1. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇可觀測管理中心 > 網格拓撲

    2. 單擊開始啟用,按照以下參數配置網格拓撲,配置完成後單擊確認啟用

      以下以ASM網關的方式訪問為例進行配置。

      配置項

      樣本值

      服務部署模式

      資料面Kubernetes叢集內部部署模式。

      使用託管模式部署時僅支援使用Serverless ASM網關進行訪問。

      觀測叢集

      c6118d720xxxxxxxxxxxxxx58410a9c7d0。

      Prometheus讀取地址

      本樣本無需填寫。

      若您使用的是自建Prometheus,請在這裡填入實際的讀取地址。

      ASM中添加多個叢集時,需要先建立彙總執行個體,並填寫彙總執行個體的讀取地址。

      身份認證-登入方式

      使用Token登入

      訪問入口

      ASM網關方式

      • 選擇ASM網關選擇入口網關名稱,本樣本為ingressgateway。

      • 選擇ASM網關連接埠選擇443。

        您也可以通過編輯網關來為網格拓撲增加獨立的連接埠。
  3. 發送測試流量,產生流量拓撲圖。

    export GATEWAY_ADDRESS=$(kubectl -n istio-system get istiogateway ingressgateway -o jsonpath="{.status.GatewayAddress[0]}")
    for i in $(seq 1 100); do
      echo "Request $i: $(curl -sSI -o /dev/null -w "%{http_code}" "http://${GATEWAY_ADDRESS}:80/productpage")"
    done
  4. 網格拓撲頁面,單擊拓撲地址後的訪問ASM網格拓撲。然後在登入方式部分單擊查看登入Token並複製Token內容。在Kiali頁面將複製的內容填入Token輸入框,單擊Log in