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 的输出为起点,创建您自己的策略。