一. NetworkPolicy 基础解释
- 官方文档
- NetworkPolicy 网络策略(网络隔离策略): k8s中资源是通过命名空间隔离的,但是为了保证k8s的网络互通性,是没有做隔离的,防止调用错误,例如测试环境请求到了生产服务等问题,可以通过NetworkPolicy定义网络策略
- 通过NetworkPolicy可以精确到pod设置网络隔离,基于pod的标签,NameSpace, CIDR进行隔离(默认情况下Pod 都是非隔离的)
- 实际可以理解成编写NetworkPolicy的yaml,内部使用选择器选中指定pod,对选中的pod设置网络策略,限制被选中的pod允许哪些资源访问,限制被选中的pod可以访问哪些资源
- 一个NetworkPolicy的yaml示例与解释
- “kind: NetworkPolicy”: 当前资源时NetworkPolicy
- 通过podSelector设置选择器,设置选中哪些pod,针对选中的pod编写网络策略
- “policyTypes”: 有两个值"Ingress" 入站策略与"Egress"出站策略
- “ingress”: 在该字段下编写入站策略,也就是被选中的pod允许哪些资源访问
- “egress”: 在该字段下编写出站策略,也就是被选中的pod可以访问哪些资源
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: networkpol-01
namespace: default
spec:
podSelector: #pod选择器
matchLabels:
app: canary-nginx #使用标签选中pod,限制被选中的pod的访问
policyTypes:
- "Ingress"
- "Egress"
ingress: #入站白名单(当前被选中的pod允许哪些资源访问)
- from:
- podSelector: #通过pod选择器同命名空间下的运行访问pod
matchLabels:
name: busybox ## busybox 可以得到 canary-nginx 的内容
- namespaceSelector: #通过命名空间选择器选中允许访问的资源有哪些
matchLabels:
kubernetes.io/metadata.name: hello ## 这个hello名称空间的可以访问 canary-nginx 的内容
- ipBlock: #CIDR方式指定允许访问的资源有哪些
cidr: "192.168.0.0/16" ## 默认 从 192.168.0.0 - 192.168.255.255 都能访问这个Pod
except: ## 排除指定范围
- "192.168.1.0/24" ## 192.168.1.0-192.168.1.255 不能访问
### 两个 - ,代表并集(或者)
### 一个 - ,代表交集(且)
ports:
- port: 80 #监听端口
egress: ## 出站白名单,也就是当前通过"canary-nginx"选中的pod能给访问哪些资源
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: hello ## app: canary-nginx 能访问hello名称空间的所有
ports:
- port: 80 #监听端口
- to和from选择器的行为:NetworkPolicy 的 spec.ingress.from 和 spec.egress.to 字段中,都可以指定 4 种类型的标签选
择器
- podSelector 选择与 NetworkPolicy 同名称空间中的 Pod 作为入方向访问控制规则的源或者出方向访问控制规则的目标
- namespaceSelector 选择某个名称空间下所有的Pod作为入方向访问控制规则的源或者出方向访问控制规则的目标
- namespaceSelector 和 podSelector 在一个 to / from 条目中同时包含 namespaceSelector 和podSelector 将选中指定名称空间中的指定 Pod。此时请特别留意 YAML 的写法
- ipBlock 可选择 IP CIDR 范围作为入方向访问控制规则的源或者出方向访问控制规则的目标。这里应该指定的是集群外部的 IP,因为集群内部 Pod 的 IP 地址是临时分配的,且不可预测
- 集群的入方向和出方向网络机制通常需要重写网络报文的 source 或者 destination IP。kubernetes 并未定义应该在处理 NetworkPolicy 之前还是之后再修改 source / destination IP,因此,在不同的云供应商、使用不同的网络插件时,最终的行为都可能不一样。这意味着
- 对于入方向的网络流量,某些情况下,你可以基于实际的源 IP 地址过滤流入的报文;在另外一些情况下,NetworkPolicy 所处理的 “source IP” 可能是 LoadBalancer 的 IP 地址,或者其他地址
- 对于出方向的网络流量,基于 ipBlock 的策略可能有效,也可能无效