部署示例应用程序并开启ambient实现加密通信

ASM实例添加入口网关后,您可以部署应用到该实例关联的集群。本文介绍如何将Bookinfo书评应用部署到ASM实例关联的ACK集群

应用说明

本文所使用应用示例是一个名为Bookinfo的书评应用。微服务架构如下图所示:

该应用由以下4个微服务构成:

  • Productpage:该微服务会调用DetailsReviews两个微服务,用来生成页面。

  • Details:该微服务包含了书籍的信息。

  • Reviews:该微服务包含了书籍相关的评论,同时会调用Ratings微服务。

  • Ratings:该微服务包含了由书籍评价组成的评级信息。

Reviews微服务有3个版本:

  • v1版本不会调用Ratings服务。

  • v2版本会调用Ratings服务,并使用15个黑色星形图标来显示评分信息。

  • v3版本会调用Ratings服务,并使用15个红色星形图标来显示评分信息。

前提条件

部署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、v2v3版本。

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