网络策略

控制集群内流量

minikube允许用户在本地Kubernetes集群中创建和测试网络策略。这很有用,因为它允许在应用程序开发过程中考虑、构建和评估网络策略,将其作为流程的组成部分,而不是在开发结束时“强行加入”。

Kubernetes NetworkPolicies 允许在IP地址或端口级别(OSI第3层或第4层)控制通过集群的Pod网络流量。链接页面提供了关于其功能和实现的更多信息。

然而,前提条件中指出,网络策略由容器网络接口 (CNI) 网络插件实现。因此,要在任何Kubernetes集群中使用或测试网络策略,您必须使用支持NetworkPolicy的网络解决方案。如果没有实现它的控制器,创建NetworkPolicy资源将无效。

原生的minikube安装(minikube start)不支持任何网络策略,因为默认的CNI Kindnet 按设计不支持网络策略。

然而,如果安装了受支持的CNI(例如Calico),minikube就可以支持网络策略。此外,在这种情况下,Kubernetes网络策略Calico网络策略都受支持。

Calico网络策略提供了比Kubernetes网络策略更丰富的功能集,包括:

  • 策略排序/优先级
  • 拒绝规则
  • 更灵活的匹配规则

在minikube集群上启用Calico

可以在正在运行的minikube集群上替换CNI,但是,在遵循开始使用!页面上的说明来构建预装Calico的minikube集群时,只需在minikube start命令后附加--cni calico标志,会大大简化操作。

Kubernetes网络策略示例

Kubernetes关于声明网络策略的文档是理解各种可能性的良好起点。此外,下面延伸阅读中的教程提供了更多指导。

以下来自Kubernetes网络策略文档的YAML展示了一个非常简单的默认入口隔离策略,通过创建一个选择所有pod但禁止任何入口流量到这些pod的网络策略,应用于命名空间。

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
spec:
  podSelector: {}
  policyTypes:
  - Ingress

Calico网络策略示例

Calico网络策略文档是学习Calico网络策略扩展功能集以及它如何与Kubernetes网络策略共存的最佳位置。

以下来自Calico策略教程的YAML展示了一个非常简单的默认拒绝全局Calico网络策略(Kubernetes原生网络策略不提供此功能),它通常用作有效零信任网络模型的起点。请注意,全局Calico网络策略不区分命名空间,并影响所有匹配策略选择器的pod。相比之下,Kubernetes网络策略是区分命名空间的,因此您需要为每个命名空间创建一个默认拒绝策略才能达到相同的效果。在此示例中,kube-system命名空间中的pod被排除,以确保Kubernetes本身平稳运行。

---
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: default-deny
spec:
  selector: projectcalico.org/namespace != "kube-system"
  types:
  - Ingress
  - Egress

延伸阅读

高级Kubernetes策略教程提供了一个使用Kubernetes网络策略可以实现什么的示例。它详细介绍了如何使用Kubernetes NetworkPolicy定义更复杂的网络策略。

Calico策略教程演示了Calico网络策略在原生Kubernetes网络策略之上提供的扩展功能。为了演示这一点,本教程遵循了与上述教程类似的方法,但改用Calico网络策略并突出显示两种策略类型之间的差异,利用了Kubernetes网络策略中不可用的功能。


最后修改于2024年6月3日: docs: 修复拼写错误 (bf08e8c0e)