请在使用站内资源的同时不要恶意进行爬取或倒链等行为,感谢支持!
相关文档:
为了实现细粒度的容器间往来访问隔离策略,Kubernetes 从 1.3 版本开始,由 SIG-Network 小组主导研发了 Network Policy 机制,目前已升级为 networking.k8s.io/v1 稳定版本。Network Policy 的主导功能是对 Pod 间的网络通信进行限制和准入控制,设置方式为将 Pod 的 Label 作为查询条件,设置允许访问或禁止访问的客户端 Pod 列表。目前查询条件可以作用于 Pod 和 Namespace 级别。
为了使用 Network Policy,Kubernetes 引入了一个新的资源对象 NetworkPolicy,供用户设置 Pod 间网络访问的策略。但仅定义一个网络策略是无法完成实际的网络隔离的,还需要一个策略控制器(Policy Controller)进行策略的实现。策略控制器由第三方网络组建提供,目前 Calico、Cilium、Kube-router、Romana、Weave Net 等开源项目均支持网络策略的实现。
Policy Controller 需要实现一个 API Listener,监听用户设置的 NetworkPolicy 定义,并将网络访问规则通过各 Node 的 Agent 进行实际设置(Agent 则需要通过 CNI 网络插件实现)。
网络策略的设置主要用于目标 Pod 的网络进行限制,在默认情况下对所有 Pod 都是允许访问额,在设置了指向 Pod 的 NetworkPolicy 网络策略之后,到 Pod 的访问才会被限制。
下面通过一个例子对 NetworkPolicy 资源对象的使用进行说明:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: role: db policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978
主要的参数说明如下:
podSelector:用于定义该网络策略作用的 Pod 方位,本例的选择条件为包含 "role=db" 标签的 Pod。
policyTypes:网络策略的类型,包括 ingress 和 egress 两种,用于设置目标 Pod 的入站和出站的网络限制。
ingress:定义允许访问目标 Pod 的入站白名单规则,满足 from 条件的客户端才能访问 ports 定义的目标 Pod 端口号。
- from:对符合条件的客户端 Pod 进行网络放行,规则包括基于客户端 Pod 的 Label、基于客户端 Pod 所在的 Namespace 的 Label 或者客户端的 IP 范围。
- ports:允许访问的目标 Pod 监听的端口号。
egress:定义目标 Pod 允许访问的 "出站" 白名单规则,目标 Pod 仅允许访问满足 to 条件的服务端 IP 范围和 ports 定义的端口号。
- to: 允许访问的服务端信息,可以基于服务端 Pod 的Label、基于服务端 Pod 所在的 Namespace 的 Label 或者服务端 IP 范围。
- ports:允许访问的服务端的端口号。
通过本例的 NetworkPolicy 设置,对目标 Pod 的网络的访问效果如下。
这里是关于 namespaceSelector 和 podSelector 的说明:在 from 或 to 的配置中,namespaceSelector 和 podSelector 可以单独设置,也可以组合配置。如果仅配置 podSelector,则表示与目标 Pod 属于相同的 Namespace,而组合设置规则可以设置 Pod 所属的 Namespace,例如:
- from: - podSelector: matchLabels: role: frontend - namespaceSelector: matchLabels: project: myproject
表示允许访问目标 Pod 的来源客户端 Pod 应具有如下属性:属于有 "project=myproject" 标签的 Namespace,并且有 "role=frontend" 标签。
在 Namespace 级别还可以设置一些默认的全局网络策略,以方便管理员对整个 Namespace 进行统一的网络策略设置。
默认禁止任何客户端访问该 Namespace 中的所有 Pod:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress
默认允许任何客户端访问该 Namespace 中的所有 Pod:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all spec: podSelector: {} ingress: - {} policyTypes: - Ingress
默认禁止该 Namespace 中的所有 Pod 访问外部服务:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Egress
默认允许该 Namespace 中的所有 Pod 访问外部服务:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all spec: podSelector: {} egress: - {} policyTypes: - Egress
默认禁止任何客户端访问该 Namespace 中的所有 Pod,同时禁止访问外部服务:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: defalut-deny spec: podSelector: {} policyTypes: - Egress - Ingress
文档创建于 , 最后一次更新于 , 文档当前的状态 正式版 , 当前编写页面的版本 V1.3.1 。