K8S学习指南(29)-k8s网络对象NetworkPolicy

发布时间:2023年12月20日

引言

随着容器编排平台Kubernetes的广泛应用,网络管理变得愈发重要。在Kubernetes中,NetworkPolicy是一项关键功能,它允许开发者定义和控制Pod之间的网络通信。本文将深入研究Kubernetes中的NetworkPolicy,详细介绍其原理、用途,并通过实际示例演示如何使用NetworkPolicy来确保集群中的网络安全。

什么是NetworkPolicy?

NetworkPolicy是Kubernetes中用于定义Pod之间网络通信规则的资源对象。通过NetworkPolicy,开发者可以控制哪些Pod可以与另外哪些Pod通信,以及使用何种方式进行通信。这种细粒度的网络控制有助于提高集群的安全性,防止未经授权的访问和通信。

NetworkPolicy的基本原理

NetworkPolicy的工作原理基于以下几个核心概念:

  1. Pod选择器(PodSelector):NetworkPolicy使用标签选择器来选择特定的Pod。通过标签,可以将网络策略应用于特定的Pod群体。
  2. Ingress规则:定义了允许从其他Pod进入被选中Pod的规则,包括允许的协议、端口范围等。
  3. Egress规则:定义了允许被选中Pod访问其他Pod或外部网络的规则。
  4. Peer Pod:NetworkPolicy中的规则是基于Peer Pod(对等Pod)的。通过选择Peer Pod,可以精确定义通信策略。

NetworkPolicy的示例

示例一:允许相同Namespace下的Pod通信

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-same-namespace
spec:
  podSelector:
    matchLabels:
      app: myapp
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: myproject
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          project: myproject

在上述清单文件中,我们创建了一个名为"allow-same-namespace"的NetworkPolicy,指定了Pod选择器为app: myapp。该策略允许来自同一命名空间下标签为project: myproject的Pod的Ingress和Egress通信。

示例二:限制外部访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-external-traffic
spec:
  podSelector:
    matchLabels:
      app: sensitive-app
  policyTypes:
  - Ingress
  - Egress
  ingress: []
  egress:
  - to:
    - podSelector: {}
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0

在这个示例中,我们创建了一个名为"deny-external-traffic"的NetworkPolicy,限制了标签为app: sensitive-app的Pod的Ingress和Egress。该策略允许Pod之间的通信,但不允许访问任何外部网络,包括0.0.0.0/0范围的IP地址。

示例三:指定端口范围

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-specific-ports
spec:
  podSelector:
    matchLabels:
      app: frontend
  ingress:
  - ports:
    - protocol: TCP
      port: 80
    - protocol: UDP
      port: 53

在这个示例中,我们创建了一个名为"allow-specific-ports"的NetworkPolicy,指定了标签为app: frontend的Pod的Ingress规则。该规则允许从其他Pod进入的流量,其中包括TCP端口80和UDP端口53。

NetworkPolicy的高级用法

除了基本的示例外,NetworkPolicy还支持一些高级用法,如网络策略的继承、Peer Pod选择器的高级匹配等。以下是一些高级用法的示例:

网络策略的继承

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: parent-policy
spec:
  podSelector:
    matchLabels:
      role: parent
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: child

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: child-policy
spec:
  podSelector:
    matchLabels:
      role: child
  policyTypes:
  - Ingress
  - Egress

在这个示例中,我们创建了两个NetworkPolicy。"parent-policy"用于选择标签为role: parent的Pod,并定义了一个Ingress规则,允许来自标签为role: child的Pod的通信。"child-policy"选择标签为role: child的Pod,并定义了Ingress和Egress规则。这样,"child-policy"继承了"parent-policy"的规则。

高级Peer Pod选择器匹配

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: advanced-selector-matching
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
  - from:
    - podSelector:
        matchExpressions:
        - {key: role, operator: In, values: [frontend, middleware]}

在这个示例中,我们通过matchExpressions定义了更复杂的Peer Pod选择器匹配条件。该规则选择标签为app: backend的Pod,并定义了一个Ingress规则,允许来自标签为rolefrontendmiddleware的Pod的通信。

结论

通过本文,我们深入探讨了Kubernetes中的NetworkPolicy,详细介绍了其原理、基本用法,并通过丰富的示例演示了如何在实际场景中使用NetworkPolicy来实现网络策略的定义和控制。对于使用Kubernetes的开发者和运维人员来说,深入理解NetworkPolicy是确保集群网络安全的关键一步。通过合理使用NetworkPolicy,可以有效地控制Pod之间的通信,提高整体系统的安全性和稳定性。

文章来源:https://blog.csdn.net/zhaopeng_yu/article/details/135026468
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。