关于优先级order:
- 为了与 Kubernetes 兼容,Calico 网络策略执行遵循 Kubernetes pod 的标准约定:
如果没有网络策略适用于 Pod,则允许所有进出该 Pod 的流量。
如果一个或多个网络策略应用于类型为 ingress 的 pod,则仅允许这些策略明确允许的入口流量。
如果一个或多个网络策略应用于类型为 egress 的 pod,则仅允许这些策略明确允许的出口流量。
对于其他端点类型(VM、主机接口),默认行为是拒绝流量。即使没有网络策略应用于端点,也只允许网络策略明确允许的流量。
- order: 策略叠加时的应用次序,数字越小越先应用,冲突时,后者会覆盖前者
- Global vs非全局并不是决定策略应用的顺序的一个因素。排序是由Calico NetworkPolicy和GlobalNetworkPolicy资源的“order”字段决定的,它的“order”政策首先应用于此。
- 如果没有指定“order”默认值到∞,那么将会应用未指定的“order”策略。
- Calico还实现了Kubernetes NetworkPolicy资源,它没有一个明确的“order”字段。为了命令那些对Calico资源的人,我们将Kubernetes的NetworkPolicy资源对待,就像他们有一个隐式的“顺序”1000。
- 对于具有相同order的策略来说,代码中有一个搭配器,但你不应该知道它是什么或依赖它,因为当排序很重要的时候,最好使用一个明确的“order”值。
Enable default deny for Kubernetes pods
资源定义:
GlobalNetworkPolicy
GlobalNetworkSet
NetworkPolicy
NetworkSet
常用命令:
https://docs.projectcalico.org/reference/calicoctl/
calicoctl apply -f policy.yaml
calicoctl apply -f policy.yaml
calicoctl get/delete np/gnp
参考资料:
About Calico
GitHub - projectcalico/libcalico-go: Golang Calico library functions: https://www.projectcalico.org
一文学会Calico高级网络策略 - 简书
最佳实践:calico建议
零信任网络模型
https://docs.projectcalico.org/security/adopt-zero-trust
隐式默认拒绝策略
我们建议为您的 Kubernetes pod 创建隐式默认拒绝策略,无论您使用 Calico 还是 Kubernetes 网络策略。这可确保默认情况下拒绝不需要的流量。请注意,隐式默认拒绝策略总是最后出现;如果任何其他策略允许流量,则拒绝不会生效。仅在评估所有其他策略后才执行拒绝。
Enable default deny for Kubernetes pods
Ingress 解决方案的类型
从广义上讲,有两种类型的入口解决方案:
- 集群内入口 - 入口负载平衡由集群本身内的 pod 执行。
- 外部入口 - 入口负载平衡由设备或云提供商功能在集群外部实现。
全局网络策略:
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: global-default
spec:
types:
- Ingress
- Egress
ingress:
- action: Allow
source: {}
egress:
- action: Allow
destination: {}
网络策略
kind: NetworkPolicy
apiVersion: projectcalico.org/v3
metadata:
name: hfftest
namespace: hff
spec:
order: 1000
ingress:
- action: Allow
protocol: TCP
source:
namespaceSelector: name == 'hffns'
destination:
ports:
- 80
- action: Deny
source:
namespaceSelector: name != 'hfftest' && (! has(privileged-namespace))
destination: {}
egress:
- action: Allow
source: {}
destination:
namespaceSelector: name == 'hff1'
- action: Deny
source: {}
destination:
namespaceSelector: name != 'hfftest' && (! has(privileged-namespace))
types:
- Ingress
- Egress