全部产品
Search
文档中心

服务网格 ASM:入门示例

更新时间:Sep 03, 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的流量服务。除了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