常见的CNI网络插件包含如下几种:api
Flannel:为Kubernetes提供叠加网络的网络插件,基于TUN/TAP隧道技术,使用UDP封装IP报文进行建立叠 加网络,借助etcd维护网络的分配状况,缺点:没法支持网络策略访问控制。
Calico:基于BGP的三层网络插件,也支持网络策略进而实现网络的访问控制;它在每台主机上都运行一个虚拟路由,利用Linux内核转发网络数据包,并借助iptables实现防火墙功能。实际上Calico最后的实现就是将每台主机都变成了一台路由器,将各个网络进行链接起来,实现跨主机通讯的功能。
Canal:由Flannel和Calico联合发布的一个统一网络插件,提供CNI网络插件,并支持网络策略实现。
其余的还包括Weave Net、Contiv、OpenContrail、Romana、NSX-T、kube-router等等。而Flannel和Calico是目前最流行的选择方案。网络
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-egress namespace: cs1 #应用于cs1 名称空间,不写名称空间对default应用 spec: podSelector: {} ingress: egress: #定义出站规则,这里没有写任何策略,表示所有拒绝。 policyTypes: - Egress - Ingress #这里面有Egress就表示要定义出站规则,不写Egress就是默认通行,Ingress是入站原理同样 #建议你们把两个都写上去 而后使用"podSelector:" 来控制是否能通行
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-egress namespace: cs1 spec: podSelector: {} ingress: - {} #这样表示"ingress"方向的所有容许通行 egress: - {} #这样表示"egress"方向的所有容许通行 policyTypes: - Egress - Ingress
这个网络策略只对名称空间起效,宿主机依然能够访问ide
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all namespace: default #只做用于 default 名称空间 spec: podSelector: #匹配pod 范围 若是匹配该名称空间的全部POD 输入"{}" 便可 matchLabels: access: "true" #匹配POD中有 access=true的标签 policyTypes: - Ingress - Egress ingress: egress:
#上图每一个cs容器的IPspa
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all spec: podSelector: {} policyTypes: - Egress - Ingress ingress: egress: - to: #注意:egress用to,ingress用from - ipBlock: cidr: 192.168.0.0/16 #放行192.168.0.0/16网络 except: - 192.168.94.134/32 #但不包括这个ip
exec进入pod 能看见ping192.168.94.134 这个IP是不通的插件
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: namespace-allow namespace: default spec: policyTypes: ["Ingress"] podSelector: {} ingress: - from: - namespaceSelector: matchLabels: name: cs1 #表示只有打了"name=cs1"的名称空间才容许进
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: namespace-allow namespace: default spec: policyTypes: ["Ingress","Egress"] podSelector: {} ingress: - from: - namespaceSelector: matchExpressions: - key: name operator: In values: ["cs1","cs2"] #中括号里面的能够 与default名称空间 ingress通讯 #表示,名称空间有标签name=cs1,name=cs2 的 能够与default名称空间通讯
7基于pod labelcode
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: namespace-allow namespace: default spec: policyTypes: ["Ingress"] podSelector: {} ingress: - from: - podSelector: matchLabels: access: "true" #容许pod 便签有 access=true的通行
#基于pod label 实验没成功不知道啥问题router