K8s网络策略学习
简介
K8s集群网络中,所有pod的网络是互通的,使用网络策略(NetworkPolicy),可以对集群网络进行限制,控制pod间的通信。网络策略(NetworkPolicy)是一种关于 Pod 间及与其他网络端点间所允许的通信规则的规范,它的资源使用标签来选择Pod,并定义规则来允许访问命名空间中定义的特定Pod的流量。
NetworkPolicy规则
NetworkPolicy是namespace 范围的,它只能影响某个namespace下的pod的网络出入站规则,并且需要有一个支持网络策略的 Kubernetes 集群(支持 NetworkPolicy 的网络:Calico、Romana、Weave 网络)
网络策略是通过yaml文件创建,例如:
apiVersion: extensions/v1beta1
kind: NetworkPolicy
metadata:
name: network-policy-test
namespace: spacew2lw3rh6
spec:
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 9898
ingress:
- from:
- podSelector:
matchLabels:
app: aa1
ports:
- port: 8080
protocol: TCP
- from:
- ipBlock:
cidr: 10.241.0.0/16
except:
- 10.241.1.0/16
- namespaceSelector:
matchLabels:
project: space9ajlk02v
ports:
- port: 8080
protocol: TCP
podSelector:
matchLabels:
app: aa2
policyTypes:
- Ingress
- Egress
上述网络策略的起到的作用:将命名空间spacew2lw3rh6下label 含有app:aa2的pod隔离起来,只有满足networkpolicy中ingress和egress规则的pod才可以与他们进行通信。
ingress规则的作用:
1、命名空间spacew2lw3rh6下label 含有app:aa1的pod,都可以与隔离中pod的8080端口建立tcp连接。
2、所有label含有project: space9ajlk02v的命名空间中,属于10.241.0.0/16网段的IP,除了10.241.1.0/16网段中的IP,都可以与隔离中pod的8080端口建立tcp连接。
egress规则的作用:允许隔离中的pod访问网段为10.0.0.0/24的目的IP的9898端口
PodSelector
Pod选择器,基于标签选择与NetworkPolicy处于同一namespace下的pod,如果pod被选中,则对其应用NetworkPolicy中定义的规则。此为可选字段,当没有此字段时,表示选中所有Pod。
PolicyTypes
NetworkPolicy定义的规则可以分成两种,一种是入Pod的Ingress规则,一种是出Pod的Egress规则。本字段可以看作是一个开关,如果其中包含Ingress,则Ingress部分定义的规则生效,如果是Egress则Egress部分定义的规则生效,如果都包含则全部生效。当然此字段也可选,如果没有指定的话,则默认Ingress生效,如果Egress部分有定义的话,Egress才生效。|
ingress与egress
ingress与egress可以包含多条规则。当包含多条时,条目之间的逻辑关系是“或”,只要匹配其中一条就可以。ingress每个规则都允许匹配 from 和 ports 部分的流量。egress每个规则都允许与 to 和 ports 部分匹配的流量。
默认策略
1)默认禁止所有入pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
2)默认允许所有入pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
ingress:
- {}
3)默认禁止所有出pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Egress
4)默认允许所有出pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
5)默认禁止所有出入pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress