如果你在 Kubernetes 上运行 Cilium,你可以从 Kubernetes 分发策略中受益。在这种模式下,Kubernetes 负责将策略分发到所有节点,而 Cilium 将自动应用这些策略。有三种格式可用于通过 Kubernetes 本地配置网络策略:
- 标准的 NetworkPolicy 资源,支持在 Pod 的入口或出口实施 L3 和 L4 策略。
- 扩展的 CiliumNetworkPolicy 格式,作为 CustomResourceDefinition 提供,支持在入口和出口的第 3-7 层为服务配置策略。
- CiliumClusterwideNetworkPolicy 格式,是一个集群范围的 CustomResourceDefinition,用于指定 Cilium 强制执行的集群范围策略。其规格与 CiliumNetworkPolicy 相同,没有指定命名空间。
Cilium 支持同时运行这些策略类型中的多种。然而,在同时使用多种策略类型时应谨慎,因为理解多种策略类型所允许的完整流量集可能会令人困惑。如果不密切注意,这可能导致不预期的策略允许行为。
NetworkPolicy
有关更多信息,请参见官方 NetworkPolicy 文档。
Kubernetes 网络策略缺失的功能已知问题:
特性 | 跟踪问题 |
---|---|
ipBlock 设置为 pod IP |
GitHub Issue 9209 |
SCTP | GitHub Issue 5719 |
截至 v1.15,ipBlock
现在可以选择性地选择 节点 IP。以前,节点被排除在 ipBlock
之外;参见 GitHub Issue 20550。
CiliumNetworkPolicy
CiliumNetworkPolicy 与标准的 NetworkPolicy 非常相似。其目的是提供 NetworkPolicy 尚未支持的功能。理想情况下,所有功能都将合并到标准资源格式中,这个 CRD 将不再需要。
CiliumNetworkPolicy 是 Cilium 提供的一种网络策略资源,旨在为 Kubernetes 集群中的网络通信提供更细粒度的安全控制。它扩展了标准 Kubernetes 网络策略的功能,允许用户在 OSI 模型的第三层(L3)、第四层(L4)和第七层(L7)定义更复杂的规则,从而实现更强的安全性和灵活性。
主要特点
-
细粒度控制: CiliumNetworkPolicy 允许用户基于标签、IP 地址、DNS 名称等多种条件定义网络访问规则。通过这种方式,用户可以精确控制哪些 Pod 可以相互通信,以及可以使用哪些协议和端口。
-
多层次支持: Cilium 支持 L3 和 L4 的网络策略,同时在 L7 层提供对常见协议(如 HTTP、gRPC 和 Kafka)的支持。这使得用户能够在应用层面上定义更复杂的访问控制规则。
-
集群范围政策: 除了命名空间范围的政策,Cilium 还提供
CiliumClusterWideNetworkPolicy
,这种政策是集群范围的,可以在整个集群中强制实施一致的安全策略。 -
易于使用的策略编辑器: Cilium 提供了一个用户友好的网络策略编辑器,简化了编写和管理网络策略的过程,降低了用户的认知负担。
-
动态身份管理: Cilium 通过将安全性与工作负载身份解耦,利用标签和元数据来管理网络策略,从而避免了因 IP 地址变化而频繁更新安全规则的问题。
CiliumNetworkPolicy
资源的原始规格如下:
type CiliumNetworkPolicy struct {
// +deepequal-gen=false
metav1.TypeMeta `json:",inline"`
// +deepequal-gen=false
metav1.ObjectMeta `json:"metadata"`
// Spec 是所需的 Cilium 特定规则规格。
Spec *api.Rule `json:"spec,omitempty"`
// Specs 是所需的 Cilium 特定规则规格的列表。
Specs api.Rules `json:"specs,omitempty"`
// Status 是 Cilium 策略规则的状态
//
// +deepequal-gen=false
// +kubebuilder:validation:Optional
Status CiliumNetworkPolicyStatus `json:"status"`
}
-
Metadata
描述策略。这包括:策略的名称,在一个命名空间内唯一;策略被注入的命名空间;一组标签,用于在 Kubernetes 中识别一个资源。
-
Spec
包含一个 规则基础 的字段。
-
Specs
包含 规则基础 列表的字段。如果需要自动添加或移除多个规则,这个字段非常有用。
-
Status
提供是否成功应用了策略的可见性。
示例
参见 第 3 层示例、第 4 层示例 和 第 7 层示例 获取详细的示例策略列表。
CiliumClusterwideNetworkPolicy
CiliumClusterwideNetworkPolicy 类似于 CiliumNetworkPolicy,不同之处在于:
- CiliumClusterwideNetworkPolicy 定义的策略是非命名空间的,并且是集群范围的;
- 它使得可以使用 节点选择器。内部策略与 CiliumNetworkPolicy 相同,因此这种策略规格的效果也相同。
CiliumClusterwideNetworkPolicy
资源的原始规格如下:
type CiliumClusterwideNetworkPolicy struct {
// Spec 是所需的 Cilium 特定规则规格。
Spec *api.Rule
// Specs 是所需的 Cilium 特定规则规格的列表。
Specs api.Rules
// Status 是 Cilium 策略规则的状态。
//
// 该字段存在于此结构中的原因是由于 k8s 代码生成器的一个错误,因为该字段不存在于结构中,所以不会创建 `UpdateStatus` 方法。
//
// +kubebuilder:validation:Optional
Status CiliumNetworkPolicyStatus
}