所属技术领域:
Kubernetes
|名词定义|
网络策略(Network Policy )是 Kubernetes 的一种资源。Network Policy 通过 Label 选择 Pod,并指定其他 Pod 或外界如何与这些 Pod 通信。
Pod的网络流量包含流入(Ingress)和流出(Egress)两种方向。默认情况下,所有 Pod 是非隔离的,即任何来源的网络流量都能够访问 Pod,没有任何限制。当为 Pod 定义了 Network Policy,只有 Policy 允许的流量才能访问 Pod。
Kubernetes的网络策略功能也是由第三方的网络插件实现的,因此,只有支持网络策略功能的网络插件才能进行配置网络策略,比如Calico、Canal、kube-router等等。
|技术特点|
- 控制面数据流
- 资源配置模板
- 指定pod标签访问
- 指定namespaces标签访问
-
NetworkPolicy数据结构定义
适用场景:
1.静态密码认证
2.x509证书认证
3.Bearer Token认证
4.集成外部认证系统
|案例展示|
一、 下面通过一个真实示例展示Network Policy普通用法
用Deployment创建nginx pod实例并用service暴露
确认创建结果
测试nginx服务连通性
通过创建Network Policy对象添加隔离性
只允许包含access: "true"标签的pod访问nginx服务。
创建Network Policy
测试隔离性
为pod添加access: "true"标签测试连通性
二、 下面是一个 NetworkPolicy 的示例:
除非选择支持网络策略的网络解决方案,否则将上述示例发送到API服务器没有任何效果。
必填字段: 与所有其他的Kubernetes配置一样,NetworkPolicy 需要 apiVersion、 kind和 metadata 字段。 关于配置文件操作的一般信息,请参考 这里、 这里和 这里。
spec: NetworkPolicy spec 中包含了在一个命名空间中定义特定网络策略所需的所有信息
podSelector: 每个 NetworkPolicy 都包括一个 podSelector ,它对该策略所应用的一组Pod进行选择。因为 NetworkPolicy 目前只支持定义 ingress 规则,这里的 podSelector 本质上是为该策略定义 “目标pod” 。示例中的策略选择带有 “role=db” 标签的pod。空的 podSelector 选择命名空间下的所有pod。
policyTypes: Each NetworkPolicy includes a policyTypes list which may include either Ingress, Egress, or both. The policyTypes field indicates whether or not the given policy applies to ingress traffic to selected pod, egress traffic from selected pods, or both. If no policyTypes are specified on a NetworkPolicy then by default Ingress will always be set and Egress will be set if the NetworkPolicy has any egress rules.
ingress: 每个 NetworkPolicy 包含一个 ingress 规则的白名单列表。(其中的)规则允许同时匹配 from 和 ports 部分的流量。示例策略中包含一条简单的规则: 它匹配一个单一的端口,来自两个来源中的一个, 第一个通过 namespaceSelector 指定,第二个通过 podSelector 指定。
egress: 每个 NetworkPolicy 包含一个 egress 规则的白名单列表。每个规则都允许匹配 to 和 port 部分的流量。该示例策略包含一条规则,该规则将单个端口上的流量匹配到 10.0.0.0/24 中的任何目的地。
所以,示例网络策略:
隔离 “default” 命名空间下 “role=db” 的pod (如果它们不是已经被隔离的话)。
允许从 “default” 命名空间下带有 “role=frontend” 标签的pod到 “default” 命名空间下的pod的6379 TCP端口的连接。
标签为 “role=frontend” 的 “default” 名称空间中的任何Pod
名称空间中带有标签 “project=myproject” 的任何pod
IP 地址范围为 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255(即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)
允许从带有 “project=myproject” 标签的命名空间下的任何 pod 到 “default” 命名空间下的 pod 的6379 TCP端口的连接。