知乎,闲鱼网站建设和网站运营,贵安建设厅网站,网站没备案做淘宝客,网站图标可以用ps 做吗前言
随着微服务的流行#xff0c;越来越多的云服务平台需要大量模块之间的网络调用。
在 Kubernetes 中#xff0c;网络策略(NetworkPolicy)是一种强大的机制#xff0c;可以控制 Pod 之间和 Pod 与外部网络之间的流量。
Kubernetes 中的 NetworkPolicy 定义了一组规则越来越多的云服务平台需要大量模块之间的网络调用。
在 Kubernetes 中网络策略(NetworkPolicy)是一种强大的机制可以控制 Pod 之间和 Pod 与外部网络之间的流量。
Kubernetes 中的 NetworkPolicy 定义了一组规则这些规则允许或者拒绝特定流量的传输。通过使用 NetworkPolicyKubernetes 管理员能够更好地掌控容器网络确保应用程序的网络安全性。
NetworkPolicy 可以实现什么
NetworkPolicy 可被定义为 Pod 标签选择器、命名空间选择器或者两者的组合。它可以实现以下功能
限制 Pod 之间的流量通过指定 Ingress 规则可以阻止来自其他 Pod 的流量进入目标 Pod。允许 Pod 之间的流量需要为目标 Pod 配置 Egress 规则以便只允许来自特定 Pod 的流量进入。限制 Pod 与外部网络的通信通过指定 Egress 规则可以控制哪些类型的外部流量可以进入 Pod并防止未经授权的访问。允许 Pod 与外部网络的通信需要为目标 Pod 配置 Ingress 规则以便只允许来自特定 IP 地址、端口或协议的流量进入。
使用 NetworkPolicy 时需要考虑什么
使用 NetworkPolicy 时需要考虑以下几个方面
NetworkPolicy 只在支持它的网络插件中起作用例如 Calico、Cilium 和 Weave Net 等。没有定义任何 NetworkPolicy 规则则所有的流量都会被允许。定义 NetworkPolicy 后它只适用于当前命名空间中的 Pod。在 NetworkPolicy 中指定标签选择器时应保证其唯一性以免给其他 Pod 带来影响。
网络策略有哪些
默认情况下如果名字空间中不存在任何策略则所有进出该名字空间中 Pod 的流量都被允许。
Namespace 隔离流量
默认情况下所有 Pod 之间都是互通的。每个 Namespace 可以配置独立的网络策略来隔离 Pod 之间的网络流量。
由此可以通过创建匹配 Pod 的 Network Policy 来作为默认的网络策略比如默认拒绝所有 Pod 之间 Ingress 的通信如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: default-deny
spec:podSelector: {}policyTypes:- Ingress默认拒绝 Pod 之间 Egress出口 通信的策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: default-deny
spec:podSelector: {}policyTypes:- Egress甚至是默认拒绝 Pod 之间 Ingress入口 和 Egress出口 通信的策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: default-deny
spec:podSelector: {}policyTypes:- Ingress- EgressPod 隔离
Pod 隔离可以分为出口的隔离和入口的隔离。其实这里的“隔离”不是绝对的而是还有一些其它限制。
比如可以通过使用标签选择器这里可以是 namespaceSelector 和 podSelector来控制 Pod 之间的流量。
如下面的 Network Policy:
允许 default namespace 中带有 rolemyfront 标签的 Pod 访问 default namespace 中带有 rolemydb 标签 Pod 的 6379 端口允许带有 projectmyprojects 标签的 namespace 中所有 Pod 访问 default namespace 中带有 rolemydb 标签 Pod 的 6379 端口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test-network-policynamespace: default
spec:podSelector:matchLabels:role: mydbingress:- from:- namespaceSelector:matchLabels:project: myproject- podSelector:matchLabels:role: myfrontports:- protocol: tcpport: 6379另外一个同时开启 Ingress 和 Egress 通信的策略为:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test-network-policynamespace: default
spec:podSelector:matchLabels:role: mydbpolicyTypes:- Ingress- Egressingress:- from:- ipBlock:cidr: 192.168.0.0/16except:- 192.168.1.0/24- namespaceSelector:matchLabels:project: myproject- podSelector:matchLabels:role: myfrontports:- protocol: TCPport: 6379egress:- to:- ipBlock:cidr: 10.1.0.0/24ports:- protocol: TCPport: 5978它用来隔离 default namespace 中带有 rolemydb 标签的 Pod
允许 default namespace 中带有 rolemyfront 标签的 Pod 访问 default namespace 中带有 rolemydb 标签 Pod 的 6379 端口允许带有 projectmyprojects 标签的 namespace 中所有 Pod 访问 default namespace 中带有 rolemydb 标签 Pod 的 6379 端口允许 default namespace 中带有 rolemydb 标签的 Pod 访问 10.1.0.0/24 网段的 TCP 5987 端口
使用场景
禁止访问指定服务
kubectl run web --imagenginx --labels appweb,envprod --expose --port 80网络策略如下:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:name: web-deny-all
spec:podSelector:matchLabels:app: webenv: prod只允许指定 Pod 访问服务
kubectl run apiserver --imagenginx --labels appbookstore,roleapi --expose --port 80网络策略如下:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:name: api-allow
spec:podSelector:matchLabels:app: bookstorerole: apiingress:- from:- podSelector:matchLabels:app: bookstore禁止 namespace 中所有 Pod 之间的相互访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: default-denynamespace: default
spec:podSelector: {}禁止其他 namespace 访问服务
kubectl create namespace secondary
kubectl run web --namespace secondary --imagenginx \--labelsappweb --expose --port 80网络策略配置如下
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:namespace: secondaryname: web-deny-other-namespaces
spec:podSelector:matchLabels:ingress:- from:- podSelector: {}此策略可以确保即使没有被其他任何 NetworkPolicy 选择的 Pod 也不会被允许流出流量。 此策略不会更改任何 Pod 的入站流量隔离行为。
只允许指定 namespace 访问服务
kubectl run web --imagenginx \--labelsappweb --expose --port 80网络策略如下
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:name: web-allow-prod
spec:podSelector:matchLabels:app: webingress:- from:- namespaceSelector:matchLabels:purpose: production允许外网访问服务
kubectl run web --imagenginx --labelsappweb --port 80
kubectl expose deployment/web --typeLoadBalancer网络策略如下
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:name: web-allow-external
spec:podSelector:matchLabels:app: webingress:- ports:- port: 80from: []有了这个策略任何额外的策略都不会导致来自这些 Pod 的任何出站连接被拒绝。 此策略对进入任何 Pod 的隔离没有影响。 以上这些使用场景的 YAML 配置定义就不再赘述了有不明白的地方可以看下我之前的文章。
总结
Kubernetes 中的 NetworkPolicy 是一个非常重要的特性可以控制容器网络的流量和安全确保应用程序的可靠性和安全性。
为了更好地使用它需要对其有一定的理解并遵循相应的配置和管理规则。