该小节演示如何在你迁移到Istio时确保你的工作仅使用双向的TLS进行通信。

Istio自动配置工作负载sidecars,以便在调用其他工作负载时使用相互TLS。默认情况下,Istio使用允许模式配置目标工作负载。当允许模式启用时,服务可以同时接受纯文本和相互的TLS通信。为了只允许相互的TLS通信,需要将配置更改为严格模式。

您可以使用Grafana仪表板来检查哪些工作负载仍然以允许模式向工作负载发送明文通信,并在迁移完成后选择锁定它们。

1. 准备工作

  • 理解Istio 认证策略和相关的双向TLS认证概念。

  • 读取认证策略任务,了解如何去配置认证策略。

  • 有一个安装了istio的kubernetes集群, 而不开启双向TLS。 (比如使用demo配置文件)

在此任务中,您可以通过创建示例工作负载并修改策略以在工作负载之间强制执行严格的相互TLS来尝试迁移过程。

2. 构建集群

  • 创建两个名称空间,foobar,然后部署带有sidecars的httpbinsleep
  1. $ kubectl create ns foo
  2. $ kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
  3. $ kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
  4. $ kubectl create ns bar
  5. $ kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n bar
  6. $ kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n bar
  • 创建其它的名称空间legacy,和部署不带有sidecar的sleep
  1. $ kubectl create ns legacy
  2. $ kubectl apply -f samples/sleep/sleep.yaml -n legacy
  • 从任何的sleep pod发送http请求到httpbin.foo。 所以的请求应该都是成功的。
  1. $ for from in "foo" "bar" "legacy"; do for to in "foo" "bar"; do kubectl exec "$(kubectl get pod -l app=sleep -n ${from} -o jsonpath={.items..metadata.name})" -c sleep -n ${from} -- curl http://httpbin.${to}:8000/ip -s -o /dev/null -w "sleep.${from} to httpbin.${to}: %{http_code}\n"; done; done
  • 校验没有认证策略和目标规则
  1. $ kubectl get peerauthentication --all-namespaces | grep -v istio-system
  2. $ kubectl get destinationrule --all-namespaces

3. 通过名称空间锁定双向TLS

  • 在迁移所有客户端到istio和注入Envoy sidecar后, 你可以锁定在foo名称空间的工作流仅接受双向TLS.
  1. $ kubectl apply -n foo -f - <<EOF
  2. apiVersion: "security.istio.io/v1beta1"
  3. kind: "PeerAuthentication"
  4. metadata:
  5. name: "default"
  6. spec:
  7. mtls:
  8. mode: STRICT
  9. EOF
  • 现在你应该看到从sleep.legacy到httpbin.foo的请求失败
  1. $ for from in "foo" "bar" "legacy"; do for to in "foo" "bar"; do kubectl exec "$(kubectl get pod -l app=sleep -n ${from} -o jsonpath={.items..metadata.name})" -c sleep -n ${from} -- curl http://httpbin.${to}:8000/ip -s -o /dev/null -w "sleep.${from} to httpbin.${to}: %{http_code}\n"; done; done

当从sleep发送请求时,您将在输出中看到纯文本和加密文本/

4. 针对全部的网格锁定双向TLS

  1. $ kubectl apply -n istio-system -f - <<EOF
  2. apiVersion: "security.istio.io/v1beta1"
  3. kind: "PeerAuthentication"
  4. metadata:
  5. name: "default"
  6. spec:
  7. mtls:
  8. mode: STRICT
  9. EOF
  • 现在foobar名称空间仅接受双向的TLS, 因此当你从sleep.legacy请求时会看到失败。
  1. $ for from in "foo" "bar" "legacy"; do for to in "foo" "bar"; do kubectl exec "$(kubectl get pod -l app=sleep -n ${from} -o jsonpath={.items..metadata.name})" -c sleep -n ${from} -- curl http://httpbin.${to}:8000/ip -s -o /dev/null -w "sleep.${from} to httpbin.${to}: %{http_code}\n"; done; done

5. 清除本案例

  1. 移除所有认证策略
  1. kubectl delete peerauthentication --all-namespaces --all
  1. 如果你不想做后面相关的任务,可以移除测试名称空间
  1. $ kubectl delete ns foo bar legacy