k8s资源之NetworkPolicy

 欢迎关注我的公众号:

 目前刚开始写一个月,一共写了18篇原创文章,文章目录如下:

istio多集群探秘,部署了50次多集群后我得出的结论

istio多集群链路追踪,附实操视频

istio防故障利器,你知道几个,istio新手不要读,太难!

istio业务权限控制,原来可以这么玩

istio实现非侵入压缩,微服务之间如何实现压缩

不懂envoyfilter也敢说精通istio系列-http-rbac-不要只会用AuthorizationPolicy配置权限

不懂envoyfilter也敢说精通istio系列-02-http-corsFilter-不要只会vs

不懂envoyfilter也敢说精通istio系列-03-http-csrf filter-再也不用再代码里写csrf逻辑了

不懂envoyfilter也敢说精通istio系列http-jwt_authn-不要只会RequestAuthorization

不懂envoyfilter也敢说精通istio系列-05-fault-filter-故障注入不止是vs

不懂envoyfilter也敢说精通istio系列-06-http-match-配置路由不只是vs

不懂envoyfilter也敢说精通istio系列-07-负载均衡配置不止是dr

不懂envoyfilter也敢说精通istio系列-08-连接池和断路器

不懂envoyfilter也敢说精通istio系列-09-http-route filter

不懂envoyfilter也敢说精通istio系列-network filter-redis proxy

不懂envoyfilter也敢说精通istio系列-network filter-HttpConnectionManager

不懂envoyfilter也敢说精通istio系列-ratelimit-istio ratelimit完全手册

 

————————————————

NetworkPolicy:

使用network policy资源可以配置pod的网络,networkPolicynamespace scoped的,也就是作用域只是在某个namespace,它只能影响某个namespace下的pod的网络出入站规则

不是所有的 Kubernetes 网络方案都支持 Network Policy。比如 Flannel 就不支持

ingress:

deny all:

[root@master01 networkPolicy]# cat default-deny-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Ingress

allow all:

[root@master01 networkPolicy]# cat allow-all-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  ingress:
  - {}

namespaceSelector:

[root@master01 networkPolicy]# cat namespace-access-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: dev
    ports:
    - protocol: TCP
      port: 80

podSelector:

[root@master01 networkPolicy]# cat podSelector-ingerss.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: busybox
    ports:
    - protocol: TCP
      port: 80

ipBlock:

[root@master01 networkPolicy]# cat ip-ingerss.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.20.59.192/32

整合:

[root@master01 networkPolicy]# cat namespace-podSelector-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: dev
    - podSelector:
        matchLabels:
          app: busybox
    ports:
    - protocol: TCP
      port: 80
[root@master01 networkPolicy]# cat namespace-podSelector-ip-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.20.0.0/16
        except:
        - 172.20.58.195/32
    - namespaceSelector:
        matchLabels:
          project: dev
    - podSelector:
        matchLabels:
          app: busybox
    ports:
    - protocol: TCP
      port: 80

egress:

default deny:

[root@master01 networkPolicy]# cat default-deny-egress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
 name: default-deny
spec:
 podSelector: {}
 policyTypes:
 - Egress

allow all:

[root@master01 networkPolicy]# cat allow-all-egress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
 name: allow-all
spec:
 podSelector: {}
 egress:
 - {}
 policyTypes:
 - Egress

namespaceSelector:

[root@master01 networkPolicy]# cat namespace-egress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
spec:
  podSelector:
    matchLabels:
      app: busybox
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          project: dev
    ports:
    - protocol: TCP
      port: 80

podSelector:

[root@master01 networkPolicy]# cat podSelector-egerss.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
spec:
  podSelector:
    matchLabels:
      app: busybox
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: nginx
    ports:
    - protocol: TCP
      port: 80

ipBlock:

[root@master01 networkPolicy]# cat ip-egress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
spec:
  podSelector:
    matchLabels:
      app: busybox
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 172.20.59.192/32

整合:

[root@master01 networkPolicy]# cat namespace-podSelector-egress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
spec:
  podSelector:
    matchLabels:
      app: busybox
  policyTypes:
  - Egress
  egress:
  - to :
    - namespaceSelector:
        matchLabels:
          project: dev
    - podSelector:
        matchLabels:
          app: nginx
    ports:
    - protocol: TCP
      port: 80
