Cilium 代理(agent)和 Cilium 网络策略的配置决定了一个端点(Endpoint)是否接受来自某个来源的流量。代理可以进入以下三种策略执行模式:
-
default
如果任何规则选择了一个 Endpoint 并且该规则有一个入口部分,那么该端点就会在入口处进入默认拒绝状态。如果任何规则选择了一个 Endpoint 并且该规则有一个出口部分,那么该端点就会在出口处进入默认拒绝状态。这意味着端点开始时没有任何限制,一旦有规则限制其在入口处接收流量或在出口处传输流量的能力,那么端点就会进入白名单模式,所有流量都必须明确允许。
-
always
在 always 模式下,即使没有规则选择特定的端点,也会在所有端点上启用策略执行。如果你想配置健康实体,在启动 cilium-agent 时用
enable-policy=always
检查整个集群的连接性,你很可能想启用与健康端点的通信。 -
never
在“never" 模式下,即使规则选择了特定的端点,所有端点上的策略执行也被禁用。换句话说,所有流量都允许来自任何来源(入口处)或目的地(出口处)。
要在运行时为 Cilium 代理管理的所有端点配置策略执行模式,请使用:
$ cilium config PolicyEnforcement={default,always,never}
如果你想在启动时为一个特定的代理配置策略执行模式,在启动 Cilium 守护程序时提供以下标志:
$ cilium-agent --enable-policy={default,always,never} [...]
同样,你可以通过在 Cilium DaemonSet 中加入上述参数来启用整个 Kubernetes 集群的策略执行模式:
- name: CILIUM_ENABLE_POLICY
value: always
规则基础知识
所有策略规则都是基于白名单模式,也就是说,策略中的每条规则都允许与该规则相匹配的流量。如果存在两条规则,其中一条可以匹配更广泛的流量,那么所有匹配更广泛规则的流量都将被允许。如果两个或更多的规则之间有一个交叉点,那么与这些规则的结合点相匹配的流量将被允许。最后,如果流量不匹配任何规则,它将根据网络策略执行模式被丢弃。
策略规则共享一个共同的基本类型,指定规则适用于哪些端点,并共享元数据以识别规则。每条规则都被分割成一个入口部分和一个出口部分。入口部分包含必须应用于进入端点的流量的规则,出口部分包含应用于来自匹配端点选择器的端点的流量的规则。可以提供入口、出口或两者。如果入口和出口都被省略,规则就没有效果。
type Rule struct {
// EndpointSelector 选择所有应该受此规则约束的端点。
// EndpointSelector 和 NodeSelector 不能同时为空,并且
// 互相排斥。
//
// +optional
EndpointSelector EndpointSelector `json: "endpointSelector,omitempty"`。
// NodeSelector 选择所有应该受此规则约束的节点。
// EndpointSelector 和 NodeSelector 不能同时为空,并且相互排斥的。
// 只能在 CiliumClusterwideNetworkPolicies 中使用。
//
// +optional
NodeSelector EndpointSelector `json: "nodeSelector,omitempty"`。
// Ingress 是一个 IngressRule 的列表,它在 Ingress 时被强制执行。
// 如果省略或为空,则此规则不适用于入口处。
//
// +optional
Ingress []IngressRule `json: "ingress,omitempty"`。
// Egress 是一个在出口处执行的 EgressRule 的列表。
// 如果省略或为空,该规则不适用于出口处。
//
// +optional
Egress []EgressRule `json: "egress,omitempty"`
// Labels 是一个可选的字符串列表,可以用来
// 重新识别该规则或存储元数据。它可以根据标签来查询
// 或删除基于标签的字符串。标签并不要求是
// 唯一的,多个规则可以有重叠的或相同的标签。
//
// +optional
Labels labels.LabelArray `json: "labels,omitempty"`
// Description 是一个自由格式的字符串,它可以由规则的创建者使用。
// 它可以被规则的创建者用来存储该规则目的的可读解释。
// 规则不能通过注释来识别。
//
// +optional
Description string `json: "description,omitempty"`.
}
endpointSelector / nodeSelector
选择策略规则所适用的端点或节点。策略规则将被应用于所有符合选择器中指定标签的端点。
Ingress
必须在端点入口处适用的规则列表,即适用于进入端点的所有网络数据包。
Egress
必须适用于端点出口的规则列表,即适用于离开端点的所有网络数据包。
Lebels
标签是用来识别规则的。规则可以通过标签列出和删除。通过以下方式导入的策略规则 kubernetes 自动获得 io.cilium.k8s.policy.name=NAME
的标签,其中 NAME
对应的是在 NetworkPolicy 或 CiliumNetworkPolicy 资源中指定的名称。
Description
描述是一个字符串,不被 Cilium 所解释。它可以用来以人类可读的形式描述规则的意图和范围。
端点选择器
端点选择器基于 Kubernetes LabelSelector。它之所以被称为端点选择器,是因为它只适用于 Endpoint.
节点选择器
节点选择器也是基于端点选择器的,不过它不是与端点相关的标签相匹配,而是适用于与集群中的节点相关的标签。
节点选择器只能用在 CiliumClusterwideNetworkPolicy。请参阅 Host Policies 以了解关于节点级策略范围的详细信息。