kubernetes 网络隔离策略
文章目录
Kubernetes通过namespace支持了多租户,不同租户间可以通过ResourceQuota来保证资源的隔离,也无法查看其他namespace的Pod信息等。但默认kubernetes并不限制访问Pod的网络请求,对于一些敏感的应用来说可能不够用。
NetworkPolicy 资源
kubernetes可以通过在namespace下设置 Network Policies 来将Policy选中的Pod隔离。
看个例子。
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。
- policyTypes: 策略类型。NetworkPolicy将流量分为 ingress 和 egress,即入方向和出方向。如果没有指定则表示不闲置。
- ingress:入方向。白名单。需要指定from、ports,即来源、目的端口号。from有三种类型,ipBlock/namespaceSelector/podSelector。
- egress:出方向。白名单。类似ingress,egress需要指定to、ports,即目的、目的端口号。
默认NetworkPolicy
默认,如果namespace下没有配置任何策略,则流量全通。可以在namespace下配置默认策略。
默认禁止所有入方向流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
默认允许所有入方向流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
ingress:
- {}
默认禁止所有出方向流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Egress
默认允许所有出方向流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
默认禁止所有出入方向流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
怎么记住这些策略呢?很简单,默认ns下没有任何策略,即没有指定policyTypes;一旦指定了某个policyType则表示要禁止;由于是白名单,因此如果没有指定ingress/egress匹配规则,那就0匹配,即任意流量都无法通过白名单;如果指定select为{},则表示匹配所有,即任意流量都可以通过。