[root@master01 networkPolicy]# cat namespace-podSelector-ip-egress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
spec:
  podSelector:
    matchLabels:
      app: busybox
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 172.20.0.0/16
        except:
        - 172.20.58.195/32
    - namespaceSelector:
        matchLabels:
          project: dev
    - podSelector:
        matchLabels:
          app: nginx
    ports:
    - protocol: TCP
      port: 80

ingerss egress 完整例子:

[root@master01 networkPolicy]# cat ingress-egress.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.20.0.0/16
        except:
        - 172.20.58.195/32
    - namespaceSelector:
        matchLabels:
          project: dev
    - podSelector:
        matchLabels:
          app: busybox
    ports:
    - protocol: TCP
      port: 80
  egress:
  - to:
    - ipBlock:
        cidr: 172.20.0.0/16
        except:
        - 172.20.58.195/32
    - namespaceSelector:
        matchLabels:
          project: dev
    - podSelector:
        matchLabels:
          app: nginx
    ports:
    - protocol: TCP
      port: 80

<think>嗯,用户现在问的是Kubernetes原生的NetworkPolicy和Calico的NetworkPolicy有什么区别。之前用户问过关于Calico中169.254.1.1的作用,可能是在部署或调试Calico网络时遇到了问题,现在想进一步了解网络策略方面的差异。用户可能是在使用Kubernetes集群,并且选择了Calico作为CNI插件,所以需要明确两者在网络策略上的不同,以便更好地进行安全配置。 首先,我需要回忆一下Kubernetes原生NetworkPolicy的基本概念。原生的NetworkPolicy是基于标签来选择Pod,并定义入口和出口规则。它主要作用于L3和L4层,也就是IP和端口层面。不过,原生的NetworkPolicy需要CNI插件支持才能生效,比如Calico、Cilium等,并不是所有CNI都支持。另外,原生策略的规则相对基础,比如只能基于IP、端口和Pod标签来做控制,不支持更复杂的条件,比如命名空间标签或者协议类型外的其他属性。 接下来是Calico的NetworkPolicy。Calico作为功能更强大的CNI插件,扩展了Kubernetes的策略模型。他们的策略不仅支持K8s原生的资源,还有自己的CRD,比如GlobalNetworkPolicyNetworkPolicy。Calico的策略可以在L3-L7层工作,支持更复杂的规则,比如HTTP路径、域名解析,甚至还能集成Istio做服务网格的授权。此外,Calico的策略作用域更广,可以定义集群级别的全局策略,或者针对特定接口的策略,这是原生NetworkPolicy做不到的。 然后,我需要比较两者的区别。功能范围上,Calico显然更全面,支持更多协议层和复杂条件。匹配条件方面,Calico可以基于命名空间标签、服务账户、甚至地理IP,而原生只能基于Pod标签。作用域方面,Calico有全局策略,原生仅限于命名空间内。另外,Calico还支持拒绝规则和日志记录,这对于调试和监控非常有用,而原生策略默认没有拒绝动作,需要隐式拒绝。 用户可能需要了解这些区别来决定使用哪种策略,或者是否同时使用。比如,如果只需要基本的隔离,原生策略可能足够;但若需要更细粒度的控制,比如应用层规则或全局策略,Calico就更合适。同时,用户可能关心兼容性问题,比如混用两者时的优先级,或者如何迁移现有策略。 可能用户的实际场景是,他们在使用Calico,但之前只接触过原生策略,现在遇到了一些安全需求,需要更高级的功能,因此想了解两者的差异。或者他们在设计集群网络策略时,需要评估不同方案的优缺点。此外,用户可能对如何选择策略模型,或者如何避免冲突有疑问,需要给出最佳实践。 最后,要确保回答结构清晰,分点说明,并给出示例帮助理解。还要注意用户可能对技术细节不太熟悉,所以需要用相对易懂的语言解释,同时保持准确性。比如,解释L3-L7层的具体例子,或者说明GlobalNetworkPolicy的应用场景。可能需要提到Calico的策略执行顺序,或者如何通过annotations来调整优先级,这些对实际配置很有帮助。</think>### **核心区别概览** Kubernetes 原生 `NetworkPolicy` 和 Calico 扩展的 `NetworkPolicy` 在 **功能范围、规则粒度、实现机制** 上存在显著差异。以下是关键对比: | **特性** | **Kubernetes NetworkPolicy** | **Calico NetworkPolicy** | |------------------------|-------------------------------------------------------|-------------------------------------------------------| | **规范层级** | L3-L4(IP + 端口) | L3-L7(IP/端口/HTTP路径/DNS域名等) | | **作用域** | 仅限命名空间内 | 支持集群级(`GlobalNetworkPolicy`)和跨命名空间 | | **规则类型** | 仅允许规则(隐式拒绝) | 允许 + 显式拒绝(支持 `deny` 动作) | | **匹配条件** | Pod标签、IP CIDR、端口 | 扩展至命名空间标签、服务账户、协议字段(如ICMP类型) | | **策略优先级** | 无优先级控制 | 支持策略顺序(`order` 字段)和日志记录(`log` 动作) | | **底层依赖** | 依赖 CNI 插件实现(如 Calico/Cilium) | 由 Calico Felix 组件直接实现 | --- ### **1. 功能范围对比** #### **(1) Kubernetes 原生 NetworkPolicy** - **基础功能**: - 控制 Pod 的入口(`ingress`)和出口(`egress`)流量。 - 支持基于 **Pod 标签选择器**、**命名空间选择器** 和 **IP CIDR** 定义规则。 - 仅作用于 **TCP/UDP/SCTP 协议**,无法控制 ICMP 或其他协议。 - **限制**: - 无显式拒绝规则,默认隐式拒绝所有非匹配流量。 - 无法定义集群级全局策略(如针对所有命名空间的统一规则)。 **示例**: ```yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-web spec: podSelector: matchLabels: app: web policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 80 ``` #### **(2) Calico NetworkPolicy** - **扩展功能**: - 支持 **显式拒绝**(`deny` 动作)和 **日志记录**(`log` 动作)。 - 可匹配 **HTTP路径**、**DNS域名**、**ICMP类型/代码** 等高级条件。 - 通过 `GlobalNetworkPolicy` 定义集群级策略(如强制所有 Pod 使用 DNSSEC)。 - 支持 **策略优先级**(`order` 字段控制执行顺序)。 **示例**: ```yaml apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: deny-external-dns spec: order: 100 selector: app == 'critical' types: - Egress egress: - action: Deny protocol: UDP destination: ports: [53] notNets: [10.96.0.0/12] # 禁止访问非集群内 DNS ``` --- ### **2. 实现机制差异** #### **(1) Kubernetes 原生策略** - **依赖 CNI 插件**:原生 `NetworkPolicy` 需要 CNI 插件(如 Calico、Cilium)实现实际的数据平面规则。 - **转换逻辑**:当 Calico 处理 Kubernetes `NetworkPolicy` 时,会将其转换为等价的 Calico 策略对象(可通过 `calicoctl get networkpolicy` 查看)。 #### **(2) Calico 原生策略** - **直接控制数据平面**:Calico 策略由 Felix 组件直接编程到 Linux 内核的 `iptables/nftables` 或 Windows 的 `HNS`。 - **细粒度控制**:支持更复杂的匹配条件(例如 `http.method == 'POST'` 或 `dns.query == 'example.com'`)。 --- ### **3. 典型使用场景** #### **适用原生 NetworkPolicy 的场景**: - 仅需基本隔离(如允许前端 Pod 访问后端服务)。 - 希望保持跨 CNI 插件的兼容性。 #### **需选择 Calico NetworkPolicy 的场景**: - 需要拒绝特定流量(如屏蔽恶意 IP)。 - 定义集群级安全基线(如强制所有 Pod 禁止访问外部数据库)。 - 精细化控制(如仅允许访问特定 HTTP 路径或 DNS 记录)。 --- ### **4. 兼容性与共存** - **混合使用**:Calico 支持同时处理 Kubernetes 原生 `NetworkPolicy` 和 Calico 扩展策略。 - **优先级规则**: - Calico `GlobalNetworkPolicy` 默认优先级最高。 - Kubernetes `NetworkPolicy` 会被转换为优先级较低的 Calico 策略。 - 可通过 `order` 字段显式调整策略顺序。 --- ### **总结建议** | **维度** | **Kubernetes NetworkPolicy** | **Calico NetworkPolicy** | |----------------|------------------------------|------------------------------------| | **简单隔离** | ✅ 推荐 | ⚠️ 功能冗余 | | **高级控制** | ❌ 不足 | ✅ 必选 | | **多云兼容性** | ✅ 高 | ❌ 依赖 Calico 数据平面 | **决策建议**: - 若需基础隔离且希望兼容不同 CNI,优先使用 Kubernetes 原生策略。 - 若需精细化控制或集群级安全策略,直接使用 Calico 扩展策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值