在 Kubernetes 集群中,默认情况下,所有 Pod 之间都是可以相互通信的,这在某些场景下可能会带来安全隐患。为了实现更精细的网络访问控制,Kubernetes 提供了 Network Policy 机制。Network Policy 允许我们定义一组规则,来控制 Pod 之间的网络流量,从而实现网络隔离和安全加固。
本文将通过丰富的示例,详细讲解 Network Policy 的概念、语法、使用场景以及配置实践,帮助大家快速掌握 Network Policy,构建安全的容器网络。
Network Policy 的核心概念
Network Policy 是一种基于 Pod 标签(Label)的网络访问控制策略。它通过定义一系列规则,来允许或拒绝 Pod 之间的网络流量。Network Policy 的核心概念包括:
- Policy 对象:Network Policy 是 Kubernetes 中的一种资源对象,我们可以通过 YAML 文件来定义和管理。
- Pod 选择器(Pod Selector):Network Policy 通过 Pod 选择器来指定哪些 Pod 需要应用该策略。
- Ingress 规则:定义允许进入被选定 Pod 的流量规则。
- Egress 规则:定义允许从被选定 Pod 发出的流量规则。
- 规则类型:
- IPBlock:基于 IP 地址段进行流量控制。
- PodSelector:基于 Pod 标签进行流量控制。
- NamespaceSelector:基于 Namespace 标签进行流量控制。
Network Policy 示例详解
下面通过几个示例来详细讲解 Network Policy 的用法。
示例 1:拒绝所有流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-allnamespace: default
spec:podSelector: {}policyTypes:- Ingress- Egress
这个 Network Policy 选择了 default
命名空间下的所有 Pod(podSelector: {}
),并定义了空的 Ingress
和 Egress
规则。这意味着拒绝所有进入和离开这些 Pod 的流量。
示例 2:允许同一 Namespace 下的 Pod 之间互访
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-same-namespacenamespace: default
spec:podSelector: {}ingress:- from:- podSelector: {}
这个 Network Policy 选择了 default
命名空间下的所有 Pod,并定义了一个 Ingress
规则,允许来自同一命名空间下所有 Pod(podSelector: {}
)的流量。
示例 3:允许特定标签的 Pod 访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-from-frontendnamespace: default
spec:podSelector:matchLabels:app: backendingress:- from:- podSelector:matchLabels:app: frontend
这个 Network Policy 选择了 default
命名空间下标签为 app: backend
的 Pod,并定义了一个 Ingress
规则,允许来自同一命名空间下标签为 app: frontend
的 Pod 的流量。
示例 4:允许来自特定 Namespace 的 Pod 访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-from-monitoringnamespace: default
spec:podSelector:matchLabels:app: backendingress:- from:- namespaceSelector:matchLabels:name: monitoring
这个 Network Policy 选择了 default
命名空间下标签为 app: backend
的 Pod,并定义了一个 Ingress
规则,允许来自标签为 name: monitoring
的 Namespace 下的所有 Pod 的流量。
示例 5:允许特定 IP 段的访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-external-accessnamespace: default
spec:podSelector:matchLabels:app: backendingress:- from:- ipBlock:cidr: 192.168.1.0/24except:- 192.168.1.10/32
这个 Network Policy 选择了 default
命名空间下标签为 app: backend
的 Pod,并定义了一个 Ingress
规则,允许来自 IP 地址段 192.168.1.0/24
但排除 192.168.1.10/32
的流量。
示例 6:允许特定端口的访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-specific-portnamespace: default
spec:podSelector:matchLabels:app: backendingress:- from:- podSelector:matchLabels:app: frontendports:- protocol: TCPport: 80
这个 Network Policy 选择了 default
命名空间下标签为 app: backend
的 Pod,并定义了一个 Ingress
规则,允许来自同一命名空间下标签为 app: frontend
的 Pod 的流量,但仅限于 TCP 协议的 80 端口。
Network Policy 的注意事项
- Network Policy 仅适用于支持它的网络插件:如 Calico、Cilium 等。
- Network Policy 是累加的:如果多个 Network Policy 选择了同一个 Pod,那么这些策略的规则会合并生效。
- Network Policy 的默认行为:如果没有 Network Policy 选择某个 Pod,那么该 Pod 的所有流量都是允许的。
- Network Policy 的调试:可以使用
kubectl describe networkpolicy <policy-name>
命令查看 Network Policy 的详细信息,以及使用网络插件提供的工具进行调试。
总结
Network Policy 是 Kubernetes 中实现网络隔离和访问控制的重要工具。通过灵活运用 Network Policy,我们可以构建出满足各种安全需求的容器网络,保障应用的安全性。