入门示例

本文介绍如何快速地在ACMG模式下部署应用。

前提条件

已部署示例代码。具体操作,请参见准备工作

重要

在本操作文档中,您可能需要反复切换 Kubernetes 上下文(context)以操作数据面集群和控制面集群。为了避免误操作,请您在每次上下文切换时,务必确认当前上下文是否正确。您可以使用kubectx简化上下文切换的操作,具体步骤,请参见kubectx。您也可以通过开启通过数据面集群KubeAPI访问Istio资源,使用数据面集群KubeAPI直接操作控制面集群。

按Namespace开启/关闭ACMG模式

  1. 通过ASM实例的kubeconfig操作控制面集群,开启ACMG模式。

    kubectl label namespace default istio.io/dataplane-mode=acmg
  2. 关闭ACMG模式。

    kubectl label namespace default istio.io/dataplane-mode-

步骤一:启用授权策略

将应用程序添加到ACMG模式后,您可以使用L4和L7授权策略来保护应用程序访问。例如,可以根据客户端工作负载身份控制对服务的访问。

L4授权策略

  1. 使用以下内容,创建productpage-viewer.yaml。

    kind: AuthorizationPolicy
    metadata:
     name: productpage-viewer
     namespace: default
    spec:
      targetRef:
        kind: Service
        group: ""
        name: productpage
      action: ALLOW
      rules:
      - from:
        - source:
            principals:
            - cluster.local/ns/default/sa/sleep
  2. 使用ASM实例的KubeConfig,执行以下命令,部署授权策略,显式允许sleep应用服务账户调用该productpage服务。

    kubectl apply -f productpage-viewer.yaml
  3. 验证授权策略是否生效。

    1. 执行以下命令:

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

      预期输出:

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

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

      预期输出:

      RBAC: access denied

      以上结果说明授权策略生效。

L7授权策略

  1. 使用以下内容创建productpage-viewer.yaml,允许sleep应用的服务账户通过GET方法访问productpage服务,但不允许执行其他操作。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
     name: productpage-viewer
     namespace: default
    spec:
      targetRef:
        kind: Service
        group: ""
        name: productpage
      action: ALLOW
      rules:
      - from:
        - source:
            principals:
            - cluster.local/ns/default/sa/sleep
        to:
        - operation:
            methods: ["GET"]
  2. 使用ASM的kubeconfig,执行以下命令,部署授权策略。

    kubectl apply -f productpage-viewer.yaml
  3. 验证授权策略是否生效。

    1. 执行以下命令,从sleep应用Pod使用GET方法访问productpage服务。

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

      预期输出:

      <title>Simple Bookstore App</title>
    2. 执行以下命令,从sleep应用Pod使用DELETE方法访问produpage服务。

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

      预期输出:

      RBAC: access denied
    3. 执行以下命令,从notsleep应用Pod使用GET方法访问produpage服务。

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

      预期输出:

      RBAC: access denied

      可以看到,从sleep应用使用GET方法可以正常访问productpage服务,使用DELETE方法和从notsleep应用访问被拒绝,策略已经生效。

步骤二:定义L7路由规则

使用VirtualService和DestinationRule

  1. 使用以下内容,创建review-all-v1.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
  2. 执行以下命令,部署VirtualService和DestinationRule,配置流量路由以100%的请求发送到review-v1。

    kubectl apply -f reviews-all-v1.yaml
  3. 执行以下命令,验证100%的请求中是否流向reviews-v1。

    kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://productpage:9080/productpage | grep reviews-v.-; done"

    预期输出:

            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>

    可以看到,所有的请求都流向了review-v1服务,VirtualService和DestinationRule已生效。

使用GatewayAPI

说明

请确认ACK集群中已存在GatewayAPI相关的CRD,并且已开启ASM实例的GatewayAPI支持开关。具体操作,请参见确认ACK集群已存在GatewayAPI相关CRD开启ASM实例的GatewayAPI支持开关

  1. 使用以下内容,创建 reviews-route-all-v1.yaml。

    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-v1
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
        version: v1
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-v2
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
        version: v2
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-v3
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
        version: v3
    ---
    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: HTTPRoute
    metadata:
      name: reviews
    spec:
      parentRefs:
      - group: ""
        kind: Service
        name: reviews
        port: 9080
      rules:
      - backendRefs:
        - name: reviews-v1
          port: 9080
  2. 执行以下命令,部署使用GatewayAPI定义的HTTPRoute规则,限制所有访问reviews的流量都将被路由到reviews-v1。

    kubectl apply -f reviews-route-all-v1.yaml
  3. 执行以下命令,验证HTTPRoute规则是否生效。

    kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://productpage:9080/productpage | grep reviews-v.-; done"

    预期输出:

            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>
            <u>reviews-v1-ff5787f99-t64h2</u>

    可以看到,所有访问reviews的流量都将被路由到了reviews-v1,使用GatewayAPI定义的HTTPRoute规则已经生效。