Kubernetes 网络策略
Kubernetes中的网络策略(NetworkPolicies)允许控制特定应用程序在TCP、UDP协议下的IP地址或端口级别的流量。这些策略是以应用程序为中心的,用于指定如何允许Pod通过网络与其他网络“实体”(即不同的端点和服务)进行通信。网络策略主要适用于有Pod参与的连接。
Pod通信实体标识符
Pod可以与以下三种实体之一通信:
- Pod(注意:Pod无法阻止对自身的访问)
- 命名空间
- IP块(即使Pod或节点的IP地址发生变化,运行Pod的节点的流量始终被允许)
在定义基于Pod或命名空间的网络策略时,可以使用选择器来指定允许哪些流量进出选定的Pod。同时,基于IP的网络策略通过CIDR范围定义。
先决条件
网络策略由网络插件实现。要使用网络策略,必须采用支持NetworkPolicy的网络解决方案。如果没有实现NetworkPolicy的控制器,创建NetworkPolicy资源将不起作用。
两种Pod隔离
Pod隔离有两种类型:出口隔离和入口隔离。它们涉及允许哪些连接:
出口隔离
- 默认:Pod允许所有出站连接。
- 策略:如果有任何NetworkPolicy选择Pod并在其policyTypes中包含“Egress”,则Pod被隔离为出口。此时,仅允许符合出口策略规则的连接。
入口隔离
- 默认:Pod允许所有入站连接。
- 策略:如果有任何NetworkPolicy选择Pod并在其policyTypes中包含“Ingress”,则Pod被隔离为入口。此时,仅允许符合入口策略规则的连接。
网络策略是叠加的。如果任何策略适用于某个方向,则该方向上的允许连接是所有适用策略允许连接的并集。
NetworkPolicy资源
一个示例NetworkPolicy如下所示:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: example-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: database
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
- namespaceSelector:
matchLabels:
env: production
- podSelector:
matchLabels:
app: web
ports:
- protocol: TCP
port: 3306
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 8080
解释:
- 必填字段:包括apiVersion、kind和metadata。
- spec:包含定义特定网络策略的所有信息。
- podSelector:选择应用策略的Pod。此示例选择标签为
role=database
的Pod。 - policyTypes:指示策略适用于入口、出口或两者。
- ingress:定义允许进入Pod的流量规则。
- egress:定义允许Pod外出的流量规则。
上述示例策略:
- 隔离了
default
命名空间中标签为role=database
的Pod的入口和出口流量。 允许
default
命名空间中标签为role=database
的Pod接受来自以下三种来源的TCP端口3306的流量:- IP块
192.168.1.0/24
- 标签为
env=production
的命名空间中的所有Pod - 标签为
app=web
的Pod
- IP块
- 允许
default
命名空间中标签为role=database
的Pod向IP块10.0.0.0/24
的TCP端口8080发送流量。
网络流量过滤
NetworkPolicy主要用于控制第4层连接(TCP、UDP和SCTP)。对于其他协议(如ARP或ICMP),行为可能因网络插件而异。
默认策略:
- 默认情况下,命名空间中不存在任何策略时,允许所有入口和出口流量。
- 可以创建默认拒绝所有入口或出口流量的策略。
示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
该策略默认拒绝default
命名空间中所有Pod的所有入口流量。
网络策略高级功能
按标签选择多个命名空间:
可以通过命名空间标签选择多个命名空间中的Pod:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: egress-namespaces namespace: default spec: podSelector: matchLabels: app: myapp policyTypes: - Egress egress: - to: - namespaceSelector: matchExpressions: - key: namespace operator: In values: ["frontend", "backend"]
- 按名称选择命名空间:
Kubernetes控制平面为所有命名空间设置不可变标签kubernetes.io/metadata.name
,可通过此标签选择特定命名空间。
通过上述方法和策略,Kubernetes网络策略可以有效地管理和控制Pod之间及其与外部世界的网络流量,确保集群内的安全和高效通信。
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。