双向 TLS 迁移

    针对多服务跨网络通信的应用场景,通常希望逐步将所有服务迁移到 Istio 网格中。如此一来,在迁移过程中,将出现只有部分服务注入了 Envoy sidecar 的情况。对于一个已注入 sidecar 的服务而言,一旦开启服务的双向 TLS 通信模式,那么传统客户端(即:没有 Envoy 的客户端)将无法与之通信,因为这些客户端没有注入 Envoy sidecar 和客户端证书。为了解决这个问题,Istio 认证策略提供了一种 “PERMISSIVE” 模式。当启用 “PERMISSIVE” 模式时,服务可以同时接收 HTTP 和双向 TLS 请求。

    这样,便可以将 Istio 服务的通信模式配置为双向 TLS,与此同时,不干扰其与传统服务之间的通信。此外,可以使用Grafana dashboard 检查哪些服务仍然向 “PERMISSIVE” 模式的服务发送明文请求,然后选择在这些服务迁移结束后关闭目标服务的 “PERMISSIVE” 模式,将其锁定为只接收双向 TLS 请求。

    • 理解 Istio 以及相关的双向 TLS 认证 概念。

    • 准备一个 Kubernetes 集群并部署好 Istio,不要开启全局双向 TLS (如:可以使用中提供的 demo 配置 profile,或者将安装选项 设置为 false)。

    • demo 准备

      • 创建如下命名空间并在其中都部署上 httpbin 和 ,注入 sidecar。

        • foo
        • bar
      • 创建如下命名空间并在其中部署 sleep,不注入 sidecar

    1. $ for from in "foo" "bar" "legacy"; do kubectl exec $(kubectl get pod -l app=sleep -n ${from} -o jsonpath={.items..metadata.name}) -c sleep -n ${from} -- curl http://httpbin.foo:8000/ip -s -o /dev/null -w "sleep.${from} to httpbin.foo: %{http_code}\n"; done
    2. sleep.foo to httpbin.foo: 200
    3. sleep.bar to httpbin.foo: 200
    4. sleep.legacy to httpbin.foo: 200
    • 验证没有在系统中设置认证策略或目标规则(控制面板除外):
    1. $ kubectl get policies.authentication.istio.io --all-namespaces
    2. NAMESPACE NAME AGE
    3. istio-system grafana-ports-mtls-disabled 3m

    设置 DestinationRule,配置 Istio 服务发送双向 TLS 请求。

    1. $ cat <<EOF | kubectl apply -n foo -f -
    2. kind: "DestinationRule"
    3. metadata:
    4. name: "example-httpbin-istio-client-mtls"
    5. host: httpbin.foo.svc.cluster.local
    6. trafficPolicy:
    7. tls:
    8. mode: ISTIO_MUTUAL
    9. EOF

    现在,我们确认一下,所有发送至 的请求仍会响应成功。

    1. $ for from in "foo" "bar" "legacy"; do kubectl exec $(kubectl get pod -l app=sleep -n ${from} -o jsonpath={.items..metadata.name}) -c sleep -n ${from} -- curl http://httpbin.foo:8000/ip -s -o /dev/null -w "sleep.${from} to httpbin.foo: %{http_code}\n"; done
    2. sleep.foo to httpbin.foo: 200
    3. sleep.bar to httpbin.foo: 200
    4. sleep.legacy to httpbin.foo: 200

    也可以指定一部分客户端使用 DestinationRule 中设置的 ISTIO_MUTUAL 双向 TLS 通信模式。检查 验证设置起效后,再扩大作用范围,最终应用到所有的 Istio 客户端服务。

    当所有客户端服务都成功迁移至 Istio 之后,注入 Envoy sidecar,便可以锁定 httpbin.foo 只接收双向 TLS 请求。

    此时,源自 sleep.legacy 的请求将响应失败。

    1. $ for from in "foo" "bar" "legacy"; do kubectl exec $(kubectl get pod -l app=sleep -n ${from} -o jsonpath={.items..metadata.name}) -c sleep -n ${from} -- curl http://httpbin.foo:8000/ip -s -o /dev/null -w "sleep.${from} to httpbin.foo: %{http_code}\n"; done
    2. sleep.foo to httpbin.foo: 200
    3. sleep.bar to httpbin.foo: 200
    4. sleep.legacy to httpbin.foo: 503

    若无法将所有服务迁移至 Istio (注入 Envoy sidecar),则必须开启 PERMISSIVE 模式。然而,开启 PERMISSIVE 模式时,系统默认不对明文请求进行认证或授权检查。推荐使用 Istio 授权 来为不同的请求路径配置不同的授权策略。

    清除所有资源。

    1. Namespaces foo bar legacy deleted.

    描述 Istio 的授权与鉴权功能。

    阐述如何在不更改授权策略的前提下从一个信任域迁移到另一个。

    认证策略

    为您展示如何使用 Istio 认证策略设置双向 TLS 和基础终端用户认证。

    在 Istio 中配置和管理 DNS 证书。

    Istio v1beta1 授权策略概述

    Istio v1beta1 授权策略的设计原则、基本概述及迁移操作。