NetworkPolicy

Istio 可以选择性地为其组件部署 Kubernetes NetworkPolicy 资源。 这对于那些强制执行“默认拒绝”(default-deny)网络策略的集群非常有用, 而这正是安全环境中常见的需求。

启用此功能后,系统将为 istiod、istio-cni、ztunnel 以及通过 Helm 安装的网关创建 NetworkPolicy 资源,以定义各组件所需的入站端口。默认情况下, 所有出站流量均被允许,因为像 istiod 这样的组件需要连接到用户自定义的端点(例如 JWKS URL)。 网关的 NetworkPolicy 会自动包含在网关 Helm Values 中配置的服务端口。

启用 NetworkPolicy

若要启用 NetworkPolicy, 请在安装期间设置 global.networkPolicy.enabled=true

使用 istioctl

$ istioctl install --set values.global.networkPolicy.enabled=true

使用 Helm 时,将该设置传递给每个 Chart:

$ helm install istiod istio/istiod -n istio-system --set global.networkPolicy.enabled=true
$ helm install istio-cni istio/cni -n istio-system --set global.networkPolicy.enabled=true
$ helm install ztunnel istio/ztunnel -n istio-system --set global.networkPolicy.enabled=true
$ helm install istio-ingressgateway istio/gateway -n istio-ingress --set global.networkPolicy.enabled=true

审查生成的策略

每个组件的 NetworkPolicy 均允许在其所需的特定端口上接收入站流量, 并允许所有的出站流量(因为像 istiod 这样的组件需要连接到用户定义的端点,例如 JWKS URL)。

您可以使用 helm template 预览将要创建的确切 NetworkPolicy 资源:

$ helm template istiod istio/istiod -n istio-system --set global.networkPolicy.enabled=true -s templates/networkpolicy.yaml
$ helm template istio-cni istio/cni -n istio-system --set global.networkPolicy.enabled=true -s templates/networkpolicy.yaml
$ helm template ztunnel istio/ztunnel -n istio-system --set global.networkPolicy.enabled=true -s templates/networkpolicy.yaml

安装后检查策略:

$ kubectl get networkpolicy -n istio-system

自定义 NetworkPolicy

Istio 所创建的 NetworkPolicy 资源被有意设计得较为宽泛——其入站规则 (ingress rules)采用了空的 from 选择器, 这意味着允许来自任何源端的流量通过指定的端口。 之所以如此设计,是因为在不同的集群环境中,合法流量的来源 (例如 kube-apiserver、Prometheus 以及各类应用 Pod)各不相同。

如果您需要更严格的策略,可以禁用 Istio 内置的 NetworkPolicy, 并以 helm template 的输出为起点,创建您自己的策略。

这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!