信任域迁移

    在 Istio 1.4 中,我们引入了一个 alpha 特性以支持授权策略 trust domain migration。 这意味着如果一个 Istio 网格需要改变它的 trust domain,其授权策略是不需要手动更新的。 在 Istio 中,如果一个 workload 运行在命名空间 中,服务账户为 bar,系统的信任域为 my-td,那么该工作负载的身份就是 spiffe://my-td/ns/foo/sa/bar。 默认情况下,Istio 网格的信任域是 cluster.local,除非您在安装时另外指定了。

    在您开始任务之前,请完成以下内容:

    1. 阅读 授权 指南。

    2. 安装 Istio,自定义信任域,并启用双向 TLS。

    3. 将 示例部署于 default 命名空间中,将 sleep 示例部署于 defaultsleep-allow 命名空间中:

      1. $ kubectl label namespace default istio-injection=enabled
      2. $ kubectl apply -f @samples/httpbin/httpbin.yaml@
      3. $ kubectl apply -f @samples/sleep/sleep.yaml@
      4. $ kubectl create namespace sleep-allow
      5. $ kubectl label namespace sleep-allow istio-injection=enabled
      6. $ kubectl apply -f @samples/sleep/sleep.yaml@ -n sleep-allow
    4. 应用如下授权策略以拒绝所有到 httpbin 的请求,除了来自 sleep-allow 命名空间的 sleep 服务。

      1. $ kubectl apply -f - <<EOF
      2. apiVersion: security.istio.io/v1beta1
      3. kind: AuthorizationPolicy
      4. metadata:
      5. name: service-httpbin.default.svc.cluster.local
      6. namespace: default
      7. spec:
      8. rules:
      9. - from:
      10. principals:
      11. - old-td/ns/sleep-allow/sa/sleep
      12. to:
      13. - operation:
      14. methods:
      15. - GET
      16. selector:
      17. app: httpbin
      18. ---
      19. EOF

    请注意授权策略传播到 sidecars 大约需要几十秒。

    1. 验证从以下请求源发送至 httpbin 的请求:

      • 来自 default 命名空间的 sleep 服务的请求被拒绝。
      1. $ kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n"
      2. 403
      • 来自 sleep-allow 命名空间的 sleep 服务的请求通过了。
      1. $ kubectl exec "$(kubectl -n sleep-allow get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -n sleep-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n"
      2. 200
    1. 使用一个新的信任域安装 Istio。

    2. 重新部署 istiod 以使信任域更改。

      1. $ kubectl rollout restart deployment -n istio-system istiod
    3. 重新部署 httpbinsleep 应用以从新的 Istio 控制平面获取更新。

      1. $ kubectl delete pod --all
      1. $ kubectl delete pod --all -n sleep-allow
    1. 使用一个新的信任域和信任域别名安装 Istio。

      1. $ cat <<EOF > ./td-installation.yaml
      2. apiVersion: install.istio.io/v1alpha2
      3. kind: IstioControlPlane
      4. spec:
      5. meshConfig:
      6. trustDomain: new-td
      7. trustDomainAliases:
      8. - old-td
      9. EOF
      10. $ istioctl install --set profile=demo -f td-installation.yaml -y
    2. 不调整授权策略,验证到 httpbin 的请求:

      • 来自 default 命名空间的 sleep 的请求被拒绝。
      1. $ kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n"
      2. 403
      • 来自 sleep-allow 命名空间的 sleep 通过了。
      1. $ kubectl exec "$(kubectl -n sleep-allow get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -n sleep-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n"
      2. 200
    1. $ kubectl delete authorizationpolicy service-httpbin.default.svc.cluster.local
    2. $ kubectl delete deploy httpbin; kubectl delete service httpbin; kubectl delete serviceaccount httpbin
    3. $ kubectl delete deploy sleep; kubectl delete service sleep; kubectl delete serviceaccount sleep
    4. $ istioctl x uninstall --purge